From b3907762199973603332eb10340d34b441561e7a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 25 Dec 2020 20:43:28 +0800 Subject: [PATCH 001/252] up4.0 --- v2rayN/v2rayN/Base/HttpWebServer.cs | 101 - v2rayN/v2rayN/Base/HttpWebServerB.cs | 141 - v2rayN/v2rayN/Forms/MainForm.Designer.cs | 161 +- v2rayN/v2rayN/Forms/MainForm.cs | 184 +- v2rayN/v2rayN/Forms/MainForm.resx | 473 ++- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 165 +- .../Forms/OptionSettingForm.Designer.cs | 297 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 157 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3128 +++++++---------- .../Forms/OptionSettingForm.zh-Hans.resx | 171 +- .../Forms/RoutingSettingControl.Designer.cs | 159 + v2rayN/v2rayN/Forms/RoutingSettingControl.cs | 76 + .../v2rayN/Forms/RoutingSettingControl.resx | 456 +++ .../Forms/RoutingSettingControl.zh-Hans.resx | 184 + .../Forms/RoutingSettingForm.Designer.cs | 151 + v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 143 + v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 420 +++ .../Forms/RoutingSettingForm.zh-Hans.resx | 145 + .../Forms/SubSettingControl.Designer.cs | 53 +- v2rayN/v2rayN/Forms/SubSettingControl.cs | 25 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 337 +- .../Forms/SubSettingControl.zh-Hans.resx | 13 +- v2rayN/v2rayN/Forms/SubSettingForm.resx | 126 +- v2rayN/v2rayN/Global.cs | 20 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 52 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 87 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 113 +- .../HttpProxyHandler/HttpProxyHandle.cs | 94 +- .../HttpProxyHandler/PACServerHandle.cs | 209 -- v2rayN/v2rayN/Mode/ComboItem.cs | 14 + v2rayN/v2rayN/Mode/Config.cs | 90 +- v2rayN/v2rayN/Mode/ERoutingSort.cs | 11 + v2rayN/v2rayN/Mode/ESysProxyType.cs | 10 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 10 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- .../v2rayN/Properties/Resources.Designer.cs | 22 +- v2rayN/v2rayN/Properties/Resources.resx | 6 - v2rayN/v2rayN/Resources/abp.js.gz | Bin 4467 -> 0 bytes v2rayN/v2rayN/Resources/pac.txt.gz | Bin 44429 -> 0 bytes v2rayN/v2rayN/Sample/BlankPac.txt | 5 - v2rayN/v2rayN/Sample/SampleClientConfig.txt | 28 +- v2rayN/v2rayN/Tool/Utils.cs | 14 + v2rayN/v2rayN/v2rayN.csproj | 36 +- 44 files changed, 4178 insertions(+), 3913 deletions(-) delete mode 100644 v2rayN/v2rayN/Base/HttpWebServer.cs delete mode 100644 v2rayN/v2rayN/Base/HttpWebServerB.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs create mode 100644 v2rayN/v2rayN/Mode/ComboItem.cs create mode 100644 v2rayN/v2rayN/Mode/ERoutingSort.cs create mode 100644 v2rayN/v2rayN/Mode/ESysProxyType.cs delete mode 100644 v2rayN/v2rayN/Resources/abp.js.gz delete mode 100644 v2rayN/v2rayN/Resources/pac.txt.gz delete mode 100644 v2rayN/v2rayN/Sample/BlankPac.txt diff --git a/v2rayN/v2rayN/Base/HttpWebServer.cs b/v2rayN/v2rayN/Base/HttpWebServer.cs deleted file mode 100644 index 9fa72495..00000000 --- a/v2rayN/v2rayN/Base/HttpWebServer.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Net; -using System.Text; -using System.Threading; - -namespace v2rayN.Base -{ - public class HttpWebServer - { - private HttpListener _listener; - private Func _responderMethod; - - public HttpWebServer(string[] prefixes, Func method) - { - try - { - _listener = new HttpListener(); - - if (!HttpListener.IsSupported) - throw new NotSupportedException( - "Needs Windows XP SP2, Server 2003 or later."); - - // URI prefixes are required, for example - // "http://localhost:8080/index/". - if (prefixes == null || prefixes.Length == 0) - throw new ArgumentException("prefixes"); - - // A responder method is required - if (method == null) - throw new ArgumentException("method"); - - foreach (string s in prefixes) - _listener.Prefixes.Add(s); - - _responderMethod = method; - _listener.Start(); - - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - throw; - } - } - - public HttpWebServer(Func method, params string[] prefixes) - : this(prefixes, method) { } - - public void Run() - { - ThreadPool.QueueUserWorkItem((o) => - { - Utils.SaveLog("Webserver running..."); - try - { - while (_listener.IsListening) - { - ThreadPool.QueueUserWorkItem((c) => - { - HttpListenerContext ctx = c as HttpListenerContext; - try - { - string address = ctx.Request.LocalEndPoint.Address.ToString(); - Utils.SaveLog("Webserver Request " + address); - string rstr = _responderMethod(address); - byte[] buf = Encoding.UTF8.GetBytes(rstr); - ctx.Response.StatusCode = 200; - ctx.Response.ContentType = "application/x-ns-proxy-autoconfig"; - ctx.Response.ContentLength64 = buf.Length; - ctx.Response.OutputStream.Write(buf, 0, buf.Length); - } - catch - { - } // suppress any exceptions - finally - { - // always close the stream - ctx.Response.OutputStream.Close(); - } - }, _listener.GetContext()); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } // suppress any exceptions - }); - } - - public void Stop() - { - if (_listener != null) - { - _listener.Stop(); - _listener.Close(); - _listener = null; - } - } - - } -} diff --git a/v2rayN/v2rayN/Base/HttpWebServerB.cs b/v2rayN/v2rayN/Base/HttpWebServerB.cs deleted file mode 100644 index fcbca1dd..00000000 --- a/v2rayN/v2rayN/Base/HttpWebServerB.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Threading; - -namespace v2rayN.Base -{ - public class HttpWebServerB - { - private TcpListener listener; - private int port; - private Func _responderMethod; - - public HttpWebServerB(int port, Func method) - { - this.port = port; - this._responderMethod = method; - - Thread thread = new Thread(StartListen) - { - IsBackground = true - }; - thread.Start(); - } - - public void Stop() - { - if (listener != null) - { - listener.Stop(); - listener = null; - } - } - - private void StartListen() - { - try - { - listener = new TcpListener(IPAddress.Any, port); - listener.Start(); - Utils.SaveLog("WebserverB running..."); - - 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 - { - TcpClient socket = obj as TcpClient; - - BufferedStream inputStream = new BufferedStream(socket.GetStream()); - StreamWriter outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); - if (inputStream.CanRead) - { - string data = ReadStream(inputStream); - - if (data.Contains("/pac/")) - { - if (_responderMethod != null) - { - string address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString(); - Utils.SaveLog("WebserverB Request " + address); - string pac = _responderMethod(address); - - if (inputStream.CanWrite) - { - WriteStream(outputStream, pac); - } - } - } - } - - outputStream.BaseStream.Flush(); - inputStream = null; - outputStream = null; - socket.Close(); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - private string ReadStream(Stream inputStream) - { - int nextchar; - string data = ""; - while (true) - { - nextchar = inputStream.ReadByte(); - if (nextchar == '\n') - { - break; - } - if (nextchar == '\r') - { - continue; - } - if (nextchar == -1) - { - Thread.Sleep(1); - continue; - }; - data += Convert.ToChar(nextchar); - } - return data; - } - - private void WriteStream(StreamWriter outputStream, string pac) - { - 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"); - outputStream.WriteLine(""); - outputStream.WriteLine(pac); - outputStream.Flush(); - } - } -} diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 86a73954..1b546c7b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -63,22 +63,17 @@ this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); - this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); 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(); - this.menuNotEnabledHttp = new System.Windows.Forms.ToolStripMenuItem(); - this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); - 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.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepClear = 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(); @@ -93,8 +88,6 @@ this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); @@ -106,16 +99,16 @@ 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.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.tsbReload = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton(); 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.tsbCheckUpdateXrayCore = 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(); @@ -211,6 +204,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; // // menuAddVmessServer // @@ -388,11 +382,6 @@ this.menuExport2SubContent.Name = "menuExport2SubContent"; this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // - // qrCodeControl - // - resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); - this.qrCodeControl.Name = "qrCodeControl"; - // // tsbServer // resources.ApplyResources(this.tsbServer, "tsbServer"); @@ -400,6 +389,11 @@ this.tsbServer.Image = global::v2rayN.Properties.Resources.server; this.tsbServer.Name = "tsbServer"; // + // qrCodeControl + // + resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); + this.qrCodeControl.Name = "qrCodeControl"; + // // notifyMain // resources.ApplyResources(this.notifyMain, "notifyMain"); @@ -415,7 +409,6 @@ this.menuServers, this.menuAddServers2, this.menuScanScreen2, - this.menuCopyPACUrl, this.menuUpdateSubscriptions, this.toolStripSeparator2, this.menuExit}); @@ -428,56 +421,28 @@ // 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.menuKeepNothing, - this.menuKeepPACNothing}); + this.menuGlobal, + this.menuKeepClear}); this.menuSysAgentMode.Name = "menuSysAgentMode"; // - // menuNotEnabledHttp - // - resources.ApplyResources(this.menuNotEnabledHttp, "menuNotEnabledHttp"); - this.menuNotEnabledHttp.Name = "menuNotEnabledHttp"; - this.menuNotEnabledHttp.Click += new System.EventHandler(this.menuNotEnabledHttp_Click); - // - // menuGlobal - // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); - this.menuGlobal.Name = "menuGlobal"; - this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); - // - // menuGlobalPAC - // - resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC"); - this.menuGlobalPAC.Name = "menuGlobalPAC"; - this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click); - // - // menuKeep - // - resources.ApplyResources(this.menuKeep, "menuKeep"); - this.menuKeep.Name = "menuKeep"; - this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click); - // - // 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 + // menuGlobal // - resources.ApplyResources(this.menuKeepPACNothing, "menuKeepPACNothing"); - this.menuKeepPACNothing.Name = "menuKeepPACNothing"; - this.menuKeepPACNothing.Click += new System.EventHandler(this.menuKeepPACNothing_Click); + resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; + this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); + // + // menuKeepClear + // + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; + this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuServers // @@ -496,12 +461,6 @@ this.menuScanScreen2.Name = "menuScanScreen2"; this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // - // 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"); @@ -559,8 +518,6 @@ this.toolSslHttpPortLab, this.toolSslHttpPort, this.toolSslBlank2, - this.toolSslPacPortLab, - this.toolSslPacPort, this.toolSslBlank3, this.toolSslServerSpeed, this.toolSslBlank4}); @@ -599,16 +556,6 @@ this.toolSslBlank2.Name = "toolSslBlank2"; this.toolSslBlank2.Spring = true; // - // toolSslPacPortLab - // - resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab"); - this.toolSslPacPortLab.Name = "toolSslPacPortLab"; - // - // toolSslPacPort - // - resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); - this.toolSslPacPort.Name = "toolSslPacPort"; - // // toolSslBlank3 // resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); @@ -641,7 +588,7 @@ this.tsbSub, this.tsbQRCodeSwitch, this.toolStripSeparator8, - this.tsbOptionSetting, + this.tsbSetting, this.toolStripSeparator5, this.tsbReload, this.toolStripSeparator7, @@ -694,13 +641,27 @@ resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; // + // tsbSetting + // + resources.ApplyResources(this.tsbSetting, "tsbSetting"); + this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbOptionSetting, + this.tsbRoutingSetting}); + this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + this.tsbSetting.Name = "tsbSetting"; + // // tsbOptionSetting // 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); // + // tsbRoutingSetting + // + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); + // // toolStripSeparator5 // resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); @@ -723,9 +684,7 @@ this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, - this.tsbCheckUpdatePACList, - this.toolStripSeparator13, - this.tsbCheckClearPACList}); + this.tsbCheckUpdateXrayCore}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // @@ -741,22 +700,11 @@ this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // - // tsbCheckUpdatePACList + // tsbCheckUpdateXrayCore // - 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 - // - resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList"); - this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; - this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click); + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator10 // @@ -880,7 +828,6 @@ private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig; private System.Windows.Forms.ToolStrip tsMain; private System.Windows.Forms.ToolStripDropDownButton tsbServer; - private System.Windows.Forms.ToolStripButton tsbOptionSetting; private System.Windows.Forms.ToolStripButton tsbClose; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; @@ -893,9 +840,7 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode; private System.Windows.Forms.ToolStripMenuItem menuGlobal; - private System.Windows.Forms.ToolStripMenuItem menuGlobalPAC; - private System.Windows.Forms.ToolStripMenuItem menuKeep; - private System.Windows.Forms.ToolStripMenuItem menuCopyPACUrl; + private System.Windows.Forms.ToolStripMenuItem menuKeepClear; private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; @@ -905,7 +850,6 @@ private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore; - private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdatePACList; private System.Windows.Forms.ToolStripMenuItem menuAddServers; private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl; private System.Windows.Forms.ToolStripMenuItem menuSpeedServer; @@ -920,8 +864,6 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripMenuItem tsbSubSetting; private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate; - private System.Windows.Forms.ToolStripMenuItem tsbCheckClearPACList; - private System.Windows.Forms.ToolStripMenuItem menuKeepPAC; private System.Windows.Forms.ToolStripMenuItem menuSelectAll; private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; @@ -934,27 +876,26 @@ private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; - private System.Windows.Forms.ToolStripStatusLabel toolSslPacPort; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank3; private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab; - private System.Windows.Forms.ToolStripStatusLabel toolSslPacPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer; 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; + private System.Windows.Forms.ToolStripDropDownButton tsbSetting; + private System.Windows.Forms.ToolStripMenuItem tsbOptionSetting; + private System.Windows.Forms.ToolStripMenuItem tsbRoutingSetting; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateXrayCore; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 90977fd0..0b7b2e55 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -35,8 +35,8 @@ namespace v2rayN.Forms { v2rayHandler.V2rayStop(); - HttpProxyHandle.CloseHttpAgent(config); - PACServerHandle.Stop(); + //HttpProxyHandle.CloseHttpAgent(config); + HttpProxyHandle.UpdateSysProxy(config, true); ConfigHandler.SaveConfig(ref config); statistics?.SaveToFile(); @@ -205,6 +205,8 @@ namespace v2rayN.Forms /// private void RefreshServersView() { + int index = lvServers.SelectedIndices.Count > 0 ? lvServers.SelectedIndices[0] : -1; + lvServers.BeginUpdate(); lvServers.Items.Clear(); @@ -270,15 +272,11 @@ namespace v2rayN.Forms } lvServers.EndUpdate(); - //if (lvServers.Items.Count > 0) - //{ - // if (lvServers.Items.Count <= testConfigIndex) - // { - // testConfigIndex = lvServers.Items.Count - 1; - // } - // lvServers.Items[testConfigIndex].Selected = true; - // lvServers.Select(); - //} + if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0) + { + lvServers.Items[index].Selected = true; + lvServers.EnsureVisible(index); // workaround + } } /// @@ -343,29 +341,8 @@ namespace v2rayN.Forms 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"); - } - } - } + toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } @@ -426,7 +403,7 @@ namespace v2rayN.Forms ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); - ChangePACButtonStatus(config.listenerType); + ChangePACButtonStatus(config.sysProxyType); tsbReload.Enabled = true; } @@ -576,7 +553,7 @@ namespace v2rayN.Forms private void menuAddVlessServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.VLESS, -1); + ShowServerForm((int)EConfigType.VLESS, -1); } private void menuRemoveServer_Click(object sender, EventArgs e) @@ -758,7 +735,17 @@ namespace v2rayN.Forms //刷新 RefreshServers(); LoadV2ray(); - HttpProxyHandle.RestartHttpAgent(config, true); + } + } + + private void tsbRoutingSetting_Click(object sender, EventArgs e) + { + RoutingSettingForm fm = new RoutingSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); } } @@ -858,13 +845,13 @@ namespace v2rayN.Forms private void menuAddShadowsocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Shadowsocks, -1); + ShowServerForm((int)EConfigType.Shadowsocks, -1); ShowForm(); } private void menuAddSocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Socks, -1); + ShowServerForm((int)EConfigType.Socks, -1); ShowForm(); } @@ -1020,10 +1007,11 @@ namespace v2rayN.Forms this.ShowInTaskbar = true; //this.notifyIcon1.Visible = false; this.txtMsgBox.ScrollToCaret(); - if (config.index >= 0 && config.index < lvServers.Items.Count) - { - lvServers.EnsureVisible(config.index); // workaround - } + //if (config.index >= 0 && config.index < lvServers.Items.Count) + //{ + // lvServers.Items[config.index].Selected = true; + // lvServers.EnsureVisible(config.index); // workaround + //} SetVisibleCore(true); } @@ -1151,55 +1139,37 @@ namespace v2rayN.Forms #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); + SetListenerType(ESysProxyType.ForcedChange); } - private void menuGlobalPAC_Click(object sender, EventArgs e) + + private void menuKeepClear_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); + SetListenerType(ESysProxyType.ForcedClear); } private void menuKeepNothing_Click(object sender, EventArgs e) { - SetListenerType(ListenerType.HttpOpenOnly); + SetListenerType(ESysProxyType.Unchanged); } - private void menuKeepPACNothing_Click(object sender, EventArgs e) + private void SetListenerType(ESysProxyType type) { - SetListenerType(ListenerType.PacOpenOnly); - } - private void SetListenerType(ListenerType type) - { - config.listenerType = type; + config.sysProxyType = type; ChangePACButtonStatus(type); } - private void ChangePACButtonStatus(ListenerType type) + private void ChangePACButtonStatus(ESysProxyType type) { - if (type != ListenerType.noHttpProxy) - { - HttpProxyHandle.RestartHttpAgent(config, false); - } - else - { - HttpProxyHandle.CloseHttpAgent(config); - } + HttpProxyHandle.UpdateSysProxy(config, false); + //if (type != ListenerType.noHttpProxy) + //{ + // HttpProxyHandle.RestartHttpAgent(config, false); + //} + //else + //{ + // HttpProxyHandle.CloseHttpAgent(config); + //} for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) { @@ -1301,6 +1271,16 @@ namespace v2rayN.Forms } private void tsbCheckUpdateCore_Click(object sender, EventArgs e) + { + CheckUpdateCore("v2fly"); + } + + private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e) + { + CheckUpdateCore("xray"); + } + + private void CheckUpdateCore(string type) { DownloadHandle downloadHandle = null; if (downloadHandle == null) @@ -1362,53 +1342,7 @@ namespace v2rayN.Forms } 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); - } + downloadHandle.CheckUpdateAsync(type); } #endregion @@ -1570,8 +1504,8 @@ namespace v2rayN.Forms + #endregion - } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index eb1e2e63..e1d6def6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -127,17 +127,14 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Magenta - 355, 22 97, 53 - - groupBox2 + + 355, 22 Add [VLESS] server @@ -151,11 +148,8 @@ Restart service - - 184, 6 - - - tsbSubSetting + + menuCopyServer 264, 22 @@ -176,22 +170,25 @@ ImageAboveText + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 语言-[中文简体] NoControl - - Top + + Settings tsbHelp - - 5 - + + 0 + False @@ -213,23 +210,20 @@ 187, 22 + + tsbSetting + toolSslBlank2 - - tsbCheckUpdateN - 355, 22 355, 22 - - Move to top (T) - - - 45, 53 + + tsbCheckUpdateN Only open Http proxy and do nothing @@ -237,11 +231,14 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuExport2SubContent + toolStripSeparator7 - Update v2rayCore + Update v2flyCore Magenta @@ -255,8 +252,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuExport2SubContent + + Fill 52, 17 @@ -264,8 +261,14 @@ Share - - tsbQRCodeSwitch + + Subscriptions + + + 952, 351 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 @@ -273,23 +276,23 @@ Export selected server for client configuration + + tsbRoutingSetting + 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 - - ImageAboveText + + 0, 17 952, 56 @@ -306,21 +309,21 @@ menuTcpingServer - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 356, 600 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 v2rayN - - 411, 22 - 355, 22 @@ -334,25 +337,19 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 393, 22 + 203, 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 + + 187, 22 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -368,17 +365,17 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM - mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY - FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr - flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh - VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh - 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - - 411, 22 + + Servers 3 @@ -413,15 +410,15 @@ menuMoveDown + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 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) @@ -434,8 +431,8 @@ 48, 53 - - 393, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 @@ -447,7 +444,7 @@ panel1 - 195, 17 + 206, 17 0 @@ -461,17 +458,17 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuKeepClear + 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 + + Export share URLs to clipboard (Ctrl+C) scMain.Panel2 @@ -510,7 +507,7 @@ tsbAbout - 195, 17 + 206, 17 toolStripSeparator5 @@ -527,6 +524,9 @@ 352, 6 + + tsbPromotion + 256, 331 @@ -539,17 +539,14 @@ 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 + + 352, 6 groupBox1 - 195, 17 + 206, 17 2 @@ -557,21 +554,15 @@ 125, 22 - - 0, 17 - scMain.Panel2 - 58, 53 + 161, 22 355, 22 - - Not Enabled Http Proxy - 187, 22 @@ -587,14 +578,17 @@ 686 - - ImageAboveText + + tsbTestMe - 265, 164 + 265, 142 - - 355, 22 + + 411, 22 + + + $this System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -605,9 +599,15 @@ Check for updates - + + tsbCheckUpdateXrayCore + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 17 + toolSslServerSpeed @@ -620,24 +620,18 @@ 125, 22 - - Only open Http proxy and clear the proxy settings - scMain + + 203, 22 + HTTP: Remove selected servers (Delete) - - 411, 22 - - - menuKeepPAC - 0 @@ -647,17 +641,11 @@ menuSelectAll - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical + + Move to top (T) - 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 @@ -668,11 +656,11 @@ ImageAboveText - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 1 - - 187, 22 + + Promotion menuAddServers @@ -695,14 +683,17 @@ menuExport2ShareUrl + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + tsMain System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbReload + + SOCKS5: v2rayN (this software) @@ -719,8 +710,8 @@ 0, 66 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 tsbV2rayWebsite @@ -752,8 +743,8 @@ Language-[English] - - menuSpeedServer + + tsbSubSetting 264, 22 @@ -761,6 +752,9 @@ 0 + + Fill + toolSslBlank3 @@ -770,11 +764,14 @@ Add [Trojan] server + + 161, 22 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator11 + + ImageAboveText System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -782,9 +779,6 @@ 0, 417 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 352, 6 @@ -800,20 +794,17 @@ 1 - - toolSslPacPort - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Settings + OptionSetting menuMoveTop - - menuKeep + + tsbCheckUpdateCore @@ -832,12 +823,12 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 351 - menuScanScreen + + ImageAboveText + cmsLv @@ -847,12 +838,15 @@ 6, 56 - - Fill - toolSslBlank1 + + scMain.Panel1 + + + tsbReload + tsbSubUpdate @@ -865,11 +859,8 @@ SPEED Disabled - - PAC: - - - Promotion + + 67, 53 menuSysAgentMode @@ -877,8 +868,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + ImageAboveText Export subscription (base64) share to clipboard @@ -907,17 +898,17 @@ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator13 + + tsbClose - - 1 + + RoutingSetting System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 17 + + tsbQRCodeSwitch 3, 151 @@ -928,8 +919,8 @@ 355, 22 - - Subscriptions + + 6, 56 952, 10 @@ -940,15 +931,9 @@ 264, 22 - - menuNotEnabledHttp - 0 - - Informations - toolStripSeparator8 @@ -964,9 +949,6 @@ 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 @@ -979,6 +961,15 @@ System.Windows.Forms.ToolStripDropDownButton, 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.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + menuSetDefaultServer @@ -988,11 +979,11 @@ Settings - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 45, 53 - - menuCopyServer + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Http proxy @@ -1000,12 +991,6 @@ 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 @@ -1051,11 +1036,11 @@ 2 - - menuKeepPACNothing + + toolStripSeparator11 - - Check for updated PAC (need the HTTP proxy are ON) + + Magenta 355, 22 @@ -1063,11 +1048,8 @@ v2rayN Project - - Servers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1075,8 +1057,8 @@ Select All (Ctrl+A) - - ImageAboveText + + Informations 3 @@ -1084,14 +1066,8 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbCheckUpdateCore - - - SOCKS5: - - - 33, 17 + + menuSpeedServer 355, 22 @@ -1099,8 +1075,8 @@ menuRemoveServer - - tsbTestMe + + Test current service status 355, 22 @@ -1120,20 +1096,14 @@ 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 + + 411, 22 355, 22 @@ -1156,6 +1126,9 @@ 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + groupBox2 @@ -1171,8 +1144,8 @@ 微软雅黑, 8pt - - Export share URLs to clipboard (Ctrl+C) + + Vertical 411, 22 @@ -1189,26 +1162,17 @@ 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 + + 0, 0 qrCodeControl - - 264, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 @@ -1225,8 +1189,8 @@ 微软雅黑, 8pt - - tsbPromotion + + groupBox2 ImageAboveText @@ -1234,21 +1198,15 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuGlobalPAC - - 393, 22 + 203, 22 - - 356, 600 + + 184, 6 0, 0 - - scMain.Panel1 - Up (U) @@ -1291,9 +1249,6 @@ 946, 22 - - Open PAC and set the system proxy (PAC mode) - 355, 22 @@ -1303,9 +1258,6 @@ menuAddVlessServer - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 946, 331 @@ -1315,23 +1267,14 @@ Add [Shadowsocks] server - - 390, 6 - 微软雅黑, 8pt 952, 593 - - 411, 22 - - - tsbCheckClearPACList - - - Test current service status + + Scan QR code on the screen toolSslSocksPort @@ -1345,9 +1288,6 @@ menuMoveBottom - - 393, 22 - 1 @@ -1372,26 +1312,17 @@ 6, 56 - - 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 - - ImageAboveText - - - toolSslPacPortLab + + 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 @@ -1405,9 +1336,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Scan QR code on the screen - 0, 56 @@ -1429,6 +1357,9 @@ $this + + Update xrayCore + toolStripSeparator2 @@ -1444,9 +1375,6 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 352, 6 - 952, 176 @@ -1456,15 +1384,9 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - Fill - - Copy local PAC URL - 3, 17 @@ -1473,37 +1395,34 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== 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.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 228, 18 + + zh-Hans + True - 108 + 65 137, 17 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 83e8f530..ab434f47 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -286,6 +286,12 @@ 批量导出订阅内容至剪贴板(多选) + + 73, 53 + + + 服务器 + 301, 600 @@ -306,62 +312,29 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 73, 53 + + 228, 22 - - 服务器 + + 不改变系统代理 - - 196, 164 + + 228, 22 + + + 自动配置系统代理(全局模式) + + + 228, 22 + + + 清除系统代理 195, 22 - 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 @@ -381,12 +354,6 @@ 扫描屏幕上的二维码 - - 195, 22 - - - 复制本地PAC网址 - 195, 22 @@ -402,20 +369,17 @@ 退出 + + 196, 142 + 服务器列表 - - 信息 - 网速显示未启用 - - 61, 53 - - - 订阅 + + 信息 124, 22 @@ -429,6 +393,12 @@ 更新订阅 + + 61, 53 + + + 订阅 + 52, 53 @@ -436,10 +406,22 @@ 分享 - 76, 53 + 124, 22 - 参数设置 + 参数设置 + + + 124, 22 + + + 路由设置 + + + 61, 53 + + + 设置 @@ -458,38 +440,35 @@ 重启服务 + + 180, 22 + + + v2rayN + + + 180, 22 + + + v2fly-Core + + + 180, 22 + + + xray-Core + 85, 53 检查更新 - - 223, 22 + + v2rayN 项目 - - v2rayN - - - 223, 22 - - - v2rayCore - - - 223, 22 - - - PAC - - - 220, 6 - - - 223, 22 - - - 简化PAC (请设置Core路由) + + V2Ray 官网 69, 53 @@ -497,12 +476,6 @@ 帮助 - - v2rayN 项目 - - - V2Ray 官网 - 68, 53 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 62af6048..27a61a74 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -34,12 +34,8 @@ 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(); this.chksniffingEnabled = new System.Windows.Forms.CheckBox(); - this.txtremoteDNS = new System.Windows.Forms.TextBox(); - this.label14 = new System.Windows.Forms.Label(); this.chkmuxEnabled = new System.Windows.Forms.CheckBox(); this.chkAllowIn2 = new System.Windows.Forms.CheckBox(); this.chkudpEnabled2 = new System.Windows.Forms.CheckBox(); @@ -55,21 +51,9 @@ this.txtlocalPort = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.tabPage2 = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.tabControl2 = new System.Windows.Forms.TabControl(); - this.tabPage3 = new System.Windows.Forms.TabPage(); - this.txtUseragent = new System.Windows.Forms.TextBox(); - this.tabPage4 = new System.Windows.Forms.TabPage(); - this.txtUserdirect = new System.Windows.Forms.TextBox(); - this.tabPage5 = new System.Windows.Forms.TabPage(); - this.txtUserblock = new System.Windows.Forms.TextBox(); - 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.linkDnsObjectDoc = new System.Windows.Forms.LinkLabel(); + this.txtremoteDNS = new System.Windows.Forms.TextBox(); + this.label14 = 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(); @@ -90,13 +74,7 @@ this.lbFreshrate = new System.Windows.Forms.Label(); this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); - 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(); @@ -104,56 +82,41 @@ this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); this.tabPage2.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.tabControl2.SuspendLayout(); - this.tabPage3.SuspendLayout(); - this.tabPage4.SuspendLayout(); - this.tabPage5.SuspendLayout(); - this.tabPage8.SuspendLayout(); - this.panel3.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); - this.tabPage9.SuspendLayout(); - this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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); - this.tabControl1.Controls.Add(this.tabPage9); + resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); 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); this.groupBox1.Controls.Add(this.chksniffingEnabled); - this.groupBox1.Controls.Add(this.txtremoteDNS); - this.groupBox1.Controls.Add(this.label14); this.groupBox1.Controls.Add(this.chkmuxEnabled); this.groupBox1.Controls.Add(this.chkAllowIn2); this.groupBox1.Controls.Add(this.chkudpEnabled2); @@ -168,6 +131,7 @@ 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; // @@ -177,26 +141,6 @@ this.chkdefAllowInsecure.Name = "chkdefAllowInsecure"; this.chkdefAllowInsecure.UseVisualStyleBackColor = true; // - // label16 - // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // cmblistenerType - // - resources.ApplyResources(this.cmblistenerType, "cmblistenerType"); - this.cmblistenerType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmblistenerType.FormattingEnabled = true; - this.cmblistenerType.Items.AddRange(new object[] { - resources.GetString("cmblistenerType.Items"), - resources.GetString("cmblistenerType.Items1"), - resources.GetString("cmblistenerType.Items2"), - resources.GetString("cmblistenerType.Items3"), - resources.GetString("cmblistenerType.Items4"), - resources.GetString("cmblistenerType.Items5"), - resources.GetString("cmblistenerType.Items6")}); - this.cmblistenerType.Name = "cmblistenerType"; - // // chksniffingEnabled2 // resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2"); @@ -209,16 +153,6 @@ this.chksniffingEnabled.Name = "chksniffingEnabled"; this.chksniffingEnabled.UseVisualStyleBackColor = true; // - // txtremoteDNS - // - resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); - this.txtremoteDNS.Name = "txtremoteDNS"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // // chkmuxEnabled // resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled"); @@ -240,12 +174,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 @@ -260,8 +194,8 @@ // // cmbprotocol // - resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -287,7 +221,6 @@ // // cmbloglevel // - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -296,6 +229,7 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -315,127 +249,31 @@ // // tabPage2 // + this.tabPage2.Controls.Add(this.linkDnsObjectDoc); + this.tabPage2.Controls.Add(this.txtremoteDNS); + this.tabPage2.Controls.Add(this.label14); resources.ApplyResources(this.tabPage2, "tabPage2"); - this.tabPage2.Controls.Add(this.groupBox2); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // - // groupBox2 + // linkDnsObjectDoc // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.tabControl2); - this.groupBox2.Controls.Add(this.panel3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; + resources.ApplyResources(this.linkDnsObjectDoc, "linkDnsObjectDoc"); + this.linkDnsObjectDoc.Name = "linkDnsObjectDoc"; + this.linkDnsObjectDoc.TabStop = true; // - // tabControl2 + // txtremoteDNS // - 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); - this.tabControl2.Name = "tabControl2"; - this.tabControl2.SelectedIndex = 0; + resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); + this.txtremoteDNS.Name = "txtremoteDNS"; // - // tabPage3 + // label14 // - resources.ApplyResources(this.tabPage3, "tabPage3"); - this.tabPage3.Controls.Add(this.txtUseragent); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.UseVisualStyleBackColor = true; - // - // txtUseragent - // - resources.ApplyResources(this.txtUseragent, "txtUseragent"); - this.txtUseragent.Name = "txtUseragent"; - // - // tabPage4 - // - resources.ApplyResources(this.tabPage4, "tabPage4"); - this.tabPage4.Controls.Add(this.txtUserdirect); - this.tabPage4.Name = "tabPage4"; - this.tabPage4.UseVisualStyleBackColor = true; - // - // txtUserdirect - // - resources.ApplyResources(this.txtUserdirect, "txtUserdirect"); - this.txtUserdirect.Name = "txtUserdirect"; - // - // tabPage5 - // - resources.ApplyResources(this.tabPage5, "tabPage5"); - this.tabPage5.Controls.Add(this.txtUserblock); - this.tabPage5.Name = "tabPage5"; - this.tabPage5.UseVisualStyleBackColor = true; - // - // txtUserblock - // - resources.ApplyResources(this.txtUserblock, "txtUserblock"); - this.txtUserblock.Name = "txtUserblock"; - // - // tabPage8 - // - 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[] { - resources.GetString("cmbroutingMode.Items"), - resources.GetString("cmbroutingMode.Items1"), - resources.GetString("cmbroutingMode.Items2"), - resources.GetString("cmbroutingMode.Items3")}); - 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.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"); - this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; - this.btnSetDefRountingRule.UseVisualStyleBackColor = true; - this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); - // - // labRoutingTips - // - 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")}); - this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; // // tabPage6 // - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -449,6 +287,7 @@ 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; // @@ -520,15 +359,13 @@ // // 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); this.tabPage7.Controls.Add(this.chkAllowLANConn); - 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; // @@ -540,9 +377,9 @@ // // 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 @@ -562,52 +399,17 @@ this.chkAllowLANConn.Name = "chkAllowLANConn"; this.chkAllowLANConn.UseVisualStyleBackColor = true; // - // txturlGFWList - // - resources.ApplyResources(this.txturlGFWList, "txturlGFWList"); - this.txturlGFWList.Name = "txturlGFWList"; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // // chkAutoRun // resources.ApplyResources(this.chkAutoRun, "chkAutoRun"); 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 @@ -638,24 +440,11 @@ this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.tabPage2.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.tabControl2.ResumeLayout(false); - this.tabPage3.ResumeLayout(false); - this.tabPage3.PerformLayout(); - this.tabPage4.ResumeLayout(false); - this.tabPage4.PerformLayout(); - this.tabPage5.ResumeLayout(false); - this.tabPage5.PerformLayout(); - this.tabPage8.ResumeLayout(false); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); + this.tabPage2.PerformLayout(); this.tabPage6.ResumeLayout(false); 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); @@ -675,9 +464,7 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.ComboBox cmbprotocol; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox cmbprotocol2; @@ -686,14 +473,6 @@ private System.Windows.Forms.CheckBox chkudpEnabled2; private System.Windows.Forms.CheckBox chkAllowIn2; private System.Windows.Forms.CheckBox chkmuxEnabled; - private System.Windows.Forms.TabControl tabControl2; - private System.Windows.Forms.TabPage tabPage3; - private System.Windows.Forms.TabPage tabPage4; - private System.Windows.Forms.Label labRoutingTips; - private System.Windows.Forms.TextBox txtUseragent; - private System.Windows.Forms.TabPage tabPage5; - private System.Windows.Forms.TextBox txtUserdirect; - private System.Windows.Forms.TextBox txtUserblock; private System.Windows.Forms.TabPage tabPage6; private System.Windows.Forms.TextBox txtKcpmtu; private System.Windows.Forms.Label label6; @@ -710,29 +489,17 @@ private System.Windows.Forms.CheckBox chkKcpcongestion; private System.Windows.Forms.TabPage tabPage7; private System.Windows.Forms.CheckBox chkAutoRun; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.TextBox txturlGFWList; private System.Windows.Forms.CheckBox chkAllowLANConn; - private System.Windows.Forms.TextBox txtremoteDNS; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.ComboBox cmbdomainStrategy; - private System.Windows.Forms.ComboBox cmbroutingMode; private System.Windows.Forms.CheckBox chksniffingEnabled; private System.Windows.Forms.CheckBox chksniffingEnabled2; - private System.Windows.Forms.Button btnSetDefRountingRule; private System.Windows.Forms.CheckBox chkEnableStatistics; private System.Windows.Forms.ComboBox cbFreshrate; private System.Windows.Forms.Label lbFreshrate; - 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; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.LinkLabel linkDnsObjectDoc; + private System.Windows.Forms.TextBox txtremoteDNS; + private System.Windows.Forms.Label label14; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 78d4eeff..d1262268 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Base; using v2rayN.HttpProxyHandler; +using v2rayN.Mode; namespace v2rayN.Forms { @@ -18,13 +19,9 @@ namespace v2rayN.Forms { InitBase(); - InitRouting(); - InitKCP(); InitGUI(); - - InitUserPAC(); } /// @@ -68,25 +65,10 @@ namespace v2rayN.Forms //remoteDNS txtremoteDNS.Text = config.remoteDNS; - cmblistenerType.SelectedIndex = (int)config.listenerType; chkdefAllowInsecure.Checked = config.defAllowInsecure; } - /// - /// 初始化路由设置 - /// - private void InitRouting() - { - //路由 - cmbdomainStrategy.Text = config.domainStrategy; - int.TryParse(config.routingMode, out int routingMode); - cmbroutingMode.SelectedIndex = routingMode; - - txtUseragent.Text = Utils.List2String(config.useragent, true); - txtUserdirect.Text = Utils.List2String(config.userdirect, true); - txtUserblock.Text = Utils.List2String(config.userblock, true); - } /// /// 初始化KCP设置 @@ -110,16 +92,10 @@ namespace v2rayN.Forms //开机自动启动 chkAutoRun.Checked = Utils.IsAutoRun(); - //自定义GFWList - txturlGFWList.Text = config.urlGFWList; - chkAllowLANConn.Checked = config.allowLANConn; chkEnableStatistics.Checked = config.enableStatistics; chkKeepOlderDedupl.Checked = config.keepOlderDedupl; - - - ComboItem[] cbSource = new ComboItem[] { new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = UIRes.I18N("QuickFresh")}, @@ -145,12 +121,6 @@ namespace v2rayN.Forms } } - - private void InitUserPAC() - { - txtuserPacRule.Text = Utils.List2String(config.userPacRule, true); - } - private void btnOK_Click(object sender, EventArgs e) { if (SaveBase() != 0) @@ -158,10 +128,6 @@ namespace v2rayN.Forms return; } - if (SaveRouting() != 0) - { - return; - } if (SaveKCP() != 0) { @@ -173,11 +139,6 @@ namespace v2rayN.Forms return; } - if (SaveUserPAC() != 0) - { - return; - } - if (ConfigHandler.SaveConfig(ref config) == 0) { this.DialogResult = DialogResult.OK; @@ -265,36 +226,12 @@ namespace v2rayN.Forms //remoteDNS config.remoteDNS = txtremoteDNS.Text.TrimEx(); - config.listenerType = (ListenerType)Enum.ToObject(typeof(ListenerType), cmblistenerType.SelectedIndex); config.defAllowInsecure = chkdefAllowInsecure.Checked; return 0; } - /// - /// 保存路由设置 - /// - /// - private int SaveRouting() - { - //路由 - string domainStrategy = cmbdomainStrategy.Text; - string routingMode = cmbroutingMode.SelectedIndex.ToString(); - - string useragent = txtUseragent.Text.TrimEx(); - string userdirect = txtUserdirect.Text.TrimEx(); - string userblock = txtUserblock.Text.TrimEx(); - - config.domainStrategy = domainStrategy; - config.routingMode = routingMode; - - config.useragent = Utils.String2List(useragent); - config.userdirect = Utils.String2List(userdirect); - config.userblock = Utils.String2List(userblock); - - return 0; - } /// /// 保存KCP设置 @@ -340,9 +277,6 @@ namespace v2rayN.Forms //开机自动启动 Utils.SetAutoRun(chkAutoRun.Checked); - //自定义GFWList - config.urlGFWList = txturlGFWList.Text.TrimEx(); - config.allowLANConn = chkAllowLANConn.Checked; bool lastEnableStatistics = config.enableStatistics; @@ -350,27 +284,10 @@ namespace v2rayN.Forms config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.keepOlderDedupl = chkKeepOlderDedupl.Checked; - //if(lastEnableStatistics != config.enableStatistics) - //{ - // /// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application - // // Shut down the current app instance. - // Application.Exit(); - - // // Restart the app passing "/restart [processId]" as cmd line args - // Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id); - //} - 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; @@ -388,75 +305,9 @@ namespace v2rayN.Forms chkudpEnabled2.Enabled = blAllow2; } - private void btnSetDefRountingRule_Click(object sender, EventArgs e) + private void linkDnsObjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - txtUseragent.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.agentTag); - txtUserdirect.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.directTag); - txtUserblock.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.blockTag); - cmbroutingMode.SelectedIndex = 3; - - List lstUrl = new List - { - Global.CustomRoutingListUrl + Global.agentTag, - Global.CustomRoutingListUrl + Global.directTag, - Global.CustomRoutingListUrl + Global.blockTag - }; - - List lstTxt = new List - { - txtUseragent, - txtUserdirect, - txtUserblock - }; - - for (int k = 0; k < lstUrl.Count; k++) - { - TextBox txt = lstTxt[k]; - DownloadHandle downloadHandle = new DownloadHandle(); - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - string result = args.Msg; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - txt.Text = result; - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - - downloadHandle.WebDownloadString(lstUrl[k]); - } - } - void AppendText(bool notify, string text) - { - labRoutingTips.Text = text; - } - - private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); - } - } - - class ComboItem - { - public int ID - { - get; set; - } - public string Text - { - get; set; + System.Diagnostics.Process.Start("https://www.v2fly.org/config/dns.html#dnsobject"); } } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 2d85641a..f0757e7d 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,34 +117,992 @@ 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 + + + 15, 192 + + + 102, 16 + + + 35 + + + allowInsecure + + + chkdefAllowInsecure + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 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 + + + 1 + + + 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 + + + 2 + + + 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 + + + 3 + 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 + + + 4 + + + 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 + + + 5 + + + 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 + + + 6 + + + 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 + + + 7 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + + 8 + + + 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 + + + 9 + + + True + + + 206, 29 + + + 53, 12 + + 11 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + protocol - - groupBox2 + + label1 - - 2 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 30, 176 + + groupBox1 + + + 10 + + + 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 + + + 11 + + + True + + + 15, 160 + + + 126, 16 + + + 9 Record local logs - - 634, 460 + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 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 + + + 13 + + + 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 + + + 14 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + 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 + + + 16 + + + Fill + + + 3, 3 + + + 648, 421 + + + 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, 427 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + True + + + NoControl + + + 342, 17 + + + 0, 0, 0, 0 + + + 107, 12 + + + 40 + + + Support DnsObject + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 8, 41 + + + True + + + 638, 356 + + + 39 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + True + + + NoControl + + + 8, 17 + + + 281, 12 + + + 38 + + + Custom DNS (multiple, separated by commas (,)) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 654, 427 + + + 4 + + + Core: DNS 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 + + + 1 + + + True + + + 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 + + + 94, 21 + + + 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 12 @@ -152,1922 +1110,340 @@ 4, 22 - - txtKcpwriteBufferSize - - - txtuserPacRule - - - 2 - - - False - - - 18 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - groupBox1 - - - 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 - - - System.Windows.Forms.Label, 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 - - - 3, 3 - - - 598, 16 - - - 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 - - - Only open PAC, do not automatically configure PAC - - - 12 - - - 662, 60 - - - 20 - - - http - - - 7 - - - 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 - - - 12 - - - txtKcpmtu - - - lbFreshrate - - - 1 - - - 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 - - - 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 - - - groupBox1 - - - System.Windows.Forms.TabPage, 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 - - - 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 + + 654, 427 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 + + Core: KCP settings 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 + + 2 + + + True + + + NoControl 15, 110 - - 5, 11 + + 198, 16 - - 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 + + 33 Keep older when deduplication - - 3, 3, 3, 3 + + chkKeepOlderDedupl - - 236, 28 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Bottom + + tabPage7 - - 3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 - - groupBox1 + + 161, 84 - - 125, 12 + + 58, 20 - - 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 + + 32 cbFreshrate + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + True + + + NoControl + + + 30, 87 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + NoControl + + + 15, 62 + + + 576, 16 + + + 29 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + True + + + 15, 38 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + 15, 16 + 246, 16 - - tabPage6 + + 23 - - label6 + + Automatically start at system startup - - 111, 24 + + chkAutoRun - - panel2 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 21 + + tabPage7 - - label9 + + 5 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 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, 453 + + + 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, 463 + + + 662, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 0 + + + 662, 10 + + + 9 + panel1 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + 2 - - label14 - True + + zh-Hans + + + 6, 12 + + + 662, 523 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + 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/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 81c0d92c..0618fb5f 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -120,43 +120,19 @@ 取消(&C) - - Core:基础设置 - + + 161, 12 + + + 支持填写DnsObject,JSON格式 + - 222, 16 + 336, 16 底层传输安全选tls时,默认跳过证书验证(allowInsecure) - - 53, 12 - - - Http代理 - - - 关闭Http代理 - - - 开启Http代理,并自动配置系统代理(全局模式) - - - 开启PAC,并自动配置系统代理(PAC模式) - - - 仅开启Http代理,并清除系统代理 - - - 仅开启PAC,并清除系统代理 - - - 仅开启Http代理,不改变系统代理 - - - 仅开启PAC,不改变系统代理 - 96, 16 @@ -226,107 +202,27 @@ 本地监听端口 + + 648, 437 + + + 654, 443 + + + Core:基础设置 + + + 654, 443 + - Core:路由设置 + Core:DNS设置 - - 3, 89 - - - 642, 481 - - - 634, 455 - - - 1.代理的Domain或IP - - - 628, 449 - - - 634, 455 - - - 2.直连的Domain或IP - - - 628, 449 - - - 634, 455 - - - 3.阻止的Domain或IP - - - 628, 449 - - - 634, 455 - - - 4.预定义规则 - - - 全局 - - - 绕过局域网地址 - - - 绕过大陆地址 - - - 绕过局域网及大陆地址 - - - 19, 26 - - - 244, 20 - - - 642, 72 - - - 77, 12 - - - 域名解析策略 - - - - NoControl - - - 351, 14 - - - 201, 23 - - - 一键设置默认自定义路由规则 - - - - True - - - 5, 49 - - - 383, 12 - - - *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + 654, 443 Core:KCP设置 - - v2rayN设置 - 156, 16 @@ -351,27 +247,30 @@ 允许来自局域网的连接 - - 227, 12 - - - 自定义GFWList地址(不需自定义请填空白) - 180, 16 开机自动启动(可能会不成功) - - 用户PAC设置 + + 654, 443 - - *设置用户PAC规则,用逗号(,)隔开 + + v2rayN设置 + + + 662, 469 确定(&O) + + 0, 479 + + + 662, 539 + 参数设置 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs new file mode 100644 index 00000000..56ae1ccf --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs @@ -0,0 +1,159 @@ +namespace v2rayN.Forms +{ + partial class RoutingSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingControl)); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.btnExpand = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.cmbroutingMode = new System.Windows.Forms.ComboBox(); + this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtUserRule = new System.Windows.Forms.TextBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.btnExpand); + this.groupBox2.Controls.Add(this.label4); + this.groupBox2.Controls.Add(this.label1); + this.groupBox2.Controls.Add(this.cmbroutingMode); + this.groupBox2.Controls.Add(this.cmbOutboundTag); + this.groupBox2.Controls.Add(this.btnRemove); + this.groupBox2.Controls.Add(this.txtUserRule); + this.groupBox2.Controls.Add(this.txtRemarks); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // btnExpand + // + resources.ApplyResources(this.btnExpand, "btnExpand"); + this.btnExpand.Name = "btnExpand"; + this.btnExpand.UseVisualStyleBackColor = true; + this.btnExpand.Click += new System.EventHandler(this.btnExpand_Click); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // cmbroutingMode + // + resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); + this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbroutingMode.FormattingEnabled = true; + this.cmbroutingMode.Items.AddRange(new object[] { + resources.GetString("cmbroutingMode.Items"), + resources.GetString("cmbroutingMode.Items1"), + resources.GetString("cmbroutingMode.Items2"), + resources.GetString("cmbroutingMode.Items3"), + resources.GetString("cmbroutingMode.Items4")}); + this.cmbroutingMode.Name = "cmbroutingMode"; + // + // cmbOutboundTag + // + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); + this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutboundTag.FormattingEnabled = true; + this.cmbOutboundTag.Items.AddRange(new object[] { + resources.GetString("cmbOutboundTag.Items"), + resources.GetString("cmbOutboundTag.Items1"), + resources.GetString("cmbOutboundTag.Items2")}); + this.cmbOutboundTag.Name = "cmbOutboundTag"; + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtUserRule + // + resources.ApplyResources(this.txtUserRule, "txtUserRule"); + this.txtUserRule.Name = "txtUserRule"; + this.txtUserRule.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // RoutingSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox2); + this.Name = "RoutingSettingControl"; + this.Load += new System.EventHandler(this.RoutingSettingControl_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtUserRule; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.ComboBox cmbOutboundTag; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbroutingMode; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button btnExpand; + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs new file mode 100644 index 00000000..2637aacf --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs @@ -0,0 +1,76 @@ +using System; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public RoutingItem routingItem + { + get; set; + } + + public RoutingSettingControl() + { + InitializeComponent(); + } + + private void RoutingSettingControl_Load(object sender, EventArgs e) + { + BindingSub(); + } + + private void BindingSub() + { + if (routingItem != null) + { + txtRemarks.Text = routingItem.remarks.ToString(); + cmbOutboundTag.Text = routingItem.outboundTag; + int.TryParse(routingItem.routingMode, out int routingMode); + cmbroutingMode.SelectedIndex = routingMode; + txtUserRule.Text = Utils.List2String(routingItem.userRules, true); + } + } + private void EndBindingSub() + { + if (routingItem != null) + { + routingItem.remarks = txtRemarks.Text.TrimEx(); + routingItem.outboundTag = cmbOutboundTag.Text; + routingItem.routingMode = cmbroutingMode.SelectedIndex.ToString(); + routingItem.userRules = Utils.String2List(txtUserRule.Text); + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (routingItem != null) + { + routingItem.remarks = string.Empty; + } + + OnButtonClicked?.Invoke(sender, e); + } + + private void btnExpand_Click(object sender, EventArgs e) + { + if (this.Height > 200) + { + this.Height = 160; + } + else + { + this.Height = 500; + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.resx b/v2rayN/v2rayN/Forms/RoutingSettingControl.resx new file mode 100644 index 00000000..7c33a91b --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.resx @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Pre-defined + + + + NoControl + + + + 733, 164 + + + 119, 20 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 9 + + + 127, 53 + + + 75, 23 + + + 127, 87 + + + Remove + + + txtRemarks + + + + 24 + + + 23 + + + RoutingSettingControl + + + 162, 21 + + + label1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 28 + + + 7 + + + proxy + + + 77, 12 + + + 362, 21 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 12 + + + label3 + + + 127, 21 + + + True + + + 0 + + + btnExpand + + + groupBox2 + + + 12, 87 + + + 2 + + + cmbroutingMode + + + 255, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Global + + + 71, 12 + + + Bypass mainland address + + + Bypassing the LAN address + + + 4 + + + 640, 21 + + + Fill + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 25 + + + groupBox2 + + + NoControl + + + 47, 12 + + + True + + + btnRemove + + + 0, 0 + + + 29 + + + label4 + + + NoControl + + + Out Tag + + + 27 + + + block + + + direct + + + 75, 23 + + + NoControl + + + 26 + + + 5 + + + groupBox2 + + + 6 + + + Expand + + + 1 + + + groupBox2 + + + groupBox2 + + + 588, 68 + + + True + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + True + + + Bypassing LAN and mainland address + + + NoControl + + + label2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 733, 164 + + + 8 + + + Top, Bottom, Left, Right + + + 12, 57 + + + cmbOutboundTag + + + 11 + + + Remarks + + + groupBox2 + + + 3 + + + True + + + 12, 25 + + + groupBox2 + + + 301, 26 + + + 47, 12 + + + Rule + + + 10 + + + Domain or IP + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtUserRule + + + 0 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + $this + + + Use custom Domain or IP + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 640, 46 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + True + + + zh-Hans + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx new file mode 100644 index 00000000..d95c2560 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 619, 46 + + + 扩大 + + + 53, 12 + + + 出口标签 + + + 65, 12 + + + 预定义规则 + + + 使用自定义域名或IP + + + 全局 + + + 绕过局域网 + + + 绕过大陆地址 + + + 绕过局域网及大陆地址 + + + 619, 20 + + + 移除 + + + 567, 64 + + + 29, 12 + + + 备注 + + + 53, 12 + + + 域名或IP + + + 709, 160 + + + 规则 + + + 709, 160 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs new file mode 100644 index 00000000..5a87e09a --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -0,0 +1,151 @@ +namespace v2rayN.Forms +{ + partial class RoutingSettingForm + { + /// + /// 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(RoutingSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnSetDefRountingRule = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); + this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.panel2.SuspendLayout(); + this.panel1.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); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnSetDefRountingRule + // + resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); + this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; + this.btnSetDefRountingRule.UseVisualStyleBackColor = true; + this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); + // + // panel1 + // + this.panel1.Controls.Add(this.btnSetDefRountingRule); + this.panel1.Controls.Add(this.labRoutingTips); + this.panel1.Controls.Add(this.linkLabelRoutingDoc); + this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // 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); + // + // 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"; + // + // RoutingSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "RoutingSettingForm"; + this.Load += new System.EventHandler(this.RoutingSettingForm_Load); + this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; + private System.Windows.Forms.ComboBox cmbdomainStrategy; + private System.Windows.Forms.Button btnSetDefRountingRule; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs new file mode 100644 index 00000000..0b145a04 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingSettingForm : BaseForm + { + List lstControls = new List(); + + public RoutingSettingForm() + { + InitializeComponent(); + } + + private void RoutingSettingForm_Load(object sender, EventArgs e) + { + cmbdomainStrategy.Text = config.domainStrategy; + + if (config.routingItem == null) + { + config.routingItem = new List(); + } + + RefreshSubsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshSubsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.routingItem.Count - 1; k >= 0; k--) + { + RoutingItem item = config.routingItem[k]; + if (Utils.IsNullOrEmpty(item.remarks)) + { + config.routingItem.RemoveAt(k); + } + } + + foreach (RoutingItem item in config.routingItem) + { + RoutingSettingControl control = new RoutingSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.routingItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshSubsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (config.routingItem.Count <= 0) + { + AddSub("proxy", ""); + } + if (ConfigHandler.SaveRoutingItem(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddSub("proxy", ""); + + RefreshSubsView(); + } + + + private void AddSub(string outboundTag, string userRule, string routingMode = "0") + { + RoutingItem RoutingItem = new RoutingItem + { + remarks = outboundTag, + routingMode = routingMode, + outboundTag = outboundTag, + userRules = Utils.String2List(userRule) + + }; + config.routingItem.Add(RoutingItem); + } + + + private void btnSetDefRountingRule_Click(object sender, EventArgs e) + { + config.routingItem.Clear(); + + List lstTag = new List + { + Global.agentTag, + Global.directTag, + Global.blockTag + }; + for (int k = 0; k < lstTag.Count; k++) + { + DownloadHandle downloadHandle = new DownloadHandle(); + + string result = downloadHandle.WebDownloadStringSync(Global.CustomRoutingListUrl + lstTag[k]); + if (Utils.IsNullOrEmpty(result)) + { + result = Utils.GetEmbedText(Global.CustomRoutingFileName + lstTag[k]); + } + AddSub(lstTag[k], result); + } + + AddSub(Global.directTag, "", "4"); + AddSub(Global.agentTag, "", "0"); + + RefreshSubsView(); + } + + private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx new file mode 100644 index 00000000..9c08b219 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + NoControl + + + + 568, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 68 + + + 765, 545 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 475, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 613 + + + 765, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Right + + + True + + + NoControl + + + 319, 17 + + + 229, 23 + + + 19 + + + Set default custom routing rules + + + btnSetDefRountingRule + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + NoControl + + + 10, 42 + + + 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 + + + panel1 + + + 1 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + Top + + + 0, 0 + + + 765, 68 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 765, 673 + + + Routing Settings + + + RoutingSettingForm + + + 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/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx new file mode 100644 index 00000000..dc3bb7b1 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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) + + + 添加(&A) + + + 确定(&O) + + + 一键设置默认自定义路由规则 + + + *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + + + 77, 12 + + + 域名解析策略 + + + 路由设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index 30fcadf5..b23cac62 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -29,27 +29,38 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); - this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.grbMain = new System.Windows.Forms.GroupBox(); + this.btnShare = new System.Windows.Forms.Button(); this.chkEnabled = new System.Windows.Forms.CheckBox(); this.btnRemove = new System.Windows.Forms.Button(); this.txtUrl = new System.Windows.Forms.TextBox(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); - this.groupBox2.SuspendLayout(); + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.grbMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); this.SuspendLayout(); // - // groupBox2 + // grbMain // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.chkEnabled); - this.groupBox2.Controls.Add(this.btnRemove); - this.groupBox2.Controls.Add(this.txtUrl); - this.groupBox2.Controls.Add(this.txtRemarks); - this.groupBox2.Controls.Add(this.label2); - this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; + resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.btnShare); + this.grbMain.Controls.Add(this.chkEnabled); + this.grbMain.Controls.Add(this.btnRemove); + this.grbMain.Controls.Add(this.txtUrl); + this.grbMain.Controls.Add(this.txtRemarks); + this.grbMain.Controls.Add(this.label2); + this.grbMain.Controls.Add(this.label3); + this.grbMain.Name = "grbMain"; + this.grbMain.TabStop = false; + // + // btnShare + // + resources.ApplyResources(this.btnShare, "btnShare"); + this.btnShare.Name = "btnShare"; + this.btnShare.UseVisualStyleBackColor = true; + this.btnShare.Click += new System.EventHandler(this.btnShare_Click); // // chkEnabled // @@ -87,27 +98,37 @@ resources.ApplyResources(this.label3, "label3"); this.label3.Name = "label3"; // + // picQRCode + // + resources.ApplyResources(this.picQRCode, "picQRCode"); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.TabStop = false; + // // SubSettingControl // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox2); + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.grbMain); this.Name = "SubSettingControl"; this.Load += new System.EventHandler(this.SubSettingControl_Load); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); + this.grbMain.ResumeLayout(false); + this.grbMain.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox grbMain; private System.Windows.Forms.TextBox txtUrl; private System.Windows.Forms.TextBox txtRemarks; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button btnRemove; private System.Windows.Forms.CheckBox chkEnabled; + private System.Windows.Forms.Button btnShare; + private System.Windows.Forms.PictureBox picQRCode; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 9836be5d..652e389e 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -1,6 +1,7 @@ using System; using System.Windows.Forms; using v2rayN.Base; +using v2rayN.Handler; using v2rayN.Mode; namespace v2rayN.Forms @@ -11,7 +12,10 @@ namespace v2rayN.Forms public event ChangeEventHandler OnButtonClicked; - public SubItem subItem { get; set; } + public SubItem subItem + { + get; set; + } public SubSettingControl() { @@ -20,6 +24,7 @@ namespace v2rayN.Forms private void SubSettingControl_Load(object sender, EventArgs e) { + this.Height = grbMain.Height; BindingSub(); } @@ -56,5 +61,23 @@ namespace v2rayN.Forms OnButtonClicked?.Invoke(sender, e); } + + private void btnShare_Click(object sender, EventArgs e) + { + if (this.Height <= grbMain.Height) + { + if (Utils.IsNullOrEmpty(subItem.url)) + { + picQRCode.Image = null; + return; + } + picQRCode.Image = QRCodeHelper.GetQRCode(subItem.url); + this.Height = grbMain.Height + 200; + } + else + { + this.Height = grbMain.Height; + } + } } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index a5dec524..fdeefb50 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -118,123 +118,270 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 6, 12 - - - zh-Hans - - - True - - - 584, 119 - - - NoControl - - - 484, 21 - - - 75, 23 - - - 24 - - - &Remove - - - True - - - NoControl - - - 406, 23 - - - 60, 16 - - - 25 - - - Enable - - - Bottom - - - 0, 9 - - - 584, 110 - - - 10 - - - Subscription details - - - True - NoControl - - 12, 25 + + grbMain - - 47, 12 + + + 60, 16 - - 10 + + txtUrl - - Remarks + + 6 - - True + + picQRCode - - NoControl + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 12, 55 + + Remove - - 83, 12 + + txtRemarks - - 0 + + + 24 - - Address (url) + + grbMain - - 127, 21 + + SubSettingControl - - 265, 21 + + Zoom - - 11 + + Subscription details - - 127, 55 + + 26 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - 432, 46 + + grbMain + + + 434, 21 + + + 83, 12 + + + 232, 21 + + + Top + + + 6, 12 + + + label3 + + + 127, 21 + + + True + + + Share + + + 619, 200 + + + 1 + + + 12, 55 + + + NoControl + + + Fill + + + $this + + + 25 + + + 127, 55 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + grbMain + + + 5 + + + 47, 12 + + + btnRemove + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable + + + chkEnabled + + + 4 + + + NoControl + + + 0, 110 + + + 75, 23 + + + 2 + + + grbMain + + + 25 + + + 10 23 + + grbMain + + + grbMain + + + 368, 23 + + + True + + + True + + + 0, 0 + + + $this + + + 0 + + + NoControl + + + label2 + + + 619, 110 + + + btnShare + + + 0 + + + NoControl + + + 619, 310 + + + 11 + + + Remarks + + + 0 + + + NoControl + + + 473, 46 + + + 12, 25 + + + 75, 23 + + + grbMain + + + 1 + + + Address (url) + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.UserControl, 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 + + + 525, 21 + + + System.Windows.Forms.GroupBox, 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 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + True + + + zh-Hans + \ 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 95e5122f..6979e601 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -117,18 +117,18 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 移除 + + 分享 + 48, 16 启用 - - 订阅详情 + + 移除 29, 12 @@ -142,4 +142,7 @@ 地址 (url) + + 订阅详情 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index e2001bb5..0f5ca1f3 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -118,19 +118,61 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + + + 448, 17 + + + 75, 23 + - - 6, 12 + + 4 - - 581, 629 + + &Cancel - + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + True - - Subscription settings + + Fill + + + 0, 0 + + + 614, 569 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 NoControl @@ -147,20 +189,17 @@ &Add - - NoControl + + btnAdd - - 448, 17 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 75, 23 + + panel2 - - 4 - - - &Cancel + + 0 NoControl @@ -177,20 +216,17 @@ &OK - - True + + btnOK - - Fill + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + panel2 - - 581, 569 - - - 10 + + 2 Bottom @@ -199,9 +235,39 @@ 0, 569 - 581, 60 + 614, 60 7 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 614, 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/Global.cs b/v2rayN/v2rayN/Global.cs index 55eeea14..7c96ee51 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -23,7 +23,6 @@ namespace v2rayN /// public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"; - public const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; /// /// PromotionUrl @@ -56,10 +55,7 @@ namespace v2rayN /// v2ray配置Httpresponse文件名 /// public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt"; - /// - /// 空白的pac文件 - /// - public const string BlankPacFileName = "v2rayN.Sample.BlankPac.txt"; + public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_"; @@ -97,7 +93,7 @@ namespace v2rayN /// /// 阻止 tag值 /// - public const string blockTag = "block"; + public const string blockTag = "block"; /// /// @@ -161,11 +157,6 @@ namespace v2rayN /// public const string trojanProtocolLite = "trojan"; - /// - /// pac - /// - public const string pacFILE = "pac.txt"; - /// /// email /// @@ -231,13 +222,6 @@ namespace v2rayN get; set; } - /// - /// PAC端口 - /// - public static int pacPort - { - get; set; - } /// /// diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 37a9878e..ddce8665 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -86,22 +86,10 @@ namespace v2rayN.Handler if (Utils.IsNullOrEmpty(config.domainStrategy)) { config.domainStrategy = "IPIfNonMatch"; - } - if (Utils.IsNullOrEmpty(config.routingMode)) + } + if (config.routingItem == null) { - config.routingMode = "0"; - } - if (config.useragent == null) - { - config.useragent = new List(); - } - if (config.userdirect == null) - { - config.userdirect = new List(); - } - if (config.userblock == null) - { - config.userblock = new List(); + config.routingItem = new List(); } //kcp if (config.kcpItem == null) @@ -139,10 +127,6 @@ namespace v2rayN.Handler { config.speedPingTestUrl = Global.SpeedPingTestUrl; } - if (Utils.IsNullOrEmpty(config.urlGFWList)) - { - config.urlGFWList = Global.GFWLIST_URL; - } //if (Utils.IsNullOrEmpty(config.remoteDNS)) //{ // config.remoteDNS = "1.1.1.1"; @@ -152,10 +136,6 @@ namespace v2rayN.Handler { config.subItem = new List(); } - if (config.userPacRule == null) - { - config.userPacRule = new List(); - } if (config == null || config.index < 0 @@ -299,7 +279,8 @@ namespace v2rayN.Handler path = config.vmess[index].path, streamSecurity = config.vmess[index].streamSecurity, allowInsecure = config.vmess[index].allowInsecure, - configType = config.vmess[index].configType + configType = config.vmess[index].configType, + flow = config.vmess[index].flow }; config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 @@ -1080,5 +1061,28 @@ namespace v2rayN.Handler return 0; } + + /// + /// SaveRoutingItem + /// + /// + /// + public static int SaveRoutingItem(ref Config config) + { + if (config.routingItem == null || config.routingItem.Count <= 0) + { + return -1; + } + + foreach (RoutingItem sub in config.routingItem) + { + + } + Global.reloadV2ray = true; + + ToJsonFile(config); + return 0; + } + } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 67a936f2..369fbc72 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -54,8 +54,10 @@ namespace v2rayN.Handler 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"; + private readonly string v2flyCoreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; + private const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; + private readonly string xrayCoreLatestUrl = "https://github.com/xtls/xray-core/releases/latest"; + private const string xrayCoreUrl = "https://github.com/xtls/xray-core/releases/download/{0}/xray-windows-{1}.zip"; public async void CheckUpdateAsync(string type) { @@ -67,9 +69,13 @@ namespace v2rayN.Handler HttpClient httpClient = new HttpClient(webRequestHandler); string url; - if (type == "Core") + if (type == "v2fly") { - url = coreLatestUrl; + url = v2flyCoreLatestUrl; + } + else if (type == "xray") + { + url = xrayCoreLatestUrl; } else if (type == "v2rayN") { @@ -94,11 +100,23 @@ namespace v2rayN.Handler /// /// 获取V2RayCore版本 /// - public string getV2rayVersion() + public string getCoreVersion(string type) { try { - string filePath = Utils.GetPath("V2ray.exe"); + var core = string.Empty; + var match = string.Empty; + if (type == "v2fly") + { + core = "v2ray.exe"; + match = "V2Ray"; + } + else if (type == "xray") + { + core = "xray.exe"; + match = "Xray"; + } + string filePath = Utils.GetPath(core); if (!File.Exists(filePath)) { string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); @@ -117,10 +135,9 @@ namespace v2rayN.Handler p.Start(); p.WaitForExit(5000); string echo = p.StandardOutput.ReadToEnd(); - string version = Regex.Match(echo, "V2Ray ([0-9.]+) \\(").Groups[1].Value; + string version = Regex.Match(echo, $"{match} ([0-9.]+) \\(").Groups[1].Value; return version; } - catch (Exception ex) { Utils.SaveLog(ex.Message, ex); @@ -136,12 +153,19 @@ namespace v2rayN.Handler string curVersion; string message; string url; - if (type == "Core") + if (type == "v2fly") { - curVersion = "v" + getV2rayVersion(); + curVersion = "v" + getCoreVersion(type); message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(coreUrl, version, osBit); + url = string.Format(v2flyCoreUrl, version, osBit); + } + else if (type == "xray") + { + curVersion = "v" + getCoreVersion(type); + message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(xrayCoreUrl, version, osBit); } else if (type == "v2rayN") { @@ -313,47 +337,24 @@ namespace v2rayN.Handler } } - #endregion - - #region PAC - - public string GenPacFile(string result) + public string WebDownloadStringSync(string url) { + string source = string.Empty; 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); + Utils.SetSecurityProtocol(); + + WebClientEx ws = new WebClientEx(); + + return ws.DownloadString(new Uri(url)); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - return ex.Message; + return string.Empty; } - 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 419ba374..95142bb5 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -32,7 +32,7 @@ namespace v2rayN.Handler try { Color color = ColorTranslator.FromHtml("#3399CC"); - int index = (int)config.listenerType; + int index = (int)config.sysProxyType; if (index > 0) { color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index b02ea327..654a7571 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -166,6 +166,13 @@ namespace v2rayN.Handler //开启udp inbound.settings.udp = config.inbound[0].udpEnabled; inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; + + //http + Inbounds inbound2 = v2rayConfig.inbounds[1]; + inbound2.port = config.GetLocalPort(Global.InboundHttp); + inbound2.protocol = Global.InboundHttp; + inbound2.listen = inbound.listen; + inbound2.settings.allowTransparent = false; } catch { @@ -188,31 +195,31 @@ namespace v2rayN.Handler { v2rayConfig.routing.domainStrategy = config.domainStrategy; - //自定义 - //需代理 - routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig); - //直连 - routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig); - //阻止 - routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig); - - - switch (config.routingMode) + foreach (var item in config.routingItem) { - case "0": - break; - case "1": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - break; - case "2": - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; - case "3": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; + if (item.routingMode != "0") + { + switch (item.routingMode) + { + case "1": + break; + case "2": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + break; + case "3": + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + case "4": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + } + } + else + { + routingUserRule(item.userRules, item.outboundTag, ref v2rayConfig); + } } - } } catch @@ -224,8 +231,19 @@ namespace v2rayN.Handler { try { - if (userRule != null - && userRule.Count > 0) + if (userRule == null) + { + } + else if (userRule.Count == 0) + { + v2rayConfig.routing.rules.Add(new RulesItem + { + type = "field", + outboundTag = tag, + port = "0-65535" + }); + } + else if (userRule.Count > 0) { //Domain RulesItem rulesDomain = new RulesItem @@ -470,7 +488,7 @@ namespace v2rayN.Handler 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; @@ -490,7 +508,7 @@ namespace v2rayN.Handler { usersItem.flow = config.flow(); } - + outbound.mux.enabled = false; outbound.mux.concurrency = -1; } @@ -624,7 +642,7 @@ namespace v2rayN.Handler //ws case "ws": WsSettings wsSettings = new WsSettings - { + { }; string path = config.path(); @@ -744,21 +762,30 @@ namespace v2rayN.Handler { return 0; } - List servers = new List(); - string[] arrDNS = config.remoteDNS.Split(','); - foreach (string str in arrDNS) + var obj = Utils.ParseJson(config.remoteDNS); + if (obj != null && obj.ContainsKey("servers")) { - //if (Utils.IsIP(str)) - //{ - servers.Add(str); - //} + v2rayConfig.dns = obj; } - //servers.Add("localhost"); - v2rayConfig.dns = new Mode.Dns + else { - servers = servers - }; + List servers = new List(); + + string[] arrDNS = config.remoteDNS.Split(','); + foreach (string str in arrDNS) + { + //if (Utils.IsIP(str)) + //{ + servers.Add(str); + //} + } + //servers.Add("localhost"); + v2rayConfig.dns = new Mode.Dns + { + servers = servers + }; + } } catch { @@ -783,8 +810,8 @@ namespace v2rayN.Handler apiObj.services = services.ToList(); v2rayConfig.api = apiObj; - policySystemSetting.statsInboundDownlink = true; - policySystemSetting.statsInboundUplink = true; + policySystemSetting.statsOutboundDownlink = true; + policySystemSetting.statsOutboundUplink = true; policyObj.system = policySystemSetting; v2rayConfig.policy = policyObj; @@ -1450,7 +1477,7 @@ namespace v2rayN.Handler else { vmessItem.remarks = WebUtility.UrlDecode(remarks); - } + } } else { @@ -1743,7 +1770,7 @@ namespace v2rayN.Handler //routing(config, ref v2rayConfig); dns(configCopy, ref v2rayConfig); - v2rayConfig.inbounds.RemoveAt(0); // Remove "proxy" service for speedtest, avoiding port conflicts. + v2rayConfig.inbounds.Clear(); // Remove "proxy" service for speedtest, avoiding port conflicts. int httpPort = configCopy.GetLocalPort("speedtest"); foreach (int index in selecteds) diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index 0236c5a8..cab3c055 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -10,23 +10,20 @@ namespace v2rayN.HttpProxyHandler { noHttpProxy = 0, GlobalHttp = 1, - GlobalPac = 2, - HttpOpenAndClear = 3, - PacOpenAndClear = 4, - HttpOpenOnly = 5, - PacOpenOnly = 6 + HttpOpenAndClear = 2, + HttpOpenOnly = 3, } /// /// 系统代理(http)总处理 /// 启动privoxy提供http协议 - /// 设置IE系统代理或者PAC模式 + /// 设置IE系统代理 /// class HttpProxyHandle { private static bool Update(Config config, bool forceDisable) { - ListenerType type = config.listenerType; - + // ListenerType type = config.listenerType; + var type = ListenerType.noHttpProxy; if (forceDisable) { type = ListenerType.noHttpProxy; @@ -43,47 +40,21 @@ namespace v2rayN.HttpProxyHandler } 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) @@ -110,7 +81,6 @@ namespace v2rayN.HttpProxyHandler Global.sysAgent = true; Global.socksPort = localPort; Global.httpPort = PrivoxyHandler.Instance.RunningPort; - Global.pacPort = config.GetLocalPort("pac"); } } } @@ -127,10 +97,10 @@ namespace v2rayN.HttpProxyHandler { try { - if (config.listenerType != ListenerType.HttpOpenOnly && config.listenerType != ListenerType.PacOpenOnly) - { - Update(config, true); - } + //if (config.listenerType != ListenerType.HttpOpenOnly) + //{ + // Update(config, true); + //} PrivoxyHandler.Instance.Stop(); @@ -151,11 +121,11 @@ namespace v2rayN.HttpProxyHandler public static void RestartHttpAgent(Config config, bool forced) { bool isRestart = false; - if (config.listenerType == ListenerType.noHttpProxy) - { - // 关闭http proxy时,直接返回 - return; - } + //if (config.listenerType == ListenerType.noHttpProxy) + //{ + // // 关闭http proxy时,直接返回 + // return; + //} //强制重启或者socks端口变化 if (forced) { @@ -177,10 +147,40 @@ namespace v2rayN.HttpProxyHandler Update(config, false); } - public static string GetPacUrl() + public static bool UpdateSysProxy(Config config, bool forceDisable) { - string pacUrl = $"http://{Global.Loopback}:{Global.pacPort}/pac/?t={ DateTime.Now.ToString("HHmmss")}"; - return pacUrl; + var type = config.sysProxyType; + + if (forceDisable) + { + type = ESysProxyType.ForcedClear; + } + + try + { + Global.httpPort = config.GetLocalPort(Global.InboundHttp); + int port = Global.httpPort; + if (port <= 0) + { + return false; + } + if (type == ESysProxyType.ForcedChange) + { + SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); + } + else if (type == ESysProxyType.ForcedClear) + { + SysProxyHandle.ResetIEProxy(); + } + else if (type == ESysProxyType.Unchanged) + { + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs deleted file mode 100644 index 23bf8087..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using v2rayN.Mode; -using v2rayN.Properties; -using v2rayN.Tool; -using v2rayN.Base; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 提供PAC功能支持 - /// - class PACServerHandle - { - private static int pacPort = 0; - private static HttpWebServer server; - private static HttpWebServerB serverB; - private static Config _config; - - public static bool IsRunning - { - get - { - return (pacPort > 0); - } - } - - public static void Init(Config config) - { - _config = config; - Global.pacPort = config.GetLocalPort("pac"); - - if (InitServer("*")) - { - pacPort = Global.pacPort; - } - //else if (InitServer(Global.Loopback)) - //{ - // pacPort = Global.pacPort; - //} - else if (InitServerB(Global.Loopback)) - { - pacPort = Global.pacPort; - } - else - { - Utils.SaveLog("Webserver init failed "); - pacPort = 0; - } - } - - private static bool InitServer(string address) - { - try - { - if (pacPort != Global.pacPort) - { - if (server != null) - { - server.Stop(); - server = null; - } - - if (server == null) - { - string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort); - Utils.SaveLog("Webserver prefixes " + prefixes); - - server = new HttpWebServer(SendResponse, prefixes); - server.Run(); - - } - } - Utils.SaveLog("Webserver at " + address); - } - catch (Exception ex) - { - Utils.SaveLog("Webserver InitServer " + ex.Message); - return false; - } - return true; - } - - public static bool InitServerB(string address) - { - try - { - if (pacPort != Global.pacPort) - { - if (serverB != null) - { - serverB.Stop(); - serverB = null; - } - - if (serverB == null) - { - serverB = new HttpWebServerB(Global.pacPort, SendResponse); - } - } - Utils.SaveLog("WebserverB at " + address); - } - catch (Exception ex) - { - Utils.SaveLog("WebserverB InitServer " + ex.Message); - return false; - } - return true; - } - - public static string SendResponse(string address) - { - try - { - string pac = GetPacList(address); - return pac; - } - catch (Exception ex) - { - Utils.SaveLog("Webserver SendResponse " + ex.Message); - return ex.Message; - } - } - - public static void Stop() - { - try - { - if (server != null) - { - server.Stop(); - server = null; - } - if (serverB != null) - { - serverB.Stop(); - serverB = null; - } - } - catch (Exception ex) - { - Utils.SaveLog("Webserver Stop " + ex.Message); - } - - //try - //{ - // if (httpWebServer == null) - // { - // return; - // } - // foreach (var key in httpWebServer.Keys) - // { - // Utils.SaveLog("Webserver Stop " + key.ToString()); - // ((HttpWebServer)httpWebServer[key]).Stop(); - // } - // httpWebServer.Clear(); - //} - //catch (Exception ex) - //{ - // Utils.SaveLog("Webserver Stop " + ex.Message); - //} - } - - private static string GetPacList(string address) - { - int port = Global.httpPort; - if (port <= 0) - { - return "No port"; - } - try - { - 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); - } - 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 - { - } - return "No pac content"; - } - - } -} diff --git a/v2rayN/v2rayN/Mode/ComboItem.cs b/v2rayN/v2rayN/Mode/ComboItem.cs new file mode 100644 index 00000000..e69373ef --- /dev/null +++ b/v2rayN/v2rayN/Mode/ComboItem.cs @@ -0,0 +1,14 @@ +namespace v2rayN.Mode +{ + class ComboItem + { + public int ID + { + get; set; + } + public string Text + { + get; set; + } + } +} diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index fb737942..42c01f70 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -67,39 +67,6 @@ namespace v2rayN.Mode { get; set; } - - /// - /// 路由模式 - /// - public string routingMode - { - get; set; - } - - /// - /// 用户自定义需代理的网址或ip - /// - public List useragent - { - get; set; - } - - /// - /// 用户自定义直连的网址或ip - /// - public List userdirect - { - get; set; - } - - /// - /// 用户自定义阻止的网址或ip - /// - public List userblock - { - get; set; - } - /// /// KcpItem /// @@ -109,9 +76,9 @@ namespace v2rayN.Mode } /// - /// 监听状态 + /// /// - public ListenerType listenerType + public ESysProxyType sysProxyType { get; set; } @@ -129,14 +96,7 @@ namespace v2rayN.Mode public string speedPingTestUrl { get; set; - } - /// - /// 自定义GFWList url - /// - public string urlGFWList - { - get; set; - } + } /// /// 允许来自局域网的连接 @@ -201,8 +161,7 @@ namespace v2rayN.Mode { get; set; } - - public List userPacRule + public List routingItem { get; set; } @@ -317,10 +276,7 @@ namespace v2rayN.Mode { return GetLocalPort(Global.InboundSocks) + 1; } - else if (protocol == "pac") - { - return GetLocalPort(Global.InboundSocks) + 2; - } + else if (protocol == "speedtest") { return GetLocalPort(Global.InboundSocks) + 103; @@ -737,4 +693,40 @@ namespace v2rayN.Mode get; set; } } + + [Serializable] + public class RoutingItem + { + /// + /// + /// + public string remarks + { + get; set; + } + + /// + /// 路由模式 + /// + public string routingMode + { + get; set; + } + + /// + /// + /// + public string outboundTag + { + get; set; + } + + /// + /// + /// + public List userRules + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/ERoutingSort.cs b/v2rayN/v2rayN/Mode/ERoutingSort.cs new file mode 100644 index 00000000..2df23d2d --- /dev/null +++ b/v2rayN/v2rayN/Mode/ERoutingSort.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum ERoutingSort + { + UserProxy = 1, + UserDirect = 2, + UserBlock = 3, + UserPredefined = 4 + } +} diff --git a/v2rayN/v2rayN/Mode/ESysProxyType.cs b/v2rayN/v2rayN/Mode/ESysProxyType.cs new file mode 100644 index 00000000..13f63c7e --- /dev/null +++ b/v2rayN/v2rayN/Mode/ESysProxyType.cs @@ -0,0 +1,10 @@ + +namespace v2rayN.Mode +{ + public enum ESysProxyType + { + Unchanged = 0, + ForcedChange = 1, + ForcedClear = 2 + } +} diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index bc85c18f..9ec65af0 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -35,7 +35,7 @@ namespace v2rayN.Mode /// /// DNS 配置 /// - public Dns dns { get; set; } + public object dns { get; set; } /// /// 路由配置 /// @@ -57,8 +57,8 @@ namespace v2rayN.Mode public class SystemPolicy { - public bool statsInboundUplink; - public bool statsInboundDownlink; + public bool statsOutboundUplink; + public bool statsOutboundDownlink; } public class Log @@ -138,7 +138,9 @@ namespace v2rayN.Mode /// VLESS /// public string decryption { get; set; } - + + public bool allowTransparent { get; set; } + } public class UsersItem diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 152885aa..79c9ddd1 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("3.29")] +[assembly: AssemblyFileVersion("4.0")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index f21638d7..2088590e 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayN.Properties { // 类通过类似于 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 Resources { @@ -70,16 +70,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] abp_js { - get { - object obj = ResourceManager.GetObject("abp_js", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -130,16 +120,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] pac_txt { - get { - object obj = ResourceManager.GetObject("pac_txt", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ ///toggle 0 diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 706454a0..2aa66967 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -157,15 +157,9 @@ ..\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 diff --git a/v2rayN/v2rayN/Resources/abp.js.gz b/v2rayN/v2rayN/Resources/abp.js.gz deleted file mode 100644 index 0577c7f5c14d22f0a4f0c744f3284da191c04cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4467 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 F007W`%bNfI diff --git a/v2rayN/v2rayN/Resources/pac.txt.gz b/v2rayN/v2rayN/Resources/pac.txt.gz deleted file mode 100644 index 7f621cb7468cd724fc93df9c7b4b386516c3973c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44429 zcmV(zK<2+6iwFqO$mm@J0B~VrE_8Tw0F+(pj`KVb{*S~xAS4i{cDK9xe(Zt}XOIvQ z2#^4AQkuAlw>f=r(r&7X8{-F;#4YfQlV&{QlmmzDn`g$36dK%rM5Gvb>>S|lbJ7m0nA0;x9&R+54r7&VZTkA>LD$g z^V!zf_z)!i;upU7g;UZYgXUxW()Ygf<-h&y*T4DIAO85azkT_;H(EE8#)0;yFMi=m zU;6TuvPRCYpSHViZ@>M#ecnBM`CAj|n&h={`|Y7)GK?ON*;uXDC)5aWKgJiu7`(fLk7GR&$$Ew-e(wywxOuS5Lx?W?h*c3^6G@TPK+#8b%&b(~)Nx9wQ zgJlk7(^PxYR~?-(yoQ+Q>{NNJMJ4P8>FvZ8F2@)>i%yCvi- z##z|6Gc;ye*qZpL=#0Cx>9VA4iLwTxr9!x1zGZ~kD&JZ}?E`aHpPnCs^sY$o z;aOFTqW`S`6<&g@)N9V?^LC63cZcF@yrRfa+m-MIqz))1D%%TdC64TrYDht=( z6HMFm3T;l9%Oy6HLj>4rWz0I04)~~IaD8dI6^5CTCi9Sw$D-okcaHncW}Bo=%F$U_ zK-9)Jwszyvs+E&&iH|9pI`13f)~A@tU1s|0C0ToBuCN=6~R7>zRqy zh|->9m*~%1`?($Ea`c{@(8+Ht&rmMr96+VrcS$#j#P{H|HFa$iXe%dQGaQHaW|Nka zP!`~&MOSjNFCDS8SUdeioiJ|d42z!X{l|i)xhlEH$>4b0H*)SPjdkc{7}OHB2ZM!8 z%^7R0f2D5GpIp(L?{vay=<>2n%bHgx>DZNaQuYgStX|nKwgv{sg;U_Q&HfV6!Ci`vG)D|CnPSiI8 zcTuiQlZ_V*)g<#Z3U%Q^Rbdg|=FN$L;Uc8c>XdT_+E(M<$etD>H9A;RpKWIDG;zI8 z{Wzo{$Ei%Ssce^|rTkdbDb~Rci5hgMRsv%*yzH6#=)Gw>+Bz*Q!QF_{+6iF2g?YedQCIb7c#|XHvY`fdmLuM`)$u>9| z>8%2XlaXa^s@i@#oHv?UOO#mSJ0W}g;0L!l!oDKkE_6=PCUw?yVaMOjP}t$H2|HqI zbsS~dq9SSB^r2`uzmO($YWn{C!2Fn|cCRvv5rZi$#1!}W=QPn=c*X9fMCt`ylG$Su zRtRL8)b^v^AI%aRKiY8gvAl#W_aH@ahgUdkM>cXIgWSG#sE)142307(^g5H!H+_73 zJaATpJz`jkd|c^wiV~|(xXOgpBB5YDfrKEW_z^fA(UgF7@^h}dRergY-AT41{!#U6gW?inp|fx1)drS*mh%RsYAQDwR!(! zX;pbhi-&cBsZ+H317}#Zt~vB8IhoW|+mmlqX2(YQvN+JQa-W`O z^s~3^XLx?w?mm0u@2WSOm;CeHw|BRp!gzZ5{M(<}(`lEye@f?J%T)W+4X>X+eV#|@ z8jA@y6;S*7{+2vuZ|PgIrRUGz-pBn5^CWvi>M6H2uVOxY-eP{ZV7)r4f&aWo+Kp=l zj6LkvH&1u?UY>Wm$8CC8fVVu6?=n}XB`q8sil79Q7dKPk3*uVp}|!(XW$tm!@cI5=!(9sW2g zclTZmSUIP#b3PVQTbQCgu~P^q9a2ruDlLAxQ2m4&`_mpB^7SNj^+jHm}>Jw5iIW zGiC#IBx&>nSYV5G#Q#Mbc=7Fkl@r?jr{`y>A9_4Vt>{g=d}?fJW_f`L-H4vug>|2! zka;(&9T^=^8#Sus)XG7Cu5K$aT8e$6M2Uo6T#!(X-Xc>U^Q6p7t-&S+hs-syE86zp zww4FVJBbOtORMGi-M%X&0R|nuWok0UJ|t6PYtp1QnR;(Yz2j2Yv_Pd)MrK{oXWF?! z85to7+^UWV_)>+`=mu#fOJ=ti0fil^mEKsPM#J4A(rza0peJFJE49z^MLvBD7udK& zsO(YGj+zubf!P3s^nsk105IfhRYt0bGtHxk~W5)8`2N|GzlkkY!@njVkq;&givkvn2e92+~Dk+Xii94yQS?NR#$<4K42#qBf7tTF1N%W z(9XlJT-ybg1?Ddom{pc&UsF1(@i@{9ZwG{fkIT7e%u24$IuiPS-C;>H zw=p}Zn{dE0tDAOr)J;iKVn(VVl(;Sa9nk!V)PyAu{sB@EZE-byIx78dEd0uKbUH{- zFiz_Tp#~MTe8Sjo&*5XUBIqu-V4PYpW)y8cA^eK>3HTT zh_LNpn^u{iMEkuQJhx{it0U}H#Lf_>qMmJ>9EJ?9lodo?qqe(DF0)Vq590Bh9LEqq zKMhCaOZIt4eW}K*!B)Q(U@NjrQtZZ?Q4YfjGFTO2Hw9@u)TAGW2 zMf~_AA5E{=yG#JC>e~>Y9=j93h!4X_=-d+&4Ag&EjPg)oe5u$Nr#6-ZfL>r=1jk3h zPEftvK=~N7tD#R5^vfWYr$h2N?Bh-n>Uya>AjK@TrpEfT)ez?A<#h~+u65|!o#)|a zDuU@kkj(x%sNlpq^QPa>Sy(t0^6qt-4}59{sV9bzKahEOdFJ+GEX>ay&tkTM4Aeu* zT6``*Y;&nrB5hqupYYPt})K?fO5B*7|s+vlrLM0`vS!Br96hi|Uvr7#6OB{;N zlQg4EyYx&(WJ>g;rp}-Qj=pLhbPQZX_O(U-4H+Sql635K;>ip|U5r&j;I;qi6-JP-;%?o5FMO^N8~ub26d`nD5i$ zB>X5S%1mkeRla{eX56II^{Za$eZht ztr7kg=4_Wfe>;CaCr_XCN%CJa{O`=!bNc*Tq`5tt)AN7H?|#e940&19puUj+$7Ez*-V)$uvJqK+5ooF zSp>CW>{z!+Hj@>y%5#XGx%@1Ha^WB{d+ChaImGVtE&+0dH`QUkt?dn3<&(yw*VAYJ zg`M1@a@Nk?EIn>?`kpvZF+^CX;^o9;j5!lwbPO&_x7UxA37&4Jk&L+ghf0xT87fqP zP_*lpZP%-P9j)Z?xx)&k^~o@cA>;NK(g&da+&9|``%N;K_-uPS*DE)jA!in&%^r1& z@?p$mU>t*@TlQ<}k#%%uc8`yuu3tX;?B&z5RKM+0uRG#r7>LoaKg4|oGi=1wF$=0s zy)T(kC0Q~`+(!9TEo78;^wrn`*3CBZ|BVMtvd%+puUXevKQU;`oA1VOe~J#+lST1> zCUDwSX%!oAAPGmX=z(|iO!-v26PyPOP{`}_${O?bH#h<@?^Tzn+KX1Rb z{l?cHZiQSjD2@^I-fBqrdK&D%4>l!@Zr_nlZ_<%Xmo!T&x@KD46hx+PD=>K&c6M?l zj;S4aT(96Xc!re(u+0&r0fVm7wA&9;g)(9=6i@Js-hWaA>nsk(Q4#3EaYh)pf*<}u z$>xMpiv3U~o$~B7x7RXa+6unn3VfG`N7Kx$-%YM^4(qt$t(|6^R1h&dC@%_F!dNWb z)DDt&GOF7{ac{JbCT#?qvGS0JzL6i&PMlbop2moH&df4g9gqDaH$3g4IDL4X+VEV zf7C#wfkp$mPEWe%vl(QxD1L2T6|owA{TmZ6EsRMD0R`qF*W>^r5r`WIOMx&Hh&TbG za@dbw_lN5~hoQxF|9;&&*i9gS1FX35zaG;3H9cI@981qNwXg$)P4+dV^FsQ&Khxjz z=>K+CKgRsu(*LcmeuUBAqw#+|PwB3HMA6Dc|KBEu=_j9l?DW%3KZF0-XVXtH{nXP> zGyQba&&B_w&Ga)&KcoN2CeWnQPd@$h{^#&MEuqEqW2c{qRvi7$`&75mqUfcTGx@+5G zdjpfnYd2iGGwj@OG7ghSSS4QF5iWCASHrmQ>N*&)UHk0X=hyyt?MwJ=!Q2sM71zGM z4(@u&uc+43a6P-PV~}pY@t_ulq$OASdKGP|2yR#5uD|U7V&WuY$8fX8>_@sc-Gm|+6&-^Gptq%X%tPiLatM0R<##m3C3>9n6ALi+Hw*`cnsTK0C~=*6+x;xsMSebDGkZd;2odz#z&UIg#tdV_2~%iYe3u+dzk;5~7BVA? z#Y59Do{|;2^i?j%g#~ZrhFkobZHrDu+z-r-UTckuUN~SZU|L2tL4sGu?xd@j{#aV|Xl?;P z3Pfp5nCnN?8&<%r!?>zQ))^w#?zGh6?jsb_E6UlSMOx0|y+74w>5&m5KCZ&eQIipU z-a&d%WZxQQ-L@`m!<6&$QruAa7Cc}}V+?9XDgExDvR7=Wc&(B%Vr;t>t?fTxp{w9L z`z+7!43|+Pw;nl9PkbtyP*6!kq;QIUCFvBBaD?|siZY+~5}!1;8Z&JK9bzPlpdwCZ ztIFn`pOqq#cjk%U>fP=mtTBmAW0Xt9Sg9cjuNGAY+%O}kun`o0Q0>wP>i5SLtWH+I zKE_L@d+eWaRw+y{z%1lhLH*g0-l^0(L&i{m9@Rih60a1KA_#gd+J zEVVJ(w?NlP*ypXFaCknFANUI8yk7ywG+BYOeeIGJ_z+`cn4dQIvsq07%bj&X-mSbB zl30fIB#kKrX2CTWAs6t;n>89{jxI)z2+7&3z?CyAty02f5w?`YN=8-E;BaB>#Y!mngZRG$uT1O`Lf3_*c9*@UL`jpYIbezS{h4CX%7$Np-uN4n24?O^WH$-2fz68R4-=kr38BG#cCI$=^v1={Xm zf-xqAa3ku^64s*MDt$JOSkOhrWUsB5v>!&!h9cwTnM)S!L2+avLr1vELEDP5$K{?Z z%-2#?BNZ>A&qHX0Gly&3Z+)L+NyZ;;zHnA4fGRl6r0DRn`Z zg~LQJAPTpzNJNzN`86!Z%kCED$&Unti5fUDsPFIL8v)E3DuzCLeVqecF3`81mBwj7 znC088oje8@>UZC6WwO^f?s<%bNq4VU;zu-!bWz&9wok1DVDWaI>XEcA25;A zbf?6MV(J?=nixeb`gs$mU!FGbiJTf^fiOT0!{ii=&kNw!4~s~QY_4G<3Bm6*wG)t84E;$@HwlR8oaTLuu zsMIIK=XZKoJo&(XVb{f6)_h1ei|5^^QU=a=ewq_8@>!=mY@d@)NtkbfxGw!kaL`R0 zPtkyQo`NfN!vf$W0AIE|_Jf@3UiKxO)nIWKj*TxkL6JVcWX>B$Zn_6|b8#7oDr?eZ z)RX?`)8pBwA@*rU<>se%>F@PvS0bE)3gZ@n3**zbF?*%_`1Z!V`%_{odkjtCKiS8f zNNydDFzhGsZfu~V_BGiurchi237nlda4h5`F!Y3P&*iJUEr+9_o7WzSrH`8f* zsYH#}%TA0f`MiC5#7y`2xKf#KkFV2ckjH{=n2WoqFEey%osV+2>M!xHRM^+;t2gLN~+OtB{cFdV;zUV*|;KPCezZ-bm6bg|~F=ZqPSnTH<1 zHznpnfG>|}YW>v00GyQI;%_#Er66Z>5ILr5sgWUO$`Sm$(v73xD}dv>Oz5N5J%9E| zqV-uyjY&$8z>F_G=fntkIz6 z-yBuI(+C1^HXh(qZ6VU!0A}bCr@|ouqY1oOm1vg}P2!?U6*j`ionReDjv;13`>A*K zQlEy&+R*>PI=Eqx+1*`&pFZ9l1YXfmo?c$JI5|0DN|UnMJqjH7DYVp%DCCebbGY6| zk7mA8lWcbXmCHxihC2T=F;IXNK_$0@q}xPHIxhNu;@~ONd>X<|#bOZ2^Sd`$*sQ zv?&Y0Fw+Uk5OZntJ^W$N8>2hq+s%U5P~OZ#m>?`;wpf0wE0rT1z|V2?nW(N?`dK^d z5P)hZp4Y|@Q<#}#d|3B}Il6t)kts%&gj-0c@jl8q@&z+vW=(J`FY2c(pift2LU2Wj zWGo|K0fx4IP~UmP;Oi7t&R&*Yl;>Pa^8BjxxY0PX8ya+)m%;|}j)s{DtKfq#uTPl? zPK5m8G+lBUI>m2k=2Npd!SzASF^mOl@0d^EJm#j$3Uz|2Ia$@4sL=3ej-qFkZIM8- zi}IL42%C+Ml^M`(6pV$w@gwABYPc}K)_}T2q8AnjA|uM6V)y-bIOs(as+;Q$T7CQZ zQR)J*4DL&zv(^Yj3|OK=k&yF%-t~ZfI?07gx*H2chOJYjG-4(FoK@4c{@f)$1wj8PwQVOMkilf-SYisr$1+a9v28oMC1j zO+_JEYY8{jI`!@SeluGeFz4(TI@^N6R%t01sb}(Lt?pxr-`-Et=ff;mbGdQ&-E`z< zPUH}#ko^bk(R#r2h#n{A+_{jOkJrxvc7Gi#`SJPJ7WM&?AcckvlI7&d_#V!wKFmBM zhD-Q{tw)ixZHHlw7|;9;U9cbC|;3uyJw;m*B=4;kuI_&IX$!U^`w$=ZYuZ=;7*Dv zP^b{4&s$w;-|Rvs(6PRV%3FmTv>>JG8`!jBk&)Qs7ZA?C{r#Y+Yczbz zL2mzgY{8;n^7qiJnh;J*SBv88luuomR_kjiBM9;@z9mC{lj?YNj|U$8&V$Jtv!T1? z!Vfzo$whRc1>s~qO@CqlC!h+zwnUaB+lQfZmS-kU>6t9@J5c?&QGHG>U!h$!RuEc4 ztKma^U}GKXPG%MxFC-sBN5cW4vS5XrwNFNDHn_xu*-G3*iqpPI8f2SZ@XrT-k=Lih)flY|V=b zJxBHKdd&9vl5335Q=_j6Spl=;eW2S=K|0fYyRuMw3PVSOoRQ58E$`oZgG_!rUU*7p zw5Cg9LxCR(g-tK!ZXg+C^yxDm`hue82QNnK8*xGogu1uNp=uO>vwM*U@gBX)kzn&0 zU+><}PvpZCe(67;HeeTWE*&gK!Z7^=u2}UxvS$xAP1c7C@!j{X;BUM`dAw+QD!CQGRb)l zM8W$;eH2tDa;S{3wIWqj+^mOs+GjA}iZHlY9+f!PrNz=-21itr!FY@k($hjp`ii@_ ztvTO4JOt5KW_|3+NLgdyhu7V=xXW^V>U-yHi?yX zxv)r;`M=Q05ry&7HVt0RupT~mtR|KaQt<$LNSgs#g?{-;SVM}|$Dv}TttxIHvy@}Z z!r*cbQ;*{s`Ki6PxRR9`g9O#h>|M%fPdY*!W1RAWby70HT%#E?~RR3$5{aT1!+F!}-Eg_~I_7U4{OCErIWE#2! zh|qWZ1pAq`({sWdm?G!OoBpzr08wcXM2~7NWrUR;l0zd~4}`Oz0{mlS4zr+9R%Gue zN-)wHo@5)RQ<(mwV0X|L`|Z1}k${l_S1Qx|Cf81E*EkS*+WJbg8i+;hBwFn zyE5$V2d_kQH!TxW;Rs^g?cQ~M(W#+x9nk<1W!B3@TWGC-TYqD&;L?bHhFUXXVvzZ; z2)^xv@#hWpF%@Ka{u_xz+Hfp(*3JUdXP)5f%#0TQgX|KY~dys|>xnhgtf+Dx%lqx;qA0qc5 zH8grF$ zWOU44WtVmEdH;uyuq3YYkzJqx%Z076mLIun~(f!SuWFC^3 zy~HG3pXHy@_4LV#ic%#^j z8~k-hu!zBi;eV)q>i@(zRG1cF7_ouobi$I;a{jz*HazXWcgegc!+=r?|0o5r!YTQCXF z92u<7E7J($%-9c+!QFyN)`RhDmjsJ$HezN7VvU*nqrFf%6ViGi#RXd>5|rcMc=^C& zop3*iuc&w@MqCyHXR}-yp_ry<>Lidh4+}MVBs}xaMLCioaj|k-< z_i4<4crK9F3vpKN9Oc`M7iDXm(wP%BhFCG^Y5@5aF^!Wsav||!exJ_oXVNkkAQrT0 zr#s|y78BspAHE;X71*u=4_`hR9h1NvqX>_isE>dY_4E`@J|0@P+q{u<76)3-+hoMb zMuuW^%~p_GL1KY!*mXQa!*wdcIrHfdFXr!Mi;#;K@5`n~COTTLIQjz<`ncdJGGESM z7~n){)=QK71!0!LD1~bTZEt>C{7hO=F81_1b1-lyWuiWM)qlWzKj5SlED;n0No1c) z3jtk6ife2io*uvb`t9eZr4)lG{UH^vK&V$19d6e{i+W)w zWKx@ch6IyKR>~ezw)2*F@;P>s9R3;*+v@3)${e3h7g|b`qU&u&;SxZGC3$7>e|a^! z$BEznLw!t4;zaPhZtkM-*J>iaqeJ^8C-nsd%~V#D-=<`0lUDtjF60h*JM9hCCdh+3 zeYOryUhmr#wV9SHf|3a`Ct95S3EmuaCgbYoU&k#O> z#GmLLOo_f=Wo)eD9-X^%xCX~KXHKV2zW48qz%xsSRRb?^Ovo+i*=(gu@*--K)ZkVF znrq^Zk4c<}`jXN?{$~O-pnjJY=atKWJ7LJ>#>wD82J*gvagGf>GV1@{k;*TsQ7$o! zllfcsn_8t|LY#nug)?Yt(wMZUPkp(=Ozz3t5(|p@Xzys*ok?bmDQAC!8yUq#?}PQ& zqJ5l#Ej;)o1<96w_^_8@jvxN-tRFk~jd~lD7+yOzMsKSIB|)sA6LyK}i%Kyqi_FZ{ z_3JF0+V?5Ft%xWh33PB?!k;dP(Nk#5Arg1AO~BSuw+6+~@#AtblyidCq!_p`+ig+` zAk328QsDoIZDtx|c=a zt7OfrH>LpT3oms?tTi%foH%7oYyYK;KcwWv-FxW}JKi%CLhbkIUd!+O_;L5uivGo= z>aux7P_K$9+sRLFb{!!b^|*llfn_0)3y5s(yQGOQ;F8J@uXiR7;Rlzcfh4KXl?wYwrZw;!KvWP&y+lT%( zIFur2=Ct4BS|tKa6(m4-^JXTT=A|i=W);e;C2ZrHJuKu=fo9P&a`8P+(a{y_s*Pd- zXKKkJqUP&Nnc`#fgle=kv~~VC&8Kii+Tr=rg?FhkI_e$Kf-Ed>u|@?3x429blXncT z>Bg(;H*^&({VC~85#hebn`6lnS)e1(Il%yFy`%F0QHXM{7E8KWtRP)*Jv-$we6|kr zl0a>Zyf@QW=myReqsO{}TRw%qDgr-Pr70$(l-=WJZ{eg<*+uIW_xlQ2_?lg~TaoV?mwy34fnijub`$s97H+{HRNYBam)y_KM~3NU8DC9DWz3`%qYJx~1#pSpV>uK1a@*B*)a^x!O|sy%RXu0^3G{ z$DwR-ma;N?_sz7AGub#R<$^2;$JA8a%FVC3N5Ma7BB&tlvDSj7f0_h3Wpj5^J4ic> z>DnDK8ll^^WmEqTv>vCAq_|E8{jL^!mxAsiRD`-I647!nyoN>{6W7Joezy~lPPUOq zv!Bl6P)U3f@QJ=-#7XBsD20(Mr|rAw7W4Cx z)#q<-anKiu`Y2;+evYxN4=sWook{=#ze>4`@g@IkgFYk>zk^fz*cja2uv%9d3Bse2 z^I+39*&)V_x6o7q7?>2^b48XUCU636w0j2}QY+^cm&F=_JK&HOa#!f4lc<4(uwEZ5 zE(o(EQlgwA_lXbc;S!-veO0EhNL5>c#NZ=IAYbMHU2@dRqv%M?lE~RnHH{x zzaz+PoioK2gY@TGppfZo;Dn+y?RVjl0>g%NGE|s2^n7v;g-6%HDz)F>gkUp2Gr9L6 z4P_rbM>5EHy^80U1|v-6F(C)<^-xZ(xY~H;KT)s|=^z=3e0nU8VO#_2LoHsyW8(@} zdnyQ0ra-o^QX7urT3oo8l9t=-@e%oyQY?IZLH#f%B#Iq$Wt=!be5q)w;Sk1TZ@Y+=hw(xVn z()tn+BOk}>T@nb^2ZxZ#q*ZuJ=s*O`%P6zfNAuz(9Wj$>oY}ELiH3&wTT7PaLaH^2 z`XCs)BfR0&OQ^A&3p1SD>fpBFwZMO)N6s1BN<`-<^JZ9!0Tt1gSAQg-XPA6WYh*ko z%BGPpGWMCAs2cc-u6dtO6czsPeM%w%^+IMKdpTYpvlIt0q(709e|Gc!XQVjGvkC;0 zcBu_pE6Ja^t@r#(9MlcPNLXw=mzOm80Xw@nO3pkR4&6+K>u)y}bNp{k0odEM7@hebV%%%`;2@?gM8@O8y={G!*zTcz~U1k zoY_ZU6rp5wnS$FZs)P7YZtjZ&z|xl@42OM|P&%9FC#9n-SoaRq;Q*^mRpWh2laKhg zd!QTkDy^OZ8Db_R3bd6g&pGYd+G!Ua;ze_WY|)5{oFWyFuY_nMC2F+AQ9QO<99_Z`K@%YA zDS|#m$lM>c(TmAgC$R0tyry7x5Gtt4MNY|PvmCbGwgpVe8(9r&NMR^gkmye_$c)*3 zWszDXnhlNid5Yz1yzgOG&TfQL1T&^y=9p--H}aC*C3;oNvLwgNjiEp=KQClNmK~>4 zP!j>~Y$^fydM!HU{2baNj`< zWHf42*G~_L>|U5$28v_oL*5uzBwLQ;$f;}R00FsuN}2m-(y``#wjreps@Hk*dEYSyWwCHRL=v zi+HuhIs6(I6GEiQV?g+YOgZQ-sA9#&P)-p>b@s#5r^4X|mH667TX4<{hsnuFL7hRn z91&c_bi*;RqCD2^_X0RV0nl8^LB`Zrg%?Y3A6#1Um*kWhxK@(e_ZhugjFz%Z)OBeL zF%wz=lM`-U7BHPR&(8FR=HdC}@!PjjRcQ1w8FU?1bQ42(4a4uqXlgQgo|!0)7y<$r zFk^o;ImVXcIqCgy9cR^Iw;)S1l%0(TnB*j1btNYA_DVi^aSk%w8Xv~J4(9n5@GwK{mo1!D+m13 zuS&})3a3`)r)HYHCoo)byVfhJty*3PPI5W0b%wS4YP9}%qg)Me-#ac7P6pwfT zZnKvnMns8Ipc>{I=s4MbBr}ofEr`>8hall&xA5N~Fnp&>vIZHw#2I8J#tz*|Vr$mG zK2H7K##lGRn2X=scTve_rzZZ&|ALmI$^y|jWUikN7%wsmxq-WO(hcEa2MF|=^vK{y zmlaJg*Ai`S5gJd<3X>;+T>ltjw&SX+7vr3muErsAA~Wq~m;kknw;jD5wlZN-3t-Ay zCwM7elYB7bTL|w}A`)Muf{G~3nq4>(0#+=Xn0AfIfb7`d|D?EGsg-*Zq)q7{IczP3 zT6+D;+mF8T!x!<7AO7qsKm5s8e){PvKl;g6-aajP_enBG*=NY#UKsX`Nj(+qa}3ON z=L0*2n&VL}%Dq>q;e%#Fb_7WIw0qip_VC&699IIGLf(CVysj$ zIV>KI$*Gkq!h$N+CjP=0G!R)mbDQAjAu|*m#0w6SW6gtiF!)>QN8JN#X8uMQ@TdDf zkKf*X_P0y1o~1XW^|o;vQ07#qv&W~WrLZTQM8KA7rMHD7{*Di<`Ek_73C73C=#sRZ z&?x{c2KQnw6~kPX`6Vg(>iiN;2BD;yk7gNclOB2iqxPa7vKqJ5LnGTa*gf@$46lOFG2c|J@A)?@AeuE1Ujqcg1D(Ge?_J&k>&YbmlILp_; z#f1!3V(pnCG5Y}m;V36GkM{+(Ba?SO^B<35QG(p(aKzZjhk@?2vA z;qSJlot%hb;+de(gvTRfxx#FWZ8B+m&x8ZcJz!6Ahg#oD)=rAEnBWo|jMBUjee$Lr z*VB*<#A>OhtIng(&Y_<2=Oz)#QWQgMrN?hAI{iATb(LD1$9S;Cp?6C@f6=E*Yq)3- z+BO~J9g=hcYAPM%hR~7@?sRWoK4HdYq%ih4^)k-(a|;?@LUBXXRiRgb#~EA-*{2o0 zWZq_jcwS7`Im0u(g_OUns^emf$q{N9QCn8HZBy&lSkP1#5R&MF1o#nZSavcYwCX((9*-;;UVXt5P!{@({ z3EG}%O}xE{ap#H{>*ekf1tM+I_P}fmEj(j3$9FlK(7ff4J`ox``cKxFT<u@ivwvzKXb^Rxd{243I7#q-ci@%pwk3`>?k=1hkAUDhFx zPQ21s{LigvB7mb!Zs%2DF=on!f|DKSUJNxWn@Jhi8-z2^uk$06#+xiC<9FCapHVoo zpXTcg;*UA7Lh3;O!6j77BaUE>;&{mpiU!Q{|X2w!%Tr-NSZU7tuyZ7vT8ANcG_hdXep&x5`f6hW?l~Cc8lqp zusM|YbR9Y(qJ&Ajt44TWAA$>GndENX+S#RtqJ4_}R4dF#XXY66@N0#jy*7Z?Soq~- z4spYU&$uTDJ8G%f^J7EyJWQ=%iwF|{i&h%_qP`{y?J?vBL<=D#mLud%1vcTy7rMOe zNE5Uks_{_$o3m@%aho^7Pt#r$u$|p((#=It^oSN{d()z~1trlI*OI7+l)WbOc(L@!B6I9fk;(MVNAnnW+G9%S)mCWW0! z0{zV8~eG`8aS90{cOJ{aDRXzPrmede{cy$F-1M-_h z*N`$?Y=yB-aZ^6xnW)ykS5Dl+0g-k%0HPM!`ZjKL4#UhAuleK72c>o+w1qG!4_V*6 z>gDeP)-=7^53t{9O3^ZkGS2BtWc#*>KLFeL{JS^9f)ci)kUQe{5Llba>}dKhA>oS% zeao5g*TGbwS+Fxkt$+WZEMVF!QaDp4WDPTo&`w-y7j1zRn3&T)3LVy(2=g81pc`M- z!hC(;2dVKY3+YMRCR&H@-W{2CZM&K-||aU896S)BCJTW5Rb>95kmN>?UTfLBmTY ze`M7ShhM&a%jgtJo1F$3r>caMjt9aiR_v;gw>cg~!D|D<0t%t#6-3V_o;mv5B0*-H z8=jP%f;Zu5+n^S#NmuLEAFA@RQ)>C)#4*Pjzc{LXu!Wnw<;@U z?ktU@c`f8~Mz>f^M}DYw%Y5omvP~ldxca=jx|&kql@@)zj#+-b>ptSobGx*%DQj#f6UJLV1VdP)5*ABVcGr1S*LbueR=d~qBeu9k_|+7Qgi z${+eJE16unK@ta*5 z7WuYFKTf;vqqUvH;CEH}p%?X8209*8cKy z9;=m*!UQYFHKA|5*;3@Bt6QQEeXa;gh`M}#gxwh9!nZXe&3^fle5(z3*Vu^^w?UQb z-NtIjI5Q^q7j`X_uzJr>*={-P$+Nv8aaF&3-hX-Czdr4spL6D@5~C3q?QRhOG(oBK zW<-x3pehy+7^h+^3VDkUuoROIK&=vn0cuU|i9~?y^s)_fr6O`|%CW+voO=$UxgKIn z%GqyzRr@x`CVUK$k%FBRUu%Ms1FY;>0v1hT3Nu$lh3#xEo)Kh+ z+RsWrx-b89`1JYk?%wIf;^V9DQf!JH_6Si|3JN2RNhf=DXH1~2RMYZ87zB7 ztDcSIO6#Ov0%%!}8bJ%BKIRd4#4JivNz8xXB;SvNWy~;iJa(!ZmnHoa}1Nn0l z%*<~#2ER)9P4!0KskhGoOUeGu>ZXQC*yNv%#U;DxI2}Js>M?H^45m>PX=ssQvY@Pl zBzpudBoVNjLTE(28ri3?7(JFY!S)Cpqv$k89T`GO2(>lNHJuC6cb0X#6UFH+cudCY zp1?Vz;kMS3==a6<2`x20W-lSR|7r$%pI+cfj#bPGWLd}$ zJht*`Lh6bTsjOV`KYmH98~;Id9-@A{d~lfB(1OKOUGrm(AGPte*}#X>=M6NtGwr_? z84G^7MfO-5tl6MMOFn30c>eVAZHtV<+%y<)t%%ofx*7lYw=rG+0&`u^Z3i?EZ;h2E z_8J1yTX~Z{v>G`z9tznvSKl)RGn!7D_-zB-{;kT)mJ+`Eh)yO&_L&D$wUi;vXFMim zi6!UR<-$Z%_1}^EPQ9i)izbuL*^;*L_Y{iYFC2;B)D{%Sk85n}Ofw>myr_BoRy-r$*vZt zX4M9ZjIY>PYa+pT$xD;2NR>P_Hn_%0w71c%!WS{Dm?6u_;~~HlxyDK>>WAnxck`r_ z%dHXj+JL$$>bT`V``U&1`*88c=yxtoby`Y)H6%T$SWX1RA6Kzzw&-F-`EM97Tga$2 z$rI5JR*8k2nn5dLW{Nd3oI*lrXpr~$T9Bm%?LJxrvLpYB2io63kCCUI&3HqeSQNU+;!YY1Qg zBM{@#%NLIkrN?g0?5fB0rPZBsYsGvd_tc%~Tx(VSfW|Jqk~<2KDK7qOS^J}&nD{&) znUsj`rhWI^xSrMjWXYYPflY+upEE(p3?ZkH;?bx%$QYMy2XEx(+s3*; zYDrfbF(-$S{W(-yFO4h2@0v`5LFPL0V6uu51BK_SoX_$4%k!&zu3GtgqGY74u&1c? zwJP`?gtygr{nS0J3!73HL;v`}NY3IqRXd~1)Hub&C^M~Y0~uu|%xT4?U}8Iy3caKY zVgX8L9)eTOO+oE0Ct z$%*fZL*m_?MqiUzBEz+x3ovbXOe=nZX1m8US3Rb^^^a+-`3c(lV_Nu$aOV~+Ds?8j8JZXAX{HGQ7jset3{@Sy1MzT{#fBZl4f~w;z$MTGVKNlmHRNN+5|`} z#zikph6TuswRw|==xq#QTuOwPPgjdAFsatpziyL8Su|0qaqsgA9aQ_8zJaKtF6#g{ z9t*?ZU9~3A<(}#tpxD>?k7gzyzRQMefcxe0FnUqdm~7K#f%yPAAUTRb(#V)d#I1Yl zb^w~;(Bl`*0nfQ&jOZJ{%U=U%W% zn5(T_nk5>f6Rfo45h$~sgr^{$>z-^l`;kl|2X*B@W)tD zTNj?hV?W;J)0@TT>sLeQQiO`XJud_)7mJ~sEpM?Wm-7~R9+Z#8(_ZRHjrb#dc zrEpU*I|_gS|0f~?gEC$qsFe`?c-KpJRZ99jdpUvc&By{k^3O^fz5GVaF-nFehSf{g zApI6R^%h5;yaGURly69l(^mBY))QA`qdIU+V~~QSM!<5pTJ?LbWx4)6G+IO}Thb!> zO@VSv0y_x`q<>$Kx_hhN#1B*m%5>ezV5RnrSp(cIJWd~OF~Xvn2%&d_iy>`QLaz8p zVr2(=uF-8Yl$|h7Af&g$B4=)O1sKB2Q2Xl!gQv3=ncJY&G+#n#x{&_<{B#IoaiB=4 z{~{gCA@rvG*GJM^ye}7F_8-X#k5T~GgbBn?!G9~>TkUeq1l^~NIzov+nYFj~1kY3VpqL;wXO?P8BfkJldH@c8%qChn1(uALF6Zi@g&veTr6}tdW-m7YQRIff>LTT~H z*g~z$ihd9Xwsp{pdTmd;35_S?PP)!(^wi(z#%skcnb!$>ri|s+;NZ+etvvyi!Y) z4ioZ6zF%{fKs4iiQPve8d2S`407dD2#URx^vES5 zYE^HN;14(Z#_3Q2?o4Kd|wlm$U<%NOFi$Qh!!fdYW*O#n3u828Qu6QJ(vai<&SkCsMSb#_t(yB_Ng`Co`!If+K4=YDAGS;uN&(VB& z-n%Tj^L%ZZ%M>48RZp#55F=at*1Gl|$wzY#&Z*RgRRP9c zh%|s-b``xXl7Bgf`Zxvhd32ILY2NFzTnD#NlAuU`<2gm%D(s`{Jc(zzRoJ=mB?G+< z8DgW34ayH-7&8}dWR=vh&~49N)~?&EET%9@xp~0{wtRamC9HMG>9ZrcYRE!^I&Dd- zDq9q5OACTOlK3%}ZVc(TEI#so!$mRFR8q(lw5%XW?8{|Lc?9s7R(w3bAW>#KQyMUO(Ek)5z4A@(XWcc?1rQ({H%~X_kI(c zIsA?m8^M$Ui^w)=n3)~l$OyD=Mr=FmV8OI|fMG_BDO(j;{^alut+9>t%O34wBd2FS_~BeT(1yH@!i;sajt1xz^f{PwOd+>HRY|qOeW!?RKS|0o$fEF zu3^eKEU7J9`P+}*$IoAr#jV7CDU6ri$UVlXFH8!EB~QMn^QQj(Ll}d@aZB(+d%0zc_McLU8z(46KZ=#-}xN=xqs| z`mI?}t__(ltY84OsXV6av@upTiLju;7_FuJxdHBhoq}sK=mzZu!L@O$N+C9U3{{=R zfb{rsI_W0h!H-JhH6`$2ROVN2WK3Dsvh?j1YbOTk8~GT^p>!@Vv{ly#@a??LT>93+ z#WsroFxX%X9r@ncP<~v}&+g|7M+&->T+wr$g_xjmGr-82g137Eaa4xM0$2o}tykE$ zuP(W?zIlAVLag#jQo*twY;?*4ccJ+sYeVzz?x)r{=^#xY3Q++1yt8q@TKC*>_AY%3 zWY8&^G}0LJ_@iu2HGvDzb=QiyA;*}hRA^_$n~|k)qQY}ak>1$4EThg59Cy#3MEf68 zsEa{OuDt4(d9!5>t#Jx?xYZmAfgD!^k29bnPkS0JF>qS!3E{Ta-I=z zW``wkZLEr_|4SV5C)ebt2eGg*a#qI?jew=WL^Wree4yd)ylirc9+gf%8HOJ*>1e46 zX68`4qu#3?!_nnG7C>?nJdNCBiQ180MY(NMeS^WA7e$9N-G|CHQsOL@ix}FaXxy}i zs1I;8!HOyh@V<*0N}RQmdy-_d#V|?@AvT2BdP=PVvOLm7p`POEv zIC*rUiBKF=wfrP?n#KCWbtXHG^SDgkvmDt@4pI4xl@J`Qa(4&RVd)<><<4yy>*}}Y z`z6IwFwJEh5a%a|L|UbgBrpZ@U$^?KUJ85u&M8xXP5A7ZM)~oAa~teh{J1z!>{EW# z01<XR$SXCxjtuKlJgcZN$|J5ze!~mWI|e5w?>N~F}qcD`X=~hq=6A6ryn{w zwl|@{bS?QA4^F)ZLzLpquG@9;(4FqjLoB@>VL`+e#4~MWtLYeT(#(PG0MgBsC0~gJ z#Sq-PjAbyP4v-&}A{vC)CgT-`Q8xIMoi%JlPkhmRrjz*9)WRth?|Bc`J>|mYViEz% zhY!mzTh;gK8dZh&2cC~)%oZvA}=(7O=8eA(&rpuDD zTQ542#OyvuhYhCrYF&#&@pMvYt5*7tkL})u`!9@^q#GS#uVHm6m$lkiv$5tlY5n2`*jPJD ztLT1mDXUfqG9wmV z&F8OReRntft++LX3l$U`LfteaG^VUeYEw%VXG9;&Fr|BN`sA|=+<6e^n96Ug4g_-r zBGz^G10?4^%+D+~ zyZIb32D@|p3cch@w4d9QO!a?7f4E_W` zA@r!+Urp~4Az*6PMw2REhDT&{;Uf}V?L49Z9^d7tNl^5YjJ2PfhMI=H_SFW8v~OAr zF8G)3pd{+z$iEA6-Qdk2e{4@SzUtMuc&X$Pnuj16!!J<|uR=kiZ1M@GgnjE|Kt%C_ z^P~DgImI4ihh?z_{T5?!J-5hgTf!wb5SFG{{W=bjid(Ax?7F^Mxceu@v{sU z+%zdq=i&ZLcb(DmV-Zlr{DMZj6~beK<0_fJT>1BG!U;?fL~GUC5NT*jW0aUrg^D%= z$bHZ6*n%y|`U7}tm2t#F5}>Z~-93u9$?#Kc+`x00kfdP{H4{oPDVs?(&Yye1x+e(J z$z!T*t!zw{g<^m*>7Etku;g*TM5awY9Fh{(+761`WDvF^!8$8FhO`;*vZM%db79{- zuwZVW2>+x$s7W;(Z=$V(lb$;g07Iy>zupRJf>ySpn7qf8&qQ86pWtFxG1K8z851!o zS(A5Y+6D2ie|@aq83U}}N)x2a6FYr0(h!)&v;FcyphU#`$6o#JH4tiAp{4q+8Q;;W z9Jti#G_r+Uo<(z}V}0IObQKQ9TbsOJWo>J4DgTRoOFGjwi#y($a`1BN0u)!8gVt0# z+6n6%8C1-CK(QX%A}I9a%3WtgjP2Gyhv=(1?}&Cnb6mp~Wc0{kK1EmL6lP9(=e$O; zp024glC8hwZkJwb z>OIF_=AX=iMO%u_9pZ(fX##1ZhqgA0zlJx|c5;v%UwTfKD z$-v|Rkvi&MSIIZ zsJV=wNapn{UQ-B(yA7oV0Lri{`!D!-C4^)4fiD`;c_la{_{e%BTA$(xpkMS&r%?8S zbAZu@LF3&0(2>CU{1KDn*JWG%s3%A?mYrTfdC?Mo_1BZGC!I*2&;E%AIq;u?3uMUY((&>s`zcvH;45QiyU2`d70EA=Ro+ijsU21`SBq!EP0c14Y< z!JkGaq%&YxzNjIp->`dJ+&#BRZA(kHTp*-)i_8~|zQqMr=+l#iX26W{o$q!~V@E>( zdS9th@4AczZZ`}VInd5uK7INmkcO;jWWnaf*%T5_yDLwUr8P#p4m@os1QQyPQHfQ) z!1f~!!LzZl3PAP~AQsw?*GBE^^z9%kzoaPaQkC)$ zbt`}5xifF^Dtfa2T#NzdE3q^JoopV1q=i@*T@Wls^j}w6fjOEG0?`q+_wD!hYGcDy za62Sl7WpL@ld;J5ZRj)#NJ*?=4#F?LSh(7!t=4G#M;q&5Jmx=b#4a3gm==*SdoGQP9|>p{j5;s%awtf&+C;IIPid8Er`pSee*cMp zzS=~!tjGA8ofH~G$+^3YDqy+h%6ugSpC9Luc}QV?Z(K3O=ujIbz!c-!x=Q_&^mWzA z?8korkLRq8!CDRhlcPN;BcojrLcQue*VkyAYBhsuFt#$3H2~7848EPCv$)2F1AHvA zs<187)|?|WLuGs~f_pOWRFjGujJZSwrt^4Hss`d~ zpkHCFy(V0(RGVM|r5j3y76c+fx<8v#Ep2c?h)I|`lQu$UOtbac8du}YelyAoux|hd z^2fQ{!M+M>FnF@rn$Y}~iQH|jk`*(=Oe88B`B*NGqr(Yw066#xLJKoRF@WWBITd!8 zZIMARs}{uMnY?R!q&^o5d|GclI8N5j*_7sBvP7dysxOC6Uk^_&pT2(jyralrhK!7N z;XC=wa097|EGgXq(pw7Cmaa^BGb1{e$^Caa&QdB6MX*8a8eJ+yMcTK%^|IpKT<=VX*l|v;?bNW%+5ypKK+o zv}Ye0PadPM*Kc3b)h&S$!O)w%i&L+hm4U+c%Mv$JsV?8pz%?$XZFDn zZh*;V_tU3Oa(EJ$#1f#G$a2L7O%GlT5zwbkS{_o!_q;Gp04kEALYcL)k@hhouzFQC z8vI(nhNVZ)3=K-M0J_93(LF%hXukEYpv6~;mkZ{6m%3g6@#zT&7PK5gv-!1*u7cYW z>N^s@xdOuCMHfH5#iu@R|bV^NzF*a&H$oB+Bx-fWpdCG@9#`Q8X&EV8pO;@e!xK0U9XP=paYl^m0H+A!P zm{4ygg}gDer&yluunP0nxiPF~H(C>md>FosP6=`=sB1RdGpi+})!_p;c~6+MDL(l~ z*uA@xDF7jvZENRu((K3g=!7n3NqZ@M^xS%DiZX=5wf3s!o9W}$N$)~PC*I-XH2M>!C=`t&JA|w>(3N56Hg>U%&YeF?XPW`RH%K}3v*$n7xeFg) zeF_DH)tk)d6+HDv*|as%3&(X7>btm(#3WHL1tBb_)B!F|x|xILfbE76I@mvMm9gH-m2E^e%WH4Rw$*-Dux? zd4?FzZo@vcqrkvBPS_|&5obEFwvSk+CC{Y_Lj5=1@F3oMfz+Rb0Y>5+4nEX&^QKQS zh@#h6nynI(F}ZRyJqLF$HdSLT<4g^9PjX9NglR@ofFjZ@ul;4sH z%vEAoUyLyqv`LSJZAc*H*iZLElb|$xrnU7Yeazk|VZ)cvlWF>3FV5zQWtce?SnlQ~ zaf#XM9N*s+n-&P3v?F3|^CxnR%Ak0S!*hTY+loR+l%+KS9r*L!*JV8rc(C)mD6}z^ zqkzRG9?01oNPXnf0vgG78BRIo7Z|2f6l{Prza+v zX$j*eI(QrR=kr?2i>_;-uxOI{#_ap%Fehte-O8>s(ni`hV=E`_oK}j@kspQIlWUx8 zS=%`hNw+~RTF!UqXj=GylH?*GTKpwKh9R(8ks#hcNg=Z*TMcAps3L$8#SyEEckzFo zWTo=Tn9`L=vq|(_>pA)z1ESJcTMoLW>SP)h@O{uJu1H{#>Q6#U)4<$V zv2kz{@!8iD7RBs9TfghFT3n@z1JdQ1Rl<=ilrZhK_Xxw!(aDe#JS0I~csKpnB(xJ1 z7|aq6wYDug-qG)$sXMx{m%nBVyORODl|*ryN|$TtPO(x}WoQtcE(aBABf+&9$nV2- z>F-lgQHh3tDYU9KtOjbN4-PWYuJYpIaz;&)k~gsn`?gn1~0Q{5)^G8q(TDaHO}l9ePToc zix-}9?=a(YZIT!+*Z|d14|bq^BP^y;@C~rLG#-;|rN`E_*~qdRVQ#;|HW*tne~vyM zkyp;IpK~VKyQ?^$j-L$c?CJ4TFVW<$eYkfE3nfbP?yuZN;F6PzU%ZY*v&O*oewD>0 zKS>2kZ%R6^JE>&{>L6aQZ8zg*8$}MhRE4KMEz~!XxoXw*8HGoA9#rx|fWFe9GJ6Vz zV|mf%-Hu4D3#3jE)mYlS29k(XJ(bnoQvl!m(2qsq%2}JOimZ0yo-RH5bl_sP1;S4h z7#852u-_)Q(E-S|F~7r~44YjU8kav7IK^_!bc71FcC=)b8s7MTL!3&=(&AU}26NC! ztbQ=2*^>T@XEo4h3#U1wlcRP6q6Gk~v5r2?^WM8o45DH-(7&FF`p~ER7%5L3NgoH2 zQvVyiXu2~-=YPeT-D=GGu7&+xm<)nsFBPQ74g#wzj{USvhJE4X3`*s_8DqVMQ&{E` z8=x@d4e4`-Y1D6iw_$~d=9bl^Qu@Zeo=G6InSE*NO zD%aJqdk7x3j-w2V5s~Tvae0wNF@m%VZRQ* zH3jH4D6mnJpzg}5Q;?6osww^%HC*CHUyebskKadMlK#S#R?)D};n|g?82o@;WmL%a z_VkPWY$K`M(-v?J9-*r5cBS(82KH4l0gwzRa1?a?>{?yrdGM94)la)lW6=&|p{0WfZKxyM&NS7tg#O^?M3?I zr*P~LM^QoNpA^$J)?L>r4*W3HT*>q5hzR#E{S0>|Mjf8YaoBTb?y zWcXB?hE0$)!FLqSY!zKT4AgXIy zg7Vt@yVoxmOz$}ICYKi^U5LPK1(c?8Ax^0wQ4GzpS#<^zbOBa{N{ob^6@FQ%J{Z=_ zDcq<6Q>K+9<}_Ii;q0SXzc0j3Pa659+OZR)nO?u-1CS6?VTNfo?A=m&<9xOZT_M4# znFc5cIHEALEDMRwg5Amun}VC99D9wm`Me{Msvl6~NNT!D$XrB-V<&{Q5r#PsKuT z4ZP|ne6X$yWTqk3jWN_|WmVxvL5NXWbgmIvS_|7yh}89|Myh z1^y#twdM@I^mI?#%LdJsOl(Q5$^?fsn|?aaWp{L9*iaNS!W$b`OM!1)gg!|mydhjQ zjv=u+P;@Xo{WU=p=;bBV8cWEa9A*+Y_oOa9*)n?C->mAj+byp(q`BRhY$$AFDW_Ow z5V# zAJs}Ka9n+>7Y^F82oM&S6f`OoXE=;@mF82z%p3x{888|hO;TBHOd-IAyF10lm%Mg1 z9~&tfnP?~@YmK3%aSgShw}rVs7fJ|AWv-+Ez#I$hJ2p$TK4=I`r0tQf0-GZ}yqCf9 zzq=jfPRX~EO=yXCiEiSO6;KRU25fg8t=x(pfL9>RxB%bXJJsKee6vb-Jm1?}Rf%7< z$~OMpE8$%MX_f)I8Pd&F(7SafdfT1f9?$A-1a;6xF{*mgWxO2}IG8dE@K2^eot?eA zH_Un-kO_`s3&kMn7qbRoJYre)8MbF=#U{SZ7PMT3&bjHr?vEqM2uvO}1I;p?Gr}CJ z@dI~9`WeB!il$zCb(@5Va%+PN&-?F5&%fL#{B`<6_m4c`+V}UO5YrsZKIy(p*nv4J zI@R`OP}0_5Y?A?kPr}}ebdqjnZ-VTqHW6!=g4Ky`e?ahk+suWcW7jz@f$bM<;A444 z>B>RzpH8+aXw+zetMEJ24Brz>cXVsGEBv)@W-&OsSG@;qC6;RNJv8!%tk})N(Tu}W za`$i1h9x9p3I)Ru3u!rm{*uU}6sjPn#UYJcE;5bX(MsLh7K-A1femcq;GIs!CrWln zM7GyWc=B()iFO0kQqu!)C{Fz#+|+^DROLEHk|b&Nb+aXnUwS?9!8e1TT2SZ>;;K}! z45dR|*+NdvdyCgZ4spy5xv%^uTI;>8YT}UL;@2@v7J$ME%Z^CAlVBI8WZx)$2|_4}0;m zbwpWPk!muGg(+L&82lJ*rQQ%+<5X+FrS!i)fwi_0o^I3<3M4POJ4q=zq~8LgMHy;Na8(3bmQx%a_9 zXfGR#c1=2D&EU=>B-^Z1^yAs(_ep@L?h9AcTpQ_4uMn`bZ`B%j`ur>ow{*57vr`D8 z3>6-_4lAS10L5tUYzQu#?WAa=gWb8V+?edi{&?nC=H21x>5%?;a=&)fufDWn_+QJA z%C0>%Sqt90YEt*+(c0_a&~u8^sA21Ul}a-Z*s`2Kd;_@)1esP=J`;Jj6^2*g%ziSh zI+frE9r`-W?WfP+2ucACq_s+<+r+TLn8L~dAM5iv{2Qapw3&K(O#!o0JJ1h?m}x4p z4t5kdPtJ{zGKn7Z3;@3fzP10N&_Mr+{$D9T%)er7|COS+|BFmdNZa_xf#Puq${Up6LHF@b<18<7Hu>n-cbdL90)QhE5i<~*g zjMz;l&djfWn4qhI-}9sY`uUu4kY7}(^CSkCNEjx5lp=6}*0=$m|By6phdA|i_vtAk z7quG1We2#cLJ8cF12WpR@l*c;8xdQlhGl?gf5v{t4nu@p?Am*kP)w7MyqCplpD3=d z!q#B}Wav1opsra}Cr0iT%GfZjN+*?{u0oTz9_1nh=1J~pp=j;ehfShj`mlgLP>NF$ zZ%1=tvb4R_^RILkGGA*>>G-hdgjhtb z=f=8DGR97}Xyp~3cA!L8!=ye4>e^wv&7yED&Z#dFX zqMBp}9OuO41TtfE-4fh8!$xUFyMffEA|Ek1ND0MZf%9q1KsZn2m99Wf(ghjv=H>x{ z$Q5h&UPR&f_RJK~^8W(g4cnVCSdQj)50^&2-O04i2gfMmr?@mYjQ7>PkzAX=y@2Rpe?j~(TBQlw~LgQI?K3I?ySTP?6H}C) z82z3u>({VkrtorJb(F*PT!SU)>Y`L|fYLX%l*+y}NG_xdw^o$Kd8ZmleF~9B8MToT zCM*)&VU1Cgi~OdOU^#HoGJ_t|)i6a@#xe!ray?5oUel zdW|X+0Z=M?ctDE=0g62R11o37bHc7dep7z-zR8`wA5gg{dW09}4DXGK+)rRs%4mV{ z552>@zt6}RWCw4;0R4_bnG0?mPc%U;vuxd3C}3Zs372CC6Z91*^K61xeIVi0!71f9_l z9KJon!yd9)^a5;6AH-t!Hf-h7P%z5Ak+P`c=QEwyC|@NG#ZoLGqH9Svrod@Cu*DeY z-T-9!dWAg<5c9+Aq?cxG9b48UoYUo)oO@VSX2R8NpTmjT&t`2{o}0r@a@^|OpD-5k zc3YjW zVmSm!I|CBdor8_Kj`FP4am^UlN3qrn6whiEwKx%05n(Y-W(ozpDjPrMwNbV?9f%*? z^@rMJ4nnZSBdWyCy*U_2;*g!qSNk3>w$5JXV>kLu>}5hT{5`cA-dG_Cxk=Z zJ%2H;m;2l6LAc-J)h^Z)?&pxw0#a5$CQa{?oEM$xF%RVG3M|Sfj+;;=9mGIGn9@1OI_cJxwghK}hw$N!j@aUzf?MMbscr zZqyl_toR0UzTcVV__R5X-B^EW|lR&%xTo_jxsC*df2q<7*Ka( z0@ff45>9Qaerc_$qC3%<>P^M_(m1obGTkheIaGOw@WzJT4iuSKHl$}^MnIBlFiM+8 zZ3rs;0zUjMqGf8}z!P;VT})14=4MAOW%QyPEKTEzaaf0z{P7>DU8UFZeM0>aXFkjR zmkg?*@EGs?kuNOtk0XgAg^!($@qTg0R5quP^I*-KS2b&a#*|i4-J7IjTl&uD+Pv>U zacA}8dzd5?DwK5sG51OIS>abVD0!$a)N{&fQQ7jWadgBn|CoTVGsc{yOO_sd(9TJf z)o*sCwo?XH*+EC=WK^=Atpt2LHsiZ0${;h6XV%NeiyePeN#k0`BBk`Y@6wK?SZ6zc zT(l1N{3*=E7_*%k56vAgM0C;3Vxs03SBs(k_9QE%XmV|%s#7r7hPC(G1CRpewS5La zF3v-V&wv=F4C!`6T!raV3Cub@A@cQk`^UIfe>nJN5WPofwY(rf&_Lz`*EhY-! zDhX2*CAmKwO*3{2c?=F@dP}r2PCJm%`XdM8;yQ_aIJ!_D<az3t`46?S_(Pd^Un_^FN{1d?%^VGMv zz(`y%#g|H)X28d3eu4o%W0>ybXH8!y@%n&3u%o@Pne>lph@k2JI@VrqP%j+>SYKkB`%u6t5|O!B&gkv$(Su zPn2JxlQ*~$WmXTlPBV_J8^)(s1-lR$VXoP>YOn#q=+PsDK`z=oeS3P6MLY68)v@r_8;2L#RIX_tc@9dB=TEZHlq_Y-3`|pq`4ZITd37P} z#d(T&1v2C6JFG!K(88=4*XTY>Rc9yV{|9D;GkbHSQv=6;-~wG)7-`o$g~5ih6cHFW zT6%u0o!(!+riBhSSl*IJz|h)p=WTaxh@A#G6_lC*n?giTL@8c>MZRc7g=J zV9ag|TY;Bz3Nzn?^SlIv`ZGlu2-r4hXnA3s3{u)g-+HdNw5@zo>6f^G@_n}IrCBFf zkE-bDnp(}noFE;pPh-SY539OeZyo77ta7GWQ@98me+tKGl`)yr?)xMctSe*u3sSE(V-H!W{%m z<$*a$Go#&=cV;xqW7p%5eD-u}X1Aw%wDuZEDoN$)usy$SwOVhf)sjNzU)(3iMX#&_ z$g{Mygd-MTnR(J&mJ|=MG7|&6*&tJ}BRqHTaLa?c`w{}rE0yut6Ty->3?(B#lF6pB z0R3QM6rKqwXB{l<7AJg80`3BUP!3R45MoV{c$Q#9=&-`#h_7lp7_nullnsP~)NPgc zDw;|aSF#9GIkc3jq9T?Rqv|)~-V>A(0;V9eajYlYxWiClHN2}tBuqKWXz*BeNh{qm=i>7IFR4>LI0EXv0V&7?hh5)F?eSDPCx6xny1erwS@J4>;ATgjw`X zpksEMJP=@TN=z}8`~iGtvFJnrwqjX9SeMP21Olz7Nr^_^vaAjfj%ux%2eVgyxgE7p zN9bz949|IbeNQEi)HGU9-wB`Y(pIB$JOf{jX?Y5yiK_h(OpG<9NvAd(&eN`TeDR6M z)RxTg-9c5Md#?o{psaH*-BJGTRfgm{_4oo%&v!BLcA+w?WWMfCQyb zzO^P1h&48Ws1-I*MWFL^DsGztN;+}g1H3cTTcA5PpEjSNVq~V9MCgQ0Cj`qB ziL~Dp3&GMw2xBQ`Oae_BiKVpcdq<~pTX)|K;xK3CYky92J@*a_qT-gt#r9#aCfDx6AqKaVmSYu{YXPj+x)4i}{%af(ElNJyYrf0r$#@@|10wDr@z zJ7XrNXa)yWC=23fjOcgqCb$jnfa3T6{W zeG$khvoN%I){jk}xlIaRuKCFhrrW-|V3qb&ndm%`>mEiBz0g#VU;=e+aN}0Q;ApPf zBvLB_Ehu%{vpFR=^i zst-zS$Qy|%!*QvL-_E~=L5ie%zb`^_74th^WK5EU1;_3o>2GTNKG(30zPk#t@cS493AI_wm8^B5b zV0#xN#w0Sn6Jcr8qIjkh+mjKEe zJ%?peuQ=l@EOu}_Gh%&9k6?GW31zGiI(zu?A~C~66JO@5DI5m2RE=Z9J(W5bu}$*S zE<6zH=2CBzDUZ?a^tV?%U}-1PT>-+*YP)mi;C>&R%5^EAjnEx(KkL%Ml<(7*HnF%$ zX9KMeckE2j2mwf4tCR<{kqudDEW33Sfb7BEa8Xc*%*Aff4ua}aufnrc zk||gY^TV7!!?y;^I(;U5IVUT6ZIy6di@iu`GFpRS#|i;EDzV%~Ku#%9j2CX-^=3>bAP=9gLTrkEZC;&1@v^B!OXJT08eP$b(q$jB=Q0ZpSK5$`hj&|#Sy729zb zW=yVti5VJNWMG~)dh_(f5#hFi-b6YG3K-a0C;z-f00`v(lvmoVztm0=d3vOEbim_U z=M(3g#tl_?b3-#+K$DT;B$0yH6e>pUQ9)8E&|Gs%c@eTBv;gR&tm0YKtyRTGXx(fE zR8+iH0Fc6Pl2?%VQob+Auo@$eNB}l@j<}Q&y^J|(L zH1}`{Hv3>0#FZu{LOLvA$UoyM;2{uUEMrr$@9B(vnv{LIM;92vi-QCb030ktCjAHq z?S#s8#6r0ZHmV(XG?`}*_S`DrvE_jcjL(%>kcho^3XP$}T1@Lud8e3Onmf!^Vx_XB z;*#XZNr;qtuFR>4jE8n}=%Ye6108O^UllMmg+NxpJ``(rZo`wAp>-F~B>3tNa|Vm6 z65s9&w71u2j|SDT=1(+x-RBrs&c(S~=Sv6y19|4Sg+_S(tT_|trP@%%f*>{`5VB`9 zz2~|SX|z(&L}Fe(Pi#^0)6)RriA3a;+bZ*_wNn(lM8(Uvbny_8y4)#yEDsPRkMskS zWjdc}or!(93n^99Ia22No{O5;`npk$ItX=R-$15FFg+8YEGUyGkxIm3))O&|*h=*E z6K>Uhyg{veoQcC+G`^$3?vUazV-9_*mGu;Nz9*)K2NGP1#XKS%t!^adgrtrYJ}bwP z=Ip+LcRh@KtIQnv*bRXqV?57tT!`bfi?xicPL%2K#&gYY_ea)qPY*>ng&vogs50*6 z$4D6wy9pG3Arqk>=DR-({Wdl4^^v)`w6K7_Z@ML1x>K+-bP^dH?c`ykL5y1yy zg?tXndJqpM(WnzkqEe$o%vKd;Pw09$O^Q_NbtjU107<5z6gEUJI5v4vj?G+;Z5-Q0 z|2pZWcN~vthpRJ2#CR+*(Hxvq-dP}Bhr`sAS4J{Sw6c=AZ6^(cvYMizVh0KRj4Vru zIIaWsDsu~Bzab^8CAEaHaJy^aiHat|Q$SK=kXbL{^(gh~9MAFo@xGF!Nrt*0W{wi) zRC!buZ)dicI9o)hU_DnE*QYj0gv1_(EhrY{%-6^y4veYI%c(F%ELPWxtdKIt8$cKY zx^^u;i&}9nRe=D@*%>!m*P*q%5WG;PGeuE17Yv}!pQNy>2Z$&(8(@pmj@^qa1tZ32 zct97;VXPLtU@$*aNu~mE?89A=T9iOt$Xn-i66D>tY5DiCdMFO^a{w5EC`t>@@Js{> z8|b`uD@GOWoT^M*!0!QvMIMfUyII1H3I%<%ymQ9+RszrJA;(ciVifK@eE7hl>9k62 zLZGP$)x^3}wPS@21@)-L_e)0Y<{pWP@Wj*5P!hzG)N8(}>H-kVW{Ban>cls;?lKI) z>^ZtsO)QUL8sV(a9i$U^KFyisw1W9am3QC1lt}Xp6LMBcZX6(>nuTx*g?29y!Dp#j z{RxK%)=?mfa|H?O-u%xn;yUX#f+{g#bCt|L=-@L3US0Ua@~TClPp``sYoQ%s+-9&0 zA0@suIwwj=g(<1yt-xd+#x~L7KF}7=5J!((^d1$l2$qYeRBiA?+rrvNB?+%A7g44* zu4m3yk!OMF&J4pi$`QlYJ$Oo*S24)NO2TsA0Z4fT^H*m%>F}32YHnDev#LZqgSTje z+B2AXrf2~Z`hbFwWpzia_i_CIp%ku7dJiFRB1LD}8H&+#)#dzi}lp-KeD4+|l zE2k=G7GddKp{hIwGGs1BL3vOXQ3oeErMv#DBxML9Cf5|n@0`cDh754`KA)%UtbDCJdM_;A-O`{G*Tp0;UC-I~md$uWC2Q(eOjbXh=K!Ku!ZT2W0p(q@e() zBG8{sKMDq&Vu{C^qU^{eFFP45)2RnUUY|)*ka;LPzi+f}YPOCJc$Itk6Qy#Ku@*bO zlZ#oVK!8Q1a4n-i?mc`U5S_S(9tl8y_?^>Cuw~lvSA_v9WW~gam4-R-Mxf4TkHWA&y>z=I91?{O=v0}vjW7;K?SDK0XK^S z!$h&*&A8o9ex4WrZ3A(IqX!&1EYfA`|0^j8ly|oulprx$8M~Wuxm}Zm`>y!sMRkfn?h^r8Z<`v0{WX-8_k*8_M*2fM?jh++64y?r{05$Rn zK6vA%+$z^#R3T_UX&=b5YK!nK2TBb{*JJAhbo{6}a`D6yWZIp+d^Gq~xL*w>oJap>!sB@Xfu zb0)6p0uYU|c*#(Uz^entDJNv@xntwbvlXVfzKY52MvMRElfbtZm(du>lyzB^4zvpx67*BB@z3X z=w~GYEMmBW?p&>ATJUwC!~_3bjM!A@%$%P3Cy6o$FB^#yJA7rzy`3-QgkpEG2LXTw zyL$5QmLXrSKtvHFQjro-5k_o$TL%DnMz4hm+@tJbcwbh+Z%QOL`+3T3L-!tIHjb0MR7@QBSw7)Xp$buMNl5+zon<4E4b!3ZLN1X@2$iS~Dn z3FWNSj9-nh27<{m9x(B!G&fRvfFzTfBP~p%IWFf05&;&zRfv{ziOq9mbb)V&7rgQ0 zNh!+KmoL?3UY*x{f*FeT)HmBnGbg0+jnOW z22NF$3pJorGuI``Fg_Y$HlOKSR!ESfXNj8d&VQlDxEm1aw7}B^hHWMRkvE=&Hi3;b zzuFkUDZ7yn0BDO7SLe7mlK?Ih=z{>^%iPq;M55grK8u3H;?)~ajf7T-!O4~Ois;i8 zpsdCyS+ymUr6Yx|p?^@)xrreaRLra^{YfzDggUEqXv8r;0TXjwfvrhclnCa`MHwp2 z=!bL;Lv;*eo(w+YUc!z!vnDM&*6Lv^0s6&Bq&=q5g)XzIDC&t4>vtr??0z8N#V5A{ z(Gg1!`Oc@Nw!-fnP@D2GQ(UJBOaxIGOjX(J7V<7t;KZ&~iH}h70SjP_%tfq9lkxy2 zgKl3H1xKxLh>{3=_H$X zD@!+Y5zXycj&2;?zw!9DHy+-(adh{_gC{p0+{Hf*pWb-5d*kTf#^Z-K9z1q`9Nu_v zhYS~N`?4QhpDwB`AlT#3!BhtNStIQMb>#tLs@*Nd%la}ji+kaBWK~?4SnkCFH(o4} zOpRF3uZCt3=ca2S579PUb$5!Ry%!{6m^9tmEXQ_aN+YsqNlUr$AR z!JDK>@il~OYE#Y63nRrn`K!4IKTH>PAVV#KOltQcRY!ITAUlx+81y3rx_XGA(&Rb{ zYC6l=fis00Dg5$UD7|n>BVFX&#A>k>Rhd%v!`VsP1<6=M*u>;m1D=#}+}m7VR2q65u#WJEtFgj&loxC?0aTtS2TsV~Nd>%&@zk_sOW(1nVzHIO zaSA(3M#QLC1%o@v!Frrm zD`1k;e6Aspv#CmYI~x*oq70Ndn{pr$P8BZAC4371`j>Sx3Ne2)$_fECP-any=xsQK zg-UvwNj!ow=zdT2nYf@8QLO2SW>CUsz`n5Xbv~^Wj}icKI(5AffRH;DFH3OW#GCpa zHxMwgB@nqZzIkB)$&}cE%xT3HPeIL;+*Ww>btP{8cSc(D7vp-Nn^m`YnR6)a9W)5& zE{ugj)5P8 zT!d-rGu-pDn!@hg5gljuFG)Wyq?u+7P$A>gScYCk(9`9aZ4yZSAy-5zrTnm_Ia^Eka&v}0Oq&Y z!HBJ19yHu_4ds?^01)w(UdlK_WqeMUr{)jYu@7>v# zZ#@7?7nn0ldhh_cv&J!&k%%4Vt1!t@!WBkR`qD5zs(=TYh6|QD6A0G^L@drM1uCCl zl}K%3?0wm!1cD_KE(Xl^l`RSmWGAE>n;df%ffmG9nLB6{SCbBmq>wJaq4l5aI4HN;xAs1RHSzU&562RMkiDKEdv2 zcYm~ZFv1<5oe(DEfzFqb%V~G32rvIm44;G}c8;S_$v4h`5W~`3s8ppizaXp>T?>Sr zLo#{LIljIW>ze22B3sa)RV?h)hEo=^d%Tb#lOl?`Jm-`1@RZq1&Zqc*6*puO z#@Hr-jg4Rgv~=?-vVRaMW|vUAhA^#I{c+f-5r<+46`>au#4f6kOm`v9F=A`xDknnkaHv zI$A!&Pr`5q%ci^+F{zm4Nd#ErNCrsOoTX#vObG`+iJ&LH>q>#woO9M>(K*?3Zlj4x zI!7tbZDIq<+LKL{u5z348Tfj5f+mr4!N*L7vpQleJ&Q^hdfxEx_M9yq+?~Za;8QEY z=DF<&gm2UNY+rQgmS&L)4~=tZ9Wl)-`=5bPwj%)$@nnbxfstH~$1IvURVHC|v_20X zGM4jD<)vkv{=I`luO5z4&tC6_&%VF+qJDVyuYdZXc#+(Vqr;YnU2Ug0C)VOB>?V7l zI-A-6#xs?*2IrgXILyaK?W}b9ePjPAN8Br+fpZA_uzHc?!=2p^_<&N;G8G!VH*Xed ztQR_1$u4sU04jBaA9KhZH_vffvkTzUp&hqJ6`Pt(QxFW4i7J6Lk3Cr*dd|Sr85huc z*uG|fM_Id(MupDjCe&@V3ZYT#$7j=Zc(RtTyOy%ImU3q;Wq&Ot3j8GJ3g;(=QJ!~~3{s#Lk8v` z^L=V&+S}@6#<5`Je@WC)qOyWm91j+I%oj9Bf-1e`h^CaE{^b3)KmEy1e=@rH)1TZN z98XO#z&)Y?{LWNf4(xbv7&+Iv!K=6`2ES^Bs0Pdca|VH5-^TDyY*y#!k2=_TvONGF zfP45_-ofCg)^_l_BzOi)$j3xtl)2V}!j4OHfc|CxX&Qto9ppMPMVZ4iw*-yKfl8y1 z%?F8%%(wvdR)aWqkwtv zr{~AdUcNmZ9RBc^!JiIazdroo_%GiAb2+s@)pOm5GD#L2kPON|Gbn3FAxilE==GCl z5ajUj^B2#L|1yAl`R()LACBI<8T|I;>%rmR)#2;o=TF|gID9>L_4f6vmv4@SgTWiE zQ78zwD2K)_lOgSqE|rOkWy1dgmRP z-(2OOV*$hU;L+f3fB)8@Ei(M@An95-Fd z`l&_-vaGcEmJLpC4`#Zi$jx|w=y0lvPLM6+0Vd>V89T88|2ts7CW$D-O~gh?sgOP^ zbsB9IRS?FiC?NAHh^PHK(qoev#@G2P@sh%LKqUo zQ>EiV%XnRhl}YBLK-gt6x3>TG_uH5c6dAIK$UalSR4-P-wzeF*K5TC3tW?5Z4q1S8r&b()N58oXfsTk-__$4dXZw(#>+A5)v zQ3WceFyBB3q&kPqztzKCN7VccTC%=_m~^ZYyf^!`o*bQJz&84E>)nqhqm!E_pH6;r{o4DR z-);YF>*P1v-)(*O&DOh<#mUb5Tc1vDZg0W&$r6CS-~If@oA1AS1Yx&Mwy(dxx&7VA z_V&%~Pd@{3fBXCUTie?|A5pZqp6Iiz8|iO;10hDknKx8-Z=ImSQ;h`POI1?1~)cHaUjO?zC7@X`qTb1e=7X5Z08Vm-ijYp&pVtdgvW^ zWJ7%Z?6BP0-5xx8G`N24x;L7(2Y6x=bj0jd`3?H3CVZ2ZA~QTPyvYF(uBJkJMR9T% z0syKmYnIQ`xr$BHQ5E|}RW#i^iz!rbyakN`27^`|YOGBVh_(5nX{qga!lJl6SpIH= zw*i{Q38A*Rdi|W-L@kP&!ppd2Oo#5q5S9;-O_WKCO=4VSL=)zXbB>4XXhkrcC?-#K zbi-4RMFgEGchv`@nMrDMeVi*3L!b84LNACcVetO=CE6-7b;A9fYtV|O$yQf>uNZuhk*s1_ zR5Bcm^(6ZmV-gvlFfeV<*mz3I0-5^n(D7RRgQ6qg6mafQbnpG|7%kN zv9y0dujG!JZH-Qbw|+i?I!TpL=CohwRuIT^4eH_|!cP6te8X~_s^WPX##N*XZg5t%EMTMB&y!LP1TXz>Bq zN?$ErR}ikyWWc^=Vy^Iy&rq_BYE?Zp&taVNmigA+74sD?^ZJ3Up`4nVU`Wq)=ku^o?Rba_sxyk zAXwin*DuJmnn^V_DVU~XUPX3mu(!Q&EACXBzxNt#Twm01WqXyi7@KClkpSwizL!>d z*B<{%EBR{56>U_5NmZUaIaWYV*b2PX(E{MrgrS|7|EeJ~3<@IZ)nceURKO^e%h@3+ zL3^7wK39g9n)v)(CJ^P)noJsGVsMtJW=Om3rer!TkLwIR61;f^i)OU|zm27kN3T>~ z)~j)dmgQ{eE*Iw{gaUR2(l7&8_jK2 z#igxC+98y}SuFW%1=Liwd9c z?o5dKVyL!v_73hJJlMZ?aKELt5led~b(5^Bv#yU(Xyx+NETnB@{}K~vD|@YtRCe=g zqw7i%!N>{;orsuNGu{oBu3h#*jye5#u^f`Rg{`{<6x-%C5Rn&)ZM@-z^~pI`z+|19 zZ;)bhGik#^Fu8BGnze${&~-PA@Ah+-g!iVNB}rZm<9D|E8+KHN6sI`ttk3=RdeQgSlqMZKr^{u2t$htaP-2 zDl}|C_|HlC@w4ZzpMF5M&cAFB9SwP(pVeOw<7Z~}lb0`E9KPD9Xq$2SOKQ^RMfRB~ zd-MGG=nqGK`SNTKUJ%R7NdrPLbkK1|z z=>Ad?LHCx@{`~j_#r*2|55J?YKY#z?+41qK*GGSRd-MkN**)O#eSlb2)PvoJ_mx;difJzWo6L9xRo4`ReT}i1prsgZ;Y) zcbCGCUL1Y@?Du%iFA$atELMosUz8@1CsM%h%pN zp*BM+eNu|=q1-HQw{d%%Zafdt5isGn$jX)>yhyLx`7dI)Yn7 zD7b|^P(@KE{w5;tK-|)XtzWq}s>?>V^~TuQDrIeg)2K~s8?Q8{+c-K(VYHZaWvG&~iHH*Z<-;K!=7T(&8Y$)b+sITO!X9VkO)R9V!dv$=x74n;cSXsDZTx217zy?^!Q7Mlw*g`Al$H`MUu5zqRKtHZKZ zQy;ZS586E(3EO+3YPF{1PHdtgd5$a5%IVV9(8k=aKf=;}nL%AB%hTzwmeFR+_k*{#vLAJxwJ?#{y-H{ZW&|9bzo{o8-v zf|F)M+8#}09$ljdzPOa8s+g|nfWGzBv?sPoAunLkfB*jdJ9~G%OfT9NNoHf|Sq~W> z!!Jq*`PZYvy>zqh_dpbsi2?t5?u#u$wdzx7lQwzqo%{7}MR?z81RFlPo*u0c^edJt zV6AX4R49gng<>g|{B>AXUEV7?Zl-y^YZ67|bm?=+GLouYYX0ffF42iWJ~nNBgD$L< zv%&BzBAMv2t){=V`Nq+Gr8(!u{rXjgRdz<4Li1#Qa94h~>6KeLbkf|ab9?ZWHs3#E zdUD0XGoDu6MAAPjBg+q1mRsu^7+jguwe?%pkk+l?Go2YO*NWBstF$_*BGLupFs;A7 z7ls_tRu#-Ytg*4IKX`Q|U2c2rM*B{*syS%0;a{ukyy&04#~Kq`Dm8)#)y zk!&vea~2H$lAKs6@YVBS1Ib@&Me`N&gRAnd$(bv~LC5dj#CEZ9=B&(6Zt{O=Hh~R5 z%o4s4TKkMuI`5Y9W~Su9wKnM0vSHJ#UP`}OGo&@d^AtE!75{%N(K~ZNGqz`@Y&~56 z^Hv+H8vHfZ9V=n~b1M*;d$N;~xd)a!QT}bMyF6QYuueSxhK#*v&BYYEno*&D*ja9h zb=vpf7C4--6SNH?S~La%lAL;7+Mmh*Xq^&Ge0>G)cYK{x?y}r=%dV!#zrA#F`Dk#- zQt{tB_awn0qkvtup1#amw}{Hy9AC1#10H&;fY2tJ?q}l*cwlbXO|HWd*nau+`D^e# z`u3NO^e~JaqM4|m_~4B?5u`i`0eW#TU8F_Jhep$ p^2yy%#6cCO%TE&w;YH*`$@63wr|+`RHd7i!{|O2S$ghE^0ste5M3n#l diff --git a/v2rayN/v2rayN/Sample/BlankPac.txt b/v2rayN/v2rayN/Sample/BlankPac.txt deleted file mode 100644 index 906a14cb..00000000 --- a/v2rayN/v2rayN/Sample/BlankPac.txt +++ /dev/null @@ -1,5 +0,0 @@ -var proxy = "__PROXY__"; - -function FindProxyForURL(url, host) { - return proxy; -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt index a582c6ea..f2924c9a 100644 --- a/v2rayN/v2rayN/Sample/SampleClientConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -1,17 +1,11 @@ -{ - "log": { - "access": "", - "error": "", - "loglevel": "error" - }, +{ "log": { "access": "Vaccess.log", "error": "Verror.log", "loglevel": "warning" }, - "inbounds": [ - { - "tag": "proxy", + "inbounds": [{ + "tag": "tag1", "port": 10808, "protocol": "socks", "listen": "127.0.0.1", @@ -26,6 +20,22 @@ "tls" ] } + }, + { + "tag": "tag2", + "port": 10809, + "protocol": "socks", + "listen": "127.0.0.1", + "settings": { + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } } ], "outbounds": [{ diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 22c37976..8fa10c63 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -19,6 +19,7 @@ using ZXing.Common; using ZXing.QrCode; using System.Security.Principal; using v2rayN.Base; +using Newtonsoft.Json.Linq; namespace v2rayN { @@ -146,6 +147,19 @@ namespace v2rayN } return result; } + + public static JObject ParseJson(string strJson) + { + try + { + JObject obj = JObject.Parse(strJson); + return obj; + } + catch + { + return null; + } + } #endregion #region 转换函数 diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index d1f912ba..51a06fb1 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -125,12 +125,25 @@ BaseServerForm.cs + Form MainForm.cs + + Form + + + RoutingSettingForm.cs + + + UserControl + + + RoutingSettingControl.cs + Form @@ -165,16 +178,16 @@ - - - Component + + + @@ -287,6 +300,13 @@ QRCodeControl.cs Designer + + RoutingSettingControl.cs + Designer + + + RoutingSettingControl.cs + SubSettingControl.cs Designer @@ -294,6 +314,13 @@ SubSettingControl.cs + + RoutingSettingForm.cs + Designer + + + RoutingSettingForm.cs + SubSettingForm.cs Designer @@ -347,8 +374,6 @@ - - @@ -411,7 +436,6 @@ - From c2c9c6a6dbf6da7563fd1ce4865a3c77343057a2 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 25 Dec 2020 20:43:39 +0800 Subject: [PATCH 002/252] Create ECoreType.cs --- v2rayN/v2rayN/Mode/ECoreType.cs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 v2rayN/v2rayN/Mode/ECoreType.cs diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs new file mode 100644 index 00000000..4049db06 --- /dev/null +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -0,0 +1,9 @@ + +namespace v2rayN.Mode +{ + public enum ECoreType + { + v2fly_core = 1, + xray_core = 2 + } +} From 52f1bdf83480d204ecbb4cb2170051b39dc5f1cb Mon Sep 17 00:00:00 2001 From: RPRX <63339210+rprx@users.noreply.github.com> Date: Fri, 25 Dec 2020 20:21:21 +0000 Subject: [PATCH 003/252] Update UI --- v2rayN/v2rayN/Forms/MainForm.resx | 2 +- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 2 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index e1d6def6..ad43b0db 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -1358,7 +1358,7 @@ $this - Update xrayCore + Update XrayCore toolStripSeparator2 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index ab434f47..31c2ed6a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -456,7 +456,7 @@ 180, 22 - xray-Core + Xray-Core 85, 53 diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 369fbc72..5dacf61f 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -56,8 +56,8 @@ namespace v2rayN.Handler private const string nUrl = "https://github.com/2dust/v2rayN/releases/download/{0}/v2rayN.zip"; private readonly string v2flyCoreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; private const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; - private readonly string xrayCoreLatestUrl = "https://github.com/xtls/xray-core/releases/latest"; - private const string xrayCoreUrl = "https://github.com/xtls/xray-core/releases/download/{0}/xray-windows-{1}.zip"; + private readonly string xrayCoreLatestUrl = "https://github.com/XTLS/Xray-core/releases/latest"; + private const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases/download/{0}/Xray-windows-{1}.zip"; public async void CheckUpdateAsync(string type) { From 03c4954c27c18325ce0e82e58a090eac2be62e77 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 27 Dec 2020 19:43:28 +0800 Subject: [PATCH 004/252] up4.1 --- .../Forms/RoutingSettingControl.Designer.cs | 24 --- v2rayN/v2rayN/Forms/RoutingSettingControl.cs | 3 - .../v2rayN/Forms/RoutingSettingControl.resx | 174 ++++++------------ .../Forms/RoutingSettingControl.zh-Hans.resx | 25 +-- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 9 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 63 +------ v2rayN/v2rayN/Mode/Config.cs | 10 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Sample/custom_routing_private | 3 + v2rayN/v2rayN/v2rayN.csproj | 1 + 10 files changed, 68 insertions(+), 246 deletions(-) create mode 100644 v2rayN/v2rayN/Sample/custom_routing_private diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs index 56ae1ccf..912b2ab4 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs @@ -32,8 +32,6 @@ this.groupBox2 = new System.Windows.Forms.GroupBox(); this.btnExpand = new System.Windows.Forms.Button(); this.label4 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.cmbroutingMode = new System.Windows.Forms.ComboBox(); this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); this.btnRemove = new System.Windows.Forms.Button(); this.txtUserRule = new System.Windows.Forms.TextBox(); @@ -48,8 +46,6 @@ resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.btnExpand); this.groupBox2.Controls.Add(this.label4); - this.groupBox2.Controls.Add(this.label1); - this.groupBox2.Controls.Add(this.cmbroutingMode); this.groupBox2.Controls.Add(this.cmbOutboundTag); this.groupBox2.Controls.Add(this.btnRemove); this.groupBox2.Controls.Add(this.txtUserRule); @@ -71,24 +67,6 @@ resources.ApplyResources(this.label4, "label4"); this.label4.Name = "label4"; // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // cmbroutingMode - // - resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); - this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbroutingMode.FormattingEnabled = true; - this.cmbroutingMode.Items.AddRange(new object[] { - resources.GetString("cmbroutingMode.Items"), - resources.GetString("cmbroutingMode.Items1"), - resources.GetString("cmbroutingMode.Items2"), - resources.GetString("cmbroutingMode.Items3"), - resources.GetString("cmbroutingMode.Items4")}); - this.cmbroutingMode.Name = "cmbroutingMode"; - // // cmbOutboundTag // resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); @@ -151,8 +129,6 @@ private System.Windows.Forms.Label label3; private System.Windows.Forms.Button btnRemove; private System.Windows.Forms.ComboBox cmbOutboundTag; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox cmbroutingMode; private System.Windows.Forms.Label label4; private System.Windows.Forms.Button btnExpand; } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs index 2637aacf..33f44027 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs @@ -31,8 +31,6 @@ namespace v2rayN.Forms { txtRemarks.Text = routingItem.remarks.ToString(); cmbOutboundTag.Text = routingItem.outboundTag; - int.TryParse(routingItem.routingMode, out int routingMode); - cmbroutingMode.SelectedIndex = routingMode; txtUserRule.Text = Utils.List2String(routingItem.userRules, true); } } @@ -42,7 +40,6 @@ namespace v2rayN.Forms { routingItem.remarks = txtRemarks.Text.TrimEx(); routingItem.outboundTag = cmbOutboundTag.Text; - routingItem.routingMode = cmbroutingMode.SelectedIndex.ToString(); routingItem.userRules = Utils.String2List(txtUserRule.Text); } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.resx b/v2rayN/v2rayN/Forms/RoutingSettingControl.resx index 7c33a91b..656bfa7b 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Pre-defined - NoControl @@ -128,29 +125,23 @@ 733, 164 + + Rule + 119, 20 + + direct + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox2 - - 9 - - - 127, 53 - - - 75, 23 - - 127, 87 - - - Remove + 127, 50 txtRemarks @@ -162,14 +153,14 @@ 23 + + 4 + RoutingSettingControl - - 162, 21 - - - label1 + + Expand System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -181,7 +172,7 @@ 28 - 7 + 5 proxy @@ -189,11 +180,11 @@ 77, 12 - - 362, 21 + + 2 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 544, 21 6, 12 @@ -213,41 +204,20 @@ btnExpand - - groupBox2 - 12, 87 - - 2 + + txtUserRule - - cmbroutingMode + + True - - 255, 20 + + 75, 23 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Global - - - 71, 12 - - - Bypass mainland address - - - Bypassing the LAN address - - - 4 - - - 640, 21 + + groupBox2 Fill @@ -261,18 +231,18 @@ 25 - + groupBox2 + + 11 + NoControl 47, 12 - - True - btnRemove @@ -291,35 +261,23 @@ Out Tag - - 27 - block - - direct - - - 75, 23 - - - NoControl - - - 26 + + Remove - 5 + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox2 - - 6 - - - Expand + + groupBox2 1 @@ -331,7 +289,7 @@ groupBox2 - 588, 68 + 588, 105 True @@ -342,12 +300,6 @@ groupBox2 - - True - - - Bypassing LAN and mainland address - NoControl @@ -360,35 +312,26 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 - 733, 164 - 8 + 6 Top, Bottom, Left, Right - - 12, 57 + + 362, 21 cmbOutboundTag - - 11 - Remarks - - groupBox2 - - - 3 + + 0 True @@ -396,8 +339,8 @@ 12, 25 - - groupBox2 + + 75, 23 301, 26 @@ -405,8 +348,8 @@ 47, 12 - - Rule + + 162, 21 10 @@ -414,32 +357,23 @@ Domain or IP + + $this + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - txtUserRule - - - 0 - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 0 - - $this + + 640, 21 - - Use custom Domain or IP - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 640, 46 + + 7 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx index d95c2560..94e70d37 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx @@ -119,7 +119,7 @@ - 619, 46 + 526, 20 扩大 @@ -130,27 +130,6 @@ 出口标签 - - 65, 12 - - - 预定义规则 - - - 使用自定义域名或IP - - - 全局 - - - 绕过局域网 - - - 绕过大陆地址 - - - 绕过局域网及大陆地址 - 619, 20 @@ -158,7 +137,7 @@ 移除 - 567, 64 + 567, 104 29, 12 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 0b145a04..35bd956f 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -65,6 +65,8 @@ namespace v2rayN.Forms private void btnOK_Click(object sender, EventArgs e) { + config.domainStrategy = cmbdomainStrategy.Text; + if (config.routingItem.Count <= 0) { AddSub("proxy", ""); @@ -93,12 +95,11 @@ namespace v2rayN.Forms } - private void AddSub(string outboundTag, string userRule, string routingMode = "0") + private void AddSub(string outboundTag, string userRule) { RoutingItem RoutingItem = new RoutingItem { remarks = outboundTag, - routingMode = routingMode, outboundTag = outboundTag, userRules = Utils.String2List(userRule) @@ -129,8 +130,8 @@ namespace v2rayN.Forms AddSub(lstTag[k], result); } - AddSub(Global.directTag, "", "4"); - AddSub(Global.agentTag, "", "0"); + AddSub(Global.directTag, Utils.GetEmbedText(Global.CustomRoutingFileName + "private")); + AddSub(Global.agentTag, ""); RefreshSubsView(); } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 654a7571..61175ba4 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -197,28 +197,7 @@ namespace v2rayN.Handler foreach (var item in config.routingItem) { - if (item.routingMode != "0") - { - switch (item.routingMode) - { - case "1": - break; - case "2": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - break; - case "3": - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; - case "4": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; - } - } - else - { - routingUserRule(item.userRules, item.outboundTag, ref v2rayConfig); - } + routingUserRule(item.userRules, item.outboundTag, ref v2rayConfig); } } } @@ -297,46 +276,6 @@ namespace v2rayN.Handler return 0; } - - private static int routingGeo(string ipOrDomain, string code, string tag, ref V2rayConfig v2rayConfig) - { - try - { - if (!Utils.IsNullOrEmpty(code)) - { - //IP - if (ipOrDomain == "ip" || ipOrDomain == "") - { - RulesItem rulesItem = new RulesItem - { - type = "field", - outboundTag = Global.directTag, - ip = new List() - }; - rulesItem.ip.Add($"geoip:{code}"); - - v2rayConfig.routing.rules.Add(rulesItem); - } - - if (ipOrDomain == "domain" || ipOrDomain == "") - { - RulesItem rulesItem = new RulesItem - { - type = "field", - outboundTag = Global.directTag, - domain = new List() - }; - rulesItem.domain.Add($"geosite:{code}"); - v2rayConfig.routing.rules.Add(rulesItem); - } - } - } - catch - { - } - return 0; - } - /// /// vmess协议服务器配置 /// diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 42c01f70..245d9ed0 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -704,15 +704,7 @@ namespace v2rayN.Mode { get; set; } - - /// - /// 路由模式 - /// - public string routingMode - { - get; set; - } - + /// /// /// diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 79c9ddd1..794c9c1a 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.0")] +[assembly: AssemblyFileVersion("4.1")] diff --git a/v2rayN/v2rayN/Sample/custom_routing_private b/v2rayN/v2rayN/Sample/custom_routing_private new file mode 100644 index 00000000..8003b809 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_private @@ -0,0 +1,3 @@ +geoip:private, +geoip:cn, +geosite:cn \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 51a06fb1..d79b2067 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -373,6 +373,7 @@ + From 9dc8cba3f020b8c1e5d5c266999b06f145fcd8b4 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 30 Dec 2020 15:55:37 +0800 Subject: [PATCH 005/252] up4.2 --- v2rayN/v2rayN/Base/ListViewFlickerFree.cs | 2 + v2rayN/v2rayN/Forms/AddServerForm.resx | 2 +- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 24 +- v2rayN/v2rayN/Forms/MainForm.cs | 40 +- v2rayN/v2rayN/Forms/MainForm.resx | 16 +- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 18 +- .../Forms/OptionSettingForm.Designer.cs | 45 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 2459 +++--- .../Forms/OptionSettingForm.zh-Hans.resx | 30 +- .../Forms/RoutingSettingControl.Designer.cs | 135 - v2rayN/v2rayN/Forms/RoutingSettingControl.cs | 73 - .../RoutingSettingDetailsForm.Designer.cs | 211 + .../v2rayN/Forms/RoutingSettingDetailsForm.cs | 86 + ...ol.resx => RoutingSettingDetailsForm.resx} | 602 +- ...=> RoutingSettingDetailsForm.zh-Hans.resx} | 42 +- .../Forms/RoutingSettingForm.Designer.cs | 229 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 345 +- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 419 +- .../Forms/RoutingSettingForm.zh-Hans.resx | 134 +- v2rayN/v2rayN/Global.cs | 5 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 140 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 14 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 82 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 32 +- .../v2rayN/HttpProxyHandler/PrivoxyHandler.cs | 2 +- v2rayN/v2rayN/Mode/Config.cs | 39 +- v2rayN/v2rayN/Mode/ECoreType.cs | 4 +- v2rayN/v2rayN/Mode/ERoutingSort.cs | 11 - v2rayN/v2rayN/Mode/ESysProxyType.cs | 4 +- v2rayN/v2rayN/Mode/RulesItem.cs | 36 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 28 - v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- .../v2rayN/Properties/Resources.Designer.cs | 17 - v2rayN/v2rayN/Properties/Resources.resx | 3 - v2rayN/v2rayN/Resources/pac.txt | 7614 ----------------- v2rayN/v2rayN/Resources/privoxy_conf.txt | 8 - v2rayN/v2rayN/Resx/ResUI.Designer.cs | 29 +- v2rayN/v2rayN/Resx/ResUI.resx | 9 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 9 + v2rayN/v2rayN/Sample/custom_routing_rules | 28 + v2rayN/v2rayN/Tool/CDateTime.cs | 156 - v2rayN/v2rayN/Tool/Utils.cs | 7 +- v2rayN/v2rayN/v2rayN.csproj | 25 +- v2rayN/v2rayN/v2rayN.csproj.user | 2 +- 45 files changed, 3278 insertions(+), 9942 deletions(-) delete mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs rename v2rayN/v2rayN/Forms/{RoutingSettingControl.resx => RoutingSettingDetailsForm.resx} (53%) rename v2rayN/v2rayN/Forms/{RoutingSettingControl.zh-Hans.resx => RoutingSettingDetailsForm.zh-Hans.resx} (85%) delete mode 100644 v2rayN/v2rayN/Mode/ERoutingSort.cs create mode 100644 v2rayN/v2rayN/Mode/RulesItem.cs delete mode 100644 v2rayN/v2rayN/Resources/pac.txt delete mode 100644 v2rayN/v2rayN/Resources/privoxy_conf.txt create mode 100644 v2rayN/v2rayN/Sample/custom_routing_rules delete mode 100644 v2rayN/v2rayN/Tool/CDateTime.cs diff --git a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs index a113a7bc..c70ccfc6 100644 --- a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs +++ b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs @@ -46,5 +46,7 @@ namespace v2rayN.Base } catch { } } + + } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 6d3eec6c..156f1f49 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -1318,7 +1318,7 @@ True - 25 + 114 6, 12 diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 1b546c7b..148b09d9 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -68,9 +68,9 @@ 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(); - this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); - this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); this.menuKeepClear = new System.Windows.Forms.ToolStripMenuItem(); + this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepNothing = 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(); @@ -421,16 +421,16 @@ // resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuKeepNothing, + this.menuKeepClear, this.menuGlobal, - this.menuKeepClear}); + this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; // - // menuKeepNothing + // menuKeepClear // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); - this.menuKeepNothing.Name = "menuKeepNothing"; - this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; + this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // @@ -438,11 +438,11 @@ this.menuGlobal.Name = "menuGlobal"; this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // - // menuKeepClear + // menuKeepNothing // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); - this.menuKeepClear.Name = "menuKeepClear"; - this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); + this.menuKeepNothing.Name = "menuKeepNothing"; + this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuServers // diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 0b7b2e55..96e6819e 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -223,11 +223,7 @@ namespace v2rayN.Forms } 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) { @@ -241,20 +237,20 @@ namespace v2rayN.Forms } } 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); + Utils.AddSubItem(lvItem, EServerColName.configType.ToString(), ((EConfigType)item.configType).ToString()); + Utils.AddSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); + Utils.AddSubItem(lvItem, EServerColName.address.ToString(), item.address); + Utils.AddSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); + Utils.AddSubItem(lvItem, EServerColName.security.ToString(), item.security); + Utils.AddSubItem(lvItem, EServerColName.network.ToString(), item.network); + Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); + Utils.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); + Utils.AddSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown); + Utils.AddSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp); + Utils.AddSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown); + Utils.AddSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp); } if (k % 2 == 1) // 隔行着色 @@ -1138,17 +1134,15 @@ namespace v2rayN.Forms #endregion #region 系统代理相关 - - + private void menuKeepClear_Click(object sender, EventArgs e) + { + SetListenerType(ESysProxyType.ForcedClear); + } private void menuGlobal_Click(object sender, EventArgs e) { SetListenerType(ESysProxyType.ForcedChange); } - private void menuKeepClear_Click(object sender, EventArgs e) - { - SetListenerType(ESysProxyType.ForcedClear); - } private void menuKeepNothing_Click(object sender, EventArgs e) { SetListenerType(ESysProxyType.Unchanged); diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index ad43b0db..b8501535 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -226,7 +226,7 @@ tsbCheckUpdateN - Only open Http proxy and do nothing + Do not change system proxy System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -585,7 +585,7 @@ 265, 142 - 411, 22 + 262, 22 $this @@ -1103,7 +1103,7 @@ Magenta - 411, 22 + 262, 22 355, 22 @@ -1148,7 +1148,7 @@ Vertical - 411, 22 + 262, 22 355, 22 @@ -1174,6 +1174,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Clear system proxy + 355, 22 @@ -1217,7 +1220,7 @@ notifyMain - Open Http proxy and set the system proxy (global mode) + Set system proxy (global mode) System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1415,9 +1418,6 @@ 228, 18 - - zh-Hans - True diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 31c2ed6a..9af1841a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -312,11 +312,11 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - + 228, 22 - - 不改变系统代理 + + 清除系统代理 228, 22 @@ -324,11 +324,11 @@ 自动配置系统代理(全局模式) - + 228, 22 - - 清除系统代理 + + 不改变系统代理 195, 22 @@ -441,19 +441,19 @@ 重启服务 - 180, 22 + 135, 22 v2rayN - 180, 22 + 135, 22 v2fly-Core - 180, 22 + 135, 22 Xray-Core diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 27a61a74..13e23b02 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -69,6 +69,8 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.cmbCoreType = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox(); this.cbFreshrate = new System.Windows.Forms.ComboBox(); this.lbFreshrate = new System.Windows.Forms.Label(); @@ -89,31 +91,32 @@ // // 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.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.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); @@ -131,7 +134,6 @@ 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; // @@ -174,12 +176,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 @@ -194,8 +196,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"), @@ -221,6 +223,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[] { @@ -229,7 +232,6 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -249,10 +251,10 @@ // // tabPage2 // + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -274,6 +276,7 @@ // // tabPage6 // + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -287,7 +290,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; // @@ -359,16 +361,33 @@ // // tabPage7 // + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.cmbCoreType); + this.tabPage7.Controls.Add(this.label4); this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // cmbCoreType + // + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); + this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType.FormattingEnabled = true; + this.cmbCoreType.Items.AddRange(new object[] { + resources.GetString("cmbCoreType.Items"), + resources.GetString("cmbCoreType.Items1")}); + this.cmbCoreType.Name = "cmbCoreType"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // // chkKeepOlderDedupl // resources.ApplyResources(this.chkKeepOlderDedupl, "chkKeepOlderDedupl"); @@ -377,9 +396,9 @@ // // 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 @@ -407,9 +426,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 @@ -501,5 +520,7 @@ private System.Windows.Forms.LinkLabel linkDnsObjectDoc; private System.Windows.Forms.TextBox txtremoteDNS; private System.Windows.Forms.Label label14; + private System.Windows.Forms.ComboBox cmbCoreType; + private System.Windows.Forms.Label label4; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index d1262268..d26843a6 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -120,6 +120,7 @@ namespace v2rayN.Forms break; } + cmbCoreType.SelectedIndex = (int)config.coreType; } private void btnOK_Click(object sender, EventArgs e) { @@ -284,6 +285,7 @@ namespace v2rayN.Forms config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.keepOlderDedupl = chkKeepOlderDedupl.Checked; + config.coreType = (ECoreType)cmbCoreType.SelectedIndex; return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index f0757e7d..05feb4af 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1310 +117,1385 @@ 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 - - - 15, 192 - - - 102, 16 - - - 35 - - - allowInsecure - - - chkdefAllowInsecure - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 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 - - - 1 - - - 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 - - - 2 - - - 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 - - - 3 - True - - 15, 63 + + Xray_core - - 120, 16 + + 11 - - 19 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - listening port 2 + + Keep older when deduplication - - False + + 1 - - chkAllowIn2 + + Record local logs - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 12 - + + + 4, 22 + + + txtKcpwriteBufferSize + + groupBox1 - + 4 - - 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 - - - 5 - - - 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 - - - 6 - - - True - - - 206, 64 - - - 53, 12 - - - 16 - - - protocol - False - - label3 + + 14 - - System.Windows.Forms.Label, 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 + + + tabControl1 groupBox1 - - 7 + + 9 - - 124, 60 - - - 78, 21 - - - 14 - - - False - - - txtlocalPort2 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + groupBox1 - - 8 + + 662, 523 - - False + + 35 - - socks + + 1 - - http + + 468, 60 - - 257, 25 + + + Top - - 97, 20 - - - 12 + + 102, 16 cmbprotocol - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6 - + + 14 + + + 30, 87 + + + 111, 100 + + + True + + + System.Windows.Forms.Label, 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 + + + 84, 16 + + + 40 + + + True + + + 120, 16 + + + True + + + tti + + + tabPage6 + + + chkdefAllowInsecure + + + 7 + + + tabPage7 + + + 12 + + + http + + + 7 + + + label5 + + + 648, 421 + + + 206, 64 + + + 95, 12 + + + tabPage6 + + + 15, 63 + + + System.Windows.Forms.CheckBox, 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 + + + 2 + + + Enable UDP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + &Cancel + + + label10 + + groupBox1 - - 9 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 662, 10 + + + Settings + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label4 + + + 236, 66 + + + txtKcpmtu + + + lbFreshrate + + + 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label11 + + + 29 + + + 8 + + + 0, 10 + + + 58, 20 + + + Support DnsObject + + + tabPage6 + + + False + + + groupBox1 + + + $this + + + 3 + + + 6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + tabPage7 + + + tabPage6 + + + Bottom + + + 576, 16 + + + 18 True - - 206, 29 + + 39 - - 53, 12 + + tabPage6 - - 11 + + congestion - - protocol + + NoControl - - label1 + + System.Windows.Forms.Button, 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 + + 89, 12 - + + NoControl + + + 0 + + + tabPage7 + + + v2rayN settings + + + 16 + + groupBox1 10 - + + 32 + + + 6, 12 + + + groupBox1 + + + 1 + + + True + + + 8 + + + 198, 16 + + + Automatically start at system startup + + + Fill + + + txtKcptti + + + 2 + + + Turn on Sniffing + + + 281, 12 + + + tabPage7 + + + 2 + + + 3, 3, 3, 3 + + + 3 + + + 662, 453 + + + 33, 29 + + + 1 + + + 124, 60 + + + 78, 21 + + + Log level + + + tabControl1 + + + 59, 12 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + warning + + + tabPage2 + + + panel2 + + + 11 + + + Statistics freshrate + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 120, 16 + + + 89, 12 + + + btnOK + + + 18, 66 + + + 20, 143 + + + 15 + + + True + + + 4, 4, 4, 4 + + + tabPage6 + + + 5 + + + Turn on Sniffing + + + groupBox1 + + + 18, 28 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 20 + + + 29 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 + + + 5 + + + Core Type + + + True + + + chksniffingEnabled + + + 2 + + + 174, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 18, 104 + + + tabPage2 + + + mtu + + + socks + + + System.Windows.Forms.GroupBox, 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 + + + panel1 + + + 30 + + + 53, 12 + + + 13 + + + label8 + + + 468, 27 + + + 236, 28 + + + chkAutoRun + + + 94, 21 + + + 345, 62 + + + 11 + + + 15, 129 + + + chkudpEnabled + + + 0 + + + True + + + 8, 17 + + + tabPage1 + + + tabPage6 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 84, 16 + + + 15 + + + True + + + False + + + label7 + + + txtlocalPort + + + info + + + 19 + + + readBufferSize + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnClose + + + 124, 25 + + + protocol + + + 23, 12 + + + 638, 356 + + + socks + + + 2 + + + 3, 3 + + + chkAllowLANConn + + + 84, 16 + + + tabControl1 + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 1 + + + 10 + + + 369, 62 + + + 161, 84 + + + 9 + + + groupBox1 + + + 33, 141 + + + NoControl + + + chkEnableStatistics + + + 4 + + + 355, 16 + + + 53, 12 + + + 193, 162 + + 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 - - - 11 - - - 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 - - - 12 - - - 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 - - - 13 - - - 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 - - - 14 - - - 124, 25 - - - 78, 21 - - - 3 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 15 - - - 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 - - - 16 - - - Fill - - - 3, 3 - - - 648, 421 - - - 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, 427 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 0 - - - True - - - NoControl - - - 342, 17 - - - 0, 0, 0, 0 - - - 107, 12 - - - 40 - - - Support DnsObject - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - 8, 41 - - - True - - - 638, 356 - - - 39 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 1 - - - True - - - NoControl - - - 8, 17 - - - 281, 12 - - - 38 - - - Custom DNS (multiple, separated by commas (,)) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 2 - - - 4, 22 - - - 654, 427 - - - 4 - - - Core: DNS 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 - - - 1 - - - True - - - 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 - - - 94, 21 - - - 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 + + label2 - - 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 - - - 12 - - - 4, 22 - - - 3, 3, 3, 3 - - + 654, 427 - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - - True - - - NoControl - - - 15, 110 - - - 198, 16 - - - 33 - - - Keep older when deduplication - - - chkKeepOlderDedupl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - 161, 84 - - - 58, 20 - - - 32 - - - cbFreshrate - - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage7 + + 9 - - 1 + + 101, 12 - - True + + 5 - - NoControl + + 12 - - 30, 87 + + 20 - - 125, 12 - - - 30 - - - Statistics freshrate - - - lbFreshrate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - True - - - NoControl - - - 15, 62 - - - 576, 16 - - - 29 + + allowInsecure Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - chkEnableStatistics + + $this - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - True - - - 15, 38 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - + 4 - - True + + Listening port - - 15, 16 + + Fill - - 246, 16 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 23 + + False - - Automatically start at system startup + + 257, 60 - - chkAutoRun - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 5 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 427 - - - 3 - - - v2rayN settings - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 tabControl1 - - 3 + + True - - Fill + + 34 - - 0, 10 + + cmbprotocol2 - - 662, 453 + + chkKeepOlderDedupl - - 10 + + True - - tabControl1 + + 16 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - $this + + True - + + True + + + chkKcpcongestion + + + Core: basic settings + + 0 - - 267, 16 + + 257, 25 - - 75, 23 + + tabPage2 - - 8 + + tabControl1 - - &OK + + listening port 2 - - btnOK + + 97, 20 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + chkAllowIn2 - - panel2 + + 15, 38 - - 1 + + True - - Bottom + + 15, 160 - - 0, 463 + + 38 - - 662, 60 + + 33 - - 11 + + 4, 22 - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Top - - - 0, 0 - - - 662, 10 + + v2fly_core 9 - - panel1 + + label1 + + + Core: KCP settings + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + error + + + 59, 12 + + + System.Windows.Forms.CheckBox, 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 + + + 8 + + + 120, 16 + + + 75, 23 + + + txtlocalPort2 + + + True + + + 246, 16 + + + True + + + 654, 427 + + + 10 + + + False + + + 206, 29 + + + downlinkCapacity + + + chkudpEnabled2 + + + Allow connections from the LAN + + + tabPage1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + panel2 + + + 3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + linkDnsObjectDoc + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 125, 12 + + + txtKcpreadBufferSize + + + none + + + groupBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + OptionSettingForm + + + 2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 62 + + + 111, 62 + + + 7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + 13 + + + 97, 20 + + + 0 + + + 8 + + + 78, 21 + + + tabPage7 + + + tabPage7 + + + True + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23, 12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 345, 100 + + + 94, 21 + + + NoControl + + + 654, 427 + + + 10 + + + 204, 16 + + + 17 + + + 23 + + + 94, 21 + + + 6 + + + 0, 463 + + + groupBox1 + + + 3 + + + http + + + 0 + + + 97, 20 + + + tabPage6 + + + tabPage6 + + + 7 + + + False + + + 257, 158 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &OK + + + 10 + + + 1 + + + 94, 21 + + + txtKcpuplinkCapacity + + + tabPage2 + + + chklogEnabled + + + chksniffingEnabled2 + + + tabPage7 + + + 4, 22 + + + $this + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + groupBox1 + + + NoControl + + + 6 + + + protocol + + + tabPage7 + + + 15, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 0 + + + 8 + + + txtremoteDNS + + + True + + + True + + + writeBufferSize + + + 11 System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + 89, 12 - - 2 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 31 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + Core: DNS settings + + + groupBox1 + + + 32 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 345, 24 + + + tabPage7 + + + cbFreshrate + + + 236, 104 + + + 4 + + + NoControl + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 94, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 8, 41 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0, 0, 0 + + + uplinkCapacity + + + txtKcpdownlinkCapacity + + + 35 + + + 6 + + + 3 + + + 3, 3, 3, 3 + + + 107, 12 + + + 0 + + + 15, 192 + + + tabPage6 + + + debug + + + chkmuxEnabled + + + label3 + + + tabPage6 + + + False + + + 15, 110 + + + 105, 137 + + + 0, 0 + + + Enable UDP + + + cmbCoreType + + + 3, 3, 3, 3 + + + groupBox1 + + + 126, 16 + + + 267, 16 + + + 75, 23 + + + groupBox1 + + + NoControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 342, 17 + + + 94, 21 + + + 97, 20 + + + 3 + + + Custom DNS (multiple, separated by commas (,)) + + + 654, 427 + + + 11 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + NoControl + + + panel2 + + + 7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Turn on Mux Multiplexing + + + cmbloglevel + + + label6 + + + 111, 24 + + + 4 + + + label9 + + + 662, 60 + + + label14 True @@ -1428,22 +1503,4 @@ zh-Hans - - 6, 12 - - - 662, 523 - - - 4, 4, 4, 4 - - - Settings - - - OptionSettingForm - - - 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/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 0618fb5f..bfab7ce2 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,12 +121,6 @@ 取消(&C) - - 161, 12 - - - 支持填写DnsObject,JSON格式 - 336, 16 @@ -145,12 +139,6 @@ 开启流量探测 - - 191, 12 - - - 自定义DNS(可多个,用逗号(,)隔开) - 开启Mux多路复用(默认开启) @@ -211,6 +199,18 @@ Core:基础设置 + + 161, 12 + + + 支持填写DnsObject,JSON格式 + + + 191, 12 + + + 自定义DNS(可多个,用逗号(,)隔开) + 654, 443 @@ -223,6 +223,12 @@ Core:KCP设置 + + 53, 12 + + + Core类型 + 156, 16 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs deleted file mode 100644 index 912b2ab4..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs +++ /dev/null @@ -1,135 +0,0 @@ -namespace v2rayN.Forms -{ - partial class RoutingSettingControl - { - /// - /// 必需的设计器变量。 - /// - private System.ComponentModel.IContainer components = null; - - /// - /// 清理所有正在使用的资源。 - /// - /// 如果应释放托管资源,为 true;否则为 false。 - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region 组件设计器生成的代码 - - /// - /// 设计器支持所需的方法 - 不要修改 - /// 使用代码编辑器修改此方法的内容。 - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingControl)); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.btnExpand = new System.Windows.Forms.Button(); - this.label4 = new System.Windows.Forms.Label(); - this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); - this.btnRemove = new System.Windows.Forms.Button(); - this.txtUserRule = new System.Windows.Forms.TextBox(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.groupBox2.SuspendLayout(); - this.SuspendLayout(); - // - // groupBox2 - // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.btnExpand); - this.groupBox2.Controls.Add(this.label4); - this.groupBox2.Controls.Add(this.cmbOutboundTag); - this.groupBox2.Controls.Add(this.btnRemove); - this.groupBox2.Controls.Add(this.txtUserRule); - this.groupBox2.Controls.Add(this.txtRemarks); - this.groupBox2.Controls.Add(this.label2); - this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // btnExpand - // - resources.ApplyResources(this.btnExpand, "btnExpand"); - this.btnExpand.Name = "btnExpand"; - this.btnExpand.UseVisualStyleBackColor = true; - this.btnExpand.Click += new System.EventHandler(this.btnExpand_Click); - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // cmbOutboundTag - // - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); - this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbOutboundTag.FormattingEnabled = true; - this.cmbOutboundTag.Items.AddRange(new object[] { - resources.GetString("cmbOutboundTag.Items"), - resources.GetString("cmbOutboundTag.Items1"), - resources.GetString("cmbOutboundTag.Items2")}); - this.cmbOutboundTag.Name = "cmbOutboundTag"; - // - // btnRemove - // - resources.ApplyResources(this.btnRemove, "btnRemove"); - this.btnRemove.Name = "btnRemove"; - this.btnRemove.UseVisualStyleBackColor = true; - this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); - // - // txtUserRule - // - resources.ApplyResources(this.txtUserRule, "txtUserRule"); - this.txtUserRule.Name = "txtUserRule"; - this.txtUserRule.Leave += new System.EventHandler(this.txtRemarks_Leave); - // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // RoutingSettingControl - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox2); - this.Name = "RoutingSettingControl"; - this.Load += new System.EventHandler(this.RoutingSettingControl_Load); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.TextBox txtUserRule; - private System.Windows.Forms.TextBox txtRemarks; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Button btnRemove; - private System.Windows.Forms.ComboBox cmbOutboundTag; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Button btnExpand; - } -} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs deleted file mode 100644 index 33f44027..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Base; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class RoutingSettingControl : UserControl - { - public event ChangeEventHandler OnButtonClicked; - - - public RoutingItem routingItem - { - get; set; - } - - public RoutingSettingControl() - { - InitializeComponent(); - } - - private void RoutingSettingControl_Load(object sender, EventArgs e) - { - BindingSub(); - } - - private void BindingSub() - { - if (routingItem != null) - { - txtRemarks.Text = routingItem.remarks.ToString(); - cmbOutboundTag.Text = routingItem.outboundTag; - txtUserRule.Text = Utils.List2String(routingItem.userRules, true); - } - } - private void EndBindingSub() - { - if (routingItem != null) - { - routingItem.remarks = txtRemarks.Text.TrimEx(); - routingItem.outboundTag = cmbOutboundTag.Text; - routingItem.userRules = Utils.String2List(txtUserRule.Text); - } - } - private void txtRemarks_Leave(object sender, EventArgs e) - { - EndBindingSub(); - } - - private void btnRemove_Click(object sender, EventArgs e) - { - if (routingItem != null) - { - routingItem.remarks = string.Empty; - } - - OnButtonClicked?.Invoke(sender, e); - } - - private void btnExpand_Click(object sender, EventArgs e) - { - if (this.Height > 200) - { - this.Height = 160; - } - else - { - this.Height = 500; - } - } - } -} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs new file mode 100644 index 00000000..4cf4fe18 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs @@ -0,0 +1,211 @@ +namespace v2rayN.Forms +{ + partial class RoutingSettingDetailsForm + { + /// + /// 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(RoutingSettingDetailsForm)); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.panel4 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtIP = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtDomain = new System.Windows.Forms.TextBox(); + this.panel3.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panel2.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // panel3 + // + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.txtPort); + this.panel3.Controls.Add(this.label1); + this.panel3.Controls.Add(this.labRoutingTips); + this.panel3.Controls.Add(this.label4); + this.panel3.Controls.Add(this.cmbOutboundTag); + this.panel3.Controls.Add(this.txtRemarks); + this.panel3.Controls.Add(this.label2); + this.panel3.Name = "panel3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // labRoutingTips + // + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + this.labRoutingTips.Name = "labRoutingTips"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbOutboundTag + // + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); + this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutboundTag.FormattingEnabled = true; + this.cmbOutboundTag.Items.AddRange(new object[] { + resources.GetString("cmbOutboundTag.Items"), + resources.GetString("cmbOutboundTag.Items1"), + resources.GetString("cmbOutboundTag.Items2")}); + this.cmbOutboundTag.Name = "cmbOutboundTag"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // panel4 + // + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Controls.Add(this.btnClose); + this.panel4.Controls.Add(this.btnOK); + this.panel4.Name = "panel4"; + // + // 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); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.groupBox2); + this.panel2.Controls.Add(this.groupBox1); + this.panel2.Name = "panel2"; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtIP); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtIP + // + resources.ApplyResources(this.txtIP, "txtIP"); + this.txtIP.Name = "txtIP"; + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtDomain); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtDomain + // + resources.ApplyResources(this.txtDomain, "txtDomain"); + this.txtDomain.Name = "txtDomain"; + // + // RoutingSettingDetailsForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel4); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.Name = "RoutingSettingDetailsForm"; + this.Load += new System.EventHandler(this.RoutingSettingDetailsForm_Load); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel4.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbOutboundTag; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtDomain; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtIP; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtPort; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs new file mode 100644 index 00000000..09b5a39e --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs @@ -0,0 +1,86 @@ +using System; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingSettingDetailsForm : BaseForm + { + public int EditIndex + { + get; set; + } + protected RulesItem routingItem = null; + + public RoutingSettingDetailsForm() + { + InitializeComponent(); + } + + private void RoutingSettingDetailsForm_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + routingItem = config.rules[EditIndex]; + BindingData(); + } + else + { + routingItem = new RulesItem(); + ClearBind(); + } + } + + private void EndBindingData() + { + if (routingItem != null) + { + routingItem.remarks = txtRemarks.Text.TrimEx(); + routingItem.port = txtPort.Text.TrimEx(); + routingItem.outboundTag = cmbOutboundTag.Text; + routingItem.domain = Utils.String2List(txtDomain.Text); + routingItem.ip = Utils.String2List(txtIP.Text); + } + } + private void BindingData() + { + if (routingItem != null) + { + txtRemarks.Text = routingItem.remarks ?? string.Empty; + txtPort.Text = routingItem.port ?? string.Empty; + cmbOutboundTag.Text = routingItem.outboundTag; + txtDomain.Text = Utils.List2String(routingItem.domain, true); + txtIP.Text = Utils.List2String(routingItem.ip, true); + } + } + private void ClearBind() + { + txtRemarks.Text = string.Empty; + txtPort.Text = string.Empty; + cmbOutboundTag.Text = Global.agentTag; + txtDomain.Text = string.Empty; + txtIP.Text = string.Empty; + } + private void btnOK_Click(object sender, EventArgs e) + { + EndBindingData(); + if (ConfigHandler.AddRoutingRule(ref config, routingItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + + this.DialogResult = DialogResult.OK; + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx similarity index 53% rename from v2rayN/v2rayN/Forms/RoutingSettingControl.resx rename to v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx index 656bfa7b..8153fa31 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx @@ -117,274 +117,472 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 733, 164 - - - Rule - - - 119, 20 - - - direct - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 127, 50 - - - txtRemarks + + panel2 - - 24 - - - 23 - - - 4 - - - RoutingSettingControl - - - Expand - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - 28 + 32 - - 5 + + 30 + + + 31 proxy - - 77, 12 - - - 2 - - - 544, 21 - - - 6, 12 - - - label3 - - - 127, 21 - - - True - - - 0 - - - btnExpand - - - 12, 87 - - - txtUserRule - - - True - - - 75, 23 - - - groupBox2 - - + + Fill - + + panel1 + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + NoControl System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 25 + + True - - groupBox2 - - - 11 + + Left NoControl - - 47, 12 + + 0 - - btnRemove + + + 29, 12 - - 0, 0 + + panel2 - - 29 + + RoutingSettingDetailsForm - - label4 + + Fill - - NoControl - - - Out Tag - - - block - - - Remove - - - 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - groupBox2 - - + 1 - - groupBox2 + + Fill - - groupBox2 + + 411, 15 - - 588, 105 + + 119, 20 - - True + + 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 + + Bottom - - groupBox2 + + Top - + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 344, 417 + + + $this + + + 504, 15 + + + groupBox1 + + NoControl - - label2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 733, 164 - 6 - - Top, Bottom, Left, Right + + label1 - - 362, 21 + + 742, 437 - - cmbOutboundTag + + 0, 0 + + + 4 + + + panel3 + + + True + + + panel3 + + + 3 + + + panel4 + + + 5 + + + 19, 43 + + + 25 + + + 3, 17 + + + panel3 + + + 274, 20 + + + labRoutingTips + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 491, 20 + + + groupBox1 + + + 1 + + + RoutingSettingDetailsForm + + + 166, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 544, 16 + + + groupBox2 + + + 3 + + + 1 + + + 386, 417 + + + panel3 + + + 392, 0 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + panel4 + + + NoControl + + + Top + + + 598, 16 + + + $this + + + groupBox2 + + + panel3 + + + System.Windows.Forms.Panel, 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 + + + txtPort + + + panel4 + + + 3, 17 + + + 1 + + + 742, 10 + + + 0, 0 + + + 24 + + + label4 + + + &OK + + + 75, 23 + + + btnClose + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 34 + + + 29 + + + block + + + direct + + + 0 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + 2 + + + 110, 21 + + + 4 + + + 7 + + + 0 + + + 11 + + + 0 + + + panel3 + + + 8 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 0, 10 Remarks - + + Fill + + + 742, 60 + + + 0, 79 + + + $this + + + 47, 12 + + + &Cancel + + + *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP + + + 742, 69 + + + True + + + 6, 12 + + + Port + + + 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 + + + txtIP + + 0 - + + label2 + + + cmbOutboundTag + + True - 12, 25 + 19, 20 - + + NoControl + + + 742, 576 + + + 10 + + + 392, 437 + + 75, 23 - - 301, 26 + + NoControl + + + True + + + 4 + + + 5 + + + txtDomain + + + 84, 16 + + + IP + + + 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 + + + 0, 516 + + + 33 47, 12 - - 162, 21 + + 350, 437 - - 10 + + panel3 - - Domain or IP + + Domain - - $this + + txtRemarks - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 347, 16 - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Out Tag - - 0 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 640, 21 - - - 7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 + + 35 True - - zh-Hans - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx similarity index 85% rename from v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx rename to v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx index 94e70d37..c080de59 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx @@ -117,47 +117,29 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + *设置的路由规则,用逗号(,)分隔 + - - 526, 20 - - - 扩大 - - 53, 12 + 71, 12 - 出口标签 - - - 619, 20 - - - 移除 - - - 567, 104 + OutboundTag 29, 12 - 备注 + 别名 - - 53, 12 + + 取消(&C) - - 域名或IP + + 确定(&O) - - 709, 160 - - - 规则 - - - 709, 160 + + 路由规则详情设置 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 5a87e09a..8261890c 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -28,19 +28,39 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingForm)); this.btnClose = new System.Windows.Forms.Button(); - this.panCon = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel(); - this.btnAdd = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); - this.btnSetDefRountingRule = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.labRoutingTips = new System.Windows.Forms.Label(); this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); + this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExportSelectedRules = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromPreset = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromFile = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromClipboard = new System.Windows.Forms.ToolStripMenuItem(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); + this.cmsLv.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.menuServer.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -51,26 +71,13 @@ this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // - // panCon - // - resources.ApplyResources(this.panCon, "panCon"); - this.panCon.Name = "panCon"; - // // panel2 // - this.panel2.Controls.Add(this.btnAdd); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // - // btnAdd - // - resources.ApplyResources(this.btnAdd, "btnAdd"); - this.btnAdd.Name = "btnAdd"; - this.btnAdd.UseVisualStyleBackColor = true; - this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); - // // btnOK // resources.ApplyResources(this.btnOK, "btnOK"); @@ -78,28 +85,13 @@ this.btnOK.UseVisualStyleBackColor = true; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // - // btnSetDefRountingRule - // - resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); - this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; - this.btnSetDefRountingRule.UseVisualStyleBackColor = true; - this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); - // // panel1 // - this.panel1.Controls.Add(this.btnSetDefRountingRule); - this.panel1.Controls.Add(this.labRoutingTips); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // - // labRoutingTips - // - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); - this.labRoutingTips.Name = "labRoutingTips"; - // // linkLabelRoutingDoc // resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); @@ -118,21 +110,169 @@ resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); this.cmbdomainStrategy.Name = "cmbdomainStrategy"; // + // lvRoutings + // + this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.FullRowSelect = true; + this.lvRoutings.GridLines = true; + this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvRoutings.HideSelection = false; + this.lvRoutings.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvRoutings.Items")))}); + this.lvRoutings.MultiSelect = false; + this.lvRoutings.Name = "lvRoutings"; + this.lvRoutings.UseCompatibleStateImageBehavior = false; + this.lvRoutings.View = System.Windows.Forms.View.Details; + this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); + this.lvRoutings.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvRoutings_KeyDown); + // + // cmsLv + // + this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); + this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuAdd, + this.menuRemove, + this.menuSelectAll, + this.menuExportSelectedRules, + this.toolStripSeparator3, + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom}); + this.cmsLv.Name = "cmsLv"; + resources.ApplyResources(this.cmsLv, "cmsLv"); + // + // menuAdd + // + this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); + // + // menuRemove + // + this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); + // + // menuSelectAll + // + this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // menuExportSelectedRules + // + this.menuExportSelectedRules.Name = "menuExportSelectedRules"; + resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); + this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + // + // menuMoveTop + // + this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); + this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); + // + // menuMoveUp + // + this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); + this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); + // + // menuMoveDown + // + this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); + this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); + // + // menuMoveBottom + // + this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); + this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); + // + // MenuItem1 + // + this.MenuItem1.DropDown = this.cmsLv; + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // tabControl2 + // + this.tabControl2.Controls.Add(this.tabPage2); + resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1, + this.toolStripMenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuImportRulesFromPreset, + this.menuImportRulesFromFile, + this.menuImportRulesFromClipboard}); + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); + // + // menuImportRulesFromPreset + // + this.menuImportRulesFromPreset.Name = "menuImportRulesFromPreset"; + resources.ApplyResources(this.menuImportRulesFromPreset, "menuImportRulesFromPreset"); + this.menuImportRulesFromPreset.Click += new System.EventHandler(this.menuImportRulesFromPreset_Click); + // + // menuImportRulesFromFile + // + this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; + resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); + this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); + // + // menuImportRulesFromClipboard + // + this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; + resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); + this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); + // // RoutingSettingForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; - this.Controls.Add(this.panCon); + this.Controls.Add(this.tabControl2); this.Controls.Add(this.panel1); this.Controls.Add(this.panel2); + this.Controls.Add(this.menuServer); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Name = "RoutingSettingForm"; this.Load += new System.EventHandler(this.RoutingSettingForm_Load); this.panel2.ResumeLayout(false); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); + this.cmsLv.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } @@ -140,12 +280,27 @@ private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Button btnOK; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Button btnAdd; - private System.Windows.Forms.Panel panCon; private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label labRoutingTips; private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; private System.Windows.Forms.ComboBox cmbdomainStrategy; - private System.Windows.Forms.Button btnSetDefRountingRule; + private Base.ListViewFlickerFree lvRoutings; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.ContextMenuStrip cmsLv; + private System.Windows.Forms.ToolStripMenuItem menuRemove; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripMenuItem menuSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuAdd; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromPreset; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromFile; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromClipboard; + private System.Windows.Forms.ToolStripMenuItem menuExportSelectedRules; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 35bd956f..e63d4ed8 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Windows.Forms; +using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; @@ -8,8 +9,7 @@ namespace v2rayN.Forms { public partial class RoutingSettingForm : BaseForm { - List lstControls = new List(); - + private List lvSelecteds = new List(); public RoutingSettingForm() { InitializeComponent(); @@ -19,59 +19,61 @@ namespace v2rayN.Forms { cmbdomainStrategy.Text = config.domainStrategy; - if (config.routingItem == null) + if (config.rules == null) { - config.routingItem = new List(); + config.rules = new List(); } - - RefreshSubsView(); + InitRoutingsView(); + RefreshRoutingsView(); } - /// - /// 刷新列表 - /// - private void RefreshSubsView() + private void InitRoutingsView() { - panCon.Controls.Clear(); - lstControls.Clear(); + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); - for (int k = config.routingItem.Count - 1; k >= 0; k--) - { - RoutingItem item = config.routingItem[k]; - if (Utils.IsNullOrEmpty(item.remarks)) - { - config.routingItem.RemoveAt(k); - } - } + lvRoutings.GridLines = true; + lvRoutings.FullRowSelect = true; + lvRoutings.View = View.Details; + lvRoutings.MultiSelect = true; + lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; - foreach (RoutingItem item in config.routingItem) - { - RoutingSettingControl control = new RoutingSettingControl(); - control.OnButtonClicked += Control_OnButtonClicked; - control.routingItem = item; - control.Dock = DockStyle.Top; + lvRoutings.Columns.Add("", 30); + lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 100); + lvRoutings.Columns.Add("outboundTag", 80); + lvRoutings.Columns.Add("port", 80); + lvRoutings.Columns.Add("domain", 200); + lvRoutings.Columns.Add("ip", 200); - panCon.Controls.Add(control); - panCon.Controls.SetChildIndex(control, 0); - - lstControls.Add(control); - } + lvRoutings.EndUpdate(); } - private void Control_OnButtonClicked(object sender, EventArgs e) + private void RefreshRoutingsView() { - RefreshSubsView(); + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + for (int k = 0; k < config.rules.Count; k++) + { + var item = config.rules[k]; + + ListViewItem lvItem = new ListViewItem(""); + Utils.AddSubItem(lvItem, "remarks", item.remarks); + Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); + Utils.AddSubItem(lvItem, "port", item.port); + Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); + Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); + + if (lvItem != null) lvRoutings.Items.Add(lvItem); + } + lvRoutings.EndUpdate(); } private void btnOK_Click(object sender, EventArgs e) { config.domainStrategy = cmbdomainStrategy.Text; - if (config.routingItem.Count <= 0) - { - AddSub("proxy", ""); - } - if (ConfigHandler.SaveRoutingItem(ref config) == 0) + if (ConfigHandler.SaveRoutingRulesItem(ref config) == 0) { this.DialogResult = DialogResult.OK; } @@ -79,7 +81,6 @@ namespace v2rayN.Forms { UI.ShowWarning(UIRes.I18N("OperationFailed")); } - } private void btnClose_Click(object sender, EventArgs e) @@ -87,58 +88,226 @@ namespace v2rayN.Forms this.DialogResult = DialogResult.Cancel; } - private void btnAdd_Click(object sender, EventArgs e) - { - AddSub("proxy", ""); - - RefreshSubsView(); - } - - - private void AddSub(string outboundTag, string userRule) - { - RoutingItem RoutingItem = new RoutingItem - { - remarks = outboundTag, - outboundTag = outboundTag, - userRules = Utils.String2List(userRule) - - }; - config.routingItem.Add(RoutingItem); - } - - - private void btnSetDefRountingRule_Click(object sender, EventArgs e) - { - config.routingItem.Clear(); - - List lstTag = new List - { - Global.agentTag, - Global.directTag, - Global.blockTag - }; - for (int k = 0; k < lstTag.Count; k++) - { - DownloadHandle downloadHandle = new DownloadHandle(); - - string result = downloadHandle.WebDownloadStringSync(Global.CustomRoutingListUrl + lstTag[k]); - if (Utils.IsNullOrEmpty(result)) - { - result = Utils.GetEmbedText(Global.CustomRoutingFileName + lstTag[k]); - } - AddSub(lstTag[k], result); - } - - AddSub(Global.directTag, Utils.GetEmbedText(Global.CustomRoutingFileName + "private")); - AddSub(Global.agentTag, ""); - - RefreshSubsView(); - } - private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); } + + private void lvRoutings_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + var fm = new RoutingSettingDetailsForm(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsView(); + } + } + + private int GetLvSelectedIndex() + { + int index = -1; + lvSelecteds.Clear(); + try + { + if (lvRoutings.SelectedIndices.Count <= 0) + { + UI.Show(UIRes.I18N("PleaseSelectRules")); + return index; + } + + index = lvRoutings.SelectedIndices[0]; + foreach (int i in lvRoutings.SelectedIndices) + { + lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + #region Edit function + + private void menuMoveTop_Click(object sender, EventArgs e) + { + MoveRule(EMove.Top); + } + + private void menuMoveUp_Click(object sender, EventArgs e) + { + MoveRule(EMove.Up); + } + + private void menuMoveDown_Click(object sender, EventArgs e) + { + MoveRule(EMove.Down); + } + + private void menuMoveBottom_Click(object sender, EventArgs e) + { + MoveRule(EMove.Bottom); + } + + private void MoveRule(EMove eMove) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectRules")); + return; + } + if (ConfigHandler.MoveRoutingRule(ref config, index, eMove) == 0) + { + RefreshRoutingsView(); + } + } + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvRoutings.Items) + { + item.Selected = true; + } + } + + private void menuAdd_Click(object sender, EventArgs e) + { + var fm = new RoutingSettingDetailsForm(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsView(); + } + } + + private void menuRemove_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(UIRes.I18N("RemoveRules")) == DialogResult.No) + { + return; + } + for (int k = lvSelecteds.Count - 1; k >= 0; k--) + { + config.rules.RemoveAt(index); + } + RefreshRoutingsView(); + } + private void menuExportSelectedRules_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + var lst = new List(); + foreach (int v in lvSelecteds) + { + lst.Add(config.rules[v]); + } + if (lst.Count > 0) + { + Utils.SetClipboardData(Utils.ToJson(lst)); + UI.Show(UIRes.I18N("OperationSuccess")); + } + + } + + private void lvRoutings_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuSelectAll_Click(null, null); + break; + case Keys.C: + menuExportSelectedRules_Click(null, null); + break; + } + } + else + { + switch (e.KeyCode) + { + case Keys.Delete: + menuRemove_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; + } + } + } + #endregion + + #region preset rules + private void menuImportRulesFromPreset_Click(object sender, EventArgs e) + { + var rules = Utils.GetEmbedText(Global.CustomRoutingFileName + "rules"); + if (ConfigHandler.AddBatchRoutingRules(ref config, rules) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } + + private void menuImportRulesFromFile_Click(object sender, EventArgs e) + { + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Rules|*.json|All|*.*" + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + return; + } + if (ConfigHandler.AddBatchRoutingRules(ref config, result) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } + + private void menuImportRulesFromClipboard_Click(object sender, EventArgs e) + { + string clipboardData = Utils.GetClipboardData(); + if (ConfigHandler.AddBatchRoutingRules(ref config, clipboardData) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } + + #endregion + + } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 9c08b219..ae3fa1eb 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -145,60 +145,6 @@ panel2 - 1 - - - True - - - Fill - - - 0, 68 - - - 765, 545 - - - 10 - - - panCon - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - NoControl - - - 47, 17 - - - 75, 23 - - - 6 - - - &Add - - - btnAdd - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - 0 @@ -226,7 +172,7 @@ panel2 - 2 + 1 Bottom @@ -250,67 +196,7 @@ $this - 2 - - - Top, Right - - - True - - - NoControl - - - 319, 17 - - - 229, 23 - - - 19 - - - Set default custom routing rules - - - btnSetDefRountingRule - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 0 - - - NoControl - - - 10, 42 - - - 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 - - - panel1 - - - 1 + 3 True @@ -343,7 +229,7 @@ panel1 - 2 + 0 AsIs @@ -373,16 +259,16 @@ panel1 - 3 + 1 Top - 0, 0 + 0, 25 - 765, 68 + 765, 51 11 @@ -397,8 +283,217 @@ $this + 2 + + + 17, 17 + + + 202, 22 + + + Add + + + 202, 22 + + + Remove selected + + + 202, 22 + + + Select All (Ctrl+A) + + + 202, 22 + + + Export Selected Rules + + + 199, 6 + + + 202, 22 + + + Move to top (T) + + + 202, 22 + + + Up (U) + + + 202, 22 + + + Down (D) + + + 202, 22 + + + Move to bottom (B) + + + 203, 186 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 3, 3 + + + 751, 505 + + + 12 + + + lvRoutings + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPage2 + + + 0 + + + 120, 21 + + + Edit and Function + + + 4, 22 + + + 3, 3, 3, 3 + + + 757, 511 + + + 0 + + + RuleList + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 0 + + + Fill + + + 0, 76 + + + 765, 537 + + + 14 + + + tabControl2 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 1 + + 139, 17 + + + 247, 22 + + + Import Rules From Preset + + + 247, 22 + + + Import Rules From File + + + 247, 22 + + + Import Rules From Clipboard + + + 95, 21 + + + Import Rules + + + 0, 0 + + + 765, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + True @@ -411,6 +506,90 @@ Routing Settings + + menuAdd + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemove + + + 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 + + + menuExportSelectedRules + + + 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 + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromPreset + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromFile + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + RoutingSettingForm diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index dc3bb7b1..c4e5f695 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -120,25 +120,141 @@ 取消(&C) - - 添加(&A) - 确定(&O) - - 一键设置默认自定义路由规则 - - - *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP - + + 785, 60 + 77, 12 域名解析策略 + + 785, 51 + + + 196, 22 + + + 添加规则 + + + 196, 22 + + + 移除所选规则 + + + 196, 22 + + + 全选 + + + 196, 22 + + + 导出所选规则至剪贴板 + + + 193, 6 + + + 196, 22 + + + 上移至顶 (T) + + + 196, 22 + + + 上移 (U) + + + 196, 22 + + + 下移 (D) + + + 196, 22 + + + 下移至底 (B) + + + 92, 21 + + + 路由规则功能 + + + 197, 186 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 771, 505 + + + 777, 511 + + + 路由规则列表 + + + 785, 537 + + + 184, 22 + + + 从预设中导入规则 + + + 184, 22 + + + 从文件中导入规则 + + + 184, 22 + + + 从剪贴板中导入规则 + + + 92, 21 + + + 导入路由规则 + + + 785, 25 + + + 785, 673 + 路由设置 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 7c96ee51..478fbbd0 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -9,6 +9,9 @@ namespace v2rayN public const string v2rayWebsiteUrl = @"https://www.v2fly.org/"; public const string AboutUrl = @"https://github.com/2dust/v2rayN"; public const string UpdateUrl = AboutUrl + @"/releases"; + public const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases"; + public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; + public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; /// @@ -17,7 +20,7 @@ namespace v2rayN 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 /// diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index ddce8665..cfdd2281 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -86,10 +86,10 @@ namespace v2rayN.Handler if (Utils.IsNullOrEmpty(config.domainStrategy)) { config.domainStrategy = "IPIfNonMatch"; - } - if (config.routingItem == null) + } + if (config.rules == null) { - config.routingItem = new List(); + config.rules = new List(); } //kcp if (config.kcpItem == null) @@ -1067,14 +1067,14 @@ namespace v2rayN.Handler /// /// /// - public static int SaveRoutingItem(ref Config config) + public static int SaveRoutingRulesItem(ref Config config) { - if (config.routingItem == null || config.routingItem.Count <= 0) + if (config.rules == null) { return -1; } - foreach (RoutingItem sub in config.routingItem) + foreach (RulesItem sub in config.rules) { } @@ -1083,6 +1083,134 @@ namespace v2rayN.Handler ToJsonFile(config); return 0; } + /// + /// AddRoutingRulesItem + /// + /// + /// + /// + /// + public static int AddRoutingRule(ref Config config, RulesItem item, int index) + { + if (index >= 0) + { + config.rules[index] = item; + } + else + { + config.rules.Add(item); + } + Global.reloadV2ray = true; + ToJsonFile(config); + + return 0; + } + + /// + /// AddBatchRoutingRules + /// + /// + /// + /// + public static int AddBatchRoutingRules(ref Config config, string clipboardData) + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + + var lstRules = Utils.FromJson>(clipboardData); + if (lstRules == null) + { + return -1; + } + + config.rules.Clear(); + foreach (var item in lstRules) + { + config.rules.Add(item); + } + + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// MoveRoutingRule + /// + /// + /// + /// + /// + public static int MoveRoutingRule(ref Config config, int index, EMove eMove) + { + int count = config.rules.Count; + if (index < 0 || index > config.rules.Count - 1) + { + return -1; + } + switch (eMove) + { + case EMove.Top: + { + if (index == 0) + { + return 0; + } + var item = Utils.DeepCopy(config.rules[index]); + config.rules.RemoveAt(index); + config.rules.Insert(0, item); + + break; + } + case EMove.Up: + { + if (index == 0) + { + return 0; + } + var item = Utils.DeepCopy(config.rules[index]); + config.rules.RemoveAt(index); + config.rules.Insert(index - 1, item); + + break; + } + + case EMove.Down: + { + if (index == count - 1) + { + return 0; + } + var item = Utils.DeepCopy(config.rules[index]); + config.rules.RemoveAt(index); + config.rules.Insert(index + 1, item); + + break; + } + case EMove.Bottom: + { + if (index == count - 1) + { + return 0; + } + var item = Utils.DeepCopy(config.rules[index]); + config.rules.RemoveAt(index); + config.rules.Add(item); + + break; + } + + } + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 5dacf61f..dd1d057a 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -52,12 +52,12 @@ namespace v2rayN.Handler #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 v2flyCoreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; - private const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; - private readonly string xrayCoreLatestUrl = "https://github.com/XTLS/Xray-core/releases/latest"; - private const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases/download/{0}/Xray-windows-{1}.zip"; + private readonly string nLatestUrl = Global.NUrl + "/latest"; + private const string nUrl = Global.NUrl + "/download/{0}/v2rayN.zip"; + private readonly string v2flyCoreLatestUrl = Global.v2flyCoreUrl + "/latest"; + private const string v2flyCoreUrl = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip"; + private readonly string xrayCoreLatestUrl = Global.xrayCoreUrl + "/latest"; + private const string xrayCoreUrl = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip"; public async void CheckUpdateAsync(string type) { @@ -119,7 +119,7 @@ namespace v2rayN.Handler string filePath = Utils.GetPath(core); if (!File.Exists(filePath)) { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); + string msg = string.Format(UIRes.I18N("NotFoundCore"), @""); //ShowMsg(true, msg); return ""; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 61175ba4..3242cbb1 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -195,9 +195,9 @@ namespace v2rayN.Handler { v2rayConfig.routing.domainStrategy = config.domainStrategy; - foreach (var item in config.routingItem) + foreach (var item in config.rules) { - routingUserRule(item.userRules, item.outboundTag, ref v2rayConfig); + routingUserRule(item, ref v2rayConfig); } } } @@ -206,68 +206,38 @@ namespace v2rayN.Handler } return 0; } - private static int routingUserRule(List userRule, string tag, ref V2rayConfig v2rayConfig) + private static int routingUserRule(RulesItem rules, ref V2rayConfig v2rayConfig) { try { - if (userRule == null) + if (rules == null) { + return 0; } - else if (userRule.Count == 0) + var hasDomainIp = false; + if (rules.domain != null && rules.domain.Count > 0) { - v2rayConfig.routing.rules.Add(new RulesItem - { - type = "field", - outboundTag = tag, - port = "0-65535" - }); + var it = Utils.DeepCopy(rules); + it.ip = null; + it.type = "field"; + v2rayConfig.routing.rules.Add(it); + hasDomainIp = true; } - else if (userRule.Count > 0) + if (rules.ip != null && rules.ip.Count > 0) { - //Domain - RulesItem rulesDomain = new RulesItem - { - type = "field", - outboundTag = tag, - domain = new List() - }; - - //IP - RulesItem rulesIP = new RulesItem - { - type = "field", - outboundTag = tag, - ip = new List() - }; - - foreach (string u in userRule) - { - string url = u.TrimEx(); - if (Utils.IsNullOrEmpty(url)) - { - continue; - } - if (Utils.IsIP(url) || url.StartsWith("geoip:")) - { - rulesIP.ip.Add(url); - } - else if (Utils.IsDomain(url) - || url.StartsWith("geosite:") - || url.StartsWith("regexp:") - || url.StartsWith("domain:") - || url.StartsWith("full:")) - { - rulesDomain.domain.Add(url); - } - } - if (rulesDomain.domain.Count > 0) - { - v2rayConfig.routing.rules.Add(rulesDomain); - } - if (rulesIP.ip.Count > 0) - { - v2rayConfig.routing.rules.Add(rulesIP); - } + var it = Utils.DeepCopy(rules); + it.domain = null; + it.type = "field"; + v2rayConfig.routing.rules.Add(it); + hasDomainIp = true; + } + if (!hasDomainIp && !Utils.IsNullOrEmpty(rules.port)) + { + var it = Utils.DeepCopy(rules); + it.domain = null; + it.ip = null; + it.type = "field"; + v2rayConfig.routing.rules.Add(it); } } catch diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index e4d13371..95951b5e 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -22,18 +22,13 @@ namespace v2rayN.Handler { private static string v2rayConfigRes = Global.v2rayConfigFileName; private List lstV2ray; + private string coreUrl; public event ProcessDelegate ProcessEvent; //private int processId = 0; private Process _process; public V2rayHandler() { - lstV2ray = new List - { - "xray", - "wv2ray", - "v2ray" - }; } /// @@ -41,6 +36,24 @@ namespace v2rayN.Handler /// public void LoadV2ray(Config config) { + if (config.coreType == ECoreType.v2fly_core) + { + lstV2ray = new List + { + "wv2ray", + "v2ray" + }; + coreUrl = Global.v2flyCoreUrl; + } + else + { + lstV2ray = new List + { + "xray" + }; + coreUrl = Global.xrayCoreUrl; + } + if (Global.reloadV2ray) { string fileName = Utils.GetPath(v2rayConfigRes); @@ -159,7 +172,8 @@ namespace v2rayN.Handler } } - private string V2rayFindexe() { + private string V2rayFindexe() + { //查找v2ray文件是否存在 string fileName = string.Empty; //lstV2ray.Reverse(); @@ -175,7 +189,7 @@ namespace v2rayN.Handler } if (Utils.IsNullOrEmpty(fileName)) { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); + string msg = string.Format(UIRes.I18N("NotFoundCore"), coreUrl); ShowMsg(false, msg); } return fileName; @@ -318,6 +332,6 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); } - } + } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs index f738a318..a49e2d04 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs @@ -74,7 +74,7 @@ namespace v2rayN.HttpProxyHandler if (_process == null) { - string privoxyConfig = Resources.privoxy_conf; + string privoxyConfig = "";//Resources.privoxy_conf; RunningPort = config.GetLocalPort(Global.InboundHttp); privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString()); privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_PORT__", RunningPort.ToString()); diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 245d9ed0..2680a577 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -96,7 +96,7 @@ namespace v2rayN.Mode public string speedPingTestUrl { get; set; - } + } /// /// 允许来自局域网的连接 @@ -161,7 +161,12 @@ namespace v2rayN.Mode { get; set; } - public List routingItem + public List rules + { + get; set; + } + + public ECoreType coreType { get; set; } @@ -276,7 +281,7 @@ namespace v2rayN.Mode { return GetLocalPort(Global.InboundSocks) + 1; } - + else if (protocol == "speedtest") { return GetLocalPort(Global.InboundSocks) + 103; @@ -693,32 +698,4 @@ namespace v2rayN.Mode get; set; } } - - [Serializable] - public class RoutingItem - { - /// - /// - /// - public string remarks - { - get; set; - } - - /// - /// - /// - public string outboundTag - { - get; set; - } - - /// - /// - /// - public List userRules - { - get; set; - } - } } diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index 4049db06..3076b8b7 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -3,7 +3,7 @@ namespace v2rayN.Mode { public enum ECoreType { - v2fly_core = 1, - xray_core = 2 + v2fly_core = 0, + Xray_core = 1 } } diff --git a/v2rayN/v2rayN/Mode/ERoutingSort.cs b/v2rayN/v2rayN/Mode/ERoutingSort.cs deleted file mode 100644 index 2df23d2d..00000000 --- a/v2rayN/v2rayN/Mode/ERoutingSort.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace v2rayN.Mode -{ - public enum ERoutingSort - { - UserProxy = 1, - UserDirect = 2, - UserBlock = 3, - UserPredefined = 4 - } -} diff --git a/v2rayN/v2rayN/Mode/ESysProxyType.cs b/v2rayN/v2rayN/Mode/ESysProxyType.cs index 13f63c7e..7e33357e 100644 --- a/v2rayN/v2rayN/Mode/ESysProxyType.cs +++ b/v2rayN/v2rayN/Mode/ESysProxyType.cs @@ -3,8 +3,8 @@ namespace v2rayN.Mode { public enum ESysProxyType { - Unchanged = 0, + ForcedClear = 0, ForcedChange = 1, - ForcedClear = 2 + Unchanged = 2 } } diff --git a/v2rayN/v2rayN/Mode/RulesItem.cs b/v2rayN/v2rayN/Mode/RulesItem.cs new file mode 100644 index 00000000..a4ae121e --- /dev/null +++ b/v2rayN/v2rayN/Mode/RulesItem.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + [Serializable] + public class RulesItem + { + public string remarks { get; set; } + /// + /// + /// + public string type { get; set; } + /// + /// + /// + public string port { get; set; } + + public List inboundTag { get; set; } + /// + /// + /// + public string outboundTag { get; set; } + + /// + /// + /// + public List ip { get; set; } + + /// + /// + /// + public List domain { get; set; } + } + +} diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 9ec65af0..94a33f8c 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -323,34 +323,6 @@ namespace v2rayN.Mode public List servers { get; set; } } - public class RulesItem - { - /// - /// - /// - public string type { get; set; } - /// - /// - /// - public string port { get; set; } - - public List inboundTag { get; set; } - /// - /// - /// - public string outboundTag { get; set; } - - /// - /// - /// - public List ip { get; set; } - - /// - /// - /// - public List domain { get; set; } - } - public class Routing { /// diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 794c9c1a..82cf7900 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.1")] +[assembly: AssemblyFileVersion("4.2")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index 2088590e..672c250f 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -120,23 +120,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ - ///toggle 0 - ///logfile v2ray_privoxy.log - ///show-on-task-bar 0 - ///activity-animation 0 - ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . - ///max-client-connections 2048 - ///hide-console - /// 的本地化字符串。 - /// - internal static string privoxy_conf { - get { - return ResourceManager.GetString("privoxy_conf", resourceCulture); - } - } - /// /// 查找 System.Byte[] 类型的本地化资源。 /// diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 2aa66967..2ffcd3a9 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -151,9 +151,6 @@ ..\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 diff --git a/v2rayN/v2rayN/Resources/pac.txt b/v2rayN/v2rayN/Resources/pac.txt deleted file mode 100644 index 6695b760..00000000 --- a/v2rayN/v2rayN/Resources/pac.txt +++ /dev/null @@ -1,7614 +0,0 @@ -// Generated by gfwlist2pac in precise mode -// https://github.com/clowwindy/gfwlist2pac - -var proxy = "__PROXY__"; - -var rules = [ - "|http://85.17.73.31/", - "||agnesb.fr", - "||akiba-web.com", - "||altrec.com", - "||angela-merkel.de", - "||angola.org", - "||apartmentratings.com", - "||apartments.com", - "||arena.taipei", - "||asianspiss.com", - "||assimp.org", - "||athenaeizou.com", - "||azubu.tv", - "||bankmobilevibe.com", - "||banorte.com", - "||bash-hackers.org", - "||beeg.com", - "||global.bing.com", - "||bloombergview.com", - "||booktopia.com.au", - "||boysmaster.com", - "||bynet.co.il", - "||carfax.com", - ".casinobellini.com", - "||casinobellini.com", - "||centauro.com.br", - "||chobit.cc", - "||clearsurance.com", - "||images.comico.tw", - "||static.comico.tw", - "||counter.social", - "||costco.com", - "||crossfire.co.kr", - "||d2pass.com", - "||darpa.mil", - "||dawangidc.com", - "||deezer.com", - "||desipro.de", - "||dingchin.com.tw", - "||discordapp.com", - "||discordapp.net", - "||dish.com", - "|http://img.dlsite.jp/", - "||dm530.net", - "share.dmhy.org", - "||dmhy.org", - "||dmm.co.jp", - "|http://www.dmm.com/netgame", - "||dnvod.tv", - "||dvdpac.com", - "||eesti.ee", - "||esurance.com", - ".expekt.com", - "||expekt.com", - ".extmatrix.com", - "||extmatrix.com", - "||fakku.net", - "||fastpic.ru", - "||filesor.com", - "||financetwitter.com", - "||flipboard.com", - "||flitto.com", - "||fnac.be", - "||fnac.com", - "||funkyimg.com", - "||fxnetworks.com", - "||g-area.org", - "||gettyimages.com", - "||getuploader.com", - "|https://raw.githubusercontent.com/programthink/zhao", - "||glass8.eu", - "||glype.com", - "||go141.com", - "||guo.media", - "||hautelook.com", - "||hautelookcdn.com", - "||wego.here.com", - "||gamer-cds.cdn.hinet.net", - "||gamer2-cds.cdn.hinet.net", - "||hmvdigital.ca", - "||hmvdigital.com", - "||homedepot.com", - "||hoovers.com", - "||hulu.com", - "||huluim.com", - "|http://secure.hustler.com", - "|http://hustlercash.com", - "|http://www.hustlercash.com", - "||hybrid-analysis.com", - "||cdn*.i-scmp.com", - "||ilovelongtoes.com", - "|http://imgmega.com/*.gif.html", - "|http://imgmega.com/*.jpg.html", - "|http://imgmega.com/*.jpeg.html", - "|http://imgmega.com/*.png.html", - "||imlive.com", - "||tw.iqiyi.com", - "||javhub.net", - "||javhuge.com", - ".javlibrary.com", - "||javlibrary.com", - "||jcpenney.com", - "||jims.net", - "||jukujo-club.com", - "||juliepost.com", - "||kawaiikawaii.jp", - "||kendatire.com", - "||khatrimaza.org", - "||kkbox.com", - "||leisurepro.com", - "||lifemiles.com", - "||longtoes.com", - "||lovetvshow.com", - "|http://www.m-sport.co.uk", - "||macgamestore.com", - "||madonna-av.com", - "||mangafox.com", - "||mangafox.me", - "||manta.com", - "||matome-plus.com", - "||matome-plus.net", - "||mattwilcox.net", - "||metarthunter.com", - "||mfxmedia.com", - "||mojim.com", - "||kb.monitorware.com", - "||monster.com", - "||moodyz.com", - "||moonbingo.com", - "||mos.ru", - "||msha.gov", - "||muzu.tv", - "||mvg.jp", - ".mybet.com", - "||mybet.com", - "||nationwide.com", - "|http://www.nbc.com/live", - "||neo-miracle.com", - "||netflix.com", - "||nflximg.com", - "||nflximg.net", - "||nflxext.com", - "||nflxso.net", - "||nflxvideo.net", - "||nic.gov", - "|http://mo.nightlife141.com", - "||nordstrom.com", - "||nordstromimage.com", - "||nordstromrack.com", - "||nottinghampost.com", - "||npsboost.com", - "||ntdtv.cz", - "||s1.nudezz.com", - "||nusatrip.com", - "||nuuvem.com", - "||omni7.jp", - "||onapp.com", - "||ontrac.com", - "@@|http://blog.ontrac.com", - "||pandora.com", - ".pandora.tv", - "||parkansky.com", - "||phmsociety.org", - "|http://*.pimg.tw/", - "||pure18.com", - "||pytorch.org", - "||qq.co.za", - "||r18.com", - "|http://radiko.jp", - "||ramcity.com.au", - "||rd.com", - "||rdio.com", - "|https://riseup.net", - "||sadistic-v.com", - "||isc.sans.edu", - "|http://cdn*.search.xxx/", - "||shiksha.com", - "||slacker.com", - "||sm-miracle.com", - "||soylentnews.org", - "||spotify.com", - "||spreadshirt.es", - "||springboardplatform.com", - "||sprite.org", - "@@|http://store.sprite.org", - "||superokayama.com", - "||superpages.com", - "||swagbucks.com", - "||switch1.jp", - "||tapanwap.com", - "||gsp.target.com", - "||login.target.com", - "||rcam.target.com", - "||thinkgeek.com", - "||thebodyshop-usa.com", - "||tma.co.jp", - "||tracfone.com", - "||tryheart.jp", - "||turntable.fm", - "||twerkingbutt.com", - "||ulop.net", - "||uukanshu.com", - "||vegasred.com", - "||vevo.com", - "||vip-enterprise.com", - "|http://viu.tv/ch/", - "|http://viu.tv/encore/", - "||vmpsoft.com", - "|http://ecsm.vs.com/", - "||wanz-factory.com", - "||ssl.webpack.de", - "||wheretowatch.com", - "||wingamestore.com", - "||wizcrafts.net", - "||vod.wwe.com", - "||xfinity.com", - "||youwin.com", - "||ytn.co.kr", - "||zattoo.com", - "||zim.vn", - "||zozotown.com", - "14.102.250.18", - "14.102.250.19", - "50.7.31.230:8898", - "174.142.105.153", - "69.65.19.160", - "||xn--4gq171p.com", - "||xn--czq75pvv1aj5c.org", - "||xn--i2ru8q2qg.com", - "||xn--oiq.cc", - "||xn--p8j9a0d9c9a.xn--q9jyb4c", - "||abebooks.com", - "|https://*.s3.amazonaws.com", - "||s3-ap-southeast-2.amazonaws.com", - "||43110.cf", - "||9gag.com", - "||agro.hk", - "||share.america.gov", - "||apkmirror.com", - "||arte.tv", - "||artstation.com", - "||bangdream.space", - "||behance.net", - "||bird.so", - "||zh.bitterwinter.org", - "||bnn.co", - "||businessinsider.com", - "||boomssr.com", - "||bwgyhw.com", - "||castbox.fm", - "||chinatimes.com", - "||clyp.it", - "||cmcn.org", - "||cmx.im", - "||dailyview.tw", - "||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", - "||hkgolden.com", - "||hudson.org", - "||ipfs.io", - "||japantimes.co.jp", - "||jiji.com", - "||jintian.net", - "||jinx.com", - "||joinmastodon.org", - "||liangzhichuanmei.com", - "||lighti.me", - "||lightyearvpn.com", - "||lihkg.com", - "||line-scdn.net", - "||i.lithium.com", - "||cloud.mail.ru", - "||cdn-images.mailchimp.com", - "||mastodon.cloud", - "||mastodon.host", - "||mastodon.social", - "||matters.news", - "||me.me", - "||metart.com", - "||mohu.club", - "||mohu.ml", - "||motiyun.com", - "||msa-it.org", - "||dictionary.goo.ne.jp", - "||go.nesnode.com", - "||international-news.newsmagazine.asia", - "||nikkei.com", - "||niu.moe", - "||nofile.io", - "||now.com", - "||sukebei.nyaa.si", - "||openvpn.org", - "||onejav.com", - "||paste.ee", - "||my.pcloud.com", - "||picacomic.com", - "||pincong.rocks", - "||pixiv.net", - "||potato.im", - "||premproxy.com", - "||prism-break.org", - "||protonvpn.com", - "||api.pureapk.com", - "||quora.com", - "||quoracdn.net", - "||qz.com", - "||cdn.seatguru.com", - "||secure.raxcdn.com", - "||redd.it", - "||reddit.com", - ".redditlist.com", - "|http://redditlist.com", - "||redditmedia.com", - "||redditstatic.com", - "||rixcloud.com", - "||rixcloud.us", - "||rsdlmonitor.com", - "||shadowsocks.be", - "||shadowsocks9.com", - "||tn1.shemalez.com", - "||tn2.shemalez.com", - "||tn3.shemalez.com", - "||static.shemalez.com", - "||six-degrees.io", - "||softfamous.com", - "||softsmirror.cf", - "||sosreader.com", - "||sspanel.net", - "||sulian.me", - "||supchina.com", - "||teddysun.com", - "||textnow.me", - "||tineye.com", - "||top10vpn.com", - "||tubepornclassic.com", - "||uku.im", - "||unseen.is", - "||cn.uptodown.com", - "||uraban.me", - "||vrsmash.com", - "||vultryhw.com", - "||scache.vzw.com", - "||scache1.vzw.com", - "||scache2.vzw.com", - "||ss7.vzw.com", - "||ssr.tools", - "||steemit.com", - "||taiwanjustice.net", - "||tinc-vpn.org", - "||u15.info", - "||washingtonpost.com", - "||wenzhao.ca", - "||whatsonweibo.com", - "||wire.com", - "||blog.workflow.is", - "||xm.com", - "||xuehua.us", - "||yes-news.com", - "||yigeni.com", - "||you-get.org", - "||zzcloud.me", - "||aex.com", - "||allcoin.com", - "||adcex.com", - "||bcex.ca", - "||bibox.com", - "||big.one", - "||binance.com", - "||bit-z.com", - "||bitcoinworld.com", - "||bitfinex.com", - "||bithumb.com", - "||bitinka.com.ar", - "||bitmex.com", - "||btc98.com", - "||btcbank.bank", - "||btctrade.im", - "||c2cx.com", - "||chaoex.com", - "||cobinhood.com", - "||coin2co.in", - "||coinbene.com", - ".coinegg.com", - "||coinegg.com", - "||coinex.com", - "||coingi.com", - "||coinrail.co.kr", - "||cointiger.com", - "||cointobe.com", - "||coinut.com", - "||discoins.com", - "||dragonex.io", - "||ebtcbank.com", - "||etherdelta.com", - "||exmo.com", - "||exrates.me", - "||exx.com", - "||fatbtc.com", - "||gate.io", - "||gatecoin.com", - "||hbg.com", - "||hitbtc.com", - "||huobi.com", - "||huobi.pro", - "||huobipro.com", - "||bx.in.th", - "||jex.com", - "||kex.com", - "||kspcoin.com", - "||kucoin.com", - "||lbank.info", - "||livecoin.net", - "||localbitcoins.com", - "||mercatox.com", - "||oex.com", - "||okex.com", - "||otcbtc.com", - "||rightbtc.com", - "||topbtc.com", - "||xbtce.com", - "||yobit.net", - "||zb.com", - "||read01.com", - "||kknews.cc", - "china-mmm.jp.net", - ".lsxszzg.com", - ".china-mmm.net", - "||china-mmm.net", - "china-mmm.sa.com", - ".allowed.org", - ".now.im", - "||amazon.co.jp", - ".amazon.com/Dalai-Lama", - "amazon.com/Prisoner-State-Secret-Journal-Premier", - "s3-ap-northeast-1.amazonaws.com", - "||aolchannels.aol.com", - "video.aol.ca/video-detail", - "video.aol.co.uk/video-detail", - "video.aol.com", - "||video.aol.com", - "||search.aol.com", - "www.aolnews.com", - ".avmo.pw", - ".avmoo.com", - "|http://avmoo.com", - ".avmoo.net", - "|http://avmoo.net", - "||avmoo.pw", - ".javmoo.xyz", - "|http://javmoo.xyz", - ".javtag.com", - "|http://javtag.com", - ".javzoo.com", - "|http://javzoo.com", - ".tellme.pw", - ".bbc.com", - "||bbc.com", - ".bbc.co.uk", - "||bbc.co.uk", - "||bbci.co.uk", - ".bbcchinese.com", - "||bbcchinese.com", - "|http://bbc.in", - ".1dumb.com", - ".25u.com", - ".2waky.com", - ".3-a.net", - ".4dq.com", - ".4mydomain.com", - ".4pu.com", - ".acmetoy.com", - ".almostmy.com", - ".americanunfinished.com", - ".authorizeddns.net", - ".authorizeddns.org", - ".authorizeddns.us", - ".bigmoney.biz", - ".changeip.name", - ".changeip.net", - ".changeip.org", - ".cleansite.biz", - ".cleansite.info", - ".cleansite.us", - ".compress.to", - ".ddns.info", - ".ddns.me.uk", - ".ddns.mobi", - ".ddns.ms", - ".ddns.name", - ".ddns.us", - ".dhcp.biz", - ".dns-dns.com", - ".dns-stuff.com", - ".dns04.com", - ".dns05.com", - ".dns1.us", - ".dns2.us", - ".dnset.com", - ".dnsrd.com", - ".dsmtp.com", - ".dumb1.com", - ".dynamic-dns.net", - ".dynamicdns.biz", - ".dynamicdns.co.uk", - ".dynamicdns.me.uk", - ".dynamicdns.org.uk", - ".dyndns.pro", - ".dynssl.com", - ".edns.biz", - ".epac.to", - ".esmtp.biz", - ".ezua.com", - ".faqserv.com", - ".fartit.com", - ".freeddns.com", - ".freetcp.com", - ".freewww.biz", - ".freewww.info", - ".ftp1.biz", - ".ftpserver.biz", - ".gettrials.com", - ".got-game.org", - ".gr8domain.biz", - ".gr8name.biz", - ".https443.net", - ".https443.org", - ".ikwb.com", - ".instanthq.com", - ".iownyour.biz", - ".iownyour.org", - ".isasecret.com", - ".itemdb.com", - ".itsaol.com", - ".jetos.com", - ".jkub.com", - ".jungleheart.com", - ".justdied.com", - ".lflink.com", - ".lflinkup.com", - ".lflinkup.net", - ".lflinkup.org", - ".longmusic.com", - ".mefound.com", - ".moneyhome.biz", - ".mrbasic.com", - ".mrbonus.com", - ".mrface.com", - ".mrslove.com", - ".my03.com", - ".mydad.info", - ".myddns.com", - ".myftp.info", - ".myftp.name", - ".mylftv.com", - ".mymom.info", - ".mynetav.net", - ".mynetav.org", - ".mynumber.org", - ".mypicture.info", - ".mypop3.net", - ".mypop3.org", - ".mysecondarydns.com", - ".mywww.biz", - ".myz.info", - ".ninth.biz", - ".ns01.biz", - ".ns01.info", - ".ns01.us", - ".ns02.biz", - ".ns02.info", - ".ns02.us", - ".ns1.name", - ".ns2.name", - ".ns3.name", - ".ocry.com", - ".onedumb.com", - ".onmypc.biz", - ".onmypc.info", - ".onmypc.net", - ".onmypc.org", - ".onmypc.us", - ".organiccrap.com", - ".otzo.com", - ".ourhobby.com", - ".pcanywhere.net", - ".port25.biz", - ".proxydns.com", - ".qhigh.com", - ".qpoe.com", - ".rebatesrule.net", - ".sellclassics.com", - ".sendsmtp.com", - ".serveuser.com", - ".serveusers.com", - ".sexidude.com", - ".sexxxy.biz", - ".sixth.biz", - ".squirly.info", - ".ssl443.org", - ".toh.info", - ".toythieves.com", - ".trickip.net", - ".trickip.org", - ".vizvaz.com", - ".wha.la", - ".wikaba.com", - ".www1.biz", - ".wwwhost.biz", - "@@|http://xx.wwwhost.biz", - ".x24hr.com", - ".xxuz.com", - ".xxxy.biz", - ".xxxy.info", - ".ygto.com", - ".youdontcare.com", - ".yourtrap.com", - ".zyns.com", - ".zzux.com", - "d1b183sg0nvnuh.cloudfront.net", - "|https://d1b183sg0nvnuh.cloudfront.net", - "d1c37gjwa26taa.cloudfront.net", - "|https://d1c37gjwa26taa.cloudfront.net", - "d3c33hcgiwev3.cloudfront.net", - "|https://d3c33hcgiwev3.cloudfront.net", - "||d3rhr7kgmtrq1v.cloudfront.net", - ".3d-game.com", - ".4irc.com", - ".b0ne.com", - ".chatnook.com", - ".darktech.org", - ".deaftone.com", - ".dtdns.net", - ".effers.com", - ".etowns.net", - ".etowns.org", - ".flnet.org", - ".gotgeeks.com", - ".scieron.com", - ".slyip.com", - ".slyip.net", - ".suroot.com", - ".blogdns.org", - ".dyndns.org", - ".dyndns-ip.com", - ".dyndns-pics.com", - ".from-sd.com", - ".from-pr.com", - ".is-a-hunter.com", - ".dynu.com", - ".dynu.net", - ".freeddns.org", - "cdninstagram.com", - "||cdninstagram.com", - "||facebook.br", - ".facebook.com", - "||facebook.com", - "@@||v6.facebook.com", - "||facebook.design", - "||connect.facebook.net", - "||facebook.hu", - "||facebook.in", - "||facebook.nl", - "||facebook.se", - "||facebookmail.com", - "||fb.com", - "||fb.me", - "||fbcdn.net", - "||fbsbx.com", - "||fbaddins.com", - "||fbworkmail.com", - ".instagram.com", - "||instagram.com", - "||m.me", - "||messenger.com", - "||oculus.com", - "||oculuscdn.com", - "||rocksdb.org", - "@@||ip6.static.sl-reverse.com", - "||thefacebook.com", - "||whatsapp.com", - "||whatsapp.net", - ".ftchinese.com", - "||ftchinese.com", - "||1e100.net", - "||466453.com", - "||abc.xyz", - "||about.google", - "||admob.com", - "||adsense.com", - "||agoogleaday.com", - "||ai.google", - "||ampproject.org", - "@@|https://www.ampproject.org", - "@@|https://cdn.ampproject.org", - "||android.com", - "||androidify.com", - "||androidtv.com", - "||api.ai", - ".appspot.com", - "||appspot.com", - "||autodraw.com", - "||blog.google", - "||blogblog.com", - "blogspot.com", - "/^https?:\\/\\/[^\\/]+blogspot\\.(.*)/", - ".blogspot.hk", - ".blogspot.jp", - ".blogspot.tw", - "||certificate-transparency.org", - "||chrome.com", - "||chromecast.com", - "||chromeexperiments.com", - "||chromercise.com", - "||chromestatus.com", - "||chromium.org", - "||com.google", - "||crbug.com", - "||creativelab5.com", - "||crisisresponse.google", - "||crrev.com", - "||data-vocabulary.org", - "||debug.com", - "||deepmind.com", - "||deja.com", - "||design.google", - "||digisfera.com", - "||dns.google", - "||domains.google", - "||duck.com", - "||environment.google", - "||feedburner.com", - "||firebaseio.com", - "||g.co", - "||gcr.io", - "||get.app", - "||get.dev", - "||get.how", - "||get.page", - "||getmdl.io", - "||getoutline.org", - "||ggpht.com", - "||gmail.com", - "||gmodules.com", - "||godoc.org", - "||golang.org", - "||goo.gl", - ".google.ae", - ".google.as", - ".google.am", - ".google.at", - ".google.az", - ".google.ba", - ".google.be", - ".google.bg", - ".google.ca", - ".google.cd", - ".google.ci", - ".google.co.id", - ".google.co.jp", - ".google.co.kr", - ".google.co.ma", - ".google.co.uk", - ".google.com", - ".google.de", - "||google.dev", - ".google.dj", - ".google.dk", - ".google.es", - ".google.fi", - ".google.fm", - ".google.fr", - ".google.gg", - ".google.gl", - ".google.gr", - ".google.ie", - ".google.is", - ".google.it", - ".google.jo", - ".google.kz", - ".google.lv", - ".google.mn", - ".google.ms", - ".google.nl", - ".google.nu", - ".google.no", - ".google.ro", - ".google.ru", - ".google.rw", - ".google.sc", - ".google.sh", - ".google.sk", - ".google.sm", - ".google.sn", - ".google.tk", - ".google.tm", - ".google.to", - ".google.tt", - ".google.vu", - ".google.ws", - "/^https?:\\/\\/([^\\/]+\\.)*google\\.(ac|ad|ae|af|al|am|as|at|az|ba|be|bf|bg|bi|bj|bs|bt|by|ca|cat|cd|cf|cg|ch|ci|cl|cm|co.ao|co.bw|co.ck|co.cr|co.id|co.il|co.in|co.jp|co.ke|co.kr|co.ls|co.ma|com|com.af|com.ag|com.ai|com.ar|com.au|com.bd|com.bh|com.bn|com.bo|com.br|com.bz|com.co|com.cu|com.cy|com.do|com.ec|com.eg|com.et|com.fj|com.gh|com.gi|com.gt|com.hk|com.jm|com.kh|com.kw|com.lb|com.ly|com.mm|com.mt|com.mx|com.my|com.na|com.nf|com.ng|com.ni|com.np|com.om|com.pa|com.pe|com.pg|com.ph|com.pk|com.pr|com.py|com.qa|com.sa|com.sb|com.sg|com.sl|com.sv|com.tj|com.tr|com.tw|com.ua|com.uy|com.vc|com.vn|co.mz|co.nz|co.th|co.tz|co.ug|co.uk|co.uz|co.ve|co.vi|co.za|co.zm|co.zw|cv|cz|de|dj|dk|dm|dz|ee|es|eu|fi|fm|fr|ga|ge|gg|gl|gm|gp|gr|gy|hk|hn|hr|ht|hu|ie|im|iq|is|it|it.ao|je|jo|kg|ki|kz|la|li|lk|lt|lu|lv|md|me|mg|mk|ml|mn|ms|mu|mv|mw|mx|ne|nl|no|nr|nu|org|pl|pn|ps|pt|ro|rs|ru|rw|sc|se|sh|si|sk|sm|sn|so|sr|st|td|tg|tk|tl|tm|tn|to|tt|us|vg|vn|vu|ws)\\/.*/", - "||googleapis.cn", - "||googleapis.com", - "||googleapps.com", - "||googleartproject.com", - "||googleblog.com", - "||googlebot.com", - "||googlechinawebmaster.com", - "||googlecode.com", - "||googlecommerce.com", - "||googledomains.com", - "||googlearth.com", - "||googleearth.com", - "||googledrive.com", - "||googlegroups.com", - "||googlehosted.com", - "||googleideas.com", - "||googleinsidesearch.com", - "||googlelabs.com", - "||googlemail.com", - "||googlemashups.com", - "||googlepagecreator.com", - "||googleplay.com", - "||googleplus.com", - "||googlescholar.com", - "||googlesource.com", - "||googleusercontent.com", - ".googlevideo.com", - "||googlevideo.com", - "||googleweblight.com", - "||googlezip.net", - "||groups.google.cn", - "||grow.google", - "||gstatic.com", - "||gvt0.com", - "||gvt1.com", - "@@||redirector.gvt1.com", - "||gvt3.com", - "||gwtproject.org", - "||html5rocks.com", - "||iam.soy", - "||igoogle.com", - "||itasoftware.com", - "||lers.google", - "||like.com", - "||madewithcode.com", - "||material.io", - "||nic.google", - "||on2.com", - "||panoramio.com", - "||picasaweb.com", - "||pki.goog", - "||plus.codes", - "||polymer-project.org", - "||pride.google", - "||questvisual.com", - "||admin.recaptcha.net", - "||api.recaptcha.net", - "||api-secure.recaptcha.net", - "||api-verify.recaptcha.net", - "||redhotlabs.com", - "||registry.google", - "||safety.google", - "||savethedate.foo", - "||schema.org", - "||shattered.io", - "|http://sipml5.org/", - "||stories.google", - "||sustainability.google", - "||synergyse.com", - "||teachparentstech.org", - "||tensorflow.org", - "||tfhub.dev", - "||thinkwithgoogle.com", - "||tiltbrush.com", - "||urchin.com", - "||waveprotocol.org", - "||waymo.com", - "||web.dev", - "||webmproject.org", - "||webrtc.org", - "||whatbrowser.org", - "||widevine.com", - "||withgoogle.com", - "||withyoutube.com", - "||x.company", - "||xn--ngstr-lra8j.com", - "||youtu.be", - ".youtube.com", - "||youtube.com", - "||youtube-nocookie.com", - "||youtubeeducation.com", - "||youtubegaming.com", - "||yt.be", - "||ytimg.com", - "||zynamics.com", - "||naughtyamerica.com", - "static01.nyt.com", - "||nyt.com", - "nytchina.com", - "nytcn.me", - "||nytcn.me", - "||nytco.com", - "|http://nyti.ms/", - ".nytimes.com", - "||nytimes.com", - "||nytimg.com", - "userapi.nytlog.com", - "cn.nytstyle.com", - "||nytstyle.com", - ".steamcommunity.com", - "||steamcommunity.com", - "|http://store.steampowered.com/app/333600", - "||t.me", - "||updates.tdesktop.com", - "||telegram.dog", - "||telegram.me", - "||telegram.org", - ".telegramdownload.com", - "||telesco.pe", - "||jtvnw.net", - "||ttvnw.net", - "||twitch.tv", - "||twitchcdn.net", - "||periscope.tv", - ".pscp.tv", - "||pscp.tv", - ".t.co", - "||t.co", - ".tweetdeck.com", - "||tweetdeck.com", - "||twimg.com", - ".twitpic.com", - "||twitpic.com", - ".twitter.com", - "||twitter.com", - "||twitter.jp", - "||vine.co", - "||gov.taipei", - ".gov.tw", - "|https://aiss.anws.gov.tw", - "||archives.gov.tw", - "||tacc.cwb.gov.tw", - "||data.gov.tw", - "||epa.gov.tw", - "||fa.gov.tw", - "||fda.gov.tw", - "||hpa.gov.tw", - "||immigration.gov.tw", - "||itaiwan.gov.tw", - "||mjib.gov.tw", - "||moeaic.gov.tw", - "||mofa.gov.tw", - "||mol.gov.tw", - "||mvdis.gov.tw", - "||nat.gov.tw", - "||nhi.gov.tw", - "||npa.gov.tw", - "||nsc.gov.tw", - "||ntbk.gov.tw", - "||ntbna.gov.tw", - "||ntbt.gov.tw", - "||ntsna.gov.tw", - "||pcc.gov.tw", - "||stat.gov.tw", - "||taipei.gov.tw", - "||taiwanjobs.gov.tw", - "||thb.gov.tw", - "||tipo.gov.tw", - "||wda.gov.tw", - "||teco-hk.org", - "||teco-mo.org", - "@@||aftygh.gov.tw", - "@@||aide.gov.tw", - "@@||tpde.aide.gov.tw", - "@@||arte.gov.tw", - "@@||chukuang.gov.tw", - "@@||cwb.gov.tw", - "@@||cycab.gov.tw", - "@@||dbnsa.gov.tw", - "@@||df.gov.tw", - "@@||eastcoast-nsa.gov.tw", - "@@||erv-nsa.gov.tw", - "@@||grb.gov.tw", - "@@||gysd.nyc.gov.tw", - "@@||hchcc.gov.tw", - "@@||hsinchu-cc.gov.tw", - "@@||iner.gov.tw", - "@@||klsio.gov.tw", - "@@||kmseh.gov.tw", - "@@||lungtanhr.gov.tw", - "@@||maolin-nsa.gov.tw", - "@@||matsu-news.gov.tw", - "@@||matsu-nsa.gov.tw", - "@@||matsucc.gov.tw", - "@@||moe.gov.tw", - "@@||mvdis.gov.tw", - "@@||nankan.gov.tw", - "@@||ncree.gov.tw", - "@@||necoast-nsa.gov.tw", - "@@||siraya-nsa.gov.tw", - "@@||cromotc.nat.gov.tw", - "@@||tax.nat.gov.tw", - "@@||necoast-nsa.gov.tw", - "@@||ner.gov.tw", - "@@||nmmba.gov.tw", - "@@||nmp.gov.tw", - "@@||nmvttc.gov.tw", - "@@||northguan-nsa.gov.tw", - "@@||npm.gov.tw", - "@@||nstm.gov.tw", - "@@||ntdmh.gov.tw", - "@@||ntl.gov.tw", - "@@||ntsec.gov.tw", - "@@||ntuh.gov.tw", - "@@||nvri.gov.tw", - "@@||penghu-nsa.gov.tw", - "@@||post.gov.tw", - "@@||siraya-nsa.gov.tw", - "@@||stdtime.gov.tw", - "@@||sunmoonlake.gov.tw", - "@@||taitung-house.gov.tw", - "@@||taoyuan.gov.tw", - "@@||tphcc.gov.tw", - "@@||trimt-nsa.gov.tw", - "@@||vghtpe.gov.tw", - "@@||vghks.gov.tw", - "@@||vghtc.gov.tw", - "@@||wanfang.gov.tw", - "@@||yatsen.gov.tw", - "@@||yda.gov.tw", - "||kinmen.org.tw", - ".v2ex.com", - "@@|http://v2ex.com", - "@@|http://cdn.v2ex.com", - "@@|http://cn.v2ex.com", - "@@|http://hk.v2ex.com", - "@@|http://i.v2ex.com", - "@@|http://lax.v2ex.com", - "@@|http://neue.v2ex.com", - "@@|http://pagespeed.v2ex.com", - "@@|http://static.v2ex.com", - "@@|http://workspace.v2ex.com", - "@@|http://www.v2ex.com", - "||data.flurry.com", - "page.bid.yahoo.com", - "tw.bid.yahoo.com", - "|https://tw.bid.yahoo.com", - "blogs.yahoo.co.jp", - "||search.yahoo.co.jp", - "buy.yahoo.com.tw/gdsale", - "hk.yahoo.com", - "hk.knowledge.yahoo.com", - "tw.money.yahoo.com", - "hk.myblog.yahoo.com", - "news.yahoo.com/china-blocks-bbc", - "||hk.news.yahoo.com", - "hk.rd.yahoo.com", - "hk.search.yahoo.com/search", - "hk.video.news.yahoo.com/video", - "meme.yahoo.com", - "tw.answers.yahoo.com", - "|https://tw.answers.yahoo.com", - "||tw.knowledge.yahoo.com", - "||tw.mall.yahoo.com", - "tw.yahoo.com", - "||tw.mobi.yahoo.com", - "tw.myblog.yahoo.com", - "||tw.news.yahoo.com", - "pulse.yahoo.com", - "||search.yahoo.com", - "upcoming.yahoo.com", - "video.yahoo.com", - "||yahoo.com.hk", - "||duckduckgo-owned-server.yahoo.net", - ".030buy.com", - ".0rz.tw", - "|http://0rz.tw", - "1-apple.com.tw", - "||1-apple.com.tw", - ".10.tt", - ".100ke.org", - ".1000giri.net", - "||1000giri.net", - ".10conditionsoflove.com", - "||10musume.com", - "123rf.com", - ".12bet.com", - "||12bet.com", - ".12vpn.com", - ".12vpn.net", - "||12vpn.com", - "||12vpn.net", - ".138.com", - "141hongkong.com/forum", - "||141jj.com", - ".141tube.com", - ".1688.com.au", - ".173ng.com", - "||173ng.com", - ".177pic.info", - ".17t17p.com", - "||18board.com", - "||18board.info", - "18onlygirls.com", - ".18p2p.com", - ".18virginsex.com", - ".1949er.org", - "zhao.1984.city", - "||zhao.1984.city", - "1984bbs.com", - "||1984bbs.com", - ".1984bbs.org", - "||1984bbs.org", - ".1991way.com", - "||1991way.com", - ".1998cdp.org", - ".1bao.org", - "|http://1bao.org", - ".1eew.com", - ".1mobile.com", - "|http://*.1mobile.tw", - "||1pondo.tv", - ".2-hand.info", - ".2000fun.com/bbs", - ".2008xianzhang.info", - "||2008xianzhang.info", - "||2017.hk", - "21andy.com/blog", - ".21join.com", - ".21pron.com", - "21sextury.com", - ".228.net.tw", - "||233abc.com", - "||24hrs.ca", - "24smile.org", - "2lipstube.com", - ".2shared.com", - "30boxes.com", - ".315lz.com", - "||32red.com", - "||36rain.com", - ".3a5a.com", - "3arabtv.com", - ".3boys2girls.com", - ".3proxy.ru", - ".3ren.ca", - ".3tui.net", - "||4bluestones.biz", - ".4chan.com", - ".4everproxy.com", - "||4everproxy.com", - "||4rbtv.com", - "||4shared.com", - "taiwannation.50webs.com", - "||51.ca", - "||51jav.org", - ".51luoben.com", - "||51luoben.com", - ".5278.cc", - ".5299.tv", - "5aimiku.com", - "5i01.com", - ".5isotoi5.org", - ".5maodang.com", - "||63i.com", - ".64museum.org", - "64tianwang.com", - "64wiki.com", - ".66.ca", - "666kb.com", - ".6park.com", - "||6park.com", - "||6parker.com", - "||6parknews.com", - "||7capture.com", - ".7cow.com", - ".8-d.com", - "|http://8-d.com", - "85cc.net", - ".85cc.us", - "|http://85cc.us", - "|http://85st.com", - ".881903.com/page/zh-tw/", - "||881903.com", - ".888.com", - ".888poker.com", - "89.64.charter.constitutionalism.solutions", - "89-64.org", - "||89-64.org", - ".8news.com.tw", - ".8z1.net", - "||8z1.net", - ".9001700.com", - "|http://908taiwan.org/", - "||91porn.com", - "||91vps.club", - ".92ccav.com", - ".991.com", - "|http://991.com", - ".99btgc01.com", - "||99btgc01.com", - ".99cn.info", - "|http://99cn.info", - "||9bis.com", - "||9bis.net", - ".tibet.a.se", - "|http://tibet.a.se", - "||a-normal-day.com", - "a5.com.ru", - "|http://aamacau.com", - ".abc.com", - ".abc.net.au", - "||abc.net.au", - ".abchinese.com", - "abclite.net", - "|https://www.abclite.net", - ".ablwang.com", - ".aboluowang.com", - "||aboluowang.com", - ".aboutgfw.com", - ".abs.edu", - ".accim.org", - ".aceros-de-hispania.com", - ".acevpn.com", - "||acevpn.com", - ".acg18.me", - "|http://acg18.me", - "||acgkj.com", - ".acmedia365.com", - ".acnw.com.au", - "actfortibet.org", - "actimes.com.au", - "activpn.com", - "||activpn.com", - "||aculo.us", - "||addictedtocoffee.de", - ".adelaidebbs.com/bbs", - ".adpl.org.hk", - "|http://adpl.org.hk", - ".adult-sex-games.com", - "||adult-sex-games.com", - "adultfriendfinder.com", - "adultkeep.net/peepshow/members/main.htm", - "||advanscene.com", - "||advertfan.com", - ".ae.org", - "||aenhancers.com", - "||af.mil", - ".afantibbs.com", - "|http://afantibbs.com", - ".ai-kan.net", - "||ai-kan.net", - "ai-wen.net", - ".aiph.net", - "||aiph.net", - ".airasia.com", - "||airconsole.com", - "|http://download.aircrack-ng.org", - ".airvpn.org", - "||airvpn.org", - ".aisex.com", - "||ait.org.tw", - "aiweiwei.com", - ".aiweiweiblog.com", - "||aiweiweiblog.com", - "||www.ajsands.com", - "a248.e.akamai.net", - "||a248.e.akamai.net", - "rfalive1.akacast.akamaistream.net", - "voa-11.akacast.akamaistream.net", - "||abematv.akamaized.net", - "||linear-abematv.akamaized.net", - "||vod-abematv.akamaized.net", - "|https://fbcdn*.akamaihd.net/", - "rthklive2-lh.akamaihd.net", - ".akademiye.org/ug", - "|http://akademiye.org/ug", - "||akiba-online.com", - "||akow.org", - ".al-islam.com", - "||al-qimmah.net", - "||alabout.com", - ".alanhou.com", - "|http://alanhou.com", - ".alarab.qa", - "||alasbarricadas.org", - "alexlur.org", - "||alforattv.net", - ".alhayat.com", - ".alicejapan.co.jp", - "aliengu.com", - "||alkasir.com", - "||allconnected.co", - ".alldrawnsex.com", - "||alldrawnsex.com", - ".allervpn.com", - "||allfinegirls.com", - ".allgirlmassage.com", - "allgirlsallowed.org", - ".allgravure.com", - "alliance.org.hk", - ".allinfa.com", - "||allinfa.com", - ".alljackpotscasino.com", - "||allmovie.com", - "||almasdarnews.com", - ".alphaporno.com", - "||alternate-tools.com", - "alternativeto.net/software", - "alvinalexander.com", - "alwaysdata.com", - "||alwaysdata.com", - "||alwaysdata.net", - ".alwaysvpn.com", - "||alwaysvpn.com", - "||am730.com.hk", - "ameblo.jp", - "||ameblo.jp", - "www1.american.edu/ted/ice/tibet", - "||americangreencard.com", - "|http://www.americorps.gov", - "||amiblockedornot.com", - ".amigobbs.net", - ".amitabhafoundation.us", - "|http://amitabhafoundation.us", - ".amnesty.org", - "||amnesty.org", - "||amnesty.org.hk", - ".amnesty.tw", - ".amnestyusa.org", - "||amnestyusa.org", - ".amnyemachen.org", - ".amoiist.com", - ".amtb-taipei.org", - "androidplus.co/apk", - ".andygod.com", - "|http://andygod.com", - "annatam.com/chinese", - "||anchorfree.com", - "||ancsconf.org", - "||andfaraway.net", - "||android-x86.org", - "angelfire.com/hi/hayashi", - "||angularjs.org", - "animecrazy.net", - ".animeshippuuden.com", - "aniscartujo.com", - "||aniscartujo.com", - "||anobii.com", - "anonymise.us", - ".anonymitynetwork.com", - ".anonymizer.com", - ".anonymouse.org", - "||anonymouse.org", - "anontext.com", - ".anpopo.com", - ".answering-islam.org", - "|http://www.antd.org", - "||anthonycalzadilla.com", - ".anti1984.com", - "antichristendom.com", - ".antiwave.net", - "|http://antiwave.net", - ".anyporn.com", - ".anysex.com", - "|http://anysex.com", - "||aobo.com.au", - ".aofriend.com", - "|http://aofriend.com", - ".aofriend.com.au", - ".aojiao.org", - "||aomiwang.com", - "video.ap.org", - ".apetube.com", - "||apiary.io", - ".apigee.com", - "||apigee.com", - "apk-dl.com", - "apkdler.com/apk/view", - ".apkmonk.com/app", - "||apkplz.com", - "apkpure.com", - "||apkpure.com", - ".aplusvpn.com", - ".appdownloader.net/Android", - ".appledaily.com", - "||appledaily.com", - "appledaily.com.hk", - "||appledaily.com.hk", - "appledaily.com.tw", - "||appledaily.com.tw", - ".appshopper.com", - "|http://appshopper.com", - "||appsocks.net", - "||appsto.re", - ".aptoide.com", - "||aptoide.com", - "||archives.gov", - ".archive.fo", - "||archive.fo", - ".archive.is", - "||archive.is", - ".archive.li", - "||archive.li", - "||archive.org", - "archive.today", - "|https://archive.today", - ".arctosia.com", - "|http://arctosia.com", - "||areca-backup.org", - ".arethusa.su", - "||arethusa.su", - "||arlingtoncemetery.mil", - "||army.mil", - ".art4tibet1998.org", - "artofpeacefoundation.org", - "artsy.net", - "||asacp.org", - "asdfg.jp/dabr", - "asg.to", - ".asia-gaming.com", - ".asiaharvest.org", - "||asiaharvest.org", - "asianews.it", - "|http://japanfirst.asianfreeforum.com/", - "||asiansexdiary.com", - "||asianwomensfilm.de", - ".asiatgp.com", - ".asiatoday.us", - "||askstudent.com", - ".askynz.net", - "||askynz.net", - "||assembla.com", - "||astrill.com", - "||atc.org.au", - ".atchinese.com", - "|http://atchinese.com", - "atgfw.org", - ".atlaspost.com", - "||atlaspost.com", - "||atdmt.com", - ".atlanta168.com/forum", - ".atnext.com", - "||atnext.com", - "ice.audionow.com", - ".av.com", - "||av.movie", - ".av-e-body.com", - "avaaz.org", - "||avaaz.org", - ".avbody.tv", - ".avcity.tv", - ".avcool.com", - ".avdb.in", - "||avdb.in", - ".avdb.tv", - "||avdb.tv", - ".avfantasy.com", - "||avg.com", - ".avgle.com", - "||avgle.com", - "||avidemux.org", - "||avoision.com", - ".avyahoo.com", - "||axureformac.com", - ".azerbaycan.tv", - "azerimix.com", - "boxun*.azurewebsites.net", - "||boxun*.azurewebsites.net", - "forum.baby-kingdom.com", - "babynet.com.hk", - "backchina.com", - "||backchina.com", - ".backpackers.com.tw/forum", - "backtotiananmen.com", - ".badiucao.com", - "||badiucao.com", - ".badjojo.com", - "badoo.com", - "|http://*2.bahamut.com.tw", - "||baidu.jp", - ".baijie.org", - "|http://baijie.org", - "||bailandaily.com", - "||baixing.me", - "||bakgeekhome.tk", - ".banana-vpn.com", - "||banana-vpn.com", - ".band.us", - ".bandwagonhost.com", - "||bandwagonhost.com", - ".bangbrosnetwork.com", - ".bangchen.net", - "|http://bangchen.net", - "||bangyoulater.com", - "bannedbook.org", - "||bannedbook.org", - ".bannednews.org", - ".baramangaonline.com", - "|http://baramangaonline.com", - ".barenakedislam.com", - "||barnabu.co.uk", - "||barton.de", - "bartvpn.com", - ".bastillepost.com", - "bayvoice.net", - "||bayvoice.net", - "dajusha.baywords.com", - "||bbchat.tv", - "||bb-chat.tv", - ".bbg.gov", - ".bbkz.com/forum", - ".bbnradio.org", - "bbs-tw.com", - ".bbsdigest.com/thread", - "||bbsfeed.com", - "bbsland.com", - ".bbsmo.com", - ".bbsone.com", - "bbtoystore.com", - ".bcast.co.nz", - ".bcc.com.tw/board", - ".bcchinese.net", - ".bcmorning.com", - "bdsmvideos.net", - ".beaconevents.com", - ".bebo.com", - "||bebo.com", - ".beevpn.com", - "||beevpn.com", - ".behindkink.com", - "||beijing1989.com", - "beijingspring.com", - "||beijingspring.com", - ".beijingzx.org", - "|http://beijingzx.org", - ".belamionline.com", - ".bell.wiki", - "|http://bell.wiki", - "bemywife.cc", - "beric.me", - ".berlintwitterwall.com", - "||berlintwitterwall.com", - ".berm.co.nz", - ".bestforchina.org", - "||bestforchina.org", - ".bestgore.com", - ".bestpornstardb.com", - "||bestvpn.com", - ".bestvpnanalysis.com", - ".bestvpnserver.com", - ".bestvpnservice.com", - ".bestvpnusa.com", - "||bet365.com", - ".betfair.com", - "||betternet.co", - ".bettervpn.com", - "||bettervpn.com", - ".bettween.com", - "||bettween.com", - "||betvictor.com", - ".bewww.net", - ".beyondfirewall.com", - "||bfnn.org", - "||bfsh.hk", - ".bgvpn.com", - "||bgvpn.com", - ".bianlei.com", - "@@||bianlei.com", - "biantailajiao.com", - "biantailajiao.in", - ".biblesforamerica.org", - "|http://biblesforamerica.org", - ".bic2011.org", - "bigfools.com", - "||bigjapanesesex.com", - ".bignews.org", - "||bignews.org", - ".bigsound.org", - ".biliworld.com", - "|http://biliworld.com", - "|http://billypan.com/wiki", - ".binux.me", - "ai.binwang.me/couplet", - "bipic.net", - ".bit.do", - "|http://bit.do", - ".bit.ly", - "|http://bit.ly", - "||bitcointalk.org", - ".bitshare.com", - "||bitshare.com", - "bitsnoop.com", - ".bitvise.com", - "||bitvise.com", - "bizhat.com", - "||bl-doujinsouko.com", - ".bjnewlife.org", - ".bjs.org", - "bjzc.org", - "||bjzc.org", - ".blacklogic.com", - ".blackvpn.com", - "||blackvpn.com", - "blewpass.com", - "tor.blingblingsquad.net", - ".blinkx.com", - "||blinkx.com", - "blinw.com", - ".blip.tv", - "||blip.tv/", - ".blockcn.com", - "||blockcn.com", - "||blockless.com", - "||blog.de", - ".blog.jp", - "|http://blog.jp", - "@@||jpush.cn", - ".blogcatalog.com", - "||blogcatalog.com", - "||blogcity.me", - ".blogger.com", - "||blogger.com", - "blogimg.jp", - "||blog.kangye.org", - ".bloglines.com", - "||bloglines.com", - "||bloglovin.com", - "rconversation.blogs.com", - "blogtd.net", - ".blogtd.org", - "|http://blogtd.org", - "||bloodshed.net", - ".bloomberg.cn", - "||bloomberg.cn", - ".bloomberg.com", - "||bloomberg.com", - "bloomberg.de", - "||bloomberg.de", - "||assets.bwbx.io", - "||bloomfortune.com", - "blueangellive.com", - ".bmfinn.com", - ".bnews.co", - "||bnews.co", - "||bnrmetal.com", - "boardreader.com/thread", - "||boardreader.com", - ".bod.asia", - "|http://bod.asia", - ".bodog88.com", - ".bolehvpn.net", - "||bolehvpn.net", - "bonbonme.com", - ".bonbonsex.com", - ".bonfoundation.org", - ".bongacams.com", - "||boobstagram.com", - "||book.com.tw", - "bookepub.com", - "||books.com.tw", - "||botanwang.com", - ".bot.nu", - ".bowenpress.com", - "||bowenpress.com", - "||app.box.com", - "dl.box.net", - "||dl.box.net", - ".boxpn.com", - "||boxpn.com", - "boxun.com", - "||boxun.com", - ".boxun.tv", - "||boxun.tv", - "boxunblog.com", - "||boxunblog.com", - ".boxunclub.com", - "boyangu.com", - ".boyfriendtv.com", - ".boysfood.com", - "||br.st", - ".brainyquote.com/quotes/authors/d/dalai_lama", - "||brandonhutchinson.com", - "||braumeister.org", - ".bravotube.net", - "||bravotube.net", - ".brazzers.com", - "||brazzers.com", - ".break.com", - "||break.com", - "breakgfw.com", - "||breakgfw.com", - "breaking911.com", - ".breakingtweets.com", - "||breakingtweets.com", - "||breakwall.net", - "briian.com/6511/freegate", - ".briefdream.com/%E7%B4%A0%E6%A3%BA", - "brizzly.com", - "||brizzly.com", - "||brkmd.com", - "broadbook.com", - ".broadpressinc.com", - "||broadpressinc.com", - "bbs.brockbbs.com", - "brucewang.net", - ".brutaltgp.com", - "||brutaltgp.com", - ".bt2mag.com", - "||bt95.com", - ".btaia.com", - ".btbtav.com", - "|http://btdigg.org", - ".btku.me", - "||btku.me", - "||btku.org", - ".btspread.com", - ".btsynckeys.com", - ".budaedu.org", - "||budaedu.org", - ".buddhanet.com.tw/zfrop/tibet", - ".buddhistchannel.tv", - ".buffered.com", - "|http://buffered.com", - ".bullog.org", - "||bullog.org", - ".bullogger.com", - "||bullogger.com", - "bunbunhk.com", - ".busayari.com", - "|http://busayari.com", - ".businessinsider.com/bing-could-be-censoring-search-results-2014", - ".businessinsider.com/china-banks-preparing-for-debt-implosion-2014", - ".businessinsider.com/hong-kong-activists-defy-police-tear-gas-as-protests-continue-overnight-2014", - ".businessinsider.com/internet-outages-reported-in-north-korea-2014", - ".businessinsider.com/iphone-6-is-approved-for-sale-in-china-2014", - ".businessinsider.com/nfl-announcers-surface-tablets-2014", - ".businessinsider.com/panama-papers", - ".businessinsider.com/umbrella-man-hong-kong-2014", - "|http://www.businessinsider.com.au/*", - ".businesstoday.com.tw", - "||businesstoday.com.tw", - ".businessweek.com", - ".busu.org/news", - "|http://busu.org/news", - "busytrade.com", - ".buugaa.com", - ".buzzhand.com", - ".buzzhand.net", - ".buzzorange.com", - "||buzzorange.com", - "||bvpn.com", - "||bwh1.net", - "bwsj.hk", - "||bx.tl", - ".c-spanvideo.org", - "||c-spanvideo.org", - "||c-est-simple.com", - ".c100tibet.org", - "||cablegatesearch.net", - ".cachinese.com", - ".cacnw.com", - "|http://cacnw.com", - ".cactusvpn.com", - "||cactusvpn.com", - ".cafepress.com", - ".cahr.org.tw", - ".calameo.com/books", - "cn.calameo.com", - "|http://cn.calameo.com", - ".calgarychinese.ca", - ".calgarychinese.com", - ".calgarychinese.net", - "|http://blog.calibre-ebook.com", - "|http://google.calstate.edu", - "falun.caltech.edu", - ".its.caltech.edu/~falun/", - ".cam4.com", - ".cam4.jp", - ".cam4.sg", - ".camfrog.com", - "||camfrog.com", - "||cams.com", - ".cams.org.sg", - "canadameet.com", - ".canalporno.com", - "|http://bbs.cantonese.asia/", - ".canyu.org", - "||canyu.org", - ".cao.im", - ".caobian.info", - "||caobian.info", - "caochangqing.com", - "||caochangqing.com", - ".cap.org.hk", - "||cap.org.hk", - ".carabinasypistolas.com", - "cardinalkungfoundation.org", - "carmotorshow.com", - "ss.carryzhou.com", - ".cartoonmovement.com", - "||cartoonmovement.com", - ".casadeltibetbcn.org", - ".casatibet.org.mx", - "|http://casatibet.org.mx", - "cari.com.my", - "||caribbeancom.com", - ".casinoking.com", - ".casinoriva.com", - "||catch22.net", - ".catchgod.com", - "|http://catchgod.com", - "||catfightpayperview.xxx", - ".catholic.org.hk", - "||catholic.org.hk", - "catholic.org.tw", - "||catholic.org.tw", - ".cathvoice.org.tw", - "||cattt.com", - ".cbc.ca", - "||cbc.ca", - ".cbsnews.com/video", - ".cbtc.org.hk", - "||cccat.cc", - "||cccat.co", - ".ccdtr.org", - "||ccdtr.org", - ".cchere.com", - "||cchere.com", - ".ccim.org", - ".cclife.ca", - "cclife.org", - "cclifefl.org", - ".ccthere.com", - "||ccthere.com", - "||ccthere.net", - ".cctmweb.net", - ".cctongbao.com/article/2078732", - "ccue.ca", - "ccue.com", - ".ccvoice.ca", - ".ccw.org.tw", - ".cgdepot.org", - "|http://cgdepot.org", - "||cdbook.org", - ".cdcparty.com", - ".cdef.org", - "||cdef.org", - "||cdig.info", - "cdjp.org", - "||cdjp.org", - ".cdn-apple.com", - "||cdn-apple.com", - ".cdnews.com.tw", - "cdp1989.org", - "cdp1998.org", - "||cdp1998.org", - "cdp2006.org", - "||cdp2006.org", - ".cdpa.url.tw", - "cdpeu.org", - "cdpusa.org", - "cdpweb.org", - "||cdpweb.org", - "cdpwu.org", - "||cdpwu.org", - "||cdw.com", - ".cecc.gov", - "||cecc.gov", - "||cellulo.info", - "||cenews.eu", - "||centerforhumanreprod.com", - "||centralnation.com", - ".centurys.net", - "|http://centurys.net", - ".cfhks.org.hk", - ".cfos.de", - ".cftfc.com", - ".cgst.edu", - ".change.org", - "||change.org", - ".changp.com", - "||changp.com", - ".changsa.net", - "|http://changsa.net", - ".channel8news.sg/news8", - ".chapm25.com", - ".chaturbate.com", - ".chuang-yen.org", - "chengmingmag.com", - ".chenguangcheng.com", - "||chenguangcheng.com", - ".chenpokong.com", - ".chenpokong.net", - "|http://chenpokong.net", - "||cherrysave.com", - ".chhongbi.org", - "chicagoncmtv.com", - "|http://chicagoncmtv.com", - ".china-week.com", - "china101.com", - "||china101.com", - "||china18.org", - "||china21.com", - "china21.org", - "||china21.org", - ".china5000.us", - "chinaaffairs.org", - "||chinaaffairs.org", - "||chinaaid.me", - "chinaaid.us", - "chinaaid.org", - "chinaaid.net", - "chinacomments.org", - "||chinacomments.org", - ".chinachange.org", - "||chinachange.org", - "chinachannel.hk", - "||chinachannel.hk", - ".chinacitynews.be", - ".chinadialogue.net", - ".chinadigitaltimes.net", - "||chinadigitaltimes.net", - ".chinaelections.org", - "||chinaelections.org", - ".chinaeweekly.com", - "||chinaeweekly.com", - "||chinafreepress.org", - ".chinagate.com", - "chinageeks.org", - "chinagfw.org", - "||chinagfw.org", - ".chinagonet.com", - ".chinagreenparty.org", - "||chinagreenparty.org", - ".chinahorizon.org", - "||chinahorizon.org", - ".chinahush.com", - ".chinainperspective.com", - "||chinainterimgov.org", - "chinalaborwatch.org", - "chinalawtranslate.com", - ".chinapost.com.tw/taiwan/national/national-news", - "chinaxchina.com/howto", - "chinalawandpolicy.com", - ".chinamule.com", - "||chinamule.com", - "chinamz.org", - ".chinanewscenter.com", - "|https://chinanewscenter.com", - ".chinapress.com.my", - "||chinapress.com.my", - ".china-review.com.ua", - "|http://china-review.com.ua", - ".chinarightsia.org", - "chinasmile.net/forums", - "chinasocialdemocraticparty.com", - "||chinasocialdemocraticparty.com", - "chinasoul.org", - "||chinasoul.org", - ".chinasucks.net", - "||chinatopsex.com", - ".chinatown.com.au", - "chinatweeps.com", - "chinaway.org", - ".chinaworker.info", - "||chinaworker.info", - "chinayouth.org.hk", - "chinayuanmin.org", - "||chinayuanmin.org", - ".chinese-hermit.net", - "chinese-leaders.org", - "chinese-memorial.org", - ".chinesedaily.com", - "||chinesedailynews.com", - ".chinesedemocracy.com", - "||chinesedemocracy.com", - "||chinesegay.org", - ".chinesen.de", - "||chinesen.de", - ".chinesenews.net.au/", - ".chinesepen.org", - ".chinesetalks.net/ch", - "||chineseupress.com", - ".chingcheong.com", - "||chingcheong.com", - ".chinman.net", - "|http://chinman.net", - "chithu.org", - "|http://chn.chosun.com", - "cnnews.chosun.com/client/news/viw.asp?cate=C01&mcate", - ".chrdnet.com", - "|http://chrdnet.com", - ".christianfreedom.org", - "|http://christianfreedom.org", - "christianstudy.com", - "||christianstudy.com", - "christusrex.org/www1/sdc", - ".chubold.com", - "chubun.com", - "chuizi.net", - "christiantimes.org.hk", - ".chrlawyers.hk", - "|http://chrlawyers.hk", - ".churchinhongkong.org/b5/index.php", - "|http://churchinhongkong.org/b5/index.php", - ".chushigangdrug.ch", - ".cienen.com", - ".cineastentreff.de", - ".cipfg.org", - "||circlethebayfortibet.org", - "||cirosantilli.com", - ".citizencn.com", - "||citizencn.com", - "|http://citizenlab.org", - "|http://www.citizenlab.org", - "||citizenscommission.hk", - ".citizenlab.org", - "citizensradio.org", - ".city365.ca", - "|http://city365.ca", - "city9x.com", - "||citypopulation.de", - ".citytalk.tw/event", - ".civicparty.hk", - "||civicparty.hk", - ".civildisobediencemovement.org", - "civilhrfront.org", - "||civilhrfront.org", - ".civiliangunner.com", - ".civilmedia.tw", - "||civilmedia.tw", - "psiphon.civisec.org", - "||vpn.cjb.net", - ".ck101.com", - "||ck101.com", - ".clarionproject.org/news/islamic-state-isis-isil-propaganda", - "||classicalguitarblog.net", - ".clb.org.hk", - "clearharmony.net", - "clearwisdom.net", - "clinica-tibet.ru", - ".clipfish.de", - "cloakpoint.com", - "||club1069.com", - "cmi.org.tw", - "|http://www.cmoinc.org", - "cmp.hku.hk", - "hkupop.hku.hk", - "||cmule.com", - "||cmule.org", - "||cms.gov", - "|http://vpn.cmu.edu", - "|http://vpn.sv.cmu.edu", - ".cn6.eu", - ".cna.com.tw", - "||cna.com.tw", - ".cnabc.com", - ".cnd.org", - "||cnd.org", - "download.cnet.com", - ".cnex.org.cn", - ".cnineu.com", - "wiki.cnitter.com", - ".cnn.com/video", - ".cnpolitics.org", - "||cnpolitics.org", - ".cn-proxy.com", - "|http://cn-proxy.com", - ".cnproxy.com", - "blog.cnyes.com", - "news.cnyes.com", - "||coat.co.jp", - ".cochina.co", - "||cochina.co", - "||cochina.org", - ".code1984.com/64", - "|http://goagent.codeplex.com", - "||codeshare.io", - "||codeskulptor.org", - "|http://tosh.comedycentral.com", - "comefromchina.com", - "||comefromchina.com", - ".comic-mega.me", - "commandarms.com", - "||commentshk.com", - ".communistcrimes.org", - "||communistcrimes.org", - "||communitychoicecu.com", - "||compileheart.com", - "||conoha.jp", - ".contactmagazine.net", - ".convio.net", - ".coobay.com", - "|http://www.cool18.com/bbs*/", - ".coolaler.com", - "||coolaler.com", - "coolder.com", - "||coolder.com", - "||coolloud.org.tw", - ".coolncute.com", - "||coolstuffinc.com", - "corumcollege.com", - ".cos-moe.com", - "|http://cos-moe.com", - ".cosplayjav.pl", - "|http://cosplayjav.pl", - ".cotweet.com", - "||cotweet.com", - ".coursehero.com", - "||coursehero.com", - "cpj.org", - "||cpj.org", - ".cq99.us", - "|http://cq99.us", - "crackle.com", - "||crackle.com", - ".crazys.cc", - ".crazyshit.com", - "||crchina.org", - "crd-net.org", - "creaders.net", - "||creaders.net", - ".creadersnet.com", - "||cristyli.com", - ".crocotube.com", - "|http://crocotube.com", - ".crossthewall.net", - "||crossthewall.net", - ".crossvpn.net", - "||crossvpn.net", - "||crucial.com", - "csdparty.com", - "||csdparty.com", - "||csuchen.de", - ".csw.org.uk", - ".ct.org.tw", - "||ct.org.tw", - ".ctao.org", - ".ctfriend.net", - ".ctitv.com.tw", - "cts.com.tw", - "|http://library.usc.cuhk.edu.hk/", - "|http://mjlsh.usc.cuhk.edu.hk/", - ".cuhkacs.org/~benng", - ".cuihua.org", - "||cuihua.org", - ".cuiweiping.net", - "||cuiweiping.net", - "||culture.tw", - ".cumlouder.com", - "||cumlouder.com", - "||curvefish.com", - ".cusu.hk", - "||cusu.hk", - ".cutscenes.net", - ".cw.com.tw", - "||cw.com.tw", - "|http://forum.cyberctm.com", - "cyberghostvpn.com", - "||cyberghostvpn.com", - "||cynscribe.com", - "cytode.us", - "||ifan.cz.cc", - "||mike.cz.cc", - "||nic.cz.cc", - ".d-fukyu.com", - "|http://d-fukyu.com", - "cl.d0z.net", - ".d100.net", - "||d100.net", - ".d2bay.com", - "|http://d2bay.com", - ".dabr.co.uk", - "||dabr.co.uk", - "dabr.eu", - "dabr.mobi", - "||dabr.mobi", - "||dabr.me", - "dadazim.com", - "||dadazim.com", - ".dadi360.com", - ".dafabet.com", - "dafagood.com", - "dafahao.com", - ".dafoh.org", - ".daftporn.com", - ".dagelijksestandaard.nl", - ".daidostup.ru", - "|http://daidostup.ru", - ".dailidaili.com", - "||dailidaili.com", - ".dailymotion.com", - "||dailymotion.com", - "daiphapinfo.net", - ".dajiyuan.com", - "||dajiyuan.de", - "dajiyuan.eu", - "dalailama.com", - ".dalailama.mn", - "|http://dalailama.mn", - ".dalailama.ru", - "||dalailama.ru", - "dalailama80.org", - ".dalailama-archives.org", - ".dalailamacenter.org", - "|http://dalailamacenter.org", - "dalailamafellows.org", - ".dalailamafilm.com", - ".dalailamafoundation.org", - ".dalailamahindi.com", - ".dalailamainaustralia.org", - ".dalailamajapanese.com", - ".dalailamaprotesters.info", - ".dalailamaquotes.org", - ".dalailamatrust.org", - ".dalailamavisit.org.nz", - ".dalailamaworld.com", - "||dalailamaworld.com", - "dalianmeng.org", - "||dalianmeng.org", - ".daliulian.org", - "||daliulian.org", - ".danke4china.net", - "||danke4china.net", - ".danwei.org", - "daolan.net", - ".daozhongxing.org", - "darktoy.net", - "||dastrassi.org", - "blog.daum.net/_blog", - ".david-kilgour.com", - "|http://david-kilgour.com", - "daxa.cn", - "||daxa.cn", - "cn.dayabook.com", - ".daylife.com/topic/dalai_lama", - "||db.tt", - ".dbc.hk/main", - "||dcard.tw", - "dcmilitary.com", - ".ddc.com.tw", - ".ddhw.info", - "||de-sci.org", - ".de-sci.org", - "packages.debian.org/zh-cn/lenny/gpass", - "||decodet.co", - ".definebabe.com", - "||delcamp.net", - "delicious.com/GFWbookmark", - ".democrats.org", - "||democrats.org", - ".demosisto.hk", - "||demosisto.hk", - "||desc.se", - "||dessci.com", - ".destroy-china.jp", - "||deutsche-welle.de", - "||devio.us", - "||devpn.com", - "||dfas.mil", - "dfn.org", - "dharmakara.net", - ".dharamsalanet.com", - ".diaoyuislands.org", - "||diaoyuislands.org", - ".difangwenge.org", - "|http://digiland.tw/", - "||digitalnomadsproject.org", - ".diigo.com", - "||diigo.com", - "||dilber.se", - "||furl.net", - ".dipity.com", - "||directcreative.com", - ".discuss.com.hk", - "||discuss.com.hk", - ".discuss4u.com", - "disp.cc", - ".disqus.com", - "||disqus.com", - ".dit-inc.us", - "||dit-inc.us", - ".dizhidizhi.com", - "||dizhuzhishang.com", - "djangosnippets.org", - ".djorz.com", - "||djorz.com", - "||dl-laby.jp", - "||dlsite.com", - "||dlyoutube.com", - "||dmcdn.net", - ".dnscrypt.org", - "||dnscrypt.org", - "||dns2go.com", - "||dnssec.net", - "doctorvoice.org", - ".dogfartnetwork.com/tour", - "gloryhole.com", - ".dojin.com", - ".dok-forum.net", - "||dolc.de", - "||dolf.org.hk", - "||dollf.com", - ".domain.club.tw", - ".domaintoday.com.au", - "chinese.donga.com", - "dongtaiwang.com", - "||dongtaiwang.com", - ".dongtaiwang.net", - "||dongtaiwang.net", - ".dongyangjing.com", - "|http://danbooru.donmai.us", - ".dontfilter.us", - "||dontmovetochina.com", - ".dorjeshugden.com", - ".dotplane.com", - "||dotplane.com", - "||dotsub.com", - ".dotvpn.com", - "||dotvpn.com", - ".doub.io", - "||doub.io", - "||dougscripts.com", - "||douhokanko.net", - "||doujincafe.com", - "dowei.org", - "dphk.org", - "dpp.org.tw", - "||dpp.org.tw", - "||dpr.info", - "||dragonsprings.org", - ".dreamamateurs.com", - ".drepung.org", - "||drgan.net", - ".drmingxia.org", - "|http://drmingxia.org", - "||dropbooks.tv", - "||dropbox.com", - "||api.dropboxapi.com", - "||notify.dropboxapi.com", - "||dropboxusercontent.com", - "drsunacademy.com", - ".drtuber.com", - ".dscn.info", - "|http://dscn.info", - ".dstk.dk", - "|http://dstk.dk", - "||dtiblog.com", - "||dtic.mil", - ".dtwang.org", - ".duanzhihu.com", - ".duckdns.org", - "|http://duckdns.org", - ".duckduckgo.com", - "||duckduckgo.com", - ".duckload.com/download", - "||duckmylife.com", - ".duga.jp", - "|http://duga.jp", - ".duihua.org", - "||duihua.org", - "||duihuahrjournal.org", - ".dunyabulteni.net", - ".duoweitimes.com", - "||duoweitimes.com", - "duping.net", - "||duplicati.com", - "dupola.com", - "dupola.net", - ".dushi.ca", - "||dvorak.org", - ".dw.com", - "||dw.com", - "||dw.de", - ".dw-world.com", - "||dw-world.com", - ".dw-world.de", - "|http://dw-world.de", - "www.dwheeler.com", - "dwnews.com", - "||dwnews.com", - "dwnews.net", - "||dwnews.net", - "xys.dxiong.com", - "||dynawebinc.com", - "||dysfz.cc", - ".dzze.com", - "||e-classical.com.tw", - "||e-gold.com", - ".e-gold.com", - ".e-hentai.org", - "||e-hentai.org", - ".e-hentaidb.com", - "|http://e-hentaidb.com", - "e-info.org.tw", - ".e-traderland.net/board", - ".e-zone.com.hk/discuz", - "|http://e-zone.com.hk/discuz", - ".e123.hk", - "||e123.hk", - ".earlytibet.com", - "|http://earlytibet.com", - ".earthcam.com", - ".earthvpn.com", - "||earthvpn.com", - "eastern-ark.com", - ".easternlightning.org", - ".eastturkestan.com", - "|http://www.eastturkistan.net/", - ".eastturkistan-gov.org", - ".eastturkistancc.org", - ".eastturkistangovernmentinexile.us", - "||eastturkistangovernmentinexile.us", - ".easyca.ca", - ".easypic.com", - ".ebony-beauty.com", - "ebookbrowse.com", - "ebookee.com", - "||ecfa.org.tw", - "ushuarencity.echainhost.com", - "||ecimg.tw", - "ecministry.net", - ".economist.com", - "bbs.ecstart.com", - "edgecastcdn.net", - "||edgecastcdn.net", - "/twimg\\.edgesuite\\.net\\/\\/?appledaily/", - "edicypages.com", - ".edmontonchina.cn", - ".edmontonservice.com", - "edoors.com", - ".edubridge.com", - "||edubridge.com", - ".edupro.org", - "||eevpn.com", - "efcc.org.hk", - ".efukt.com", - "|http://efukt.com", - "||eic-av.com", - "||eireinikotaerukai.com", - ".eisbb.com", - ".eksisozluk.com", - "||eksisozluk.com", - "electionsmeter.com", - "||elgoog.im", - ".ellawine.org", - ".elpais.com", - "||elpais.com", - ".eltondisney.com", - ".emaga.com/info/3407", - "emilylau.org.hk", - ".emanna.com/chineseTraditional", - "bitc.bme.emory.edu/~lzhou/blogs", - ".empfil.com", - ".emule-ed2k.com", - "|http://emule-ed2k.com", - ".emulefans.com", - "|http://emulefans.com", - ".emuparadise.me", - ".enanyang.my", - "||enewstree.com", - ".enfal.de", - "chinese.engadget.com", - "||engagedaily.org", - "englishforeveryone.org", - "||englishfromengland.co.uk", - "englishpen.org", - ".enlighten.org.tw", - "||entermap.com", - ".entnt.com", - "|http://entnt.com", - ".episcopalchurch.org", - ".epochhk.com", - "|http://epochhk.com", - "epochtimes-bg.com", - "||epochtimes-bg.com", - "epochtimes-romania.com", - "||epochtimes-romania.com", - "epochtimes.co.il", - "||epochtimes.co.il", - "epochtimes.co.kr", - "||epochtimes.co.kr", - "epochtimes.com", - "||epochtimes.com", - ".epochtimes.cz", - "epochtimes.de", - "epochtimes.fr", - ".epochtimes.ie", - ".epochtimes.it", - "epochtimes.jp", - "epochtimes.ru", - "epochtimes.se", - "epochtimestr.com", - ".epochweek.com", - "||epochweek.com", - "||epochweekly.com", - ".eporner.com", - ".equinenow.com", - "erabaru.net", - ".eracom.com.tw", - ".eraysoft.com.tr", - ".erepublik.com", - ".erights.net", - "||erights.net", - ".erktv.com", - "|http://erktv.com", - "||ernestmandel.org", - "||erodaizensyu.com", - "||erodoujinlog.com", - "||erodoujinworld.com", - "||eromanga-kingdom.com", - "||eromangadouzin.com", - ".eromon.net", - "|http://eromon.net", - ".eroprofile.com", - ".eroticsaloon.net", - ".eslite.com", - "||eslite.com", - "wiki.esu.im/%E8%9B%A4%E8%9B%A4%E8%AF%AD%E5%BD%95", - ".etaa.org.au", - ".etadult.com", - "etaiwannews.com", - "||etizer.org", - "||etokki.com", - ".ettoday.net/news/20151216/614081", - "etvonline.hk", - ".eu.org", - "||eu.org", - ".eucasino.com", - ".eulam.com", - ".eurekavpt.com", - "||eurekavpt.com", - ".euronews.com", - "||euronews.com", - "eeas.europa.eu/delegations/china/press_corner/all_news/news/2015/20150716_zh", - "eeas.europa.eu/statements-eeas/2015/151022", - ".evschool.net", - "|http://evschool.net", - "||exblog.jp", - "||blog.exblog.co.jp", - "@@||www.exblog.jp", - ".exchristian.hk", - "||exchristian.hk", - "|http://blog.excite.co.jp", - "||exmormon.org", - "||expatshield.com", - ".expecthim.com", - "||expecthim.com", - "experts-univers.com", - "||exploader.net", - ".expressvpn.com", - "||expressvpn.com", - ".extremetube.com", - "eyevio.jp", - "||eyevio.jp", - ".eyny.com", - "||eyny.com", - ".ezpc.tk/category/soft", - ".ezpeer.com", - "||facebookquotes4u.com", - ".faceless.me", - "||faceless.me", - "|http://facesoftibetanselfimmolators.info", - "||facesofnyfw.com", - ".faith100.org", - "|http://faith100.org", - ".faithfuleye.com", - "||faiththedog.info", - ".fakku.net", - ".falsefire.com", - "||falsefire.com", - "falun-co.org", - "falunart.org", - "||falunasia.info", - "|http://falunau.org", - ".falunaz.net", - "falundafa.org", - "falundafa-dc.org", - "||falundafa-florida.org", - "||falundafa-nc.org", - "||falundafa-pa.net", - "||falundafa-sacramento.org", - "falun-ny.net", - "||falundafaindia.org", - "falundafamuseum.org", - ".falungong.club", - ".falungong.de", - "falungong.org.uk", - "||falunhr.org", - "faluninfo.de", - "faluninfo.net", - ".falunpilipinas.net", - "||falunworld.net", - "familyfed.org", - ".fangeming.com", - "||fanglizhi.info", - "||fangong.org", - "fangongheike.com", - ".fanqiang.tk", - "fanqianghou.com", - "||fanqianghou.com", - ".fanqiangzhe.com", - "||fanqiangzhe.com", - "fapdu.com", - "faproxy.com", - ".fawanghuihui.org", - "fanqiangyakexi.net", - "fail.hk", - "||famunion.com", - ".fan-qiang.com", - ".fangbinxing.com", - "||fangbinxing.com", - "fangeming.com", - ".fangmincn.org", - "||fangmincn.org", - ".fanhaodang.com", - "||fanswong.com", - ".fanyue.info", - ".farwestchina.com", - "en.favotter.net", - "nytimes.map.fastly.net", - "||nytimes.map.fastly.net", - "||fast.wistia.com", - "||fastssh.com", - "||faststone.org", - "favstar.fm", - "||favstar.fm", - "faydao.com/weblog", - ".fc2.com", - ".fc2china.com", - ".fc2cn.com", - "||fc2cn.com", - "fc2blog.net", - "|http://uygur.fc2web.com/", - "video.fdbox.com", - ".fdc64.de", - ".fdc64.org", - ".fdc89.jp", - "||fourface.nodesnoop.com", - "||feelssh.com", - "feer.com", - ".feifeiss.com", - "|http://feitianacademy.org", - ".feitian-california.org", - "||feministteacher.com", - ".fengzhenghu.com", - "||fengzhenghu.com", - ".fengzhenghu.net", - "||fengzhenghu.net", - ".fevernet.com", - "|http://ff.im", - "fffff.at", - "fflick.com", - ".ffvpn.com", - "fgmtv.net", - ".fgmtv.org", - ".fhreports.net", - "|http://fhreports.net", - ".figprayer.com", - "||figprayer.com", - ".fileflyer.com", - "||fileflyer.com", - "|http://feeds.fileforum.com", - ".files2me.com", - ".fileserve.com/file", - "fillthesquare.org", - "filmingfortibet.org", - ".filthdump.com", - ".finchvpn.com", - "||finchvpn.com", - "findmespot.com", - "||findyoutube.com", - "||findyoutube.net", - ".fingerdaily.com", - "finler.net", - ".firearmsworld.net", - "|http://firearmsworld.net", - ".fireofliberty.org", - "||fireofliberty.org", - ".firetweet.io", - "||firetweet.io", - ".flagsonline.it", - "fleshbot.com", - ".fleursdeslettres.com", - "|http://fleursdeslettres.com", - "||flgg.us", - "||flgjustice.org", - "||flickr.com", - "||staticflickr.com", - "flickrhivemind.net", - ".flickriver.com", - ".fling.com", - "||flipkart.com", - "||flog.tw", - ".flyvpn.com", - "||flyvpn.com", - "|http://cn.fmnnow.com", - "fofldfradio.org", - "blog.foolsmountain.com", - ".forum4hk.com", - "fangong.forums-free.com", - "pioneer-worker.forums-free.com", - "|https://ss*.4sqi.net", - "video.foxbusiness.com", - "|http://foxgay.com", - "||fringenetwork.com", - "||flecheinthepeche.fr", - ".fochk.org", - "|http://fochk.org", - "||focustaiwan.tw", - ".focusvpn.com", - "||fofg.org", - ".fofg-europe.net", - ".fooooo.com", - "||fooooo.com", - "footwiball.com", - ".fotile.me", - "||fourthinternational.org", - "||foxdie.us", - "||foxsub.com", - "foxtang.com", - ".fpmt.org", - "|http://fpmt.org", - ".fpmt.tw", - ".fpmt-osel.org", - "||fpmtmexico.org", - "fqok.org", - "||fqrouter.com", - "||franklc.com", - ".freakshare.com", - "|http://freakshare.com", - "||free4u.com.ar", - "free-gate.org", - ".free-hada-now.org", - "free-proxy.cz", - ".free.fr/adsl", - "kineox.free.fr", - "tibetlibre.free.fr", - "||freealim.com", - "whitebear.freebearblog.org", - "||freebrowser.org", - ".freechal.com", - ".freedomchina.info", - "||freedomchina.info", - ".freedomhouse.org", - "||freedomhouse.org", - ".freedomsherald.org", - "||freedomsherald.org", - ".freefq.com", - ".freefuckvids.com", - ".freegao.com", - "||freegao.com", - "freeilhamtohti.org", - ".freekwonpyong.org", - "||saveliuxiaobo.com", - ".freelotto.com", - "||freelotto.com", - "freeman2.com", - ".freeopenvpn.com", - "freemoren.com", - "freemorenews.com", - "freemuse.org/archives/789", - "freenet-china.org", - "freenewscn.com", - "cn.freeones.com", - ".freeoz.org/bbs", - "||freeoz.org", - "||freessh.us", - "free4u.com.ar", - ".free-ssh.com", - "||free-ssh.com", - ".freechina.news/", - "||freechinaforum.org", - "||freechinaweibo.com", - ".freedomcollection.org/interviews/rebiya_kadeer", - ".freeforums.org", - "||freenetproject.org", - ".freeoz.org", - ".freetibet.net", - "||freetibet.org", - ".freetibetanheroes.org", - "|http://freetibetanheroes.org", - ".freeviewmovies.com", - ".freevpn.me", - "|http://freevpn.me", - "||freewallpaper4.me", - ".freewebs.com", - ".freewechat.com", - "||freewechat.com", - "freeweibo.com", - "||freeweibo.com", - ".freexinwen.com", - ".freeyoutubeproxy.net", - "||freeyoutubeproxy.net", - "friendfeed.com", - "friendfeed-media.com/e99a4ebe2fb4c1985c2a58775eb4422961aa5a2e", - "friends-of-tibet.org", - ".friendsoftibet.org", - "freechina.net", - "|http://www.zensur.freerk.com/", - "freevpn.nl", - "freeyellow.com", - "hk.frienddy.com/hk", - "|http://adult.friendfinder.com/", - ".fring.com", - "||fring.com", - ".fromchinatousa.net", - "||frommel.net", - ".frontlinedefenders.org", - ".frootvpn.com", - "||frootvpn.com", - "||fscked.org", - ".fsurf.com", - ".ftv.com.tw", - "fucd.com", - ".fuckcnnic.net", - "||fuckcnnic.net", - "fuckgfw.org", - ".fulione.com", - "|https://fulione.com", - "||fullerconsideration.com", - "fulue.com", - ".funf.tw", - "funp.com", - ".fuq.com", - ".furhhdl.org", - "||furinkan.com", - ".futurechinaforum.org", - "||futuremessage.org", - ".fux.com", - ".fuyin.net", - ".fuyindiantai.org", - ".fuyu.org.tw", - "||fw.cm", - ".fxcm-chinese.com", - "||fxcm-chinese.com", - "fzh999.com", - "fzh999.net", - "fzlm.com", - ".g6hentai.com", - "|http://g6hentai.com", - "||g-queen.com", - "||gabocorp.com", - ".gaeproxy.com", - ".gaforum.org", - ".galaxymacau.com", - "||galenwu.com", - ".galstars.net", - "||game735.com", - "gamebase.com.tw", - "gamejolt.com", - "|http://wiki.gamerp.jp", - "||gamer.com.tw", - ".gamer.com.tw", - ".gamez.com.tw", - "||gamez.com.tw", - ".gamousa.com", - ".gaoming.net", - "||gaoming.net", - "ganges.com", - ".gaopi.net", - "|http://gaopi.net", - ".gaozhisheng.org", - ".gaozhisheng.net", - "gardennetworks.com", - "||gardennetworks.org", - "72.52.81.22", - "||gartlive.com", - "||gate-project.com", - "||gather.com", - ".gatherproxy.com", - "gati.org.tw", - ".gaybubble.com", - ".gaycn.net", - ".gayhub.com", - "||gaymap.cc", - ".gaymenring.com", - ".gaytube.com", - "||images-gaytube.com", - ".gaywatch.com", - "|http://gaywatch.com", - ".gazotube.com", - "||gazotube.com", - "||gcc.org.hk", - "||gclooney.com", - "||gcmasia.com", - ".gcpnews.com", - "|http://gcpnews.com", - ".gdbt.net/forum", - "gdzf.org", - "||geek-art.net", - "geekerhome.com/2010/03/xixiang-project-cross-gfw", - "||geekheart.info", - ".gekikame.com", - "|http://gekikame.com", - ".gelbooru.com", - "|http://gelbooru.com", - ".geocities.co.jp", - ".geocities.com/SiliconValley/Circuit/5683/download.html", - "hk.geocities.com", - "geocities.jp", - ".gerefoundation.org", - "||getastrill.com", - ".getchu.com", - ".getcloak.com", - "||getcloak.com", - "||getfoxyproxy.org", - ".getfreedur.com", - "||getgom.com", - ".geti2p.net", - "||geti2p.net", - ".getlantern.org", - "||getlantern.org", - ".getjetso.com/forum", - "getiton.com", - ".getsocialscope.com", - "||getsync.com", - "gfbv.de", - ".gfgold.com.hk", - ".gfsale.com", - "||gfsale.com", - "gfw.org.ua", - ".gfw.press", - "||gfw.press", - ".ggssl.com", - "||ggssl.com", - ".ghostpath.com", - "||ghostpath.com", - "||ghut.org", - ".giantessnight.com", - "|http://giantessnight.com", - ".gifree.com", - "||giga-web.jp", - "tw.gigacircle.com", - "|http://cn.giganews.com/", - "gigporno.ru", - "||girlbanker.com", - ".git.io", - "||git.io", - "|http://softwaredownload.gitbooks.io", - "github.com/getlantern", - "|https://gist.github.com", - "http://cthlo.github.io/hktv", - "hahaxixi.github.io", - "|https://hahaxixi.github.io", - "||haoel.github.io", - "||rg3.github.io", - "||sikaozhe1997.github.io", - "||sodatea.github.io", - "||terminus2049.github.io", - "||toutyrater.github.io", - "wsgzao.github.io", - "|https://wsgzao.github.io", - "||raw.githubusercontent.com", - ".gizlen.net", - "||gizlen.net", - ".gjczz.com", - "||gjczz.com", - "globaljihad.net", - "globalmediaoutreach.com", - "globalmuseumoncommunism.org", - "||globalrescue.net", - ".globaltm.org", - ".globalvoicesonline.org", - "||globalvoicesonline.org", - "||globalvpn.net", - ".glock.com", - "gluckman.com/DalaiLama", - "gmbd.cn", - "||gmhz.org", - "|http://www.gmiddle.com", - "|http://www.gmiddle.net", - ".gmll.org", - "||gnci.org.hk", - "go-pki.com", - "||goagent.biz", - "||goagentplus.com", - "gobet.cc", - "godfootsteps.org", - "||godfootsteps.org", - "godns.work", - "godsdirectcontact.co.uk", - ".godsdirectcontact.org", - "godsdirectcontact.org.tw", - ".godsimmediatecontact.com", - ".gogotunnel.com", - "||gohappy.com.tw", - ".gokbayrak.com", - ".goldbet.com", - "||goldbetsports.com", - "||goldeneyevault.com", - ".goldenfrog.com", - "||goldenfrog.com", - ".goldjizz.com", - "|http://goldjizz.com", - ".goldstep.net", - "||goldwave.com", - "gongmeng.info", - "gongm.in", - "gongminliliang.com", - ".gongwt.com", - "|http://gongwt.com", - "blog.goo.ne.jp/duck-tail_2009", - ".gooday.xyz", - "|http://gooday.xyz", - ".goodreads.com", - "||goodreads.com", - ".goodreaders.com", - "||goodreaders.com", - ".goodtv.com.tw", - ".goodtv.tv", - "||goofind.com", - ".googlesile.com", - ".gopetition.com", - "||gopetition.com", - ".goproxing.net", - ".gotrusted.com", - "||gotrusted.com", - "||gotw.ca", - "||grammaly.com", - "grandtrial.org", - ".graphis.ne.jp", - "||graphis.ne.jp", - "||graphql.org", - "greatfirewall.biz", - "||greatfirewallofchina.net", - ".greatfirewallofchina.org", - "||greatfirewallofchina.org", - "||greenfieldbookstore.com.hk", - ".greenparty.org.tw", - "||greenpeace.org", - ".greenreadings.com/forum", - "great-firewall.com", - "great-roc.org", - "greatroc.org", - "greatzhonghua.org", - ".greenpeace.com.tw", - ".greenvpn.net", - "||greenvpn.net", - ".greenvpn.org", - "||grotty-monday.com", - "gs-discuss.com", - "||gtricks.com", - "guancha.org", - "guaneryu.com", - ".guardster.com", - ".gun-world.net", - "gunsandammo.com", - "||gutteruncensored.com", - "||gvm.com.tw", - ".gzm.tv", - "||gzone-anime.info", - "||clementine-player.org", - "echofon.com", - "||greasespot.net", - "||www.klip.me", - "@@||site.locql.com", - "||stephaniered.com", - "@@||download.syniumsoftware.com", - "|http://ub0.cc", - "wozy.in", - "gospelherald.com", - "||gospelherald.com", - "|http://hk.gradconnection.com/", - "||grangorz.org", - "greatfire.org", - "||greatfire.org", - "greatfirewallofchina.org", - "||greatroc.tw", - ".gts-vpn.com", - "|http://gts-vpn.com", - ".gu-chu-sum.org", - "|http://gu-chu-sum.org", - ".guaguass.com", - "|http://guaguass.com", - ".guaguass.org", - "|http://guaguass.org", - ".guangming.com.my", - "guishan.org", - "||guishan.org", - ".gumroad.com", - "||gumroad.com", - "||gunsamerica.com", - "guruonline.hk", - "|http://gvlib.com", - ".gyalwarinpoche.com", - ".gyatsostudio.com", - ".h528.com", - ".h5dm.com", - ".h5galgame.me", - "||h-china.org", - ".h-moe.com", - "|http://h-moe.com", - "h1n1china.org", - ".hacg.club", - "||hacg.club", - ".hacg.in", - "|http://hacg.in", - ".hacg.li", - "|http://hacg.li", - ".hacg.me", - "|http://hacg.me", - ".hacg.red", - "|http://hacg.red", - ".hacken.cc/bbs", - ".hacker.org", - "||hackthatphone.net", - "hahlo.com", - "||hakkatv.org.tw", - ".handcraftedsoftware.org", - "|http://bbs.hanminzu.org/", - ".hanunyi.com", - ".hao.news/news", - "|http://ae.hao123.com", - "|http://ar.hao123.com", - "|http://br.hao123.com", - "|http://en.hao123.com", - "|http://id.hao123.com", - "|http://jp.hao123.com", - "|http://ma.hao123.com", - "|http://mx.hao123.com", - "|http://sa.hao123.com", - "|http://th.hao123.com", - "|http://tw.hao123.com", - "|http://vn.hao123.com", - "|http://hk.hao123img.com", - "|http://ld.hao123img.com", - "||happy-vpn.com", - ".haproxy.org", - "||hardsextube.com", - ".harunyahya.com", - "|http://harunyahya.com", - "bbs.hasi.wang", - "have8.com", - "@@||haygo.com", - ".hclips.com", - "||hdlt.me", - "||hdtvb.net", - ".hdzog.com", - "|http://hdzog.com", - "||heartyit.com", - ".heavy-r.com", - ".hec.su", - "|http://hec.su", - ".hecaitou.net", - "||hecaitou.net", - ".hechaji.com", - "||hechaji.com", - "||heeact.edu.tw", - ".hegre-art.com", - "|http://hegre-art.com", - "||cdn.helixstudios.net", - "||helplinfen.com", - "||helloandroid.com", - "||helloqueer.com", - ".helloss.pw", - "hellotxt.com", - "||hellotxt.com", - ".hentai.to", - ".hellouk.org/forum/lofiversion", - ".helpeachpeople.com", - "||helpeachpeople.com", - "||helpster.de", - ".helpzhuling.org", - "hentaitube.tv", - ".hentaivideoworld.com", - "||id.heroku.com", - "heqinglian.net", - "||heungkongdiscuss.com", - ".hexieshe.com", - "||hexieshe.com", - "||hexieshe.xyz", - "||hexxeh.net", - "app.heywire.com", - ".heyzo.com", - ".hgseav.com", - ".hhdcb3office.org", - ".hhthesakyatrizin.org", - "hi-on.org.tw", - "hidden-advent.org", - "||hidden-advent.org", - "hidecloud.com/blog/2008/07/29/fuck-beijing-olympics.html", - "||hide.me", - ".hidein.net", - ".hideipvpn.com", - "||hideipvpn.com", - ".hideman.net", - "||hideman.net", - "hideme.nl", - "||hidemy.name", - ".hidemyass.com", - "||hidemyass.com", - "hidemycomp.com", - "||hidemycomp.com", - ".hihiforum.com", - ".hihistory.net", - "||hihistory.net", - ".higfw.com", - "highpeakspureearth.com", - "||highrockmedia.com", - "||hiitch.com", - "||hikinggfw.org", - ".hilive.tv", - ".himalayan-foundation.org", - "himalayanglacier.com", - ".himemix.com", - "||himemix.com", - ".himemix.net", - "times.hinet.net", - ".hitomi.la", - "|http://hitomi.la", - ".hiwifi.com", - "@@||hiwifi.com", - "hizbuttahrir.org", - "hizb-ut-tahrir.info", - "hizb-ut-tahrir.org", - ".hjclub.info", - ".hk-pub.com/forum", - "|http://hk-pub.com", - ".hk01.com", - "||hk01.com", - ".hk32168.com", - "||hk32168.com", - "||hkacg.com", - "||hkacg.net", - ".hkatvnews.com", - "hkbc.net", - ".hkbf.org", - ".hkbookcity.com", - "||hkbookcity.com", - ".hkchurch.org", - "hkci.org.hk", - ".hkcmi.edu", - "||hkcnews.com", - "||hkcoc.com", - "hkday.net", - ".hkdailynews.com.hk/china.php", - "hkdf.org", - ".hkej.com", - ".hkepc.com/forum/viewthread.php?tid=1153322", - "china.hket.com", - "||hkfaa.com", - "hkfreezone.com", - "hkfront.org", - "m.hkgalden.com", - "|https://m.hkgalden.com", - ".hkgreenradio.org/home", - ".hkheadline.com*blog", - ".hkheadline.com/instantnews", - "hkhkhk.com", - "hkhrc.org.hk", - "hkhrm.org.hk", - "||hkip.org.uk", - "1989report.hkja.org.hk", - "hkjc.com", - ".hkjp.org", - ".hklft.com", - ".hklts.org.hk", - "||hklts.org.hk", - "news.hkpeanut.com", - "hkptu.org", - ".hkreporter.com", - "||hkreporter.com", - "|http://hkupop.hku.hk/", - ".hkusu.net", - "||hkusu.net", - ".hkvwet.com", - ".hkwcc.org.hk", - "||hkzone.org", - ".hmonghot.com", - "|http://hmonghot.com", - ".hmv.co.jp/", - "hnjhj.com", - "||hnjhj.com", - ".hnntube.com", - "||hola.com", - "||hola.org", - "holymountaincn.com", - "holyspiritspeaks.org", - "||holyspiritspeaks.org", - "||derekhsu.homeip.net", - ".homeperversion.com", - "|http://homeservershow.com", - "|http://old.honeynet.org/scans/scan31/sub/doug_eric/spam_translation.html", - ".hongkongfp.com", - "||hongkongfp.com", - "hongmeimei.com", - "||hongzhi.li", - ".hootsuite.com", - "||hootsuite.com", - ".hopedialogue.org", - "|http://hopedialogue.org", - ".hopto.org", - ".hornygamer.com", - ".hornytrip.com", - "|http://hornytrip.com", - ".hotav.tv", - ".hotels.cn", - "hotfrog.com.tw", - "hotgoo.com", - ".hotpornshow.com", - "hotpot.hk", - ".hotshame.com", - "||hotspotshield.com", - ".hotvpn.com", - "||hotvpn.com", - "||hougaige.com", - "||howtoforge.com", - "||hoxx.com", - ".hqcdp.org", - "||hqcdp.org", - "||hqjapanesesex.com", - "hqmovies.com", - ".hrcir.com", - ".hrcchina.org", - ".hrea.org", - ".hrichina.org", - "||hrichina.org", - ".hrtsea.com", - ".hrw.org", - "||hrw.org", - "hrweb.org", - "||hsjp.net", - "||hsselite.com", - "|http://hst.net.tw", - ".hstern.net", - ".hstt.net", - ".htkou.net", - "||htkou.net", - ".hua-yue.net", - ".huaglad.com", - "||huaglad.com", - ".huanghuagang.org", - "||huanghuagang.org", - ".huangyiyu.com", - ".huaren.us", - "||huaren.us", - ".huaren4us.com", - ".huashangnews.com", - "|http://huashangnews.com", - "bbs.huasing.org", - "huaxia-news.com", - "huaxiabao.org", - "huaxin.ph", - "||huayuworld.org", - ".huffingtonpost.com/rebiya-kadeer", - "||hugoroy.eu", - "||huhaitai.com", - "||huhamhire.com", - "huiyi.in", - ".hulkshare.com", - "humanrightsbriefing.org", - "||hung-ya.com", - "||hungerstrikeforaids.org", - "||huping.net", - "hurgokbayrak.com", - ".hurriyet.com.tr", - ".hut2.ru", - "||hutianyi.net", - "hutong9.net", - "huyandex.com", - ".hwadzan.tw", - "||hwayue.org.tw", - "||hwinfo.com", - "||hxwk.org", - "hxwq.org", - "||hyperrate.com", - "ebook.hyread.com.tw", - "||ebook.hyread.com.tw", - "||i1.hk", - "||i2p2.de", - "||i2runner.com", - "||i818hk.com", - ".i-cable.com", - ".i-part.com.tw", - ".iamtopone.com", - "iask.ca", - "||iask.ca", - "iask.bz", - "||iask.bz", - ".iav19.com", - "ibiblio.org/pub/packages/ccic", - ".iblist.com", - "||iblogserv-f.net", - "ibros.org", - "|http://cn.ibtimes.com", - ".ibvpn.com", - "||ibvpn.com", - "icams.com", - "blogs.icerocket.com/tag", - ".icij.org", - "||icij.org", - "||icl-fi.org", - ".icoco.com", - "||icoco.com", - "||furbo.org", - "||warbler.iconfactory.net", - "||iconpaper.org", - "||icu-project.org", - "w.idaiwan.com/forum", - "||iddddg.com", - "idemocracy.asia", - ".identi.ca", - "||identi.ca", - "||idiomconnection.com", - "|http://www.idlcoyote.com", - ".idouga.com", - ".idreamx.com", - "forum.idsam.com", - ".idv.tw", - ".ieasy5.com", - "|http://ieasy5.com", - ".ied2k.net", - ".ienergy1.com", - "|http://if.ttt/", - "ifanqiang.com", - ".ifcss.org", - "||ifcss.org", - "ifjc.org", - ".ift.tt", - "|http://ift.tt", - "||ifreewares.com", - "||igcd.net", - ".igfw.net", - "||igfw.net", - ".igfw.tech", - "||igfw.tech", - ".igmg.de", - "||ignitedetroit.net", - ".igotmail.com.tw", - "||igvita.com", - "||ihakka.net", - ".ihao.org/dz5", - "||iicns.com", - ".ikstar.com", - "||illusionfactory.com", - "||ilove80.be", - "||im.tv", - "@@||myvlog.im.tv", - "||im88.tw", - ".imgchili.net", - "|http://imgchili.net", - ".imageab.com", - ".imagefap.com", - "||imagefap.com", - "||imageflea.com", - "imageshack.us", - "||imagevenue.com", - "||imagezilla.net", - ".imb.org", - "|http://imb.org", - "|http://www.imdb.com/name/nm0482730", - ".imdb.com/title/tt0819354", - ".imdb.com/title/tt1540068", - ".imdb.com/title/tt4908644", - ".img.ly", - "||img.ly", - ".imgur.com", - "||imgur.com", - ".imkev.com", - "||imkev.com", - ".imlive.com", - ".immoral.jp", - "impact.org.au", - "impp.mn", - "|http://tech2.in.com/video/", - "in99.org", - "in-disguise.com", - ".incapdns.net", - ".incloak.com", - "||incloak.com", - "||incredibox.fr", - "||indiandefensenews.in", - "timesofindia.indiatimes.com/dalai", - "timesofindia.indiatimes.com/defaultinterstitial.cms", - ".indiemerch.com", - "||indiemerch.com", - "info-graf.fr", - "website.informer.com", - ".initiativesforchina.org", - ".inkui.com", - ".inmediahk.net", - "||inmediahk.net", - "||innermongolia.org", - "|http://blog.inoreader.com", - ".inote.tw", - ".insecam.org", - "|http://insecam.org", - "||insidevoa.com", - ".institut-tibetain.org", - "|http://internet.org/", - "internetdefenseleague.org", - "internetfreedom.org", - "||internetpopculture.com", - ".inthenameofconfuciusmovie.com", - "||inthenameofconfuciusmovie.com", - "inxian.com", - "||inxian.com", - "ipalter.com", - ".ipfire.org", - "||iphone4hongkong.com", - "||iphonehacks.com", - "||iphonetaiwan.org", - "||iphonix.fr", - "||ipicture.ru", - ".ipjetable.net", - "||ipjetable.net", - ".ipobar.com/read.php?", - "ipoock.com/img", - ".iportal.me", - "|http://iportal.me", - "||ippotv.com", - ".ipredator.se", - "||ipredator.se", - ".iptv.com.tw", - "||iptvbin.com", - "||ipvanish.com", - "iredmail.org", - "chinese.irib.ir", - "||ironbigfools.compython.net", - "||ironpython.net", - ".ironsocket.com", - "||ironsocket.com", - ".is.gd", - ".islahhaber.net", - ".islam.org.hk", - "|http://islam.org.hk", - ".islamawareness.net/Asia/China", - ".islamhouse.com", - "||islamhouse.com", - ".islamicity.com", - ".islamicpluralism.org", - ".islamtoday.net", - ".isaacmao.com", - "||isaacmao.com", - "||isgreat.org", - "||ismaelan.com", - ".ismalltits.com", - "||ismprofessional.net", - "isohunt.com", - "||israbox.com", - ".issuu.com", - "||issuu.com", - ".istars.co.nz", - "oversea.istarshine.com", - "||oversea.istarshine.com", - "blog.istef.info/2007/10/21/myentunnel", - ".istiqlalhewer.com", - ".istockphoto.com", - "isunaffairs.com", - "isuntv.com", - "itaboo.info", - "||itaboo.info", - ".italiatibet.org", - "download.ithome.com.tw", - "ithelp.ithome.com.tw", - "||itshidden.com", - ".itsky.it", - ".itweet.net", - "|http://itweet.net", - ".iu45.com", - ".iuhrdf.org", - "||iuhrdf.org", - ".iuksky.com", - ".ivacy.com", - "||ivacy.com", - ".iverycd.com", - ".ivpn.net", - "||ixquick.com", - ".ixxx.com", - "iyouport.com", - "||iyouport.com", - ".izaobao.us", - "||gmozomg.izihost.org", - ".izles.net", - ".izlesem.org", - "||j.mp", - "blog.jackjia.com", - "jamaat.org", - ".jamyangnorbu.com", - "|http://jamyangnorbu.com", - ".jandyx.com", - "||janwongphoto.com", - "||japan-whores.com", - ".jav.com", - ".jav101.com", - ".jav2be.com", - "||jav2be.com", - ".jav68.tv", - ".javakiba.org", - "|http://javakiba.org", - ".javbus.com", - "||javbus.com", - "||javfor.me", - ".javhd.com", - ".javhip.com", - ".javmobile.net", - "|http://javmobile.net", - ".javmoo.com", - ".javseen.com", - "|http://javseen.com", - "jbtalks.cc", - "jbtalks.com", - "jbtalks.my", - ".jdwsy.com", - "jeanyim.com", - "||jfqu36.club", - "||jfqu37.xyz", - "||jgoodies.com", - ".jiangweiping.com", - "||jiangweiping.com", - "||jiaoyou8.com", - ".jiehua.cz", - "||hk.jiepang.com", - "||tw.jiepang.com", - "jieshibaobao.com", - ".jigglegifs.com", - "56cun04.jigsy.com", - "jigong1024.com", - "daodu14.jigsy.com", - "specxinzl.jigsy.com", - "wlcnew.jigsy.com", - ".jihadology.net", - "|http://jihadology.net", - "jinbushe.org", - "||jinbushe.org", - ".jingsim.org", - "zhao.jinhai.de", - "jingpin.org", - "||jingpin.org", - "jinpianwang.com", - ".jinroukong.com", - "ac.jiruan.net", - "||jitouch.com", - ".jizzthis.com", - "jjgirls.com", - ".jkb.cc", - "|http://jkb.cc", - "jkforum.net", - "||jma.go.jp", - "research.jmsc.hku.hk/social", - "weiboscope.jmsc.hku.hk", - ".jmscult.com", - "|http://jmscult.com", - "||joachims.org", - "||jobso.tv", - ".sunwinism.joinbbs.net", - ".journalchretien.net", - "||journalofdemocracy.org", - ".joymiihub.com", - ".joyourself.com", - "jpopforum.net", - "||fiddle.jshell.net", - ".jubushoushen.com", - "||jubushoushen.com", - ".juhuaren.com", - "||juliereyc.com", - "||junauza.com", - ".june4commemoration.org", - ".junefourth-20.net", - "||junefourth-20.net", - "||bbs.junglobal.net", - ".juoaa.com", - "|http://juoaa.com", - "justfreevpn.com", - ".justicefortenzin.org", - "justpaste.it", - "justtristan.com", - "juyuange.org", - "juziyue.com", - "||juziyue.com", - "||jwmusic.org", - "@@||music.jwmusic.org", - ".jyxf.net", - "||k-doujin.net", - "||ka-wai.com", - ".kagyu.org", - "||kagyu.org.za", - ".kagyumonlam.org", - ".kagyunews.com.hk", - ".kagyuoffice.org", - "||kagyuoffice.org", - "||kagyuoffice.org.tw", - ".kaiyuan.de", - ".kakao.com", - "||kakao.com", - ".kalachakralugano.org", - ".kankan.today", - ".kannewyork.com", - "||kannewyork.com", - ".kanshifang.com", - "||kanshifang.com", - "||kantie.org", - "kanzhongguo.com", - "kanzhongguo.eu", - ".kaotic.com", - "||karayou.com", - "karkhung.com", - ".karmapa.org", - ".karmapa-teachings.org", - "||kawase.com", - ".kba-tx.org", - ".kcoolonline.com", - ".kebrum.com", - "||kebrum.com", - ".kechara.com", - ".keepandshare.com/visit/visit_page.php?i=688154", - ".keezmovies.com", - ".kendincos.net", - ".kenengba.com", - "||kenengba.com", - "||keontech.net", - ".kepard.com", - "||kepard.com", - "wiki.keso.cn/Home", - "||keycdn.com", - ".khabdha.org", - ".khmusic.com.tw", - "||kichiku-doujinko.com", - ".kik.com", - "||kik.com", - "bbs.kimy.com.tw", - ".kindleren.com", - "|http://kindleren.com", - "|http://www.kindleren.com", - ".kingdomsalvation.org", - "||kingdomsalvation.org", - "kinghost.com", - "||kingstone.com.tw", - ".kink.com", - ".kinokuniya.com", - "||kinokuniya.com", - "killwall.com", - "||killwall.com", - "||kinmen.travel", - ".kir.jp", - ".kissbbao.cn", - "|http://kiwi.kz", - "||kk-whys.co.jp", - ".kmuh.org.tw", - ".knowledgerush.com/kr/encyclopedia", - ".kobo.com", - "||kobo.com", - ".kobobooks.com", - "||kobobooks.com", - "||kodingen.com", - "@@||www.kodingen.com", - "||kompozer.net", - ".konachan.com", - "|http://konachan.com", - ".kone.com", - "||koolsolutions.com", - ".koornk.com", - "||koornk.com", - "||koranmandarin.com", - ".korenan2.com", - "|http://gojet.krtco.com.tw", - ".ksdl.org", - ".ksnews.com.tw", - "||ktzhk.com", - ".kui.name/event", - "kun.im", - ".kurashsultan.com", - "||kurtmunger.com", - "kusocity.com", - "||kwcg.ca", - "kwongwah.com.my", - ".kxsw.life", - "||kxsw.life", - ".kyofun.com", - "kyohk.net", - "||kyoyue.com", - ".kyzyhello.com", - "||kyzyhello.com", - ".kzeng.info", - "||kzeng.info", - "la-forum.org", - "ladbrokes.com", - "||labiennale.org", - ".lagranepoca.com", - "||lagranepoca.com", - ".lalulalu.com", - ".lama.com.tw", - "||lama.com.tw", - ".lamayeshe.com", - "|http://lamayeshe.com", - "|http://www.lamenhu.com", - ".lamnia.co.uk", - "||lamnia.co.uk", - "lamrim.com", - ".lanterncn.cn", - "|http://lanterncn.cn", - ".lantosfoundation.org", - ".laod.cn", - "|http://laod.cn", - "laogai.org", - "||laogai.org", - "laomiu.com", - ".laoyang.info", - "|http://laoyang.info", - "||laptoplockdown.com", - ".laqingdan.net", - "||laqingdan.net", - "||larsgeorge.com", - ".lastcombat.com", - "|http://lastcombat.com", - "||lastfm.es", - "latelinenews.com", - ".latibet.org", - "||le-vpn.com", - ".leafyvpn.net", - "||leafyvpn.net", - "leeao.com.cn/bbs/forum.php", - "lefora.com", - "||left21.hk", - ".legalporno.com", - ".legsjapan.com", - "|http://leirentv.ca", - "leisurecafe.ca", - "||lematin.ch", - ".lemonde.fr", - "||lenwhite.com", - "lerosua.org", - "||lerosua.org", - "blog.lester850.info", - "||lesoir.be", - ".letou.com", - "letscorp.net", - "||letscorp.net", - "||ss.levyhsu.com", - "||cdn.assets.lfpcontent.com", - ".lhakar.org", - "|http://lhakar.org", - ".lhasocialwork.org", - ".liangyou.net", - "||liangyou.net", - ".lianyue.net", - "||liaowangxizang.net", - ".liaowangxizang.net", - "||liberal.org.hk", - ".libertytimes.com.tw", - "blogs.libraryinformationtechnology.com/jxyz", - ".lidecheng.com/blog/fucking-gfw", - ".lighten.org.tw", - ".lightnovel.cn", - "@@|https://www.lightnovel.cn", - "limiao.net", - "linkuswell.com", - "abitno.linpie.com/use-ipv6-to-fuck-gfw", - "||line.me", - "||line-apps.com", - ".linglingfa.com", - "||lingvodics.com", - ".link-o-rama.com", - "|http://link-o-rama.com", - ".linkideo.com", - "||api.linksalpha.com", - "||apidocs.linksalpha.com", - "||www.linksalpha.com", - "||help.linksalpha.com", - "||linux.org.hk", - "linuxtoy.org/archives/installing-west-chamber-on-ubuntu", - ".lionsroar.com", - ".lipuman.com", - "||liquidvpn.com", - "||greatfire.us7.list-manage.com", - "||listentoyoutube.com", - "listorious.com", - ".liu-xiaobo.org", - "||liudejun.com", - ".liuhanyu.com", - ".liujianshu.com", - "||liujianshu.com", - ".liuxiaobo.net", - "|http://liuxiaobo.net", - "liuxiaotong.com", - "||liuxiaotong.com", - ".livedoor.jp", - ".liveleak.com", - "||liveleak.com", - ".livestation.com", - "livestream.com", - "||livestream.com", - "||livingonline.us", - "||livingstream.com", - "||livevideo.com", - ".livevideo.com", - ".liwangyang.com", - "lizhizhuangbi.com", - "lkcn.net", - ".llss.me/", - ".load.to", - ".lobsangwangyal.com", - ".localdomain.ws", - "||localdomain.ws", - "localpresshk.com", - "||lockestek.com", - "logbot.net", - "||logiqx.com", - "secure.logmein.com", - "||secure.logmein.com", - ".londonchinese.ca", - ".longhair.hk", - "longmusic.com", - "||longtermly.net", - "||lookpic.com", - ".looktoronto.com", - "|http://looktoronto.com", - ".lotsawahouse.org/tibetan-masters/fourteenth-dalai-lama", - ".lotuslight.org.hk", - ".lotuslight.org.tw", - "hkreporter.loved.hk", - "||lpsg.com", - "||lrfz.com", - ".lrip.org", - "||lrip.org", - ".lsd.org.hk", - "||lsd.org.hk", - "lsforum.net", - ".lsm.org", - "||lsm.org", - ".lsmchinese.org", - "||lsmchinese.org", - ".lsmkorean.org", - "||lsmkorean.org", - ".lsmradio.com/rad_archives", - ".lsmwebcast.com", - ".ltn.com.tw", - "||ltn.com.tw", - ".luke54.com", - ".luke54.org", - ".lupm.org", - "||lupm.org", - "||lushstories.com", - "luxebc.com", - "lvhai.org", - "||lvhai.org", - "||lvv2.com", - ".lyfhk.net", - "|http://lyfhk.net", - ".lzmtnews.org", - "||lzmtnews.org", - "http://*.m-team.cc", - ".macrovpn.com", - "macts.com.tw", - "||mad-ar.ch", - "||madrau.com", - "||madthumbs.com", - "||magic-net.info", - "mahabodhi.org", - "my.mail.ru", - ".maiplus.com", - "|http://maiplus.com", - ".maizhong.org", - "makkahnewspaper.com", - ".mamingzhe.com", - "manicur4ik.ru", - ".maplew.com", - "|http://maplew.com", - "||marc.info", - "marguerite.su", - "||martincartoons.com", - "maskedip.com", - ".maiio.net", - ".mail-archive.com", - ".malaysiakini.com", - "||makemymood.com", - ".manchukuo.net", - ".maniash.com", - "|http://maniash.com", - ".mansion.com", - ".mansionpoker.com", - "||martau.com", - "|http://blog.martinoei.com", - ".martsangkagyuofficial.org", - "|http://martsangkagyuofficial.org", - "maruta.be/forget", - ".marxist.com", - "||marxist.net", - ".marxists.org/chinese", - "||matainja.com", - "||mathable.io", - "||mathiew-badimon.com", - "||matsushimakaede.com", - "|http://maturejp.com", - "mayimayi.com", - ".maxing.jp", - ".mcaf.ee", - "|http://mcaf.ee", - "||mcadforums.com", - "mcfog.com", - "mcreasite.com", - ".md-t.org", - "||md-t.org", - "||meansys.com", - ".media.org.hk", - ".mediachinese.com", - "||mediachinese.com", - ".mediafire.com/?", - ".mediafire.com/download", - ".mediafreakcity.com", - "||mediafreakcity.com", - ".medium.com", - "||medium.com", - ".meetav.com", - "||meetup.com", - "mefeedia.com", - "jihadintel.meforum.org", - "||mega.nz", - "||megaproxy.com", - "||megarotic.com", - "megavideo.com", - "||megurineluka.com", - "meirixiaochao.com", - ".meltoday.com", - ".memehk.com", - "||memehk.com", - "memorybbs.com", - ".memri.org", - ".memrijttm.org", - ".mercyprophet.org", - "|http://mercyprophet.org", - "||mergersandinquisitions.org", - ".meridian-trust.org", - "|http://meridian-trust.org", - ".meripet.biz", - "|http://meripet.biz", - ".meripet.com", - "|http://meripet.com", - "merit-times.com.tw", - "meshrep.com", - ".mesotw.com/bbs", - "metacafe.com/watch", - "||meteorshowersonline.com", - "|http://www.metro.taipei/", - ".metrohk.com.hk/?cmd=detail&categoryID=2", - "||metrolife.ca", - ".metroradio.com.hk", - "|http://metroradio.com.hk", - "meyou.jp", - ".meyul.com", - "||mgoon.com", - "||mgstage.com", - "||mh4u.org", - "mhradio.org", - "|http://michaelanti.com", - "||michaelmarketl.com", - "|http://bbs.mikocon.com", - ".microvpn.com", - "|http://microvpn.com", - "middle-way.net", - ".mihk.hk/forum", - ".mihr.com", - "mihua.org", - "||mikesoltys.com", - ".milph.net", - "|http://milph.net", - ".milsurps.com", - "mimiai.net", - ".mimivip.com", - ".mimivv.com", - ".mindrolling.org", - "|http://mindrolling.org", - ".minghui.or.kr", - "|http://minghui.or.kr", - "minghui.org", - "||minghui.org", - "minghui-a.org", - "minghui-b.org", - "minghui-school.org", - ".mingjinglishi.com", - "||mingjinglishi.com", - "mingjingnews.com", - "||mingjingtimes.com", - ".mingpao.com", - "||mingpao.com", - ".mingpaocanada.com", - ".mingpaomonthly.com", - "|http://mingpaomonthly.com", - "mingpaonews.com", - ".mingpaony.com", - ".mingpaosf.com", - ".mingpaotor.com", - ".mingpaovan.com", - ".mingshengbao.com", - ".minhhue.net", - ".miniforum.org", - ".ministrybooks.org", - ".minzhuhua.net", - "||minzhuhua.net", - "minzhuzhanxian.com", - "minzhuzhongguo.org", - "||miroguide.com", - "mirrorbooks.com", - ".mist.vip", - "thecenter.mit.edu", - ".mitao.com.tw", - ".mitbbs.com", - "||mitbbs.com", - "mitbbsau.com", - ".mixero.com", - "||mixero.com", - "mixpod.com", - ".mixx.com", - "||mixx.com", - "||mizzmona.com", - ".mk5000.com", - ".mlcool.com", - "||mlzs.work", - ".mm-cg.com", - "||mmaaxx.com", - ".mmmca.com", - "mnewstv.com", - "||mobatek.net", - ".mobile01.com", - "||mobile01.com", - "||mobileways.de", - ".mobypicture.com", - "|http://moby.to", - "||moeerolibrary.com", - "wiki.moegirl.org", - ".mofaxiehui.com", - ".mofos.com", - "||mog.com", - "molihua.org", - "||mondex.org", - ".money-link.com.tw", - "|http://money-link.com.tw", - "|http://www.monlamit.org", - ".moonbbs.com", - "||moonbbs.com", - "c1522.mooo.com", - "||monitorchina.org", - "bbs.morbell.com", - "||morningsun.org", - "||moroneta.com", - ".motherless.com", - "|http://motherless.com", - "motor4ik.ru", - ".mousebreaker.com", - ".movements.org", - "||movements.org", - "||moviefap.com", - "||www.moztw.org", - ".mp3buscador.com", - "mp3ye.eu", - "||mpettis.com", - "mpfinance.com", - "mpinews.com", - "mponline.hk", - ".mqxd.org", - "|http://mqxd.org", - "mrtweet.com", - "||mrtweet.com", - "news.hk.msn.com", - "news.msn.com.tw", - "msguancha.com", - ".mswe1.org", - "|http://mswe1.org", - "||mthruf.com", - "muchosucko.com", - "||multiply.com", - "multiproxy.org", - "multiupload.com", - ".mullvad.net", - "||mullvad.net", - ".mummysgold.com", - ".murmur.tw", - "|http://murmur.tw", - ".musicade.net", - ".muslimvideo.com", - "||muzi.com", - "||muzi.net", - "||mx981.com", - ".my-formosa.com", - ".my-proxy.com", - ".my-private-network.co.uk", - "||my-private-network.co.uk", - "forum.my903.com", - ".myactimes.com/actimes", - "||myanniu.com", - ".myaudiocast.com", - "||myaudiocast.com", - ".myav.com.tw/bbs", - ".mybbs.us", - ".myca168.com", - ".mycanadanow.com", - "||bbs.mychat.to", - "||mychinamyhome.com", - ".mychinamyhome.com", - ".mychinanet.com", - ".mychinanews.com", - "||mychinanews.com", - ".mychinese.news", - "||mycnnews.com", - "||mykomica.org", - "mycould.com/discuz", - ".myeasytv.com", - "||myeclipseide.com", - ".myforum.com.hk", - "||myforum.com.hk", - "||myforum.com.uk", - ".myfreecams.com", - ".myfreepaysite.com", - ".myfreshnet.com", - ".myiphide.com", - "||myiphide.com", - "forum.mymaji.com", - "mymediarom.com/files/box", - "||mymoe.moe", - "||mymusic.net.tw", - "||myparagliding.com", - "||mypopescu.com", - "myradio.hk/podcast", - ".myreadingmanga.info", - "mysinablog.com", - ".myspace.com", - "||myspacecdn.com", - ".mytalkbox.com", - ".mytizi.com", - "||naacoalition.org", - "old.nabble.com", - "||naitik.net", - ".nakuz.com/bbs", - "||nalandabodhi.org", - "||nalandawest.org", - ".namgyal.org", - "namgyalmonastery.org", - "||namsisi.com", - ".nanyang.com", - "||nanyang.com", - ".nanyangpost.com", - "||nanyangpost.com", - ".nanzao.com", - "||jpl.nasa.gov", - "||pds.nasa.gov", - "||solarsystem.nasa.gov", - ".nakido.com", - "||nakido.com", - ".naol.ca", - ".naol.cc", - "uighur.narod.ru", - ".nat.moe", - "||nat.moe", - "cyberghost.natado.com", - "||national-lottery.co.uk", - "news.nationalgeographic.com/news/2014/06/140603-tiananmen-square", - ".nationsonline.org/oneworld/tibet", - "||line.naver.jp", - "||navyfamily.navy.mil", - "||navyreserve.navy.mil", - "||nko.navy.mil", - "||usno.navy.mil", - "naweeklytimes.com", - ".nbtvpn.com", - "|http://nbtvpn.com", - "nccwatch.org.tw", - ".nch.com.tw", - ".ncn.org", - "||ncn.org", - "||etools.ncol.com", - ".nde.de", - ".ndr.de", - ".ned.org", - "||nekoslovakia.net", - "||nepusoku.com", - "||net-fits.pro", - "bbs.netbig.com", - ".netbirds.com", - "netcolony.com", - "bolin.netfirms.com", - "||netme.cc", - "netsneak.com", - ".network54.com", - "networkedblogs.com", - ".networktunnel.net", - "neverforget8964.org", - "new-3lunch.net", - ".new-akiba.com", - ".new96.ca", - ".newcenturymc.com", - "|http://newcenturymc.com", - "newcenturynews.com", - "||newchen.com", - ".newchen.com", - ".newgrounds.com", - "newipnow.com", - ".newlandmagazine.com.au", - ".newnews.ca", - "news100.com.tw", - "newschinacomment.org", - ".newscn.org", - "||newscn.org", - "newspeak.cc/story", - ".newsancai.com", - "||newsancai.com", - ".newsdetox.ca", - ".newsdh.com", - "||newstamago.com", - "||newstapa.org", - "newstarnet.com", - ".newtaiwan.com.tw", - "newtalk.tw", - "||newtalk.tw", - "newyorktimes.com", - "||nexon.com", - ".next11.co.jp", - ".nextmag.com.tw", - ".nextmedia.com", - "||nexton-net.jp", - "nexttv.com.tw", - ".nfjtyd.com", - "||co.ng.mil", - "||nga.mil", - "ngensis.com", - ".nhentai.net", - "|http://nhentai.net", - ".nhk-ondemand.jp", - ".nicovideo.jp/watch", - "||nicovideo.jp", - "||nighost.org", - "av.nightlife141.com", - "ninecommentaries.com", - ".ninjacloak.com", - "||ninjaproxy.ninja", - "nintendium.com", - "taiwanyes.ning.com", - "usmgtcg.ning.com/forum", - "||niusnews.com", - "||njactb.org", - "njuice.com", - "||njuice.com", - "nlfreevpn.com", - ".ddns.net/", - ".gooddns.info", - "||gotdns.ch", - ".maildns.xyz", - ".no-ip.org", - ".opendn.xyz", - ".servehttp.com", - "sytes.net", - ".whodns.xyz", - ".zapto.org", - "|http://dynupdate.no-ip.com/", - "||nobel.se", - "nobelprize.org/nobel_prizes/peace/laureates/1989", - "nobelprize.org/nobel_prizes/peace/laureates/2010", - "nobodycanstop.us", - "||nobodycanstop.us", - "||nokogiri.org", - "||nokola.com", - "noodlevpn.com", - ".norbulingka.org", - "nordvpn.com", - "||nordvpn.com", - "||novelasia.com", - ".news.now.com", - "|http://news.now.com", - "news.now.com%2Fhome", - "||nownews.com", - ".nowtorrents.com", - ".noypf.com", - "||noypf.com", - "||npa.go.jp", - ".npnt.me", - "|http://npnt.me", - ".nps.gov", - ".nradio.me", - "|http://nradio.me", - ".nrk.no", - "||nrk.no", - ".ntd.tv", - "||ntd.tv", - ".ntdtv.com", - "||ntdtv.com", - ".ntdtv.co.kr", - "ntdtv.ca", - "ntdtv.org", - "ntdtv.ru", - "ntdtvla.com", - ".ntrfun.com", - "||cbs.ntu.edu.tw", - "||media.nu.nl", - ".nubiles.net", - "||nuexpo.com", - ".nukistream.com", - "||nurgo-software.com", - "||nutaku.net", - ".nuvid.com", - "||nvdst.com", - "nuzcom.com", - ".nvquan.org", - ".nvtongzhisheng.org", - "|http://nvtongzhisheng.org", - ".nwtca.org", - "|http://nyaa.eu", - "||nyaa.si", - ".nydus.ca", - "nylon-angel.com", - "nylonstockingsonline.com", - ".nzchinese.com", - "||nzchinese.net.nz", - "observechina.net", - ".obutu.com", - "ocaspro.com", - "occupytiananmen.com", - "oclp.hk", - ".ocreampies.com", - "||october-review.org", - "offbeatchina.com", - "officeoftibet.com", - "|http://ofile.org", - "||ogaoga.org", - "twtr2src.ogaoga.org", - ".ogate.org", - "||ogate.org", - "www2.ohchr.org/english/bodies/cat/docs/ngos/II_China_41.pdf", - ".oikos.com.tw/v4", - ".oiktv.com", - "oizoblog.com", - ".ok.ru", - "||ok.ru", - ".okayfreedom.com", - "||okayfreedom.com", - "okk.tw", - "|http://filmy.olabloga.pl/player", - "old-cat.net", - "||olumpo.com", - ".olympicwatch.org", - "omgili.com", - "||omnitalk.com", - "||omnitalk.org", - "cling.omy.sg", - "forum.omy.sg", - "news.omy.sg", - "showbiz.omy.sg", - "||on.cc", - "||onedrive.live.com", - "||onion.city", - ".onlinecha.com", - "||onlineyoutube.com", - ".onlytweets.com", - "|http://onlytweets.com", - "onmoon.net", - "onmoon.com", - ".onthehunt.com", - "|http://onthehunt.com", - ".oopsforum.com", - "open.com.hk", - "openallweb.com", - "opendemocracy.net", - "||opendemocracy.net", - ".openervpn.in", - "openid.net", - "||openid.net", - ".openleaks.org", - "||openleaks.org", - "openvpn.net", - "||openvpn.net", - "||openwebster.com", - ".openwrt.org.cn", - "@@||openwrt.org.cn", - "my.opera.com/dahema", - "||demo.opera-mini.net", - ".opus-gaming.com", - "|http://opus-gaming.com", - "www.orchidbbs.com", - ".organcare.org.tw", - "organharvestinvestigation.net", - ".orgasm.com", - ".orgfree.com", - "||orient-doll.com", - "orientaldaily.com.my", - "||orientaldaily.com.my", - "||orn.jp", - "t.orzdream.com", - "||t.orzdream.com", - "tui.orzdream.com", - "||orzistic.org", - "||osfoora.com", - ".otnd.org", - "||otnd.org", - "||otto.de", - "||ourdearamy.com", - "oursogo.com", - ".oursteps.com.au", - "||oursteps.com.au", - ".oursweb.net", - "||ourtv.hk", - "xinqimeng.over-blog.com", - "||overplay.net", - "share.ovi.com/media", - "|http://owl.li", - "|http://ht.ly", - "|http://htl.li", - "|http://mash.to", - "www.owind.com", - "|http://www.oxid.it", - "oyax.com", - "oyghan.com/wps", - ".ozchinese.com/bbs", - "||ow.ly", - "bbs.ozchinese.com", - ".ozvoice.org", - "||ozvoice.org", - ".ozxw.com", - ".ozyoyo.com", - "||pachosting.com", - ".pacificpoker.com", - ".packetix.net", - "||pacopacomama.com", - ".padmanet.com", - "page2rss.com", - "||pagodabox.com", - ".palacemoon.com", - "forum.palmislife.com", - "||eriversoft.com", - ".paldengyal.com", - "paljorpublications.com", - ".paltalk.com", - "||pandapow.co", - ".pandapow.net", - ".pandavpn-jp.com", - ".panluan.net", - "||panluan.net", - "||pao-pao.net", - "paper.li", - "paperb.us", - ".paradisehill.cc", - ".paradisepoker.com", - ".partycasino.com", - ".partypoker.com", - ".passion.com", - "||passion.com", - ".passiontimes.hk", - "pastebin.com", - ".pastie.org", - "||pastie.org", - "||blog.pathtosharepoint.com", - "pbs.org/wgbh/pages/frontline/gate", - "pbs.org/wgbh/pages/frontline/tankman", - "pbs.org/wgbh/pages/frontline/tibet", - "video.pbs.org", - "pbwiki.com", - "||pbworks.com", - "||developers.box.net", - "||wiki.oauth.net", - "||wiki.phonegap.com", - "||wiki.jqueryui.com", - "||pbxes.com", - "||pbxes.org", - "pcdvd.com.tw", - ".pchome.com.tw", - "|http://pcij.org", - ".pcstore.com.tw", - "||pct.org.tw", - "pdetails.com", - "||pdproxy.com", - "||peace.ca", - "peacefire.org", - "peacehall.com", - "||peacehall.com", - "|http://pearlher.org", - ".peeasian.com", - ".pekingduck.org", - "||pekingduck.org", - ".pemulihan.or.id", - "|http://pemulihan.or.id", - "||pen.io", - "penchinese.com", - "||penchinese.net", - ".penchinese.net", - "pengyulong.com", - "penisbot.com", - "||blog.pentalogic.net", - ".penthouse.com", - ".pentoy.hk/%E4%B8%AD%E5%9C%8B", - ".pentoy.hk/%E6%99%82%E4%BA%8B", - ".peoplebookcafe.com", - ".peoplenews.tw", - "||peoplenews.tw", - ".peopo.org", - "||peopo.org", - ".percy.in", - ".perfectgirls.net", - "perfectvpn.net", - ".persecutionblog.com", - ".persiankitty.com", - "pfd.org.hk", - "phapluan.org", - "phayul.com", - "philborges.com", - "philly.com", - "||phncdn.com", - "||photodharma.net", - "||photofocus.com", - "||phuquocservices.com", - "||picacomiccn.com", - ".picidae.net", - "||img*.picturedip.com", - "picturesocial.com", - "||pin-cong.com", - ".pin6.com", - "||pin6.com", - ".ping.fm", - "||ping.fm", - "||pinimg.com", - ".pinkrod.com", - "||pinoy-n.com", - "||pinterest.at", - "||pinterest.ca", - "||pinterest.co.kr", - "||pinterest.co.uk", - ".pinterest.com", - "||pinterest.com", - "||pinterest.de", - "||pinterest.dk", - "||pinterest.fr", - "||pinterest.jp", - "||pinterest.nl", - "||pinterest.se", - ".pipii.tv", - ".piposay.com", - "piraattilahti.org", - ".piring.com", - "||pixelqi.com", - "||css.pixnet.in", - "||pixnet.net", - ".pixnet.net", - ".pk.com", - "||placemix.com", - "|http://pictures.playboy.com", - "||playboy.com", - ".playboyplus.com", - "||playboyplus.com", - "||player.fm", - ".playno1.com", - "||playno1.com", - "||playpcesor.com", - "plays.com.tw", - "||m.plixi.com", - "plm.org.hk", - "plunder.com", - ".plurk.com", - "||plurk.com", - ".plus28.com", - ".plusbb.com", - ".pmatehunter.com", - "|http://pmatehunter.com", - ".pmates.com", - "||po2b.com", - "pobieramy.top", - "||podictionary.com", - ".pokerstars.com", - "||pokerstars.com", - ".pokerstars.net", - "zh.pokerstrategy.com", - "politicalchina.org", - "politicalconsultation.org", - ".politiscales.net", - "||poloniex.com", - ".polymerhk.com", - "|http://polymerhk.com", - ".popo.tw", - "||popvote.hk", - ".popyard.com", - "||popyard.org", - ".porn.com", - ".porn2.com", - ".porn5.com", - ".pornbase.org", - ".pornerbros.com", - "||pornhd.com", - ".pornhost.com", - ".pornhub.com", - "||pornhub.com", - ".pornhubdeutsch.net", - "|http://pornhubdeutsch.net", - "||pornmm.net", - ".pornoxo.com", - ".pornrapidshare.com", - "||pornrapidshare.com", - ".pornsharing.com", - "|http://pornsharing.com", - ".pornsocket.com", - ".pornstarclub.com", - "||pornstarclub.com", - ".porntube.com", - ".porntubenews.com", - ".porntvblog.com", - "||porntvblog.com", - ".pornvisit.com", - ".portablevpn.nl", - "||poskotanews.com", - ".post01.com", - ".post76.com", - "||post76.com", - ".post852.com", - "postadult.com", - ".postimg.org", - "||potvpn.com", - "||powercx.com", - ".powerphoto.org", - "||www.powerpointninja.com", - "||presidentlee.tw", - "||cdn.printfriendly.com", - ".pritunl.com", - "provpnaccounts.com", - "||provpnaccounts.com", - ".proxfree.com", - "||proxfree.com", - "proxyanonimo.es", - ".proxynetwork.org.uk", - "||proxynetwork.org.uk", - "||pts.org.tw", - ".pttvan.org", - "pubu.com.tw", - "puffinbrowser.com", - "pureinsight.org", - ".pushchinawall.com", - ".putty.org", - "||putty.org", - "||calebelston.com", - "||blog.fizzik.com", - "||nf.id.au", - "||sogrady.me", - "||vatn.org", - "||ventureswell.com", - "||whereiswerner.com", - ".power.com", - "||power.com", - "powerapple.com", - "||powerapple.com", - "||abc.pp.ru", - "heix.pp.ru", - "||prayforchina.net", - "||premeforwindows7.com", - "||presentationzen.com", - "||prestige-av.com", - "prisoner-state-secret-journal-premier", - ".prisoneralert.com", - "||pritunl.com", - "||privacybox.de", - ".private.com/home", - "||privateinternetaccess.com", - "privatepaste.com", - "||privatepaste.com", - "privatetunnel.com", - "||privatetunnel.com", - "||privatevpn.com", - "||procopytips.com", - "provideocoalition.com", - "||prosiben.de", - "proxifier.com", - "api.proxlet.com", - "||proxomitron.info", - ".proxpn.com", - "||proxpn.com", - ".proxylist.org.uk", - "||proxylist.org.uk", - ".proxypy.net", - "||proxypy.net", - "proxyroad.com", - ".proxytunnel.net", - "||proyectoclubes.com", - "prozz.net", - "psblog.name", - "||psblog.name", - "||psiphon.ca", - ".psiphon3.com", - "||psiphon3.com", - ".psiphontoday.com", - ".ptt.cc", - "||ptt.cc", - ".puffstore.com", - ".puuko.com", - "||pullfolio.com", - ".punyu.com/puny", - "||pureconcepts.net", - "||pureinsight.org", - "||purepdf.com", - "||purevpn.com", - ".purplelotus.org", - ".pursuestar.com", - "||pursuestar.com", - ".pussyspace.com", - ".putihome.org", - ".putlocker.com/file", - "pwned.com", - "python.com", - ".python.com.tw", - "|http://python.com.tw", - "pythonhackers.com/p", - "ss.pythonic.life/", - ".qanote.com", - "||qanote.com", - ".qgirl.com.tw", - "||qiandao.today", - ".qi-gong.me", - "||qi-gong.me", - "||qiangyou.org", - ".qidian.ca", - ".qienkuen.org", - "||qienkuen.org", - "||qiwen.lu", - "qixianglu.cn", - "bbs.qmzdd.com", - ".qkshare.com", - "qoos.com", - "||qoos.com", - "blog.qooza.hk/dafengqixi", - "||efksoft.com", - "||qstatus.com", - "||qtweeter.com", - "||qtrac.eu", - ".quannengshen.org", - "|http://quannengshen.org", - "quantumbooter.net", - "||quitccp.net", - ".quitccp.net", - "||quitccp.org", - ".quitccp.org", - ".quora.com/Chinas-Future", - ".quran.com", - "|http://quran.com", - ".quranexplorer.com", - "qusi8.net", - ".qvodzy.org", - "nemesis2.qx.net/pages/MyEnTunnel", - "qxbbs.org", - ".ra.gg", - "|http://ra.gg/", - ".radicalparty.org", - "||rael.org", - "radicalparty.org", - "radioaustralia.net.au", - ".radiohilight.net", - "||radiohilight.net", - "opml.radiotime.com", - "||radiovaticana.org", - "||radiovncr.com", - "||raggedbanner.com", - "||raidcall.com.tw", - ".raidtalk.com.tw", - ".rainbowplan.org/bbs", - "|https://raindrop.io/", - ".raizoji.or.jp", - "|http://raizoji.or.jp", - "rangwang.biz", - "rangzen.com", - "rangzen.net", - "rangzen.org", - "|http://blog.ranxiang.com/", - "ranyunfei.com", - "||ranyunfei.com", - ".rapbull.net", - "|http://rapidgator.net/", - "||rapidmoviez.com", - "rapidvpn.com", - "||rapidvpn.com", - "||rarbgprx.org", - ".raremovie.cc", - "|http://raremovie.cc", - ".raremovie.net", - "|http://raremovie.net", - "||rawgit.com", - "||rawgithub.com", - "||razyboard.com", - "rcinet.ca", - ".read100.com", - ".readingtimes.com.tw", - "||readingtimes.com.tw", - "||readmoo.com", - ".readydown.com", - "|http://readydown.com", - ".realcourage.org", - ".realitykings.com", - "||realitykings.com", - ".realraptalk.com", - ".realsexpass.com", - ".recordhistory.org", - ".recovery.org.tw", - "|http://online.recoveryversion.org", - "||recoveryversion.com.tw", - "||red-lang.org", - "redballoonsolidarity.org", - ".redchinacn.net", - "|http://redchinacn.net", - "redchinacn.org", - "redtube.com", - "referer.us", - "||referer.us", - "||reflectivecode.com", - "relaxbbs.com", - ".relay.com.tw", - ".releaseinternational.org", - "religioustolerance.org", - "renminbao.com", - "||renminbao.com", - ".renyurenquan.org", - "||renyurenquan.org", - "|http://certificate.revocationcheck.com", - "subacme.rerouted.org", - "||resilio.com", - ".reuters.com", - "||reuters.com", - "||reutersmedia.net", - ".revleft.com", - "retweetist.com", - "||retweetrank.com", - "revver.com", - ".rfa.org", - "||rfa.org", - ".rfachina.com", - ".rfamobile.org", - "rfaweb.org", - "||rferl.org", - ".rfi.fr", - "||rfi.fr", - "|http://rfi.my/", - "|http://vds.rightster.com/", - ".rigpa.org", - ".rileyguide.com", - "riku.me/", - ".ritouki.jp", - "||ritter.vg", - ".rlwlw.com", - "||rlwlw.com", - ".rmjdw.com", - ".rmjdw132.info", - ".roadshow.hk", - ".roboforex.com", - "||robustnessiskey.com", - "||rocket-inc.net", - "|http://www2.rocketbbs.com/11/bbs.cgi?id=5mus", - "|http://www2.rocketbbs.com/11/bbs.cgi?id=freemgl", - "||rojo.com", - "||ronjoneswriter.com", - "||rolia.net", - ".roodo.com", - ".rosechina.net", - ".rotten.com", - ".rsf.org", - "||rsf.org", - ".rsf-chinese.org", - "||rsf-chinese.org", - ".rsgamen.org", - "||phosphation13.rssing.com", - ".rssmeme.com", - "||rssmeme.com", - "||rtalabel.org", - ".rthk.hk", - "|http://rthk.hk", - ".rthk.org.hk", - "|http://rthk.org.hk", - ".rti.org.tw", - "||rti.org.tw", - ".rtycminnesota.org", - ".ruanyifeng.com/blog*some_ways_to_break_the_great_firewall", - "rukor.org", - ".runbtx.com", - ".rushbee.com", - ".ruten.com.tw", - "rutube.ru", - ".ruyiseek.com", - ".rxhj.net", - "|http://rxhj.net", - ".s1s1s1.com", - "||s-cute.com", - ".s-dragon.org", - "||s1heng.com", - "|http://www.s4miniarchive.com", - "||s8forum.com", - "cdn1.lp.saboom.com", - "||sacks.com", - "sacom.hk", - "||sacom.hk", - "||sadpanda.us", - ".safervpn.com", - "||safervpn.com", - ".saintyculture.com", - "|http://saintyculture.com", - ".saiq.me", - "||saiq.me", - "||sakuralive.com", - ".sakya.org", - ".salvation.org.hk", - "||salvation.org.hk", - ".samair.ru/proxy/type-01", - ".sambhota.org", - ".cn.sandscotaicentral.com", - "|http://cn.sandscotaicentral.com", - ".sanmin.com.tw", - "sapikachu.net", - "savemedia.com", - "||savethesounds.info", - ".savetibet.de", - "||savetibet.de", - "savetibet.fr", - "savetibet.nl", - ".savetibet.org", - "||savetibet.org", - "savetibet.ru", - ".savetibetstore.org", - "||savetibetstore.org", - "savevid.com", - "||say2.info", - ".sbme.me", - "|http://sbme.me", - ".sbs.com.au/yourlanguage", - ".scasino.com", - "|http://www.sciencemag.org/content/344/6187/953", - ".sciencenets.com", - ".scmp.com", - "||scmp.com", - ".scmpchinese.com", - "||scramble.io", - ".scribd.com", - "||scribd.com", - "||scriptspot.com", - "seapuff.com", - "domainhelp.search.com", - ".searchtruth.com", - "secretchina.com", - "||secretchina.com", - "||secretgarden.no", - ".secretsline.biz", - "||secretsline.biz", - "||securetunnel.com", - "securityinabox.org", - "|https://securityinabox.org", - ".securitykiss.com", - "||securitykiss.com", - "||seed4.me", - "news.seehua.com", - "seesmic.com", - "||seevpn.com", - "||seezone.net", - "sejie.com", - ".sendspace.com", - "|http://tweets.seraph.me/", - "sesawe.net", - "||sesawe.net", - ".sesawe.org", - "||sethwklein.net", - ".setn.com", - ".settv.com.tw", - "forum.setty.com.tw", - ".sevenload.com", - "||sevenload.com", - ".sex.com", - ".sex-11.com", - "||sex3.com", - "||sex8.cc", - ".sexandsubmission.com", - ".sexbot.com", - ".sexhu.com", - ".sexhuang.com", - "sexinsex.net", - "||sexinsex.net", - ".sextvx.com", - "67.220.91.15", - "67.220.91.18", - "67.220.91.23", - "|http://*.sf.net", - ".sfileydy.com", - "||sfshibao.com", - ".sftindia.org", - ".sftuk.org", - "||sftuk.org", - "||shadeyouvpn.com", - "shadow.ma", - ".shadowsky.xyz", - ".shadowsocks.asia", - "||www.shadowsocks.com", - ".shadowsocks.com", - "||shadowsocks.com.hk", - ".shadowsocks.org", - "||shadowsocks.org", - "||shadowsocks-r.com", - "|http://cn.shafaqna.com", - ".shambalapost.com", - ".shambhalasun.com", - ".shangfang.org", - "||shangfang.org", - "shapeservices.com", - ".sharebee.com", - "||sharecool.org", - "sharpdaily.com.hk", - "||sharpdaily.com.hk", - ".sharpdaily.hk", - ".sharpdaily.tw", - ".shat-tibet.com", - "sheikyermami.com", - ".shellfire.de", - "||shellfire.de", - ".shenshou.org", - "shenyun.com", - "shenyunperformingarts.org", - "||shenyunperformingarts.org", - "shenzhoufilm.com", - "||shenzhoufilm.com", - "||sherabgyaltsen.com", - ".shiatv.net", - ".shicheng.org", - "shinychan.com", - "shipcamouflage.com", - ".shireyishunjian.com", - ".shitaotv.org", - "||shixiao.org", - "||shizhao.org", - "shizhao.org", - "shkspr.mobi/dabr", - "||shodanhq.com", - "||shooshtime.com", - ".shop2000.com.tw", - ".shopping.com", - ".showhaotu.com", - ".showtime.jp", - ".shutterstock.com", - "||shutterstock.com", - "ch.shvoong.com", - ".shwchurch.org", - "||www.shwchurch.org", - ".shwchurch3.com", - "|http://shwchurch3.com", - ".siddharthasintent.org", - "||sidelinesnews.com", - ".sidelinessportseatery.com", - ".sijihuisuo.club", - ".sijihuisuo.com", - ".silkbook.com", - "||simbolostwitter.com", - "simplecd.org", - "||simplecd.org", - "@@||simplecd.me", - "simpleproductivityblog.com", - "bbs.sina.com/", - "bbs.sina.com%2F", - "blog.sina.com.tw", - "dailynews.sina.com/", - "dailynews.sina.com%2F", - "forum.sina.com.hk", - "home.sina.com", - "||magazines.sina.com.tw", - "news.sina.com.hk", - "news.sina.com.tw", - "news.sinchew.com.my", - ".sinchew.com.my/node/", - ".sinchew.com.my/taxonomy/term", - ".singaporepools.com.sg", - "||singaporepools.com.sg", - ".singfortibet.com", - ".singpao.com.hk", - "singtao.com", - "||singtao.com", - "news.singtao.ca", - ".singtaousa.com", - "||singtaousa.com", - "sino-monthly.com", - "||sinocast.com", - "sinocism.com", - "sinomontreal.ca", - ".sinonet.ca", - ".sinopitt.info", - ".sinoants.com", - "||sinoants.com", - ".sinoquebec.com", - ".sierrafriendsoftibet.org", - "sis.xxx", - "||sis001.com", - "sis001.us", - ".site2unblock.com", - "||site90.net", - ".sitebro.tw", - "||sitekreator.com", - "||siteks.uk.to", - "||sitemaps.org", - ".sjrt.org", - "|http://sjrt.org", - "||sjum.cn", - "||sketchappsources.com", - "||skimtube.com", - "||skybet.com", - "|http://users.skynet.be/reves/tibethome.html", - ".skyking.com.tw", - "bbs.skykiwi.com", - "|http://www.skype.com/intl/", - "|http://www.skype.com/zh-Hant", - "||skyvegas.com", - ".xskywalker.com", - "||xskywalker.com", - "||skyxvpn.com", - "m.slandr.net", - ".slaytizle.com", - ".sleazydream.com", - "||slheng.com", - "||slideshare.net", - "forum.slime.com.tw", - ".slinkset.com", - "||slickvpn.com", - ".slutload.com", - "||smartdnsproxy.com", - ".smarthide.com", - "||app.smartmailcloud.com", - "smchbooks.com", - ".smh.com.au/world/death-of-chinese-playboy-leaves-fresh-scratches-in-party-paintwork-20120903-25a8v", - "smhric.org", - ".smith.edu/dalailama", - ".smyxy.org", - "||snapchat.com", - ".snaptu.com", - "||snaptu.com", - "||sndcdn.com", - "sneakme.net", - "snowlionpub.com", - "home.so-net.net.tw/yisa_tsai", - "||soc.mil", - ".socks-proxy.net", - "||socks-proxy.net", - ".sockscap64.com", - "||sockslist.net", - ".socrec.org", - "|http://socrec.org", - ".sod.co.jp", - ".softether.org", - "||softether.org", - ".softether-download.com", - "||softether-download.com", - "||cdn.softlayer.net", - "||sogclub.com", - "sohcradio.com", - "||sohcradio.com", - ".sokmil.com", - "||sorting-algorithms.com", - ".sostibet.org", - ".soumo.info", - "||soup.io", - "@@||static.soup.io", - ".sobees.com", - "||sobees.com", - "socialwhale.com", - ".softether.co.jp", - "||softwarebychuck.com", - "blog.sogoo.org", - "soh.tw", - "||soh.tw", - "sohfrance.org", - "||sohfrance.org", - "chinese.soifind.com", - "sokamonline.com", - ".solidaritetibet.org", - ".solidfiles.com", - "||somee.com", - ".songjianjun.com", - "||songjianjun.com", - ".sonicbbs.cc", - ".sonidodelaesperanza.org", - ".sopcast.com", - ".sopcast.org", - ".sorazone.net", - "||sos.org", - "bbs.sou-tong.org", - ".soubory.com", - "|http://soubory.com", - ".soul-plus.net", - ".soulcaliburhentai.net", - "||soulcaliburhentai.net", - "||soundcloud.com", - ".soundofhope.kr", - "soundofhope.org", - "||soundofhope.org", - "||soupofmedia.com", - "|http://sourceforge.net/p*/shadowsocksgui/", - ".sourcewadio.com", - "southnews.com.tw", - "sowers.org.hk", - "||wlx.sowiki.net", - "||spankbang.com", - ".spankingtube.com", - ".spankwire.com", - "||spb.com", - "||speakerdeck.com", - "||speedify.com", - "spem.at", - "||spencertipping.com", - "||spendee.com", - "||spicevpn.com", - ".spideroak.com", - "||spideroak.com", - ".spike.com", - ".spotflux.com", - "||spotflux.com", - ".spring4u.info", - "|http://spring4u.info", - "||sproutcore.com", - "||sproxy.info", - "||srocket.us", - ".ss-link.com", - "||ss-link.com", - ".ssglobal.co/wp", - "|http://ssglobal.co", - ".ssglobal.me", - "||ssh91.com", - ".sspro.ml", - "|http://sspro.ml", - ".ssrshare.com", - "||ssrshare.com", - "||sss.camp", - "||sstmlt.moe", - "sstmlt.net", - "||sstmlt.net", - "|http://stackoverflow.com/users/895245", - ".stage64.hk", - "||stage64.hk", - "||standupfortibet.org", - "stanford.edu/group/falun", - "usinfo.state.gov", - "||statueofdemocracy.org", - ".starfishfx.com", - ".starp2p.com", - "||starp2p.com", - ".startpage.com", - "||startpage.com", - ".startuplivingchina.com", - "|http://startuplivingchina.com", - "||static-economist.com", - "||stc.com.sa", - "||steel-storm.com", - ".steganos.com", - "||steganos.com", - ".steganos.net", - ".stepchina.com", - "ny.stgloballink.com", - "hd.stheadline.com/news/realtime", - "sthoo.com", - "||sthoo.com", - ".stickam.com", - "stickeraction.com/sesawe", - ".stileproject.com", - ".sto.cc", - ".stoporganharvesting.org", - "||storagenewsletter.com", - ".storm.mg", - "||storm.mg", - ".stoptibetcrisis.net", - "||stoptibetcrisis.net", - "||storify.com", - ".stormmediagroup.com", - "||stoweboyd.com", - "stranabg.com", - "||straplessdildo.com", - "||streamingthe.net", - "streema.com/tv/NTDTV_Chinese", - "cn.streetvoice.com/article", - "cn.streetvoice.com/diary", - "cn2.streetvoice.com", - "tw.streetvoice.com", - ".strikingly.com", - "||strongvpn.com", - ".strongwindpress.com", - ".student.tw/db", - "||studentsforafreetibet.org", - "||stumbleupon.com", - "stupidvideos.com", - ".successfn.com", - "panamapapers.sueddeutsche.de", - ".sugarsync.com", - "||sugarsync.com", - ".sugobbs.com", - "||sugumiru18.com", - "||suissl.com", - "summify.com", - ".sumrando.com", - "||sumrando.com", - "sun1911.com", - ".sunporno.com", - "||sunmedia.ca", - "||sunporno.com", - ".sunskyforum.com", - ".sunta.com.tw", - ".sunvpn.net", - ".suoluo.org", - ".superfreevpn.com", - ".supervpn.net", - "||supervpn.net", - ".superzooi.com", - "|http://superzooi.com", - ".suppig.net", - ".suprememastertv.com", - "|http://suprememastertv.com", - ".surfeasy.com", - "||surfeasy.com", - ".surfeasy.com.au", - "|http://surfeasy.com.au", - "||surrenderat20.net", - ".suyangg.com", - "|http://suyangg.com", - ".svsfx.com", - ".swissinfo.ch", - "||swissinfo.ch", - ".swissvpn.net", - "||swissvpn.net", - "switchvpn.net", - "||switchvpn.net", - ".sydneytoday.com", - "||sydneytoday.com", - ".sylfoundation.org", - "||syncback.com", - "sysresccd.org", - ".sytes.net", - "blog.syx86.com/2009/09/puff", - "blog.syx86.cn/2009/09/puff", - ".szbbs.net", - ".szetowah.org.hk", - "||t-g.com", - ".t35.com", - ".t66y.com", - "||t66y.com", - ".taa-usa.org", - "|http://taa-usa.org", - ".taaze.tw", - "||taaze.tw", - "|http://www.tablesgenerator.com/", - "tabtter.jp", - ".tacem.org", - ".taconet.com.tw", - "||taedp.org.tw", - ".tafm.org", - ".tagwa.org.au", - "tagwalk.com", - "||tagwalk.com", - "tahr.org.tw", - ".taipeisociety.org", - "||taipeisociety.org", - ".taiwanbible.com", - ".taiwancon.com", - ".taiwandaily.net", - "||taiwandaily.net", - ".taiwandc.org", - ".taiwanjustice.com", - "taiwankiss.com", - "taiwannation.com", - "taiwannation.com.tw", - "||taiwanncf.org.tw", - "||taiwannews.com.tw", - "|http://www.taiwanonline.cc/", - "taiwantp.net", - "||taiwantt.org.tw", - "taiwanus.net", - "taiwanyes.com", - "taiwan-sex.com", - ".talk853.com", - ".talkboxapp.com", - "||talkboxapp.com", - ".talkcc.com", - "||talkcc.com", - ".talkonly.net", - "||talkonly.net", - "||tamiaode.tk", - "||tanc.org", - "tangben.com", - ".tangren.us", - ".taoism.net", - "|http://taoism.net", - ".taolun.info", - "||taolun.info", - ".tapatalk.com", - "||tapatalk.com", - "blog.taragana.com", - ".tascn.com.au", - "||taup.net", - "|http://www.taup.org.tw", - ".taweet.com", - "||taweet.com", - ".tbcollege.org", - "||tbcollege.org", - ".tbi.org.hk", - ".tbicn.org", - ".tbjyt.org", - "||tbpic.info", - ".tbrc.org", - "tbs-rainbow.org", - ".tbsec.org", - "||tbsec.org", - "tbskkinabalu.page.tl", - ".tbsmalaysia.org", - ".tbsn.org", - "||tbsn.org", - ".tbsseattle.org", - ".tbssqh.org", - "|http://tbssqh.org", - "tbswd.org", - ".tbtemple.org.uk", - ".tbthouston.org", - ".tccwonline.org", - ".tcewf.org", - "tchrd.org", - "tcnynj.org", - "||tcpspeed.co", - ".tcpspeed.com", - "||tcpspeed.com", - ".tcsofbc.org", - ".tcsovi.org", - ".tdm.com.mo", - "teamamericany.com", - "||techviz.net", - "||teck.in", - ".teeniefuck.net", - "teensinasia.com", - ".telecomspace.com", - "||telegraph.co.uk", - ".tenacy.com", - "||tenzinpalmo.com", - ".tew.org", - ".thaicn.com", - "||theatrum-belli.com", - "theblemish.com", - "||thebcomplex.com", - ".thebobs.com", - "||thebobs.com", - ".thechinabeat.org", - "|http://www.thechinastory.org/yearbooks/yearbook-2012/", - ".thedalailamamovie.com", - "|http://thedalailamamovie.com", - "||thedw.us", - "thefrontier.hk/tf", - "cn.thegay.com", - "|http://thegioitinhoc.vn/", - ".thegly.com", - ".thehots.info", - "thehousenews.com", - "||thehun.net", - ".theinitium.com", - "||theinitium.com", - ".thenewslens.com", - "||thenewslens.com", - ".thepiratebay.org", - "||thepiratebay.org", - ".theporndude.com", - "||theporndude.com", - "||theportalwiki.com", - "thereallove.kr", - "therock.net.nz", - "thespeeder.com", - "||thestandnews.com", - "thetibetcenter.org", - "thetibetconnection.org", - ".thetibetmuseum.org", - ".thetibetpost.com", - "||thetibetpost.com", - "||thetinhat.com", - "thetrotskymovie.com", - "thevivekspot.com", - "||thewgo.org", - ".theync.com", - "|http://theync.com", - ".thinkingtaiwan.com", - ".thisav.com", - "|http://thisav.com", - ".thlib.org", - "||thomasbernhard.org", - ".thongdreams.com", - "threatchaos.com", - "||throughnightsfire.com", - ".thumbzilla.com", - "||thywords.com", - ".thywords.com.tw", - "tiananmenmother.org", - ".tiananmenduizhi.com", - "||tiananmenduizhi.com", - "||tiananmenuniv.com", - "||tiananmenuniv.net", - "||tiandixing.org", - ".tianhuayuan.com", - ".tianlawoffice.com", - "||tianti.io", - "tiantibooks.org", - "||tiantibooks.org", - "tianyantong.org.cn", - ".tianzhu.org", - ".tibet.at", - "tibet.ca", - ".tibet.com", - "||tibet.com", - "tibet.fr", - ".tibet.net", - "||tibet.net", - "tibet.nu", - ".tibet.org", - "||tibet.org", - ".tibet.sk", - "tibet.org.tw", - ".tibet.to", - ".tibet-envoy.eu", - "||tibet-envoy.eu", - ".tibet-foundation.org", - ".tibet-house-trust.co.uk", - "tibet-info.net", - "tibet-initiative.de", - "||tibet-initiative.de", - ".tibet-munich.de", - ".tibet3rdpole.org", - "|http://tibet3rdpole.org", - "tibetaction.net", - "||tibetaction.net", - ".tibetaid.org", - "tibetalk.com", - ".tibetan.fr", - "tibetan-alliance.org", - ".tibetanarts.org", - ".tibetanbuddhistinstitute.org", - "|http://tibetanbuddhistinstitute.org", - "tibetancommunity.org", - ".tibetanjournal.com", - ".tibetanlanguage.org", - ".tibetanliberation.org", - "||tibetanliberation.org", - ".tibetcollection.com", - ".tibetanaidproject.org", - ".tibetancommunityuk.net", - "|http://tibetancommunityuk.net", - "tibetanculture.org", - "tibetanfeministcollective.org", - ".tibetanpaintings.com", - ".tibetanphotoproject.com", - ".tibetanpoliticalreview.org", - ".tibetanreview.net", - "|http://tibetansports.org", - ".tibetanwomen.org", - "|http://tibetanwomen.org", - ".tibetanyouth.org", - ".tibetanyouthcongress.org", - "||tibetanyouthcongress.org", - ".tibetcharity.dk", - "tibetcharity.in", - ".tibetchild.org", - ".tibetcity.com", - ".tibetcorps.org", - ".tibetexpress.net", - "|http://tibetexpress.net", - "tibetfocus.com", - "tibetfund.org", - ".tibetgermany.com", - "||tibetgermany.de", - ".tibethaus.com", - ".tibetheritagefund.org", - "tibethouse.jp", - "tibethouse.org", - "||tibethouse.us", - ".tibetinfonet.net", - ".tibetjustice.org", - ".tibetkomite.dk", - "|http://tibetmuseum.org", - "tibetnetwork.org", - "||tibetnetwork.org", - ".tibetoffice.ch", - "|http://tibetoffice.ch", - "tibetoffice.eu", - "tibetoffice.org", - "tibetonline.com", - "||tibetonline.com", - ".tibetoffice.com.au", - "|http://tibetoffice.com.au", - "||tibetonline.tv", - ".tibetonline.tv", - ".tibetoralhistory.org", - "|http://tibetoralhistory.org", - ".tibetpolicy.eu", - ".tibetrelieffund.co.uk", - "tibetsites.com", - ".tibetsociety.com", - "||tibetsociety.com", - ".tibetsun.com", - ".tibetsupportgroup.org", - "|http://tibetsupportgroup.org", - ".tibetswiss.ch", - ".tibettelegraph.com", - "tibettimes.net", - "||tibetwrites.org", - ".ticket.com.tw", - ".tigervpn.com", - "||tigervpn.com", - ".timdir.com", - "|http://timdir.com", - ".time.com", - "|http://time.com", - ".timsah.com", - "||blog.tiney.com", - "tintuc101.com", - ".tiny.cc", - "|http://tiny.cc", - "tinychat.com", - "||tinypaste.com", - ".tistory.com", - "||tkcs-collins.com", - ".tmagazine.com", - "||tmagazine.com", - ".tmdfish.com", - "|http://tmi.me", - ".tmpp.org", - "|http://tmpp.org", - ".tnaflix.com", - "||tnaflix.com", - ".tngrnow.com", - ".tngrnow.net", - ".tnp.org", - "|http://tnp.org", - ".to-porno.com", - "||to-porno.com", - "togetter.com", - ".tokyo-247.com", - ".tokyo-hot.com", - "||tokyo-porn-tube.com", - "||tokyocn.com", - "tw.tomonews.net", - ".tongil.or.kr", - ".tono-oka.jp", - "tonyyan.net", - ".toodoc.com", - "toonel.net", - "top81.ws", - ".topnews.in", - ".toppornsites.com", - "|http://toppornsites.com", - ".torguard.net", - "||torguard.net", - "||top.tv", - ".topshareware.com", - ".topsy.com", - "||topsy.com", - "||toptip.ca", - "tora.to", - ".torcn.com", - ".torproject.org", - "||torproject.org", - "torrentprivacy.com", - "||torrentprivacy.com", - "|http://torrentproject.se", - "||torrenty.org", - "||torrentz.eu", - "||torvpn.com", - "||totalvpn.com", - ".toutiaoabc.com", - "towngain.com", - "toypark.in", - "toytractorshow.com", - ".tparents.org", - ".tpi.org.tw", - "||tpi.org.tw", - "traffichaus.com", - "||transparency.org", - "||treemall.com.tw", - "trendsmap.com", - "||trendsmap.com", - ".trialofccp.org", - "||trialofccp.org", - ".trimondi.de/SDLE", - ".trouw.nl", - "|http://trouw.nl", - ".trt.net.tr", - "trtc.com.tw", - ".truebuddha-md.org", - "|http://truebuddha-md.org", - "trulyergonomic.com", - ".truth101.co.tv", - "|http://truth101.co.tv", - ".truthontour.org", - "|http://truthontour.org", - ".truveo.com", - ".tsctv.net", - ".tsemtulku.com", - "tsquare.tv", - ".tsu.org.tw", - "tsunagarumon.com", - ".tsctv.net", - "||tt1069.com", - ".tttan.com", - "||tttan.com", - "bb.ttv.com.tw/bb", - "tu8964.com", - ".tubaholic.com", - ".tube.com", - "tube8.com", - "||tube8.com", - ".tube911.com", - "||tube911.com", - ".tubecup.com", - ".tubegals.com", - ".tubeislam.com", - "|http://tubeislam.com", - ".tubestack.com", - "||tubewolf.com", - ".tuibeitu.net", - "tuidang.net", - ".tuidang.org", - "||tuidang.org", - ".tuidang.se", - "bbs.tuitui.info", - ".tumutanzi.com", - "|http://tumutanzi.com", - "||tumview.com", - ".tunein.com", - "|http://tunein.com", - "||tunnelbear.com", - ".tunnelr.com", - "||tunnelr.com", - ".tuo8.blue", - "||tuo8.blue", - ".tuo8.cc", - ".tuo8.club", - "||tuo8.club", - ".tuo8.fit", - ".tuo8.hk", - ".tuo8.in", - ".tuo8.ninja", - ".tuo8.org", - "||tuo8.fit", - "||tuo8.org", - ".tuo8.pw", - "|http://tuo8.pw", - "||tuo8.red", - ".tuo8.space", - "tuitwit.com", - ".turansam.org", - ".turbobit.net", - "|http://turbobit.net", - ".turbohide.com", - "||turbohide.com", - ".tushycash.com", - "|http://tushycash.com", - "||app.tutanota.com", - ".tuvpn.com", - "||tuvpn.com", - "|http://tuzaijidi.com", - "|http://*.tuzaijidi.com", - ".tw01.org", - "|http://tw01.org", - ".tumblr.com", - "||tumblr.com", - "||lecloud.net", - "|http://cosmic.monar.ch", - "||slutmoonbeam.com", - "|http://blog.soylent.com", - ".tv.com", - "|http://tv.com", - "tvants.com", - "forum.tvb.com", - "news.tvb.com/list/world", - "news.tvb.com/local", - "news.tvbs.com.tw", - ".tvboxnow.com", - "|http://tvboxnow.com/", - "tvider.com", - ".tvmost.com.hk", - ".tvplayvideos.com", - "||tvunetworks.com", - ".tw-blog.com", - "|https://tw-blog.com", - ".tw-npo.org", - ".twaitter.com", - "twapperkeeper.com", - "||twapperkeeper.com", - "||twaud.io", - ".twaud.io", - ".twavi.com", - ".twbbs.net.tw", - "twbbs.org", - "twbbs.tw", - "||twblogger.com", - "tweepmag.com", - ".tweepml.org", - "||tweepml.org", - ".tweetbackup.com", - "||tweetbackup.com", - "tweetboard.com", - "||tweetboard.com", - ".tweetboner.biz", - "||tweetboner.biz", - ".tweetcs.com", - "|http://tweetcs.com", - "|http://deck.ly", - "||mtw.tl", - "||tweetedtimes.com", - "||tweetmylast.fm", - "tweetphoto.com", - "||tweetphoto.com", - "||tweetrans.com", - "tweetree.com", - "||tweetree.com", - ".tweettunnel.com", - "||tweettunnel.com", - "||tweetwally.com", - "tweetymail.com", - "||twelve.today", - ".tweez.net", - "|http://tweez.net", - "||twftp.org", - "||twgreatdaily.com", - "twibase.com", - ".twibble.de", - "||twibble.de", - "twibbon.com", - "||twibs.com", - ".twicountry.org", - "|http://twicountry.org", - "twicsy.com", - ".twiends.com", - "|http://twiends.com", - ".twifan.com", - "|http://twifan.com", - "twiffo.com", - "||twiffo.com", - ".twilightsex.com", - "twilog.org", - "twimbow.com", - "||twindexx.com", - "twipple.jp", - "||twipple.jp", - "||twip.me", - "twishort.com", - "||twishort.com", - "twistar.cc", - "||twister.net.co", - "||twisterio.com", - "twisternow.com", - "twistory.net", - "twitbrowser.net", - "||twitcause.com", - "||twitgether.com", - "||twiggit.org", - "twitgoo.com", - "twitiq.com", - "||twitiq.com", - ".twitlonger.com", - "||twitlonger.com", - "|http://tl.gd/", - "twitmania.com", - "twitoaster.com", - "||twitoaster.com", - "||twitonmsn.com", - ".twit2d.com", - "||twit2d.com", - ".twitstat.com", - "||twitstat.com", - "||firstfivefollowers.com", - "||retweeteffect.com", - "||tweeplike.me", - "||tweepguide.com", - "||turbotwitter.com", - ".twitvid.com", - "||twitvid.com", - "|http://twt.tl", - "twittbot.net", - "||ads-twitter.com", - "||twttr.com", - "||twitter4j.org", - ".twittercounter.com", - "||twittercounter.com", - "twitterfeed.com", - ".twittergadget.com", - "||twittergadget.com", - ".twitterkr.com", - "||twitterkr.com", - "||twittermail.com", - "||twitterrific.com", - "twittertim.es", - "||twittertim.es", - "twitthat.com", - "||twitturk.com", - ".twitturly.com", - "||twitturly.com", - ".twitzap.com", - "twiyia.com", - "||twstar.net", - ".twtkr.com", - "|http://twtkr.com", - ".twnorth.org.tw", - "twskype.com", - "twtrland.com", - "twurl.nl", - ".twyac.org", - "||twyac.org", - ".txxx.com", - ".tycool.com", - "||tycool.com", - "||typepad.com", - "@@||www.typepad.com", - "@@||static.typepad.com", - "||blog.expofutures.com", - "||legaltech.law.com", - "||blogs.tampabay.com", - "||contests.twilio.com", - ".embr.in", - "||embr.in", - ".u9un.com", - "||u9un.com", - ".ubddns.org", - "|http://ubddns.org", - "||uberproxy.net", - ".uc-japan.org", - "||uc-japan.org", - ".srcf.ucam.org/salon/", - "|http://china.ucanews.com/", - "||ucdc1998.org", - "|http://hum*.uchicago.edu/faculty/ywang/history", - "||uderzo.it", - ".udn.com", - "||udn.com", - "||udn.com.tw", - "udnbkk.com/bbs", - "||uforadio.com.tw", - "ufreevpn.com", - ".ugo.com", - "||uhdwallpapers.org", - "||uhrp.org", - ".uighur.nl", - "||uighur.nl", - "uighurbiz.net", - ".ulike.net", - "ukcdp.co.uk", - "ukliferadio.co.uk", - "||ukliferadio.co.uk", - "ultravpn.fr", - "||ultravpn.fr", - "ultraxs.com", - "umich.edu/~falun", - "||unblock.cn.com", - ".unblocker.yt", - "unblock-us.com", - "||unblock-us.com", - ".unblockdmm.com", - "|http://unblockdmm.com", - "||unblocksit.es", - "uncyclomedia.org", - ".uncyclopedia.hk/wiki", - "|http://uncyclopedia.hk", - "|http://uncyclopedia.tw", - "underwoodammo.com", - "||underwoodammo.com", - "||unholyknight.com", - ".uni.cc", - "||cldr.unicode.org", - ".unification.net", - ".unification.org.tw", - "||unirule.cloud", - ".unitedsocialpress.com", - ".unix100.com", - "||unknownspace.org", - ".unodedos.com", - "unpo.org", - ".untraceable.us", - "|http://untraceable.us", - "||uocn.org", - "tor.updatestar.com", - ".upholdjustice.org", - ".upload4u.info", - "uploaded.net/file", - "|http://uploaded.net/file", - "|http://uploaded.to/file", - ".uploadstation.com/file", - ".upmedia.mg", - "||upmedia.mg", - ".upornia.com", - "|http://upornia.com", - "||uproxy.org", - "|http://tor.cn.uptodown.com/", - ".upwill.org", - "ur7s.com", - "||urbansurvival.com", - "myshare.url.com.tw/", - "||urlborg.com", - "||urlparser.com", - "us.to", - "||usacn.com", - ".usaip.eu", - "||usaip.eu", - "dalailama.usc.edu", - "iipdigital.usembassy.gov", - "||usfk.mil", - "||usma.edu", - "||usmc.mil", - ".usocctn.com", - "|http://tarr.uspto.gov/", - "||tsdr.uspto.gov", - ".ustream.tv", - "||ustream.tv", - ".usunitednews.com", - "|http://usunitednews.com", - "usus.cc", - ".utopianpal.com", - "||utopianpal.com", - ".uu-gg.com", - ".uvwxyz.xyz", - "||uvwxyz.xyz", - ".uwants.com", - ".uwants.net", - "uyghur.co.uk", - "|http://uyghur-j.org", - "||uyghuramerican.org", - ".uyghurcanadiansociety.org", - ".uyghurensemble.co.uk", - "||uyghurcongress.org", - ".uyghurpen.org", - ".uyghurpress.com", - "|https://uyghurpress.com", - ".uyghurstudies.org", - "|http://uyghurstudies.org", - "uygur.org", - "|http://uymaarip.com/", - ".v2ray.com", - "||v2ray.com", - ".van001.com", - ".van698.com", - ".vanemu.cn", - ".vanilla-jp.com", - ".vanpeople.com", - "vansky.com", - "||vaticannews.va", - "||vcf-online.org", - "||vcfbuilder.org", - ".vegasred.com", - ".velkaepocha.sk", - ".venbbs.com", - ".venchina.com", - ".venetianmacao.com", - "||venetianmacao.com", - "veoh.com", - "mysite.verizon.net", - "vermonttibet.org", - ".versavpn.com", - "||versavpn.com", - "||verybs.com", - ".vft.com.tw", - ".viber.com", - "||viber.com", - ".vica.info", - ".victimsofcommunism.org", - "|http://victimsofcommunism.org", - "||vid.me", - "||vidble.com", - "videobam.com", - "||videobam.com", - ".videodetective.com", - ".videomega.tv", - "||videomega.tv", - ".videomo.com", - "videopediaworld.com", - ".videopress.com", - ".vidinfo.org/video", - "vietdaikynguyen.com", - ".vijayatemple.org", - "vimeo.com", - "||vimeo.com", - "||vimperator.org", - "||vincnd.com", - "||vinniev.com", - "|http://www.lib.virginia.edu/area-studies/Tibet/tibet.html", - ".virtualrealporn.com", - "||virtualrealporn.com", - "visibletweets.com", - "|http://ny.visiontimes.com", - ".vital247.org", - "||viu.com", - ".vivahentai4u.net", - ".vivatube.com", - ".vivthomas.com", - "||vivthomas.com", - ".vjav.com", - "||vjav.com", - ".vjmedia.com.hk", - ".vllcs.org", - "|http://vllcs.org", - "||vmixcore.com", - "||vnet.link", - "cn.voa.mobi", - "tw.voa.mobi", - ".voachineseblog.com", - "||voachineseblog.com", - "voagd.com", - ".voacantonese.com", - "||voacantonese.com", - "voachinese.com", - "||voachinese.com", - ".voanews.com", - "||voanews.com", - "voatibetan.com", - "||voatibetan.com", - ".voatibetanenglish.com", - "||voatibetanenglish.com", - ".vocativ.com", - "vocn.tv", - ".vot.org", - "||vot.org", - ".vovo2000.com", - "|http://vovo2000.com", - ".voxer.com", - "||voxer.com", - ".voy.com", - "||vpn.ac", - ".vpn4all.com", - "||vpn4all.com", - ".vpnaccount.org", - "|http://vpnaccount.org", - ".vpnaccounts.com", - "||vpnaccounts.com", - ".vpncomparison.org", - ".vpncup.com", - "||vpncup.com", - "vpnbook.com", - ".vpncoupons.com", - "|http://vpncoupons.com", - ".vpndada.com", - "||vpndada.com", - ".vpnfan.com", - "vpnfire.com", - ".vpnfires.biz", - ".vpnforgame.net", - "||vpnforgame.net", - "||vpngate.jp", - ".vpngate.net", - "||vpngate.net", - ".vpngratis.net", - "vpnhq.com", - ".vpnmaster.com", - "||vpnmaster.com", - ".vpnmentor.com", - "||vpnmentor.com", - ".vpninja.net", - "||vpninja.net", - ".vpnintouch.com", - "||vpnintouch.net", - "vpnjack.com", - "||vpnjack.com", - ".vpnpick.com", - "||vpnpick.com", - "||vpnpop.com", - "||vpnpronet.com", - ".vpnreactor.com", - "||vpnreactor.com", - "||vpnreviewz.com", - ".vpnsecure.me", - "||vpnsecure.me", - ".vpnshazam.com", - "||vpnshazam.com", - ".vpnshieldapp.com", - "||vpnshieldapp.com", - ".vpnsp.com", - ".vpntraffic.com", - ".vpntunnel.com", - "||vpntunnel.com", - ".vpnuk.info", - "||vpnuk.info", - "||vpnunlimitedapp.com", - ".vpnvip.com", - "||vpnvip.com", - ".vpnworldwide.com", - ".vporn.com", - "||vporn.com", - ".vpser.net", - "@@||vpser.net", - "vraiesagesse.net", - ".vrmtr.com", - "||vtunnel.com", - "||vuku.cc", - "lists.w3.org/archives/public", - "||w3schools.com", - "||waffle1999.com", - ".wahas.com", - ".waigaobu.com", - "waikeung.org/php_wind", - ".wailaike.net", - ".waiwaier.com", - "|http://waiwaier.com", - "||wallmama.com", - "wallornot.org", - "||wallpapercasa.com", - ".wallproxy.com", - "@@||wallproxy.com.cn", - "||waltermartin.com", - "||waltermartin.org", - "||www.wan-press.org", - "||wanderinghorse.net", - "||wangafu.net", - "||wangjinbo.org", - ".wangjinbo.org", - "wanglixiong.com", - ".wango.org", - "||wango.org", - "wangruoshui.net", - "www.wangruowang.org", - "want-daily.com", - "wapedia.mobi/zhsimp", - "||waselpro.com", - ".watchinese.com", - ".wattpad.com", - "||wattpad.com", - ".makzhou.warehouse333.com", - "washeng.net", - ".watch8x.com", - "||watchmygf.net", - "||wav.tv", - ".wdf5.com", - ".wearehairy.com", - ".wearn.com", - "||wearn.com", - "|http://hkcoc.weather.com.hk", - "||hudatoriq.web.id", - "||web2project.net", - "webbang.net", - ".webevader.org", - ".webfreer.com", - "weblagu.com", - ".webjb.org", - ".webrush.net", - "webs-tv.net", - ".websitepulse.com/help/testtools.china-test", - "|http://www.websnapr.com", - ".webwarper.net", - "|http://webwarper.net", - "webworkerdaily.com", - ".weekmag.info", - "||wefightcensorship.org", - ".wefong.com", - "weiboleak.com", - ".weihuo.org", - "weijingsheng.org", - ".weiming.info", - "||weiming.info", - "weiquanwang.org", - "|http://weisuo.ws", - ".welovecock.com", - ".wemigrate.org", - "|http://wemigrate.org", - "wengewang.com", - "||wengewang.org", - ".wenhui.ch", - "|http://trans.wenweipo.com/gb/", - ".wenxuecity.com", - "||wenxuecity.com", - ".wenyunchao.com", - "||wenyunchao.com", - ".westca.com", - "||westca.com", - "||westernwolves.com", - ".westkit.net", - "||westpoint.edu", - ".westernshugdensociety.org", - "wetpussygames.com", - ".wetplace.com", - "wexiaobo.org", - "||wexiaobo.org", - "wezhiyong.org", - "||wezone.net", - ".wforum.com", - "||wforum.com/", - ".whatblocked.com", - "||whatblocked.com", - ".wheatseeds.org", - "||wheelockslatin.com", - ".whippedass.com", - ".whoer.net", - "||whoer.net", - "whotalking.com", - "whylover.com", - "||whyx.org", - "|http://zh.ecdm.wikia.com", - "|http://evchk.wikia.com", - "fq.wikia.com", - "zh.pttpedia.wikia.com/wiki/%E7%BF%92%E5%8C%85%E5%AD%90%E4%B9%8B%E4%BA%82", - "cn.uncyclopedia.wikia.com", - "zh.uncyclopedia.wikia.com", - "||wikileaks.ch", - "||wikileaks.com", - "||wikileaks.de", - "||wikileaks.eu", - "||wikileaks.lu", - ".wikileaks.org", - "||wikileaks.org", - "||wikileaks.pl", - ".wikileaks-forum.com", - "wildammo.com", - ".williamhill.com", - "||collateralmurder.com", - "||collateralmurder.org", - "wikilivres.info/wiki/%E9%9B%B6%E5%85%AB%E5%AE%AA%E7%AB%A0", - "||wikimapia.org", - "|http://zh.wikisource.org", - "||zh.wikinews.org", - "||ja.wikipedia.org", - "||wikipedia.org", - "||wikiwiki.jp", - "||casino.williamhill.com", - "||sports.williamhill.com", - "||vegas.williamhill.com", - "||willw.net", - "||windowsphoneme.com", - ".windscribe.com", - "||windscribe.com", - "||community.windy.com", - "||wingy.site", - ".winning11.com", - "winwhispers.info", - "||wiredbytes.com", - "||wiredpen.com", - ".wisdompubs.org", - ".wisevid.com", - "||wisevid.com", - ".witnessleeteaching.com", - ".witopia.net", - ".wjbk.org", - "||wjbk.org", - "|http://wn.com", - ".wnacg.com", - ".wnacg.org", - ".wo.tc", - "||woeser.com", - "|http://woesermiddle-way.net/", - ".wokar.org", - "|http://wokar.org", - "wolfax.com", - "||wolfax.com", - "||woolyss.com", - "woopie.jp", - "||woopie.jp", - "woopie.tv", - "||woopie.tv", - "||workatruna.com", - ".workerdemo.org.hk", - ".workerempowerment.org", - "||workersthebig.net", - ".worldcat.org", - "worldjournal.com", - ".worldvpn.net", - "||worldvpn.net", - "||videopress.com", - ".wordpress.com", - "|http://*.wordpress.com", - "||chenshan20042005.wordpress.com", - "||chinaview.wordpress.com", - "||cnbbnews.wordpress.com", - "||freedominfonetweb.wordpress.com", - "||hka8964.wordpress.com", - "||hkanews.wordpress.com", - "||hqsbnet.wordpress.com", - "||hqsbonline.wordpress.com", - "||investigating.wordpress.com", - "||jobnewera.wordpress.com", - "||minghuiyw.wordpress.com", - "||wo3ttt.wordpress.com", - "||sujiatun.wordpress.com", - "||xijie.wordpress.com", - "||wp.com", - ".wow.com", - ".wow-life.net", - "||wowlegacy.ml", - "||wowporn.com", - "||wowgirls.com", - ".wowrk.com", - "woxinghuiguo.com", - ".woyaolian.org", - "|http://woyaolian.org", - ".wpoforum.com", - "||wpoforum.com", - ".wqyd.org", - "||wqyd.org", - "wrchina.org", - "wretch.cc", - ".wsj.com", - "||wsj.com", - ".wsj.net", - "||wsj.net", - ".wsjhk.com", - ".wtbn.org", - ".wtfpeople.com", - "wuerkaixi.com", - "||wufafangwen.com", - "wufi.org.tw", - "||wuguoguang.com", - "wujie.net", - "wujieliulan.com", - "||wujieliulan.com", - "wukangrui.net", - "||wuw.red", - "||wuyanblog.com", - ".wwitv.com", - "||wwitv.com", - "wzyboy.im/post/160", - ".x-berry.com", - "||x-berry.com", - "||x-art.com", - "||x-wall.org", - "x1949x.com", - "x365x.com", - "xanga.com", - "||xbabe.com", - ".xbookcn.com", - "||xbookcn.com", - "||xcafe.in", - "||xcity.jp", - ".xcritic.com", - "|http://cdn*.xda-developers.com", - ".xerotica.com", - "destiny.xfiles.to/ubbthreads", - ".xfm.pp.ru", - ".xgmyd.com", - "||xgmyd.com", - "xhamster.com", - "||xhamster.com", - ".xianba.net", - ".xianchawang.net", - ".xianjian.tw", - "|http://xianjian.tw", - ".xianqiao.net", - ".xiaobaiwu.com", - ".xiaochuncnjp.com", - ".xiaod.in", - ".xiaohexie.com", - "||xiaolan.me", - "||xiaoma.org", - "||xiaohexie.com", - "xiezhua.com", - ".xihua.es", - "forum.xinbao.de/forum", - ".xing.com", - "|http://xing.com", - ".xinmiao.com.hk", - "||xinmiao.com.hk", - "xinsheng.net", - "xinshijue.com", - "xinhuanet.org", - "|http://xinyubbs.net", - ".xiongpian.com", - ".xiuren.org", - "xizang-zhiye.org", - "xjp.cc", - "||xjp.cc", - "||xjtravelguide.com", - "xlfmtalk.com", - "||xlfmwz.info", - "||xml-training-guide.com", - "xmovies.com", - "||xnxx.com", - "xpdo.net", - "||xpud.org", - ".xrentdvd.com", - ".xskywalker.net", - "||xtube.com", - "blog.xuite.net", - "vlog.xuite.net", - "xuzhiyong.net", - "||xuchao.org", - "xuchao.net", - "||xuchao.net", - "xvideo.cc", - ".xvideos.com", - "||xvideos.com", - "||xvideos.es", - ".xkiwi.tk/", - ".xxbbx.com", - ".xxlmovies.com", - "||xxx.com", - ".xxx.xxx", - "|http://xxx.xxx", - ".xxxfuckmom.com", - "||xxxx.com.au", - ".xxxymovies.com", - "|http://xxxymovies.com", - "xys.org", - "xysblogs.org", - "xyy69.com", - "xyy69.info", - "||yakbutterblues.com", - "||yam.com", - "||yam.org.tw", - ".yanghengjun.com", - "yangjianli.com", - ".yasni.co.uk", - "||yasni.co.uk", - ".yayabay.com/forum", - ".ydy.com", - ".yeahteentube.com", - "||yeahteentube.com", - "||yecl.net", - "||yeelou.com", - "yeeyi.com", - "yegle.net", - "||yegle.net", - ".yes.xxx", - "||yes123.com.tw", - "||yesasia.com", - "||yesasia.com.hk", - ".yes-news.com", - "|http://yes-news.com", - ".yespornplease.com", - "||yespornplease.com", - "|http://yeyeclub.com", - "||yhcw.net", - ".yibada.com", - ".yibaochina.com", - ".yidio.com", - "||yidio.com", - "yilubbs.com", - "xa.yimg.com", - ".yingsuoss.com", - ".yipub.com", - "||yipub.com", - "yinlei.org/mt", - ".yizhihongxing.com", - ".yobt.com", - ".yobt.tv", - "||yobt.tv", - ".yogichen.org", - "||yogichen.org", - ".yolasite.com", - ".yomiuri.co.jp", - "yong.hu", - ".yorkbbs.ca", - "||youxu.info", - ".youjizz.com", - "||youjizz.com", - ".youmaker.com", - "||youmaker.com", - ".youngpornvideos.com", - "youngspiration.hk", - ".youpai.org", - "||youpai.org", - ".your-freedom.net", - "||yourepeat.com", - ".yourprivatevpn.com", - "||yourprivatevpn.com", - ".yousendit.com", - "||yousendit.com", - ".youthnetradio.org/tmit/forum", - "blog.youthwant.com.tw", - "me.youthwant.com.tw", - "share.youthwant.com.tw", - "topic.youthwant.com.tw", - ".youporn.com", - "||youporn.com", - ".youporngay.com", - "||youporngay.com", - ".yourlisten.com", - "|http://yourlisten.com", - ".yourlust.com", - "|http://yourlust.com", - "youshun12.com", - ".youtubecn.com", - "youversion.com", - "||youversion.com", - "blog.youxu.info/2010/03/14/west-chamber", - "ytht.net", - "yuanming.net", - ".yuanzhengtang.org", - ".yulghun.com", - "||yunchao.net", - "||yuntipub.com", - ".yuvutu.com", - "||yvesgeleyn.com", - ".ywpw.com/forums/history/post/A0/p0/html/227", - "yx51.net", - ".yyii.org", - "||yyii.org", - ".yzzk.com", - "|http://yzzk.com", - "zacebook.com", - ".zalmos.com", - "||zalmos.com", - "||zannel.com", - ".zaobao.com", - "||zaobao.com", - "|http://zaobao.com.sg", - "||zaobao.com.sg", - ".zaozon.com", - "||zdnet.com.tw", - ".zello.com", - "||zello.com", - ".zengjinyan.org", - ".zenmate.com", - "||zenmate.com", - "||zenmate.com.ru", - "||zeronet.io", - "||zeutch.com", - ".zfreet.com", - ".zgsddh.com", - "zgzcjj.net", - ".zhanbin.net", - "||zhanbin.net", - ".zhangboli.net", - "||zhangtianliang.com", - "||zhanlve.org", - "zhenghui.org", - ".zhengjian.org", - "||zhengjian.org", - "zhengwunet.org", - "zhenlibu.info", - "||zhenlibu.info", - ".zhenlibu1984.com", - "||zhenlibu1984.com", - "|http://zhenxiang.biz", - ".zhinengluyou.com", - "zhongguo.ca", - "|http://zhongguorenquan.org", - "zhongguotese.net", - "||zhongguotese.net", - "||zhongmeng.org", - ".zhoushuguang.com", - "||zhreader.com", - ".zhuangbi.me", - "||zhuangbi.me", - ".zhuanxing.cn", - "||zhuatieba.com", - "zhuichaguoji.org", - "||zhuichaguoji.org", - "|http://book.zi5.me", - ".ziddu.com/download", - "||zillionk.com", - ".zinio.com", - "||zinio.com", - ".ziporn.com", - ".zippyshare.com", - ".zkaip.com", - "||zkaip.com", - "realforum.zkiz.com", - "||zmw.cn", - ".zodgame.us", - "zomobo.net", - ".zonaeuropa.com", - "||zonaeuropa.com", - "||zonghexinwen.com", - ".zonghexinwen.net", - "||zoogvpn.com", - "||zootool.com", - ".zoozle.net", - "writer.zoho.com", - "||zorrovpn.com", - "||zpn.im", - "||zspeeder.me", - ".zsrhao.com", - ".zuo.la", - "||zuo.la", - "||zuobiao.me", - ".zuola.com", - "||zuola.com", - "||zvereff.com", - ".zynaima.com", - "zyzc9.com", - ".zzcartoon.com", - "64memo", - "aHR0cHM6Ly95ZWNsLm5ldA", - "freenet", - ".google.*/falun", - "phobos.apple.com*/video", - "q=freedom", - "q%3Dfreedom", - "remembering_tiananmen_20_years", - "search*safeweb", - "q=triangle", - "q%3DTriangle", - "ultrareach", - "ultrasurf", - "@@||aliyun.com", - "@@||baidu.com", - "@@||chinaso.com", - "@@||chinaz.com", - "@@|http://nrch.culture.tw/", - "@@||adservice.google.com", - "@@||dl.google.com", - "@@||kh.google.com", - "@@||khm.google.com", - "@@||khm0.google.com", - "@@||khm1.google.com", - "@@||khm2.google.com", - "@@||khm3.google.com", - "@@||khmdb.google.com", - "@@||tools.google.com", - "@@||clientservices.googleapis.com", - "@@||fonts.googleapis.com", - "@@||khm.googleapis.com", - "@@||khm0.googleapis.com", - "@@||khm1.googleapis.com", - "@@||khm2.googleapis.com", - "@@||khm3.googleapis.com", - "@@||khmdb.googleapis.com", - "@@||storage.googleapis.com", - "@@||translate.googleapis.com", - "@@||update.googleapis.com", - "@@||safebrowsing.googleapis.com", - "@@||cn.gravatar.com", - "@@||connectivitycheck.gstatic.com", - "@@||csi.gstatic.com", - "@@||fonts.gstatic.com", - "@@||ssl.gstatic.com", - "@@||haosou.com", - "@@||ip.cn", - "@@||jike.com", - "@@|http://translate.google.cn", - "@@|http://www.google.cn/maps", - "@@||http2.golang.org", - "@@||gov.cn", - "@@||qq.com", - "@@||sina.cn", - "@@||sina.com.cn", - "@@||sogou.com", - "@@||so.com", - "@@||soso.com", - "@@||uluai.com.cn", - "@@||weibo.com", - "@@||yahoo.cn", - "@@||youdao.com", - "@@||zhongsou.com", - "@@|http://ime.baidu.jp" -]; - -/* -* This file is part of Adblock Plus , -* Copyright (C) 2006-2014 Eyeo GmbH -* -* Adblock Plus is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 3 as -* published by the Free Software Foundation. -* -* Adblock Plus is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Adblock Plus. If not, see . -*/ - -function createDict() -{ - var result = {}; - result.__proto__ = null; - return result; -} - -function getOwnPropertyDescriptor(obj, key) -{ - if (obj.hasOwnProperty(key)) - { - return obj[key]; - } - return null; -} - -function extend(subclass, superclass, definition) -{ - if (Object.__proto__) - { - definition.__proto__ = superclass.prototype; - subclass.prototype = definition; - } - else - { - var tmpclass = function(){}, ret; - tmpclass.prototype = superclass.prototype; - subclass.prototype = new tmpclass(); - subclass.prototype.constructor = superclass; - for (var i in definition) - { - if (definition.hasOwnProperty(i)) - { - subclass.prototype[i] = definition[i]; - } - } - } -} - -function Filter(text) -{ - this.text = text; - this.subscriptions = []; -} -Filter.prototype = { - text: null, - subscriptions: null, - toString: function() - { - return this.text; - } -}; -Filter.knownFilters = createDict(); -Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; -Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; -Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; -Filter.fromText = function(text) -{ - if (text in Filter.knownFilters) - { - return Filter.knownFilters[text]; - } - var ret; - if (text.charAt(0) == "!") - { - ret = new CommentFilter(text); - } - else - { - ret = RegExpFilter.fromText(text); - } - Filter.knownFilters[ret.text] = ret; - return ret; -}; - -function InvalidFilter(text, reason) -{ - Filter.call(this, text); - this.reason = reason; -} -extend(InvalidFilter, Filter, { - reason: null -}); - -function CommentFilter(text) -{ - Filter.call(this, text); -} -extend(CommentFilter, Filter, { -}); - -function ActiveFilter(text, domains) -{ - Filter.call(this, text); - this.domainSource = domains; -} -extend(ActiveFilter, Filter, { - domainSource: null, - domainSeparator: null, - ignoreTrailingDot: true, - domainSourceIsUpperCase: false, - getDomains: function() - { - var prop = getOwnPropertyDescriptor(this, "domains"); - if (prop) - { - return prop; - } - var domains = null; - if (this.domainSource) - { - var source = this.domainSource; - if (!this.domainSourceIsUpperCase) - { - source = source.toUpperCase(); - } - var list = source.split(this.domainSeparator); - if (list.length == 1 && (list[0]).charAt(0) != "~") - { - domains = createDict(); - domains[""] = false; - if (this.ignoreTrailingDot) - { - list[0] = list[0].replace(/\.+$/, ""); - } - domains[list[0]] = true; - } - else - { - var hasIncludes = false; - for (var i = 0; i < list.length; i++) - { - var domain = list[i]; - if (this.ignoreTrailingDot) - { - domain = domain.replace(/\.+$/, ""); - } - if (domain == "") - { - continue; - } - var include; - if (domain.charAt(0) == "~") - { - include = false; - domain = domain.substr(1); - } - else - { - include = true; - hasIncludes = true; - } - if (!domains) - { - domains = createDict(); - } - domains[domain] = include; - } - domains[""] = !hasIncludes; - } - this.domainSource = null; - } - return this.domains; - }, - sitekeys: null, - isActiveOnDomain: function(docDomain, sitekey) - { - if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0)) - { - return false; - } - if (!this.getDomains()) - { - return true; - } - if (!docDomain) - { - return this.getDomains()[""]; - } - if (this.ignoreTrailingDot) - { - docDomain = docDomain.replace(/\.+$/, ""); - } - docDomain = docDomain.toUpperCase(); - while (true) - { - if (docDomain in this.getDomains()) - { - return this.domains[docDomain]; - } - var nextDot = docDomain.indexOf("."); - if (nextDot < 0) - { - break; - } - docDomain = docDomain.substr(nextDot + 1); - } - return this.domains[""]; - }, - isActiveOnlyOnDomain: function(docDomain) - { - if (!docDomain || !this.getDomains() || this.getDomains()[""]) - { - return false; - } - if (this.ignoreTrailingDot) - { - docDomain = docDomain.replace(/\.+$/, ""); - } - docDomain = docDomain.toUpperCase(); - for (var domain in this.getDomains()) - { - if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) - { - return false; - } - } - return true; - } -}); - -function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) -{ - ActiveFilter.call(this, text, domains, sitekeys); - if (contentType != null) - { - this.contentType = contentType; - } - if (matchCase) - { - this.matchCase = matchCase; - } - if (thirdParty != null) - { - this.thirdParty = thirdParty; - } - if (sitekeys != null) - { - this.sitekeySource = sitekeys; - } - if (regexpSource.length >= 2 && regexpSource.charAt(0) == "/" && regexpSource.charAt(regexpSource.length - 1) == "/") - { - var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); - this.regexp = regexp; - } - else - { - this.regexpSource = regexpSource; - } -} -extend(RegExpFilter, ActiveFilter, { - domainSourceIsUpperCase: true, - length: 1, - domainSeparator: "|", - regexpSource: null, - getRegexp: function() - { - var prop = getOwnPropertyDescriptor(this, "regexp"); - if (prop) - { - return prop; - } - var source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, ""); - var regexp = new RegExp(source, this.matchCase ? "" : "i"); - this.regexp = regexp; - return regexp; - }, - contentType: 2147483647, - matchCase: false, - thirdParty: null, - sitekeySource: null, - getSitekeys: function() - { - var prop = getOwnPropertyDescriptor(this, "sitekeys"); - if (prop) - { - return prop; - } - var sitekeys = null; - if (this.sitekeySource) - { - sitekeys = this.sitekeySource.split("|"); - this.sitekeySource = null; - } - this.sitekeys = sitekeys; - return this.sitekeys; - }, - matches: function(location, contentType, docDomain, thirdParty, sitekey) - { - if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey)) - { - return true; - } - return false; - } -}); -RegExpFilter.prototype["0"] = "#this"; -RegExpFilter.fromText = function(text) -{ - var blocking = true; - var origText = text; - if (text.indexOf("@@") == 0) - { - blocking = false; - text = text.substr(2); - } - var contentType = null; - var matchCase = null; - var domains = null; - var sitekeys = null; - var thirdParty = null; - var collapse = null; - var options; - var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; - if (match) - { - options = match[1].toUpperCase().split(","); - text = match.input.substr(0, match.index); - for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) - { - var option = options[_loopIndex6]; - var value = null; - var separatorIndex = option.indexOf("="); - if (separatorIndex >= 0) - { - value = option.substr(separatorIndex + 1); - option = option.substr(0, separatorIndex); - } - option = option.replace(/-/, "_"); - if (option in RegExpFilter.typeMap) - { - if (contentType == null) - { - contentType = 0; - } - contentType |= RegExpFilter.typeMap[option]; - } - else if (option.charAt(0) == "~" && option.substr(1) in RegExpFilter.typeMap) - { - if (contentType == null) - { - contentType = RegExpFilter.prototype.contentType; - } - contentType &= ~RegExpFilter.typeMap[option.substr(1)]; - } - else if (option == "MATCH_CASE") - { - matchCase = true; - } - else if (option == "~MATCH_CASE") - { - matchCase = false; - } - else if (option == "DOMAIN" && typeof value != "undefined") - { - domains = value; - } - else if (option == "THIRD_PARTY") - { - thirdParty = true; - } - else if (option == "~THIRD_PARTY") - { - thirdParty = false; - } - else if (option == "COLLAPSE") - { - collapse = true; - } - else if (option == "~COLLAPSE") - { - collapse = false; - } - else if (option == "SITEKEY" && typeof value != "undefined") - { - sitekeys = value; - } - else - { - return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); - } - } - } - if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) - { - if (contentType == null) - { - contentType = RegExpFilter.prototype.contentType; - } - contentType &= ~RegExpFilter.typeMap.DOCUMENT; - } - try - { - if (blocking) - { - return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); - } - else - { - return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); - } - } - catch (e) - { - return new InvalidFilter(origText, e); - } -}; -RegExpFilter.typeMap = { - OTHER: 1, - SCRIPT: 2, - IMAGE: 4, - STYLESHEET: 8, - OBJECT: 16, - SUBDOCUMENT: 32, - DOCUMENT: 64, - XBL: 1, - PING: 1, - XMLHTTPREQUEST: 2048, - OBJECT_SUBREQUEST: 4096, - DTD: 1, - MEDIA: 16384, - FONT: 32768, - BACKGROUND: 4, - POPUP: 268435456, - ELEMHIDE: 1073741824 -}; -RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); - -function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) -{ - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); - this.collapse = collapse; -} -extend(BlockingFilter, RegExpFilter, { - collapse: null -}); - -function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) -{ - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); -} -extend(WhitelistFilter, RegExpFilter, { -}); - -function Matcher() -{ - this.clear(); -} -Matcher.prototype = { - filterByKeyword: null, - keywordByFilter: null, - clear: function() - { - this.filterByKeyword = createDict(); - this.keywordByFilter = createDict(); - }, - add: function(filter) - { - if (filter.text in this.keywordByFilter) - { - return; - } - var keyword = this.findKeyword(filter); - var oldEntry = this.filterByKeyword[keyword]; - if (typeof oldEntry == "undefined") - { - this.filterByKeyword[keyword] = filter; - } - else if (oldEntry.length == 1) - { - this.filterByKeyword[keyword] = [oldEntry, filter]; - } - else - { - oldEntry.push(filter); - } - this.keywordByFilter[filter.text] = keyword; - }, - remove: function(filter) - { - if (!(filter.text in this.keywordByFilter)) - { - return; - } - var keyword = this.keywordByFilter[filter.text]; - var list = this.filterByKeyword[keyword]; - if (list.length <= 1) - { - delete this.filterByKeyword[keyword]; - } - else - { - var index = list.indexOf(filter); - if (index >= 0) - { - list.splice(index, 1); - if (list.length == 1) - { - this.filterByKeyword[keyword] = list[0]; - } - } - } - delete this.keywordByFilter[filter.text]; - }, - findKeyword: function(filter) - { - var result = ""; - var text = filter.text; - if (Filter.regexpRegExp.test(text)) - { - return result; - } - var match = Filter.optionsRegExp.exec(text); - if (match) - { - text = match.input.substr(0, match.index); - } - if (text.substr(0, 2) == "@@") - { - text = text.substr(2); - } - var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); - if (!candidates) - { - return result; - } - var hash = this.filterByKeyword; - var resultCount = 16777215; - var resultLength = 0; - for (var i = 0, l = candidates.length; i < l; i++) - { - var candidate = candidates[i].substr(1); - var count = candidate in hash ? hash[candidate].length : 0; - if (count < resultCount || count == resultCount && candidate.length > resultLength) - { - result = candidate; - resultCount = count; - resultLength = candidate.length; - } - } - return result; - }, - hasFilter: function(filter) - { - return filter.text in this.keywordByFilter; - }, - getKeywordForFilter: function(filter) - { - if (filter.text in this.keywordByFilter) - { - return this.keywordByFilter[filter.text]; - } - else - { - return null; - } - }, - _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey) - { - var list = this.filterByKeyword[keyword]; - for (var i = 0; i < list.length; i++) - { - var filter = list[i]; - if (filter == "#this") - { - filter = list; - } - if (filter.matches(location, contentType, docDomain, thirdParty, sitekey)) - { - return filter; - } - } - return null; - }, - matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) - { - var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); - if (candidates === null) - { - candidates = []; - } - candidates.push(""); - for (var i = 0, l = candidates.length; i < l; i++) - { - var substr = candidates[i]; - if (substr in this.filterByKeyword) - { - var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); - if (result) - { - return result; - } - } - } - return null; - } -}; - -function CombinedMatcher() -{ - this.blacklist = new Matcher(); - this.whitelist = new Matcher(); - this.resultCache = createDict(); -} -CombinedMatcher.maxCacheEntries = 1000; -CombinedMatcher.prototype = { - blacklist: null, - whitelist: null, - resultCache: null, - cacheEntries: 0, - clear: function() - { - this.blacklist.clear(); - this.whitelist.clear(); - this.resultCache = createDict(); - this.cacheEntries = 0; - }, - add: function(filter) - { - if (filter instanceof WhitelistFilter) - { - this.whitelist.add(filter); - } - else - { - this.blacklist.add(filter); - } - if (this.cacheEntries > 0) - { - this.resultCache = createDict(); - this.cacheEntries = 0; - } - }, - remove: function(filter) - { - if (filter instanceof WhitelistFilter) - { - this.whitelist.remove(filter); - } - else - { - this.blacklist.remove(filter); - } - if (this.cacheEntries > 0) - { - this.resultCache = createDict(); - this.cacheEntries = 0; - } - }, - findKeyword: function(filter) - { - if (filter instanceof WhitelistFilter) - { - return this.whitelist.findKeyword(filter); - } - else - { - return this.blacklist.findKeyword(filter); - } - }, - hasFilter: function(filter) - { - if (filter instanceof WhitelistFilter) - { - return this.whitelist.hasFilter(filter); - } - else - { - return this.blacklist.hasFilter(filter); - } - }, - getKeywordForFilter: function(filter) - { - if (filter instanceof WhitelistFilter) - { - return this.whitelist.getKeywordForFilter(filter); - } - else - { - return this.blacklist.getKeywordForFilter(filter); - } - }, - isSlowFilter: function(filter) - { - var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; - if (matcher.hasFilter(filter)) - { - return !matcher.getKeywordForFilter(filter); - } - else - { - return !matcher.findKeyword(filter); - } - }, - matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey) - { - var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); - if (candidates === null) - { - candidates = []; - } - candidates.push(""); - var blacklistHit = null; - for (var i = 0, l = candidates.length; i < l; i++) - { - var substr = candidates[i]; - if (substr in this.whitelist.filterByKeyword) - { - var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); - if (result) - { - return result; - } - } - if (substr in this.blacklist.filterByKeyword && blacklistHit === null) - { - blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); - } - } - return blacklistHit; - }, - matchesAny: function(location, docDomain) - { - var key = location + " " + docDomain + " "; - if (key in this.resultCache) - { - return this.resultCache[key]; - } - var result = this.matchesAnyInternal(location, 0, docDomain, null, null); - if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) - { - this.resultCache = createDict(); - this.cacheEntries = 0; - } - this.resultCache[key] = result; - this.cacheEntries++; - return result; - } -}; -var defaultMatcher = new CombinedMatcher(); - -var direct = 'DIRECT;'; - -for (var i = 0; i < rules.length; i++) { - defaultMatcher.add(Filter.fromText(rules[i])); -} - -function FindProxyForURL(url, host) { - if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { - return proxy; - } - return direct; -} diff --git a/v2rayN/v2rayN/Resources/privoxy_conf.txt b/v2rayN/v2rayN/Resources/privoxy_conf.txt deleted file mode 100644 index 6a265b25..00000000 --- a/v2rayN/v2rayN/Resources/privoxy_conf.txt +++ /dev/null @@ -1,8 +0,0 @@ -listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ -toggle 0 -logfile v2ray_privoxy.log -show-on-task-bar 0 -activity-animation 0 -forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . -max-client-connections 2048 -hide-console diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index b5b956d6..91bf3499 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", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ResUI { @@ -627,6 +627,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Operation success 的本地化字符串。 + /// + internal static string OperationSuccess { + get { + return ResourceManager.GetString("OperationSuccess", resourceCulture); + } + } + /// /// 查找类似 Please Fill Remarks 的本地化字符串。 /// @@ -654,6 +663,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please select rules 的本地化字符串。 + /// + internal static string PleaseSelectRules { + get { + return ResourceManager.GetString("PleaseSelectRules", resourceCulture); + } + } + /// /// 查找类似 Please select the server first 的本地化字符串。 /// @@ -681,6 +699,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 + /// + internal static string RemoveRules { + get { + return ResourceManager.GetString("RemoveRules", resourceCulture); + } + } + /// /// 查找类似 Are you sure to remove the server? 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 50d37abe..d934df5b 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -361,4 +361,13 @@ The ping of current service: {0} + + Operation success + + + Please select rules + + + Are you sure to remove the rules? + \ 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 4b312497..3346ab6a 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -361,4 +361,13 @@ 当前服务的真连接延迟: {0} + + 操作成功 + + + 请先选择规则 + + + 是否确定移除规则? + \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_rules b/v2rayN/v2rayN/Sample/custom_routing_rules new file mode 100644 index 00000000..94b28108 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_rules @@ -0,0 +1,28 @@ +[{ + "remarks": "block", + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "remarks": "direct", + "outboundTag": "direct", + "domain": [ + "geosite:cn" + ] + }, + { + "remarks": "direct", + "outboundTag": "direct", + "ip": [ + "geoip:private", + "geoip:cn" + ] + }, + { + "remarks": "proxy", + "port": "0-65535", + "outboundTag": "proxy" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Tool/CDateTime.cs b/v2rayN/v2rayN/Tool/CDateTime.cs deleted file mode 100644 index fb7a2e25..00000000 --- a/v2rayN/v2rayN/Tool/CDateTime.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System; -using System.Net; -using System.Runtime.InteropServices; -using System.Text; - -namespace v2rayN -{ - class CDateTime - { - /// - /// 设置本地系统时间 - /// - public static void SetLocalTime() - { - using (WebClient wc = new WebClient()) - { - string url = ""; - string result = string.Empty; - - try - { - wc.Encoding = Encoding.UTF8; - wc.DownloadStringCompleted += wc_DownloadStringCompleted; - wc.DownloadStringAsync(new Uri(url)); - } - catch - { - } - } - } - - static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) - { - try - { - string result = e.Result; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - EWebTime webTime = Utils.FromJson(result); - if (webTime != null - && webTime.result != null - && webTime.result.stime != null - && !Utils.IsNullOrEmpty(webTime.result.stime)) - { - DateTime dtWeb = GetTimeFromLinux(webTime.result.stime); - - SYSTEMTIME st = new SYSTEMTIME(); - st.FromDateTime(dtWeb); - - //调用Win32 API设置系统时间 - Win32API.SetLocalTime(ref st); - } - } - catch - { - } - } - - /// - /// 时间戳转为C#格式时间 - /// - /// - /// - private static DateTime GetTimeFromLinux(string timeStamp) - { - DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); - long lTime = long.Parse(timeStamp + "0000000"); - TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); - } - } - - /// - /// - /// - public struct SYSTEMTIME - { - public ushort wYear; - public ushort wMonth; - public ushort wDayOfWeek; - public ushort wDay; - public ushort wHour; - public ushort wMinute; - public ushort wSecond; - public ushort wMilliseconds; - - /// - /// 从System.DateTime转换。 - /// - /// System.DateTime类型的时间。 - public void FromDateTime(DateTime time) - { - wYear = (ushort)time.Year; - wMonth = (ushort)time.Month; - wDayOfWeek = (ushort)time.DayOfWeek; - wDay = (ushort)time.Day; - wHour = (ushort)time.Hour; - wMinute = (ushort)time.Minute; - wSecond = (ushort)time.Second; - wMilliseconds = (ushort)time.Millisecond; - } - - /// - /// 转换为System.DateTime类型。 - /// - /// - public DateTime ToDateTime() - { - return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); - } - - /// - /// 静态方法。转换为System.DateTime类型。 - /// - /// SYSTEMTIME类型的时间。 - /// - public static DateTime ToDateTime(SYSTEMTIME time) - { - return time.ToDateTime(); - } - } - - public class Win32API - { - [DllImport("Kernel32.dll")] - public static extern bool SetLocalTime(ref SYSTEMTIME Time); - [DllImport("Kernel32.dll")] - public static extern void GetLocalTime(ref SYSTEMTIME Time); - } - - public class WTResult - { - /// - /// - /// - public string stime { get; set; } - } - - public class EWebTime - { - /// - /// - /// - public WTResult result { get; set; } - /// - /// - /// - public int error_code { get; set; } - /// - /// - /// - public string reason { get; set; } - } -} - diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 8fa10c63..f6ac4c67 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -24,8 +24,7 @@ using Newtonsoft.Json.Linq; namespace v2rayN { class Utils - { - + { #region 资源Json操作 @@ -802,6 +801,10 @@ namespace v2rayN } } + public static void AddSubItem(ListViewItem i, string name, string text) + { + i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); + } #endregion #region TempPath diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index d79b2067..3211d957 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -125,6 +125,12 @@ BaseServerForm.cs + + Form + + + RoutingSettingDetailsForm.cs + Form @@ -138,12 +144,6 @@ RoutingSettingForm.cs - - UserControl - - - RoutingSettingControl.cs - Form @@ -187,9 +187,9 @@ - + @@ -300,12 +300,11 @@ QRCodeControl.cs Designer - - RoutingSettingControl.cs - Designer + + RoutingSettingDetailsForm.cs - - RoutingSettingControl.cs + + RoutingSettingDetailsForm.cs SubSettingControl.cs @@ -374,6 +373,7 @@ + @@ -442,7 +442,6 @@ - diff --git a/v2rayN/v2rayN/v2rayN.csproj.user b/v2rayN/v2rayN/v2rayN.csproj.user index 778969a8..a36e9eb4 100644 --- a/v2rayN/v2rayN/v2rayN.csproj.user +++ b/v2rayN/v2rayN/v2rayN.csproj.user @@ -9,7 +9,7 @@ zh-CN false - ProjectFiles + ShowAllFiles false From 656451f60454010e67d51feb807a63b314035ba5 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 31 Dec 2020 13:45:00 +0800 Subject: [PATCH 006/252] Update V2rayConfigHandler.cs --- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 3242cbb1..596a95b3 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -220,6 +220,10 @@ namespace v2rayN.Handler var it = Utils.DeepCopy(rules); it.ip = null; it.type = "field"; + if (Utils.IsNullOrEmpty(rules.port)) + { + it.port = null; + } v2rayConfig.routing.rules.Add(it); hasDomainIp = true; } @@ -228,6 +232,10 @@ namespace v2rayN.Handler var it = Utils.DeepCopy(rules); it.domain = null; it.type = "field"; + if (Utils.IsNullOrEmpty(rules.port)) + { + it.port = null; + } v2rayConfig.routing.rules.Add(it); hasDomainIp = true; } From d8ee3c3bbacdcbeb10db1af85ec77c2e4ada5a3b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 31 Dec 2020 20:15:01 +0800 Subject: [PATCH 007/252] up --- .../RoutingSettingDetailsForm.Designer.cs | 39 +- .../v2rayN/Forms/RoutingSettingDetailsForm.cs | 22 + .../Forms/RoutingSettingDetailsForm.resx | 1003 ++++++++++------- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 6 +- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 256 +++-- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 72 +- v2rayN/v2rayN/Mode/RulesItem.cs | 27 +- v2rayN/v2rayN/Resx/Resx.zip | Bin 7367 -> 0 bytes v2rayN/v2rayN/Sample/custom_routing_block | 1 - v2rayN/v2rayN/Sample/custom_routing_direct | 132 --- v2rayN/v2rayN/Sample/custom_routing_private | 3 - v2rayN/v2rayN/Sample/custom_routing_proxy | 33 - v2rayN/v2rayN/v2rayN.csproj | 4 - 13 files changed, 845 insertions(+), 753 deletions(-) delete mode 100644 v2rayN/v2rayN/Resx/Resx.zip delete mode 100644 v2rayN/v2rayN/Sample/custom_routing_block delete mode 100644 v2rayN/v2rayN/Sample/custom_routing_direct delete mode 100644 v2rayN/v2rayN/Sample/custom_routing_private delete mode 100644 v2rayN/v2rayN/Sample/custom_routing_proxy diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs index 4cf4fe18..ee40a2d0 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs @@ -46,6 +46,8 @@ this.txtIP = new System.Windows.Forms.TextBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.txtDomain = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.clbProtocol = new System.Windows.Forms.CheckedListBox(); this.panel3.SuspendLayout(); this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); @@ -60,7 +62,8 @@ // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.clbProtocol); + this.panel3.Controls.Add(this.label3); this.panel3.Controls.Add(this.txtPort); this.panel3.Controls.Add(this.label1); this.panel3.Controls.Add(this.labRoutingTips); @@ -68,6 +71,7 @@ this.panel3.Controls.Add(this.cmbOutboundTag); this.panel3.Controls.Add(this.txtRemarks); this.panel3.Controls.Add(this.label2); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // txtPort @@ -82,8 +86,8 @@ // // labRoutingTips // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.Name = "labRoutingTips"; // // label4 @@ -93,13 +97,13 @@ // // cmbOutboundTag // - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbOutboundTag.FormattingEnabled = true; this.cmbOutboundTag.Items.AddRange(new object[] { resources.GetString("cmbOutboundTag.Items"), resources.GetString("cmbOutboundTag.Items1"), resources.GetString("cmbOutboundTag.Items2")}); + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.Name = "cmbOutboundTag"; // // txtRemarks @@ -114,15 +118,15 @@ // // panel4 // - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.btnClose); this.panel4.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // btnClose // - resources.ApplyResources(this.btnClose, "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); @@ -136,15 +140,15 @@ // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.groupBox2); this.panel2.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtIP); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -155,8 +159,8 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -165,6 +169,23 @@ resources.ApplyResources(this.txtDomain, "txtDomain"); this.txtDomain.Name = "txtDomain"; // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // clbProtocol + // + this.clbProtocol.CheckOnClick = true; + resources.ApplyResources(this.clbProtocol, "clbProtocol"); + this.clbProtocol.FormattingEnabled = true; + this.clbProtocol.Items.AddRange(new object[] { + resources.GetString("clbProtocol.Items"), + resources.GetString("clbProtocol.Items1"), + resources.GetString("clbProtocol.Items2")}); + this.clbProtocol.MultiColumn = true; + this.clbProtocol.Name = "clbProtocol"; + // // RoutingSettingDetailsForm // resources.ApplyResources(this, "$this"); @@ -207,5 +228,7 @@ private System.Windows.Forms.Label labRoutingTips; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckedListBox clbProtocol; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs index 09b5a39e..a0511439 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; @@ -42,6 +43,16 @@ namespace v2rayN.Forms routingItem.outboundTag = cmbOutboundTag.Text; routingItem.domain = Utils.String2List(txtDomain.Text); routingItem.ip = Utils.String2List(txtIP.Text); + + var protocol = new List(); + for (int i = 0; i < clbProtocol.Items.Count; i++) + { + if (clbProtocol.GetItemChecked(i)) + { + protocol.Add(clbProtocol.Items[i].ToString()); + } + } + routingItem.protocol = protocol; } } private void BindingData() @@ -53,6 +64,17 @@ namespace v2rayN.Forms cmbOutboundTag.Text = routingItem.outboundTag; txtDomain.Text = Utils.List2String(routingItem.domain, true); txtIP.Text = Utils.List2String(routingItem.ip, true); + + if (routingItem.protocol != null) + { + for (int i = 0; i < clbProtocol.Items.Count; i++) + { + if (routingItem.protocol.Contains(clbProtocol.Items[i].ToString())) + { + clbProtocol.SetItemChecked(i, true); + } + } + } } } private void ClearBind() diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx index 8153fa31..0481d1dd 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx @@ -117,472 +117,607 @@ System.Resources.ResXResourceWriter, 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 - - - panel2 - - - - 32 - - - 30 - - - 31 - - - proxy - - - Fill - - - panel1 - - - 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - NoControl - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Left - - - NoControl - - - 0 - - - - 29, 12 - - - panel2 - - - RoutingSettingDetailsForm - - - Fill - - - 1 - - - Fill - - - 411, 15 - - - 119, 20 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom - Top - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 344, 417 - - - $this - - - 504, 15 - - - groupBox1 - - - NoControl - - - 6 - - - label1 - - - 742, 437 - + 0, 0 - - 4 - - - panel3 - - - True - - - panel3 - - - 3 - - - panel4 - - - 5 - - - 19, 43 - - - 25 - - - 3, 17 - - - panel3 - - - 274, 20 - - - labRoutingTips - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 491, 20 - - - groupBox1 - - - 1 - - - RoutingSettingDetailsForm - - - 166, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 544, 16 - - - groupBox2 - - - 3 - - - 1 - - - 386, 417 - - - panel3 - - - 392, 0 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - panel4 - - - NoControl - - - Top - - - 598, 16 - - - $this - - - groupBox2 - - - panel3 - - - System.Windows.Forms.Panel, 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 - - - txtPort - - - panel4 - - - 3, 17 - - - 1 - 742, 10 - - 0, 0 - - - 24 - - - label4 - - - &OK - - - 75, 23 - - - btnClose - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 34 - - - 29 - - - block - - - direct - - - 0 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnOK - - - 2 - - - 110, 21 - - - 4 - + 7 - - 0 + + panel1 - - 11 - - - 0 - - - panel3 - - - 8 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 0, 10 - - - Remarks - - - Fill - - - 742, 60 - - - 0, 79 - - - $this - - - 47, 12 - - - &Cancel - - - *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP - - - 742, 69 - - - True - - - 6, 12 - - - Port - - - 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 - - - txtIP - - - 0 - - - label2 - - - cmbOutboundTag - - - True - - - 19, 20 - - - NoControl - - - 742, 576 - - - 10 - - - 392, 437 - - - 75, 23 - - - NoControl - - - True - - - 4 - - - 5 - - - txtDomain - - - 84, 16 - - - IP - - + 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 + + $this - - 0, 516 + + 3 - - 33 + + 80 - - 47, 12 + + http - - 350, 437 + + tls - + + bittorrent + + + 347, 43 + + + 245, 20 + + + 39 + + + clbProtocol + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel3 - - Domain + + 0 - - txtRemarks + + True - - 347, 16 + + NoControl - - Out Tag + + 274, 47 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 53, 12 + + + 36 + + + protocol + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + 84, 43 + + + 166, 21 35 + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + True + + + NoControl + + + 19, 47 + + + 29, 12 + + + 34 + + + Port + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + NoControl + + + 19, 82 + + + 598, 16 + + + 33 + + + *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 + + + 4 + + + True + + + NoControl + + + 274, 20 + + + 47, 12 + + + 32 + + + Out Tag + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + proxy + + + direct + + + block + + + 347, 16 + + + 119, 20 + + + 31 + + + cmbOutboundTag + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 6 + + + 84, 16 + + + 166, 21 + + + 30 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 7 + + + True + + + NoControl + + + 19, 20 + + + 47, 12 + + + 29 + + + Remarks + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 8 + + + Top + + + 0, 10 + + + 742, 111 + + + 8 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Bottom + + + 0, 516 + + + 742, 60 + + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + + + 504, 15 + + + 75, 23 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + NoControl + + + 411, 15 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Fill + + + 0, 121 + + + 742, 395 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 350, 395 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 344, 375 + + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 395 + + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Fill + + + 3, 17 + + + True + + + 386, 375 + + + 24 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + True + + 6, 12 + + + 742, 576 + + + RoutingSettingDetailsForm + + + RoutingSettingDetailsForm + + + 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/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index e63d4ed8..b51d56d6 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -42,8 +42,9 @@ namespace v2rayN.Forms lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 100); lvRoutings.Columns.Add("outboundTag", 80); lvRoutings.Columns.Add("port", 80); - lvRoutings.Columns.Add("domain", 200); - lvRoutings.Columns.Add("ip", 200); + lvRoutings.Columns.Add("protocol", 100); + lvRoutings.Columns.Add("domain", 160); + lvRoutings.Columns.Add("ip", 160); lvRoutings.EndUpdate(); } @@ -61,6 +62,7 @@ namespace v2rayN.Forms Utils.AddSubItem(lvItem, "remarks", item.remarks); Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); Utils.AddSubItem(lvItem, "port", item.port); + Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol)); Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index ae3fa1eb..b773ce33 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -147,21 +147,6 @@ 0 - - NoControl - - - 475, 17 - - - 75, 23 - - - 5 - - - &OK - btnOK @@ -198,6 +183,81 @@ 3 + + NoControl + + + 475, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + Top + + + 0, 25 + + + 765, 51 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + True @@ -261,33 +321,59 @@ 1 - - Top - - - 0, 25 - - - 765, 51 - - - 11 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - 17, 17 + + 203, 186 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 3, 3 + + + 751, 505 + + + 12 + + + lvRoutings + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPage2 + + + 0 + 202, 22 @@ -339,77 +425,12 @@ Move to bottom (B) - - 203, 186 - - - cmsLv - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA - BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 - bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp - bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz - dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA - CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp - bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 - bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 - ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 - ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - - - 3, 3 - - - 751, 505 - - - 12 - - - lvRoutings - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabPage2 - - - 0 - 120, 21 Edit and Function - - 4, 22 - - - 3, 3, 3, 3 - - - 757, 511 - - - 0 - - - RuleList - tabPage2 @@ -446,6 +467,33 @@ 1 + + 4, 22 + + + 3, 3, 3, 3 + + + 757, 511 + + + 0 + + + RuleList + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 0 + 139, 17 diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 596a95b3..473400c3 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -214,16 +214,37 @@ namespace v2rayN.Handler { return 0; } + if (Utils.IsNullOrEmpty(rules.port)) + { + rules.port = null; + } + if (rules.domain != null && rules.domain.Count == 0) + { + rules.domain = null; + } + if (rules.ip != null && rules.ip.Count == 0) + { + rules.ip = null; + } + if (rules.protocol != null && rules.protocol.Count == 0) + { + rules.protocol = null; + } + var hasDomainIp = false; if (rules.domain != null && rules.domain.Count > 0) { var it = Utils.DeepCopy(rules); it.ip = null; it.type = "field"; - if (Utils.IsNullOrEmpty(rules.port)) - { - it.port = null; - } + //if (Utils.IsNullOrEmpty(it.port)) + //{ + // it.port = null; + //} + //if (it.protocol != null && it.protocol.Count == 0) + //{ + // it.protocol = null; + //} v2rayConfig.routing.rules.Add(it); hasDomainIp = true; } @@ -232,20 +253,43 @@ namespace v2rayN.Handler var it = Utils.DeepCopy(rules); it.domain = null; it.type = "field"; - if (Utils.IsNullOrEmpty(rules.port)) - { - it.port = null; - } + //if (Utils.IsNullOrEmpty(it.port)) + //{ + // it.port = null; + //} + //if (it.protocol != null && it.protocol.Count == 0) + //{ + // it.protocol = null; + //} v2rayConfig.routing.rules.Add(it); hasDomainIp = true; } - if (!hasDomainIp && !Utils.IsNullOrEmpty(rules.port)) + if (!hasDomainIp) { - var it = Utils.DeepCopy(rules); - it.domain = null; - it.ip = null; - it.type = "field"; - v2rayConfig.routing.rules.Add(it); + if (!Utils.IsNullOrEmpty(rules.port)) + { + var it = Utils.DeepCopy(rules); + //it.domain = null; + //it.ip = null; + //if (it.protocol != null && it.protocol.Count == 0) + //{ + // it.protocol = null; + //} + it.type = "field"; + v2rayConfig.routing.rules.Add(it); + } + else if (rules.protocol != null && rules.protocol.Count > 0) + { + var it = Utils.DeepCopy(rules); + //it.domain = null; + //it.ip = null; + //if (Utils.IsNullOrEmpty(it.port)) + //{ + // it.port = null; + //} + it.type = "field"; + v2rayConfig.routing.rules.Add(it); + } } } catch diff --git a/v2rayN/v2rayN/Mode/RulesItem.cs b/v2rayN/v2rayN/Mode/RulesItem.cs index a4ae121e..bb3a85e4 100644 --- a/v2rayN/v2rayN/Mode/RulesItem.cs +++ b/v2rayN/v2rayN/Mode/RulesItem.cs @@ -6,31 +6,22 @@ namespace v2rayN.Mode [Serializable] public class RulesItem { - public string remarks { get; set; } - /// - /// - /// + public string remarks { get; set; } + public string type { get; set; } - /// - /// - /// + public string port { get; set; } public List inboundTag { get; set; } - /// - /// - /// + public string outboundTag { get; set; } - - /// - /// - /// + public List ip { get; set; } - - /// - /// - /// + public List domain { get; set; } + + public List protocol { get; set; } + } } diff --git a/v2rayN/v2rayN/Resx/Resx.zip b/v2rayN/v2rayN/Resx/Resx.zip deleted file mode 100644 index 0cb38db96976257ee5c256c7f490c4a730acd46c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7367 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.settings True - - - - From 77c5f6c583f4c77317992bdd507cc7ae488cba44 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Jan 2021 20:30:24 +0800 Subject: [PATCH 008/252] up4.3 --- v2rayN/v2rayN/Forms/AddServer3Form.cs | 2 +- v2rayN/v2rayN/Forms/AddServer4Form.cs | 2 +- v2rayN/v2rayN/Forms/AddServer5Form.cs | 2 +- v2rayN/v2rayN/Forms/AddServerForm.cs | 2 +- v2rayN/v2rayN/Forms/MainForm.cs | 4 +- v2rayN/v2rayN/Forms/QRCodeControl.cs | 2 +- .../RoutingSettingDetailsForm.Designer.cs | 38 +- .../v2rayN/Forms/RoutingSettingDetailsForm.cs | 23 + .../Forms/RoutingSettingDetailsForm.resx | 174 ++--- v2rayN/v2rayN/Handler/ConfigHandler.cs | 103 +-- v2rayN/v2rayN/Handler/ShareHandler.cs | 683 ++++++++++++++++++ v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 391 +--------- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 11 +- v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + v2rayN/v2rayN/v2rayN.csproj | 1 + 17 files changed, 810 insertions(+), 636 deletions(-) create mode 100644 v2rayN/v2rayN/Handler/ShareHandler.cs diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index 8113a784..d1a4a858 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -119,7 +119,7 @@ namespace v2rayN.Forms { ClearServer(); - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { UI.ShowWarning(msg); diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs index 23ec6aaa..29102347 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -108,7 +108,7 @@ namespace v2rayN.Forms { ClearServer(); - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { UI.ShowWarning(msg); diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index d426e5c6..32c7e48c 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -263,7 +263,7 @@ namespace v2rayN.Forms { ClearServer(); - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { UI.ShowWarning(msg); diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index bd80867b..ab54fd9b 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -268,7 +268,7 @@ namespace v2rayN.Forms { ClearServer(); - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { UI.ShowWarning(msg); diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 96e6819e..67b78ee5 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -685,7 +685,7 @@ namespace v2rayN.Forms StringBuilder sb = new StringBuilder(); foreach (int v in lvSelecteds) { - string url = ConfigHandler.GetVmessQRCode(config, v); + string url = ShareHandler.GetShareUrl(config, v); if (Utils.IsNullOrEmpty(url)) { continue; @@ -708,7 +708,7 @@ namespace v2rayN.Forms StringBuilder sb = new StringBuilder(); foreach (int v in lvSelecteds) { - string url = ConfigHandler.GetVmessQRCode(config, v); + string url = ShareHandler.GetShareUrl(config, v); if (Utils.IsNullOrEmpty(url)) { continue; diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs index 02d59b48..855db30d 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.cs +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -24,7 +24,7 @@ namespace v2rayN.Forms { if (Index >= 0) { - string url = ConfigHandler.GetVmessQRCode(config, Index); + string url = ShareHandler.GetShareUrl(config, Index); if (Utils.IsNullOrEmpty(url)) { picQRCode.Image = null; diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs index ee40a2d0..43d2de45 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs @@ -31,6 +31,8 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingDetailsForm)); this.panel1 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); + this.clbProtocol = new System.Windows.Forms.CheckedListBox(); + this.label3 = new System.Windows.Forms.Label(); this.txtPort = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.labRoutingTips = new System.Windows.Forms.Label(); @@ -46,8 +48,6 @@ this.txtIP = new System.Windows.Forms.TextBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.txtDomain = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.clbProtocol = new System.Windows.Forms.CheckedListBox(); this.panel3.SuspendLayout(); this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); @@ -74,6 +74,23 @@ resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // + // clbProtocol + // + this.clbProtocol.CheckOnClick = true; + resources.ApplyResources(this.clbProtocol, "clbProtocol"); + this.clbProtocol.FormattingEnabled = true; + this.clbProtocol.Items.AddRange(new object[] { + resources.GetString("clbProtocol.Items"), + resources.GetString("clbProtocol.Items1"), + resources.GetString("clbProtocol.Items2")}); + this.clbProtocol.MultiColumn = true; + this.clbProtocol.Name = "clbProtocol"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // // txtPort // resources.ApplyResources(this.txtPort, "txtPort"); @@ -169,23 +186,6 @@ resources.ApplyResources(this.txtDomain, "txtDomain"); this.txtDomain.Name = "txtDomain"; // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // clbProtocol - // - this.clbProtocol.CheckOnClick = true; - resources.ApplyResources(this.clbProtocol, "clbProtocol"); - this.clbProtocol.FormattingEnabled = true; - this.clbProtocol.Items.AddRange(new object[] { - resources.GetString("clbProtocol.Items"), - resources.GetString("clbProtocol.Items1"), - resources.GetString("clbProtocol.Items2")}); - this.clbProtocol.MultiColumn = true; - this.clbProtocol.Name = "clbProtocol"; - // // RoutingSettingDetailsForm // resources.ApplyResources(this, "$this"); diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs index a0511439..65fe6a8f 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs @@ -88,6 +88,29 @@ namespace v2rayN.Forms private void btnOK_Click(object sender, EventArgs e) { EndBindingData(); + var hasRule = false; + if (routingItem.domain != null && routingItem.domain.Count > 0) + { + hasRule = true; + } + if (routingItem.ip != null && routingItem.ip.Count > 0) + { + hasRule = true; + } + if (routingItem.protocol != null && routingItem.protocol.Count > 0) + { + hasRule = true; + } + if (!Utils.IsNullOrEmpty(routingItem.port)) + { + hasRule = true; + } + if (!hasRule) + { + UI.ShowWarning(string.Format(UIRes.I18N("RoutingRuleDetailRequiredTips"), "Port/Protocol/Domain/IP")); + return; + } + if (ConfigHandler.AddRoutingRule(ref config, routingItem, EditIndex) == 0) { this.DialogResult = DialogResult.OK; diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx index 0481d1dd..855817b0 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx @@ -193,7 +193,7 @@ 36 - protocol + Protocol label3 @@ -420,54 +420,6 @@ 2 - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 0 - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 1 - - - Bottom - - - 0, 516 - - - 742, 60 - - - 10 - - - panel4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - NoControl @@ -522,53 +474,44 @@ 1 - - groupBox2 + + Bottom - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 516 - - panel2 + + 742, 60 - - 0 + + 10 - - groupBox1 + + panel4 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Fill - - - 0, 121 - - - 742, 395 - - - 11 - - - panel2 - - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 0 + + 1 + + + Fill + + + 3, 17 + + + True + + + 344, 375 + + + 25 txtIP @@ -609,32 +552,20 @@ 0 - + Fill - + 3, 17 - + True - - 344, 375 + + 386, 375 - - 25 - - - txtIP - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 + + 24 txtDomain @@ -675,31 +606,28 @@ 1 - + Fill - - 3, 17 + + 0, 121 - - True + + 742, 395 - - 386, 375 + + 11 - - 24 + + panel2 - - txtDomain + + System.Windows.Forms.Panel, 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 - - groupBox1 - - + 0 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index cfdd2281..abdd02f5 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -339,100 +339,6 @@ namespace v2rayN.Handler Utils.ToJsonFile(config, Utils.GetPath(configRes)); } - /// - /// 取得服务器QRCode配置 - /// - /// - /// - /// - public static string GetVmessQRCode(Config config, int index) - { - try - { - string url = string.Empty; - - VmessItem vmessItem = config.vmess[index]; - if (vmessItem.configType == (int)EConfigType.Vmess) - { - 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); - url = string.Format("{0}{1}", Global.vmessProtocol, url); - - } - else if (vmessItem.configType == (int)EConfigType.Shadowsocks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.remarks)) - { - remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - vmessItem.security, - vmessItem.id, - vmessItem.address, - vmessItem.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); - } - else if (vmessItem.configType == (int)EConfigType.Socks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.remarks)) - { - remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - vmessItem.security, - vmessItem.id, - vmessItem.address, - vmessItem.port); - 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); - } - string query = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.requestHost)) - { - query = string.Format("?sni={0}", vmessItem.requestHost); - } - url = string.Format("{0}@{1}:{2}", - vmessItem.id, - vmessItem.address, - vmessItem.port); - url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); - } - else - { - } - return url; - } - catch - { - return ""; - } - } - /// /// 移动服务器 /// @@ -824,7 +730,7 @@ namespace v2rayN.Handler } continue; } - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(str, out string msg); + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(str, out string msg); if (vmessItem == null) { continue; @@ -858,6 +764,13 @@ namespace v2rayN.Handler countServers++; } } + else if (vmessItem.configType == (int)EConfigType.VLESS) + { + if (AddVlessServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } } return countServers; } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs new file mode 100644 index 00000000..766f16e0 --- /dev/null +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -0,0 +1,683 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Web; +using v2rayN.Base; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + class ShareHandler + { + + #region GetShareUrl + + /// + /// GetShareUrl + /// + /// + /// + /// + public static string GetShareUrl(Config config, int index) + { + try + { + string url = string.Empty; + + VmessItem item = config.vmess[index]; + if (item.configType == (int)EConfigType.Vmess) + { + VmessQRCode vmessQRCode = new VmessQRCode + { + v = item.configVersion.ToString(), + ps = item.remarks.TrimEx(), //备注也许很长 ; + add = item.address, + port = item.port.ToString(), + id = item.id, + aid = item.alterId.ToString(), + net = item.network, + type = item.headerType, + host = item.requestHost, + path = item.path, + tls = item.streamSecurity + }; + + url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + + } + else if (item.configType == (int)EConfigType.Shadowsocks) + { + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + WebUtility.UrlEncode(item.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + item.security, + item.id, + item.address, + item.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); + } + else if (item.configType == (int)EConfigType.Socks) + { + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + WebUtility.UrlEncode(item.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + item.security, + item.id, + item.address, + item.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); + } + else if (item.configType == (int)EConfigType.Trojan) + { + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + WebUtility.UrlEncode(item.remarks); + } + string query = string.Empty; + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + query = string.Format("?sni={0}", item.requestHost); + } + url = string.Format("{0}@{1}:{2}", + item.id, + item.address, + item.port); + url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); + } + else if (item.configType == (int)EConfigType.VLESS) + { + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + WebUtility.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.flow)) + { + dicQuery.Add("flow", item.flow); + } + if (!Utils.IsNullOrEmpty(item.security)) + { + dicQuery.Add("encryption", item.security); + } + else + { + dicQuery.Add("encryption", "none"); + } + if (!Utils.IsNullOrEmpty(item.streamSecurity)) + { + dicQuery.Add("security", item.streamSecurity); + } + else + { + dicQuery.Add("security", "none"); + } + if (!Utils.IsNullOrEmpty(item.network)) + { + dicQuery.Add("type", item.network); + } + else + { + dicQuery.Add("type", "tcp"); + } + + switch (item.network) + { + case "tcp": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", item.requestHost); + } + break; + case "kcp": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("seed", item.path); + } + break; + + case "ws": + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", item.requestHost); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", item.path); + } + break; + + case "http": + case "h2": + dicQuery["type"] = "http"; + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", item.requestHost); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", item.path); + } + break; + + case "quic": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + dicQuery.Add("quicSecurity", item.requestHost); + dicQuery.Add("key", item.path); + break; + } + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + item.address, + item.port); + url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); + } + else + { + } + return url; + } + catch + { + return ""; + } + } + + #endregion + + #region ImportShareUrl + + + /// + /// 从剪贴板导入URL + /// + /// + /// + /// + public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = clipboardData.TrimEx();// Utils.GetClipboardData(); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + if (result.StartsWith(Global.vmessProtocol)) + { + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result); + } + else + { + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode vmessQRCode = Utils.FromJson(result); + if (vmessQRCode == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + + + vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); + vmessItem.remarks = Utils.ToString(vmessQRCode.ps); + vmessItem.address = Utils.ToString(vmessQRCode.add); + vmessItem.port = Utils.ToInt(vmessQRCode.port); + vmessItem.id = Utils.ToString(vmessQRCode.id); + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + + if (!Utils.IsNullOrEmpty(vmessQRCode.net)) + { + vmessItem.network = vmessQRCode.net; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.type)) + { + vmessItem.headerType = vmessQRCode.type; + } + + vmessItem.requestHost = Utils.ToString(vmessQRCode.host); + vmessItem.path = Utils.ToString(vmessQRCode.path); + vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); + } + + ConfigHandler.UpgradeServerVersion(ref vmessItem); + } + else if (result.StartsWith(Global.ssProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem = ResolveSSLegacy(result); + if (vmessItem == null) + { + vmessItem = ResolveSip002(result); + } + if (vmessItem == null) + { + return null; + } + if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0) + { + return null; + } + + vmessItem.configType = (int)EConfigType.Shadowsocks; + } + else if (result.StartsWith(Global.socksProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Socks; + result = result.Substring(Global.socksProtocol.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; + } + 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]; + } + else if (result.StartsWith(Global.trojanProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Trojan; + + Uri uri = new Uri(result); + vmessItem.address = uri.IdnHost; + vmessItem.port = uri.Port; + vmessItem.id = uri.UserInfo; + + var qurery = HttpUtility.ParseQueryString(uri.Query); + vmessItem.requestHost = qurery["sni"] ?? ""; + + var remarks = uri.Fragment.Replace("#", ""); + if (Utils.IsNullOrEmpty(remarks)) + { + vmessItem.remarks = "NONE"; + } + else + { + vmessItem.remarks = WebUtility.UrlDecode(remarks); + } + } + else if (result.StartsWith(Global.vlessProtocol)) + { + vmessItem = ResolveStdVLESS(result); + + ConfigHandler.UpgradeServerVersion(ref vmessItem); + } + else + { + msg = UIRes.I18N("NonvmessOrssProtocol"); + return null; + } + } + catch + { + msg = UIRes.I18N("Incorrectconfiguration"); + return null; + } + + return vmessItem; + } + + + private static VmessItem ResolveVmess4Kitsunebi(string result) + { + VmessItem vmessItem = new VmessItem + { + configType = (int)EConfigType.Vmess + }; + result = result.Substring(Global.vmessProtocol.Length); + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + result = result.Substring(0, indexSplit); + } + result = Utils.Base64Decode(result); + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + string[] arr22 = arr1[1].Split(':'); + if (arr21.Length != 2 || arr21.Length != 2) + { + return null; + } + + vmessItem.address = arr22[0]; + vmessItem.port = Utils.ToInt(arr22[1]); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.remarks = "Alien"; + vmessItem.alterId = 0; + + 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 (!Utils.IsNullOrEmpty(tag)) + { + 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": + case "h2": + 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; + } + + private static VmessItem ResolveStdVLESS(string result) + { + VmessItem item = new VmessItem + { + configType = (int)EConfigType.VLESS, + security = "none" + }; + + Uri url = new Uri(result); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = url.UserInfo; + + var query = HttpUtility.ParseQueryString(url.Query); + + item.flow = query["flow"] ?? ""; + item.security = query["encryption"] ?? "none"; + item.streamSecurity = query["security"] ?? ""; + item.network = query["type"] ?? "tcp"; + switch (item.network) + { + case "tcp": + item.headerType = query["headerType"] ?? "none"; + item.requestHost = query["host"] ?? ""; + + break; + case "kcp": + item.headerType = query["headerType"] ?? "none"; + item.path = query["seed"] ?? ""; + break; + + case "ws": + item.requestHost = query["host"] ?? ""; + item.path = query["path"] ?? "/"; + break; + + case "http": + case "h2": + item.network = "h2"; + item.requestHost = query["host"] ?? ""; + item.path = query["path"] ?? "/"; + break; + + case "quic": + item.headerType = query["headerType"] ?? "none"; + item.requestHost = query["quicSecurity"] ?? "none"; + item.path = query["key"] ?? ""; + break; + + default: + return null; + } + + return item; + } + + #endregion + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 473400c3..6fa3ecb6 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -1,13 +1,7 @@ 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; namespace v2rayN.Handler @@ -467,7 +461,7 @@ namespace v2rayN.Handler } else { - usersItem.flow = config.flow(); + usersItem.flow = config.flow().Replace("splice", "direct"); } outbound.mux.enabled = false; @@ -1283,179 +1277,6 @@ namespace v2rayN.Handler return vmessItem; } - /// - /// 从剪贴板导入URL - /// - /// - /// - /// - public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg) - { - msg = string.Empty; - VmessItem vmessItem = new VmessItem(); - - try - { - //载入配置文件 - string result = clipboardData.TrimEx();// Utils.GetClipboardData(); - if (Utils.IsNullOrEmpty(result)) - { - msg = UIRes.I18N("FailedReadConfiguration"); - return null; - } - - if (result.StartsWith(Global.vmessProtocol)) - { - int indexSplit = result.IndexOf("?"); - if (indexSplit > 0) - { - vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result); - } - else - { - vmessItem.configType = (int)EConfigType.Vmess; - result = result.Substring(Global.vmessProtocol.Length); - result = Utils.Base64Decode(result); - - //转成Json - VmessQRCode vmessQRCode = Utils.FromJson(result); - if (vmessQRCode == null) - { - msg = UIRes.I18N("FailedConversionConfiguration"); - return null; - } - vmessItem.security = Global.DefaultSecurity; - vmessItem.network = Global.DefaultNetwork; - vmessItem.headerType = Global.None; - - - vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); - vmessItem.remarks = Utils.ToString(vmessQRCode.ps); - vmessItem.address = Utils.ToString(vmessQRCode.add); - vmessItem.port = Utils.ToInt(vmessQRCode.port); - vmessItem.id = Utils.ToString(vmessQRCode.id); - vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); - - if (!Utils.IsNullOrEmpty(vmessQRCode.net)) - { - vmessItem.network = vmessQRCode.net; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.type)) - { - vmessItem.headerType = vmessQRCode.type; - } - - vmessItem.requestHost = Utils.ToString(vmessQRCode.host); - vmessItem.path = Utils.ToString(vmessQRCode.path); - vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); - } - - ConfigHandler.UpgradeServerVersion(ref vmessItem); - } - else if (result.StartsWith(Global.ssProtocol)) - { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); - - vmessItem = ResolveSSLegacy(result); - if (vmessItem == null) - { - vmessItem = ResolveSip002(result); - } - if (vmessItem == null) - { - return null; - } - if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0) - { - return null; - } - - vmessItem.configType = (int)EConfigType.Shadowsocks; - } - else if (result.StartsWith(Global.socksProtocol)) - { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); - - vmessItem.configType = (int)EConfigType.Socks; - result = result.Substring(Global.socksProtocol.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; - } - 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]; - } - else if (result.StartsWith(Global.trojanProtocol)) - { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); - - vmessItem.configType = (int)EConfigType.Trojan; - - Uri uri = new Uri(result); - vmessItem.address = uri.IdnHost; - vmessItem.port = uri.Port; - vmessItem.id = uri.UserInfo; - - var qurery = HttpUtility.ParseQueryString(uri.Query); - vmessItem.requestHost = qurery["sni"] ?? ""; - - var remarks = uri.Fragment.Replace("#", ""); - if (Utils.IsNullOrEmpty(remarks)) - { - vmessItem.remarks = "NONE"; - } - else - { - vmessItem.remarks = WebUtility.UrlDecode(remarks); - } - } - else - { - msg = UIRes.I18N("NonvmessOrssProtocol"); - return null; - } - } - catch - { - msg = UIRes.I18N("Incorrectconfiguration"); - return null; - } - - return vmessItem; - } - - /// /// 导出为客户端配置 /// @@ -1480,216 +1301,6 @@ namespace v2rayN.Handler return GenerateServerConfig(config, fileName, out msg); } - private static VmessItem ResolveVmess4Kitsunebi(string result) - { - VmessItem vmessItem = new VmessItem - { - configType = (int)EConfigType.Vmess - }; - result = result.Substring(Global.vmessProtocol.Length); - int indexSplit = result.IndexOf("?"); - if (indexSplit > 0) - { - result = result.Substring(0, indexSplit); - } - result = Utils.Base64Decode(result); - - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - string[] arr22 = arr1[1].Split(':'); - if (arr21.Length != 2 || arr21.Length != 2) - { - return null; - } - - vmessItem.address = arr22[0]; - vmessItem.port = Utils.ToInt(arr22[1]); - vmessItem.security = arr21[0]; - vmessItem.id = arr21[1]; - - vmessItem.network = Global.DefaultNetwork; - vmessItem.headerType = Global.None; - vmessItem.remarks = "Alien"; - vmessItem.alterId = 0; - - 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 diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 82cf7900..66a0322b 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.2")] +[assembly: AssemblyFileVersion("4.3")] diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 91bf3499..a92b8267 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 { @@ -717,6 +717,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 {0},One of the required. 的本地化字符串。 + /// + internal static string RoutingRuleDetailRequiredTips { + get { + return ResourceManager.GetString("RoutingRuleDetailRequiredTips", resourceCulture); + } + } + /// /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index d934df5b..21747ecc 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -370,4 +370,7 @@ Are you sure to remove the rules? + + {0},One of the required. + \ 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 3346ab6a..59b4f18b 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -370,4 +370,7 @@ 是否确定移除规则? + + {0},必填其中一项. + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index f6d76a16..ea9c4b89 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -131,6 +131,7 @@ RoutingSettingDetailsForm.cs + Form From e578c75545a614d23f0d5b88e18ae7898074bf05 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Jan 2021 21:43:31 +0800 Subject: [PATCH 009/252] up4.4 --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 66a0322b..bc7f263c 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.3")] +[assembly: AssemblyFileVersion("4.4")] From 57d5e02d6a473a4c7ab8ec3d18ba2841267c176e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 6 Jan 2021 19:54:15 +0800 Subject: [PATCH 010/252] up4.5 --- v2rayN/v2rayN/Forms/MainForm.cs | 4 +- .../Forms/OptionSettingForm.Designer.cs | 36 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3051 ++++++++++------- .../Forms/OptionSettingForm.zh-Hans.resx | 6 + v2rayN/v2rayN/Handler/ShareHandler.cs | 52 +- v2rayN/v2rayN/Mode/Config.cs | 4 + v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Tool/FileManager.cs | 6 +- v2rayN/v2rayN/Tool/Utils.cs | 11 +- 10 files changed, 1828 insertions(+), 1346 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 67b78ee5..3eb68a7b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -223,7 +223,7 @@ namespace v2rayN.Forms } VmessItem item = config.vmess[k]; - + bool stats = statistics != null && statistics.Enable; if (stats) { @@ -1310,7 +1310,7 @@ namespace v2rayN.Forms string fileName = downloadHandle.DownloadFileName; fileName = Utils.GetPath(fileName); - FileManager.ZipExtractToFile(fileName); + FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : ""); AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 13e23b02..ddbc4857 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -69,6 +69,7 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox(); this.cmbCoreType = new System.Windows.Forms.ComboBox(); this.label4 = new System.Windows.Forms.Label(); this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox(); @@ -91,32 +92,31 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); 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.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); @@ -134,6 +134,7 @@ 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; // @@ -176,12 +177,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 @@ -196,8 +197,8 @@ // // cmbprotocol // - resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -223,7 +224,6 @@ // // cmbloglevel // - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -232,6 +232,7 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -251,10 +252,10 @@ // // tabPage2 // - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -263,6 +264,7 @@ resources.ApplyResources(this.linkDnsObjectDoc, "linkDnsObjectDoc"); this.linkDnsObjectDoc.Name = "linkDnsObjectDoc"; this.linkDnsObjectDoc.TabStop = true; + this.linkDnsObjectDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkDnsObjectDoc_LinkClicked); // // txtremoteDNS // @@ -276,7 +278,6 @@ // // tabPage6 // - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -290,6 +291,7 @@ 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; // @@ -361,7 +363,7 @@ // // tabPage7 // - resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); this.tabPage7.Controls.Add(this.cmbCoreType); this.tabPage7.Controls.Add(this.label4); this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); @@ -370,17 +372,24 @@ this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // chkIgnoreGeoUpdateCore + // + resources.ApplyResources(this.chkIgnoreGeoUpdateCore, "chkIgnoreGeoUpdateCore"); + this.chkIgnoreGeoUpdateCore.Name = "chkIgnoreGeoUpdateCore"; + this.chkIgnoreGeoUpdateCore.UseVisualStyleBackColor = true; + // // cmbCoreType // - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType.FormattingEnabled = true; this.cmbCoreType.Items.AddRange(new object[] { resources.GetString("cmbCoreType.Items"), resources.GetString("cmbCoreType.Items1")}); + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.Name = "cmbCoreType"; // // label4 @@ -396,9 +405,9 @@ // // 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 @@ -426,9 +435,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 @@ -522,5 +531,6 @@ private System.Windows.Forms.Label label14; private System.Windows.Forms.ComboBox cmbCoreType; private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox chkIgnoreGeoUpdateCore; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index d26843a6..95dbb622 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -120,6 +120,7 @@ namespace v2rayN.Forms break; } + chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; cmbCoreType.SelectedIndex = (int)config.coreType; } private void btnOK_Click(object sender, EventArgs e) @@ -285,6 +286,7 @@ namespace v2rayN.Forms config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.keepOlderDedupl = chkKeepOlderDedupl.Checked; + config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; config.coreType = (ECoreType)cmbCoreType.SelectedIndex; return 0; diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 05feb4af..a0268ac7 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1390 +117,1837 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Xray_core - - - 11 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Keep older when deduplication - - - 1 - - - Record local logs - - - 12 - - - 4, 22 + + 355, 16 - - txtKcpwriteBufferSize + + 75, 23 - - groupBox1 - - - 4 - - - False - - - 14 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - groupBox1 - - - 9 - - - groupBox1 - - - 662, 523 - - - 35 - - - 1 - - - 468, 60 - - - - Top - - - 102, 16 - - - cmbprotocol - - - 6 - - - 14 - - - 30, 87 - - - 111, 100 - - - True - - - System.Windows.Forms.Label, 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 - - - 84, 16 - - - 40 - - - True - - - 120, 16 - - - True - - - tti - - - tabPage6 - - - chkdefAllowInsecure - - + + 7 - - tabPage7 - - - 12 - - - http - - - 7 - - - label5 - - - 648, 421 - - - 206, 64 - - - 95, 12 - - - tabPage6 - - - 15, 63 - - - System.Windows.Forms.CheckBox, 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 - - - 2 - - - Enable UDP - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - &Cancel - - label10 - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 662, 10 - - - Settings - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label4 - - - 236, 66 - - - txtKcpmtu - - - lbFreshrate - - - 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label11 - - - 29 - - - 8 - - - 0, 10 - - - 58, 20 - - - Support DnsObject - - - tabPage6 - - - False - - - groupBox1 - - - $this - - - 3 - - - 6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - tabPage7 - - - tabPage6 - - - Bottom - - - 576, 16 - - - 18 - - - True - - - 39 - - - tabPage6 - - - congestion - - - NoControl + + btnClose System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 89, 12 - - - NoControl - - - 0 - - - tabPage7 - - - v2rayN settings - - - 16 - - - groupBox1 - - - 10 - - - 32 - - - 6, 12 - - - groupBox1 - - - 1 - - - True - - - 8 - - - 198, 16 - - - Automatically start at system startup - - - Fill - - - txtKcptti - - - 2 - - - Turn on Sniffing - - - 281, 12 - - - tabPage7 - - - 2 - - - 3, 3, 3, 3 - - - 3 - - - 662, 453 - - - 33, 29 - - - 1 - - - 124, 60 - - - 78, 21 - - - Log level - - - tabControl1 - - - 59, 12 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - warning - - - tabPage2 - - + panel2 - - 11 - - - Statistics freshrate - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 120, 16 - - - 89, 12 - - - btnOK - - - 18, 66 - - - 20, 143 - - - 15 - - - True - - - 4, 4, 4, 4 - - - tabPage6 - - - 5 - - - Turn on Sniffing + + 0 groupBox1 - - 18, 28 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 20 - - - 29 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - - - 5 - - - Core Type - - - True - - - chksniffingEnabled - - - 2 - - - 174, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 18, 104 - - - tabPage2 - - - mtu - - - socks - System.Windows.Forms.GroupBox, 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 - - - panel1 - - - 30 - - - 53, 12 - - - 13 - - - label8 - - - 468, 27 - - - 236, 28 - - - chkAutoRun - - - 94, 21 - - - 345, 62 - - - 11 - - - 15, 129 - - - chkudpEnabled - - - 0 - - - True - - - 8, 17 - tabPage1 - - tabPage6 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 84, 16 - - - 15 - - - True - - - False - - - label7 - - - txtlocalPort - - - info - - - 19 - - - readBufferSize - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnClose - - - 124, 25 - - - protocol - - - 23, 12 - - - 638, 356 - - - socks - - - 2 - - - 3, 3 - - - chkAllowLANConn - - - 84, 16 - - - tabControl1 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 1 - - - 10 - - - 369, 62 - - - 161, 84 - - - 9 - - - groupBox1 - - - 33, 141 - - - NoControl - - - chkEnableStatistics - - - 4 - - - 355, 16 - - - 53, 12 - - - 193, 162 - - - True - - - 369, 27 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - label2 - - - 654, 427 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - - - 101, 12 - - - 5 - - - 12 - - - 20 - - - allowInsecure - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - $this - - - 4 - - - Listening port - - - Fill - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - 257, 60 - - + 0 - - tabControl1 - - - True - - - 34 - - - cmbprotocol2 - - - chkKeepOlderDedupl - - - True - - - 16 - - - True - - - True - - - True - - - chkKcpcongestion - - - Core: basic settings - - - 0 - - - 257, 25 - - - tabPage2 - - - tabControl1 - - - listening port 2 - - - 97, 20 - - - chkAllowIn2 - - - 15, 38 - - - True - - - 15, 160 - - - 38 - - - 33 - 4, 22 - - v2fly_core + + + 3, 3, 3, 3 - - 9 - - - label1 - - - Core: KCP settings - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - error - - - 59, 12 - - - System.Windows.Forms.CheckBox, 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 - - - 8 - - - 120, 16 - - - 75, 23 - - - txtlocalPort2 - - - True - - - 246, 16 - - - True - - + 654, 427 - - 10 + + 0 - - False - - - 206, 29 - - - downlinkCapacity - - - chkudpEnabled2 - - - Allow connections from the LAN + + Core: basic settings tabPage1 - + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 654, 427 + + + 4 + + + Core: DNS settings + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + chkKcpcongestion + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage6 - - 2 - - - panel2 - - - 3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - linkDnsObjectDoc - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 125, 12 - - - txtKcpreadBufferSize - - - none - - - groupBox1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - - - OptionSettingForm - - - 2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 62 - - - 111, 62 - - - 7 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - 13 - - - 97, 20 - - + 0 - - 8 + + txtKcpwriteBufferSize - - 78, 21 - - - tabPage7 - - - tabPage7 - - - True - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23, 12 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 345, 100 - - - 94, 21 - - - NoControl - - - 654, 427 - - - 10 - - - 204, 16 - - - 17 - - - 23 - - - 94, 21 - - - 6 - - - 0, 463 - - - groupBox1 - - - 3 - - - http - - - 0 - - - 97, 20 - - - tabPage6 - - - tabPage6 - - - 7 - - - False - - - 257, 158 - - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - &OK + + tabPage6 - - 10 - - + 1 - - 94, 21 - - - txtKcpuplinkCapacity - - - tabPage2 - - - chklogEnabled - - - chksniffingEnabled2 - - - tabPage7 - - - 4, 22 - - - $this - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - groupBox1 - - - NoControl - - - 6 - - - protocol - - - tabPage7 - - - 15, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 0 - - - 8 - - - txtremoteDNS - - - True - - - True - - - 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 - - - 31 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - Core: DNS settings - - - groupBox1 - - - 32 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 345, 24 - - - tabPage7 - - - cbFreshrate - - - 236, 104 - - - 4 - - - NoControl - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 94, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 8, 41 + + label10 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0, 0, 0 + + tabPage6 - - uplinkCapacity + + 2 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 3 + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 4 txtKcpdownlinkCapacity - - 35 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 + + tabPage6 - - 3 + + 5 - - 3, 3, 3, 3 + + label8 - - 107, 12 - - - 0 - - - 15, 192 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage6 - - debug + + 6 - - chkmuxEnabled + + txtKcpuplinkCapacity - - label3 - - - tabPage6 - - - False - - - 15, 110 - - - 105, 137 - - - 0, 0 - - - Enable UDP - - - cmbCoreType - - - 3, 3, 3, 3 - - - groupBox1 - - - 126, 16 - - - 267, 16 - - - 75, 23 - - - groupBox1 - - - NoControl - - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 9 + + tabPage6 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 342, 17 - - - 94, 21 - - - 97, 20 - - - 3 - - - Custom DNS (multiple, separated by commas (,)) - - - 654, 427 - - - 11 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - NoControl - - - panel2 - - + 7 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Turn on Mux Multiplexing - - - cmbloglevel - - - label6 - - - 111, 24 - - - 4 - label9 - - 662, 60 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 8 + + + txtKcptti + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 9 + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 10 + + + txtKcpmtu + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 11 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 12 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 2 + + + Core: KCP settings + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + True + + + NoControl + + + 15, 132 + + + 234, 16 + + + 36 + + + Ignore Geo files when updating core + + + chkIgnoreGeoUpdateCore + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + v2fly_core + + + Xray_core + + + 325, 130 + + + 97, 20 + + + 34 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + True + + + NoControl + + + 253, 134 + + + 59, 12 + + + 35 + + + Core Type + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + NoControl + + + 15, 108 + + + 198, 16 + + + 33 + + + Keep older when deduplication + + + chkKeepOlderDedupl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + 161, 84 + + + 58, 20 + + + 32 + + + cbFreshrate + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + NoControl + + + 30, 88 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 5 + + + True + + + NoControl + + + 15, 64 + + + 576, 16 + + + 29 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 6 + + + True + + + 15, 40 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 7 + + + True + + + 15, 16 + + + 246, 16 + + + 23 + + + Automatically start at system startup + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 8 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 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, 453 + + + 10 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + chkdefAllowInsecure + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + chksniffingEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + chksniffingEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + chkmuxEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + chkAllowIn2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + chkudpEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + cmbprotocol2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + txtlocalPort2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + cmbprotocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + chkudpEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + cmbloglevel + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + Fill + + + 3, 3 + + + 648, 421 + + + 6 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 0 + + + True + + + NoControl + + + 15, 192 + + + 102, 16 + + + 35 + + + allowInsecure + + + chkdefAllowInsecure + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 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 + + + 1 + + + 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 + + + 2 + + + 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 + + + 3 + + + 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 + + + 4 + + + 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 + + + 5 + + + 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 + + + 6 + + + 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 + + + 7 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 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 + + + 9 + + + 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 + + + 10 + + + 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 + + + 11 + + + 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 + + + 12 + + + 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 + + + 13 + + + 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 + + + 14 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + 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 + + + 16 + + + True + + + NoControl + + + 342, 17 + + + 0, 0, 0, 0 + + + 107, 12 + + + 40 + + + Support DnsObject + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 8, 41 + + + True + + + 638, 356 + + + 39 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + True + + + NoControl + + + 8, 17 + + + 281, 12 + + + 38 + + + Custom DNS (multiple, separated by commas (,)) label14 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 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 + + + 1 + + + True + + + 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 + + + 94, 21 + + + 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 + + + 12 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 463 + + + 662, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 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 + + + Top + + + 0, 0 + + + 662, 10 + + + 9 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + True - - zh-Hans - + + 6, 12 + + + 662, 523 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + 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/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index bfab7ce2..eccd6e2c 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -223,6 +223,12 @@ Core:KCP设置 + + 150, 16 + + + 更新Core时忽略Geo文件 + 53, 12 diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 766f16e0..157988c8 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -57,7 +57,7 @@ namespace v2rayN.Handler string remark = string.Empty; if (!Utils.IsNullOrEmpty(item.remarks)) { - remark = "#" + WebUtility.UrlEncode(item.remarks); + remark = "#" + Utils.UrlEncode(item.remarks); } url = string.Format("{0}:{1}@{2}:{3}", item.security, @@ -72,7 +72,7 @@ namespace v2rayN.Handler string remark = string.Empty; if (!Utils.IsNullOrEmpty(item.remarks)) { - remark = "#" + WebUtility.UrlEncode(item.remarks); + remark = "#" + Utils.UrlEncode(item.remarks); } url = string.Format("{0}:{1}@{2}:{3}", item.security, @@ -87,12 +87,12 @@ namespace v2rayN.Handler string remark = string.Empty; if (!Utils.IsNullOrEmpty(item.remarks)) { - remark = "#" + WebUtility.UrlEncode(item.remarks); + remark = "#" + Utils.UrlEncode(item.remarks); } string query = string.Empty; if (!Utils.IsNullOrEmpty(item.requestHost)) { - query = string.Format("?sni={0}", item.requestHost); + query = string.Format("?sni={0}", Utils.UrlEncode(item.requestHost)); } url = string.Format("{0}@{1}:{2}", item.id, @@ -105,7 +105,7 @@ namespace v2rayN.Handler string remark = string.Empty; if (!Utils.IsNullOrEmpty(item.remarks)) { - remark = "#" + WebUtility.UrlEncode(item.remarks); + remark = "#" + Utils.UrlEncode(item.remarks); } var dicQuery = new Dictionary(); if (!Utils.IsNullOrEmpty(item.flow)) @@ -150,7 +150,7 @@ namespace v2rayN.Handler } if (!Utils.IsNullOrEmpty(item.requestHost)) { - dicQuery.Add("host", item.requestHost); + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); } break; case "kcp": @@ -164,18 +164,18 @@ namespace v2rayN.Handler } if (!Utils.IsNullOrEmpty(item.path)) { - dicQuery.Add("seed", item.path); + dicQuery.Add("seed", Utils.UrlEncode(item.path)); } break; case "ws": if (!Utils.IsNullOrEmpty(item.requestHost)) { - dicQuery.Add("host", item.requestHost); + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); } if (!Utils.IsNullOrEmpty(item.path)) { - dicQuery.Add("path", item.path); + dicQuery.Add("path", Utils.UrlEncode(item.path)); } break; @@ -184,11 +184,11 @@ namespace v2rayN.Handler dicQuery["type"] = "http"; if (!Utils.IsNullOrEmpty(item.requestHost)) { - dicQuery.Add("host", item.requestHost); + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); } if (!Utils.IsNullOrEmpty(item.path)) { - dicQuery.Add("path", item.path); + dicQuery.Add("path", Utils.UrlEncode(item.path)); } break; @@ -201,8 +201,8 @@ namespace v2rayN.Handler { dicQuery.Add("headerType", "none"); } - dicQuery.Add("quicSecurity", item.requestHost); - dicQuery.Add("key", item.path); + dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); + dicQuery.Add("key", Utils.UrlEncode(item.path)); break; } string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); @@ -330,7 +330,7 @@ namespace v2rayN.Handler { try { - vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + vmessItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); } catch { } result = result.Substring(0, indexRemark); @@ -383,7 +383,7 @@ namespace v2rayN.Handler } else { - vmessItem.remarks = WebUtility.UrlDecode(remarks); + vmessItem.remarks = Utils.UrlDecode(remarks); } } else if (result.StartsWith(Global.vlessProtocol)) @@ -509,7 +509,7 @@ namespace v2rayN.Handler var tag = match.Groups["tag"].Value; if (!Utils.IsNullOrEmpty(tag)) { - server.remarks = HttpUtility.UrlDecode(tag, Encoding.UTF8); + server.remarks = Utils.UrlDecode(tag); } Match details; try @@ -591,7 +591,7 @@ namespace v2rayN.Handler case "ws": string p1 = q["path"] ?? "/"; string h1 = q["host"] ?? ""; - i.requestHost = h1; + i.requestHost = Utils.UrlDecode(h1); i.path = p1; break; @@ -600,7 +600,7 @@ namespace v2rayN.Handler i.network = "h2"; string p2 = q["path"] ?? "/"; string h2 = q["host"] ?? ""; - i.requestHost = h2; + i.requestHost = Utils.UrlDecode(h2); i.path = p2; break; @@ -609,7 +609,7 @@ namespace v2rayN.Handler string k = q["key"] ?? ""; string t3 = q["type"] ?? "none"; i.headerType = t3; - i.requestHost = s; + i.requestHost = Utils.UrlDecode(s); i.path = k; break; @@ -645,30 +645,30 @@ namespace v2rayN.Handler { case "tcp": item.headerType = query["headerType"] ?? "none"; - item.requestHost = query["host"] ?? ""; + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); break; case "kcp": item.headerType = query["headerType"] ?? "none"; - item.path = query["seed"] ?? ""; + item.path = Utils.UrlDecode(query["seed"] ?? ""); break; case "ws": - item.requestHost = query["host"] ?? ""; - item.path = query["path"] ?? "/"; + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + item.path = Utils.UrlDecode(query["path"] ?? "/"); break; case "http": case "h2": item.network = "h2"; - item.requestHost = query["host"] ?? ""; - item.path = query["path"] ?? "/"; + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + item.path = Utils.UrlDecode(query["path"] ?? "/"); break; case "quic": item.headerType = query["headerType"] ?? "none"; item.requestHost = query["quicSecurity"] ?? "none"; - item.path = query["key"] ?? ""; + item.path = Utils.UrlDecode(query["key"] ?? ""); break; default: diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 2680a577..b1b63fe5 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -170,6 +170,10 @@ namespace v2rayN.Mode { get; set; } + public bool ignoreGeoUpdateCore + { + get; set; + } #region 函数 diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index bc7f263c..c8e96058 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.4")] +[assembly: AssemblyFileVersion("4.5")] diff --git a/v2rayN/v2rayN/Tool/FileManager.cs b/v2rayN/v2rayN/Tool/FileManager.cs index bd5ebf93..d668b599 100644 --- a/v2rayN/v2rayN/Tool/FileManager.cs +++ b/v2rayN/v2rayN/Tool/FileManager.cs @@ -68,7 +68,7 @@ namespace v2rayN.Tool throw ex; } } - public static bool ZipExtractToFile(string fileName) + public static bool ZipExtractToFile(string fileName, string ignoredName) { try { @@ -82,6 +82,10 @@ namespace v2rayN.Tool } try { + if (!Utils.IsNullOrEmpty(ignoredName) && entry.Name.Contains(ignoredName)) + { + continue; + } entry.ExtractToFile(Utils.GetPath(entry.Name), true); } catch (IOException ex) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index f6ac4c67..1e1e9444 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -20,11 +20,12 @@ using ZXing.QrCode; using System.Security.Principal; using v2rayN.Base; using Newtonsoft.Json.Linq; +using System.Web; namespace v2rayN { class Utils - { + { #region 资源Json操作 @@ -369,6 +370,14 @@ namespace v2rayN result = list; } + public static string UrlEncode(string url) + { + return HttpUtility.UrlEncode(url); + } + public static string UrlDecode(string url) + { + return HttpUtility.UrlDecode(url); + } #endregion From e6fc9e47837f742963ffe7f3ed39069fd11191e3 Mon Sep 17 00:00:00 2001 From: Li Date: Thu, 14 Jan 2021 16:34:34 +0800 Subject: [PATCH 011/252] Add menu to clear all service statistics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加按钮,清除所有服务统计 --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 166 +- v2rayN/v2rayN/Forms/MainForm.cs | 10 +- v2rayN/v2rayN/Forms/MainForm.resx | 2451 ++++++++++---------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 6 + v2rayN/v2rayN/Handler/StatisticsHandler.cs | 21 + 5 files changed, 1356 insertions(+), 1298 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 148b09d9..a208b5dd 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -58,6 +58,7 @@ this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem(); + this.menuClearServerStatistics = 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(); @@ -139,19 +140,17 @@ // // scMain.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); this.scMain.Panel2.Controls.Add(this.qrCodeControl); this.scMain.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -170,7 +169,6 @@ // // 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, @@ -198,6 +196,7 @@ this.menuRealPingServer, this.menuSpeedServer, this.tsbTestMe, + this.menuClearServerStatistics, this.toolStripSeparator6, this.menuExport2ClientConfig, this.menuExport2ServerConfig, @@ -205,188 +204,195 @@ this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // + // menuClearServerStatistics + // + this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); + this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); + // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // // tsbServer // - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // // qrCodeControl @@ -396,14 +402,14 @@ // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuServers, @@ -419,63 +425,63 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -486,31 +492,31 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.scMain); + resources.ApplyResources(this.groupBox1, "groupBox1"); 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.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, this.toolSslSocksPort, @@ -521,6 +527,7 @@ 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); // @@ -531,8 +538,8 @@ // // toolSslSocksPort // - resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); this.toolSslSocksPort.Name = "toolSslSocksPort"; + resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); // // toolSslBlank1 // @@ -547,8 +554,8 @@ // // toolSslHttpPort // - resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); this.toolSslHttpPort.Name = "toolSslHttpPort"; + resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); // // toolSslBlank2 // @@ -570,8 +577,8 @@ // // toolSslBlank4 // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); // // panel1 // @@ -580,7 +587,6 @@ // // 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, @@ -598,74 +604,75 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "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 // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "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; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); // // tsbSetting // - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // @@ -675,45 +682,44 @@ // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, this.tsbCheckUpdateXrayCore}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -721,49 +727,50 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "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 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // @@ -896,6 +903,7 @@ private System.Windows.Forms.ToolStripMenuItem tsbOptionSetting; private System.Windows.Forms.ToolStripMenuItem tsbRoutingSetting; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateXrayCore; + private System.Windows.Forms.ToolStripMenuItem menuClearServerStatistics; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 3eb68a7b..3068b337 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -660,6 +660,15 @@ namespace v2rayN.Forms string result = httpProxyTest() + "ms"; AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); } + + private void menuClearStatistic_Click(object sender, EventArgs e) + { + if (statistics != null && statistics.Enable) + { + statistics.ClearStatistic = true; + } + } + private int httpProxyTest() { SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "", UpdateSpeedtestHandler); @@ -1500,6 +1509,5 @@ namespace v2rayN.Forms #endregion - } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index b8501535..55fb406d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,694 +117,214 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - 97, 53 - - - 355, 22 - - - Add [VLESS] server - - - 2 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Restart service - - - menuCopyServer - - - 264, 22 - - - groupBox2 - - - menuMoveUp - - - Add [Socks] server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ImageAboveText - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 语言-[中文简体] - - - NoControl - - - Settings - - - tsbHelp - - - - 0 - - - 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 - - - tsbSetting - - - toolSslBlank2 - - - 355, 22 - - - 355, 22 - - - tsbCheckUpdateN - - - Do not change system proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - toolStripSeparator7 - - - Update v2flyCore - - - Magenta - - - menuKeepNothing - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 52, 17 - - - Share - - - Subscriptions - - - 952, 351 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - Export selected server for client configuration - - - tsbRoutingSetting - - - 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 - - - Export selected server for server configuration - - - 0, 17 - - - 952, 56 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Test servers real delay (Ctrl+R) - - - menuTcpingServer - - - ImageAboveText - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 356, 600 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - 355, 22 - - - toolStripSeparator1 - - - 3 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - 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 - - - 187, 22 - - - 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 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - - - - Servers - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Import bulk URL from clipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Move to bottom (B) - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6, 12 - - - 48, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 206, 17 - - - 0 - - - 686, 331 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepClear - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom - - - Export share URLs to clipboard (Ctrl+C) - - - scMain.Panel2 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 39, 17 - - - menuAddServers2 - - - Fill - - - tsbServer + + 3, 21 + + + 327, 17 + + + 423, 24 Add [VMess] server - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 423, 24 - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VLESS] server - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 423, 24 - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + Add [Shadowsocks] server - - tsbAbout + + 423, 24 - - 206, 17 + + Add [Socks] server - - 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 - - - tsbPromotion - - - 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 - - - 352, 6 - - - groupBox1 - - - 206, 17 - - - 2 - - - 125, 22 - - - scMain.Panel2 - - - 161, 22 - - - 355, 22 - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - ssMain - - - 686 - - - tsbTestMe - - - 265, 142 - - - 262, 22 - - - $this - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - Check for updates - - - tsbCheckUpdateXrayCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 17 - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 125, 22 - - - scMain - - - 203, 22 - - - HTTP: - - - Remove selected servers (Delete) - - - 0 - - - Help - - - menuSelectAll - - - Move to top (T) - - - 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 - - - Scan QR code on the screen (Ctrl+S) - - - ImageAboveText - - - 1 - - - Promotion - - - menuAddServers - - - 355, 22 - - - menuAddVmessServer - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - BottomCenter - - - menuExport2ShareUrl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsMain - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - SOCKS5: - - - 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 - - - 5 - - - tsbV2rayWebsite - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - txtMsgBox - - - toolSslBlank4 - - - menuAddTrojanServer - - - 261, 6 - - - v2rayN - - - Language-[English] - - - tsbSubSetting - - - 264, 22 - - - 0 - - - Fill - - - toolSslBlank3 - - - 128, 53 + + 423, 24 Add [Trojan] server - - 161, 22 + + 423, 24 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - + + 423, 24 + + + Import bulk URL from clipboard (Ctrl+V) + + + 423, 24 + + + Scan QR code on the screen (Ctrl+S) + + + 420, 6 + + + 423, 24 + + + Remove selected servers (Delete) + + + 423, 24 + + + Remove duplicate servers + + + 423, 24 + + + Clone selected server + + + 423, 24 + + + Set as active server (Enter) + + + 420, 6 + + + 423, 24 + + + Move to top (T) + + + 423, 24 + + + Up (U) + + + 423, 24 + + + Down (D) + + + 423, 24 + + + Move to bottom (B) + + + 423, 24 + + + Select All (Ctrl+A) + + + 420, 6 + + + 423, 24 + + + Test servers ping (Ctrl+P) + + + 423, 24 + + + Test servers with tcping (Ctrl+O) + + + 423, 24 + + + Test servers real delay (Ctrl+R) + + + 423, 24 + + + Test servers download speed (Ctrl+T) + + + 423, 24 + + + Test current service status + + + 423, 24 + + + Clear all service statistics + + + 420, 6 + + + 423, 24 + + + Export selected server for client configuration + + + 423, 24 + + + Export selected server for server configuration + + + 423, 24 + + + Export share URLs to clipboard (Ctrl+C) + + + 423, 24 + + + Export subscription (base64) share to clipboard + + + Magenta + + + 77, 56 + + + Servers + + ImageAboveText + + 424, 708 + + + cmsLv + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 417 - - - 352, 6 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - V2Ray Website - - - No - - - 1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OptionSetting - - - menuMoveTop - - - tsbCheckUpdateCore + + Fill @@ -823,620 +343,1115 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - menuScanScreen + + 0, 0 - - ImageAboveText + + 1003, 472 - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - toolSslBlank1 - - - scMain.Panel1 - - - tsbReload - - - tsbSubUpdate - - - 微软雅黑, 8pt - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - SPEED Disabled - - - 67, 53 - - - menuSysAgentMode - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - 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 - - - tsbClose - - - RoutingSetting - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbQRCodeSwitch - - - 3, 151 - - - True - - - 355, 22 - - - 6, 56 - - - 952, 10 - - - Updates - - - 264, 22 - - + + 0 - - toolStripSeparator8 - - - 89, 53 - - - 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.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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - 45, 53 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Http proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - Magenta + + scMain.Panel1 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - 100 - - - 2 - - - toolStripSeparator11 - - - Magenta - - - 355, 22 - - - v2rayN Project - - + 0 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - Informations - - - 3 - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSpeedServer - - - 355, 22 - - - menuRemoveServer - - - Test current service status - - - 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) - - - 352, 6 - - - Magenta - - - 262, 22 - - - 355, 22 - - - tsbSub - - - Magenta - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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 - - - Vertical - - - 262, 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 - - - $this - - - 0, 0 - - - qrCodeControl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Clear system proxy - - - 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 - - - groupBox2 - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - 184, 6 - - - 0, 0 - - - Up (U) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - Set 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 + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 64, 53 + + scMain - - Magenta + + 0 - - 946, 22 + + Fill - - 355, 22 + + 0, 0 - - Set as active server (Enter) + + 4, 4, 4, 4 - - menuAddVlessServer + + 256, 472 + + + 2 + + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scMain.Panel2 + + + 0 + + + scMain.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 1 + + + 100 - 946, 331 + 1263, 472 - - 6, 56 + + 1003 - - Add [Shadowsocks] server + + 0 - - 微软雅黑, 8pt + + scMain - - 952, 593 + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 324, 26 + + + Clear system proxy + + + 324, 26 + + + Set system proxy (global mode) + + + 324, 26 + + + Do not change system proxy + + + 309, 24 + + + Http proxy + + + 309, 24 + + + Server + + + 309, 24 + + + Import bulk URL from clipboard + + + 309, 24 Scan QR code on the screen - - toolSslSocksPort + + 309, 24 - - toolStripSeparator10 + + Update subscriptions - - toolSslHttpPortLab + + 306, 6 - - menuMoveBottom + + 309, 24 - - 1 + + Exit - - Magenta + + 310, 154 - - menuExport2ClientConfig + + cmsMain - - 187, 22 + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuExport2ServerConfig + + v2rayN + + + True + + + 498, 17 + + + Fill + + + 0, 69 + + + 1269, 496 + + + 0 + + + Servers list + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Fill + + + 3, 21 0 + + True + + + Vertical + + + 1263, 126 + + + 3 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + 228, 18 + + + 微软雅黑, 8pt + + + 65, 20 + + + SOCKS5: + + + 0, 20 + + + 微软雅黑, 8pt + + + 305, 20 + + + 微软雅黑, 8pt + + + 48, 20 + + + HTTP: + + + 0, 20 + + + 微软雅黑, 8pt + + + 305, 20 + + + 微软雅黑, 8pt + + + 305, 20 + + + False + + + 微软雅黑, 8pt + + + No + + + 220, 20 + + + SPEED Disabled + + + MiddleRight + + + 0, 20 + + + 3, 147 + + + 1263, 26 + + + 0 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + Bottom + + + 0, 565 + + + 1269, 176 + + + 3 + + + Informations + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top + + + 0, 59 + + + 1269, 10 + + + 2 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 409, 17 + + + 6, 59 + + + 153, 26 + + + Settings + + + 153, 26 + + + Updates + + + Magenta + + + 122, 56 + + + Subscriptions + + + ImageAboveText + + + Magenta + + + 54, 56 + + + Share + + + BottomCenter + + + ImageAboveText + + + 6, 59 + + + 203, 26 + + + OptionSetting + + + 203, 26 + + + RoutingSetting + + + Magenta + + + 83, 56 + + + Settings + + + ImageAboveText + + + 6, 59 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + + + + BottomCenter + + + Magenta + + + 120, 56 + + + Restart service + + + ImageAboveText + + + 6, 59 + + + 250, 26 + + + v2rayN (this software) + + + 250, 26 + + + Update v2flyCore + + + 250, 26 + + + Update XrayCore + + + Magenta + + + 155, 56 + + + Check for updates + + + ImageAboveText + + + 6, 59 + + + 230, 26 + + + v2rayN Project + + + 230, 26 + + + V2Ray Website + + + 227, 6 + + + 230, 26 + + + Language-[English] + + + 230, 26 + + + 语言-[中文简体] + + + Magenta + + + 58, 56 + + + Help + + + ImageAboveText + + + Magenta + + + 107, 56 + + + Promotion + ImageAboveText - 6, 56 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Magenta - - - 52, 53 - - - 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 - - - Exit - - - bgwScan - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 56 - - - Close - - - 264, 22 - - - 0, 17 - - - 0 - - - Import bulk URL from clipboard (Ctrl+V) - - - $this - - - Update XrayCore - - - toolStripSeparator2 - - - toolSslSocksPortLab - - - Add a custom configuration server - - - toolSslHttpPort - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 952, 176 - - - statusStrip1 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 3, 17 - - - toolStripSeparator3 + 6, 59 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - - 355, 22 + + Magenta - - 355, 22 + + 61, 56 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Close - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText + + + 0, 0 + + + 1269, 59 + + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 - - 228, 18 - True 65 - - 137, 17 - - - 498, 17 - - - 17, 17 - - - 409, 17 - - - 327, 17 - + + 8, 15 + + + 1269, 741 + + + 5, 5, 5, 5 + + + v2rayN + + + menuAddVmessServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddVlessServer + + + 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 + + + menuAddTrojanServer + + + 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 + + + tsbTestMe + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuClearServerStatistics + + + 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 + + + menuKeepClear + + + 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 + + + menuKeepNothing + + + 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 + + + menuUpdateSubscriptions + + + 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 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + 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 + + + tsbV2rayWebsite + + + 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 + \ 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 9af1841a..f75d3073 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -259,6 +259,12 @@ 测试当前服务状态 + + 300, 22 + + + 清除所有服务统计数据 + 297, 6 diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index ab4d4a6a..6fb71b94 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -30,6 +30,11 @@ namespace v2rayN.Handler get; set; } + public bool ClearStatistic + { + get; set; + } + public List Statistic { get @@ -60,6 +65,7 @@ namespace v2rayN.Handler config_ = config; Enable = config.enableStatistics; UpdateUI = false; + ClearStatistic = false; updateFunc_ = update; exitFlag_ = false; @@ -126,6 +132,21 @@ namespace v2rayN.Handler serverStatItem.totalUp += up; serverStatItem.totalDown += down; + if (ClearStatistic) + { + foreach (ServerStatItem item in serverStatistics_.server) + { + item.todayUp = 0; + item.todayDown = 0; + item.totalUp = 0; + item.totalDown = 0; + updateFunc_(up, down, new List { item }); + } + + ClearStatistic = false; + + } + if (UpdateUI) { updateFunc_(up, down, new List { serverStatItem }); From 63411c5978204583b5656e5371d47de0f8a49e5d Mon Sep 17 00:00:00 2001 From: Li Date: Fri, 15 Jan 2021 13:38:06 +0800 Subject: [PATCH 012/252] Replace 'clear all server statistic' function from Flag to Method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将清除统计数据提取成方法 --- v2rayN/v2rayN/Forms/MainForm.cs | 4 +-- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 39 +++++++++++----------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 3068b337..54dfd491 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -663,9 +663,9 @@ namespace v2rayN.Forms private void menuClearStatistic_Click(object sender, EventArgs e) { - if (statistics != null && statistics.Enable) + if (statistics != null) { - statistics.ClearStatistic = true; + statistics.ClearAllServerStatistics(); } } diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index 6fb71b94..de013922 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -30,10 +30,6 @@ namespace v2rayN.Handler get; set; } - public bool ClearStatistic - { - get; set; - } public List Statistic { @@ -65,7 +61,6 @@ namespace v2rayN.Handler config_ = config; Enable = config.enableStatistics; UpdateUI = false; - ClearStatistic = false; updateFunc_ = update; exitFlag_ = false; @@ -132,21 +127,6 @@ namespace v2rayN.Handler serverStatItem.totalUp += up; serverStatItem.totalDown += down; - if (ClearStatistic) - { - foreach (ServerStatItem item in serverStatistics_.server) - { - item.todayUp = 0; - item.todayDown = 0; - item.totalUp = 0; - item.totalDown = 0; - updateFunc_(up, down, new List { item }); - } - - ClearStatistic = false; - - } - if (UpdateUI) { updateFunc_(up, down, new List { serverStatItem }); @@ -212,6 +192,25 @@ namespace v2rayN.Handler } } + public void ClearAllServerStatistics() + { + if (serverStatistics_ != null) + { + foreach (var item in serverStatistics_.server) + { + item.todayUp = 0; + item.todayDown = 0; + item.totalUp = 0; + item.totalDown = 0; + // update ui display to zero + updateFunc_(0, 0, new List { item }); + } + + // update statistic json file + SaveToFile(); + } + } + private ServerStatItem GetServerStatItem(string itemId) { long ticks = DateTime.Now.Date.Ticks; From 597531b92bedd4ef4e5685e9fdc801ca3641f39a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 20 Jan 2021 15:33:03 +0800 Subject: [PATCH 013/252] up4.6 --- .../v2rayN/Forms/AddServer3Form.Designer.cs | 18 +- v2rayN/v2rayN/Forms/AddServer3Form.resx | 760 ++++++++------- v2rayN/v2rayN/Forms/MainForm.resx | 200 ++-- .../Forms/RoutingSettingDetailsForm.resx | 164 +++- .../RoutingSettingDetailsForm.zh-Hans.resx | 2 +- .../Forms/RoutingSettingForm.Designer.cs | 58 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 20 +- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 890 +++++++++--------- .../Forms/RoutingSettingForm.zh-Hans.resx | 6 + .../Forms/RoutingSubSettingForm.Designer.cs | 106 +++ v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs | 61 ++ .../v2rayN/Forms/RoutingSubSettingForm.resx | 300 ++++++ .../Forms/RoutingSubSettingForm.zh-Hans.resx | 133 +++ v2rayN/v2rayN/Global.cs | 5 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 34 + v2rayN/v2rayN/Handler/DownloadHandle.cs | 8 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 9 +- v2rayN/v2rayN/Mode/Config.cs | 4 + v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/v2rayN.csproj | 14 + v2rayN/v2rayN/v2rayN.csproj.user | 2 +- 22 files changed, 1758 insertions(+), 1040 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs index 06312421..27b7c91c 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs @@ -55,15 +55,14 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.cmbSecurity); this.groupBox1.Controls.Add(this.txtRemarks); @@ -75,6 +74,7 @@ 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,7 +85,6 @@ // // cmbSecurity // - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; this.cmbSecurity.Items.AddRange(new object[] { @@ -94,9 +93,8 @@ resources.GetString("cmbSecurity.Items2"), resources.GetString("cmbSecurity.Items3"), resources.GetString("cmbSecurity.Items4"), - resources.GetString("cmbSecurity.Items5"), - resources.GetString("cmbSecurity.Items6"), - resources.GetString("cmbSecurity.Items7")}); + resources.GetString("cmbSecurity.Items5")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // // txtRemarks @@ -146,9 +144,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 +163,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 // - resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); this.menuItemImportClipboard.Name = "menuItemImportClipboard"; + resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); // // AddServer3Form diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index 272c310f..f17e4d82 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -118,489 +118,483 @@ 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 - - 53, 12 + + 22 - - label6 + + * Fill in manually - - groupBox1 + + label13 - - 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-256-gcm - - 6 + + aes-128-gcm - - 5 + + chacha20-poly1305 - - 303, 17 + + chacha20-ietf-poly1305 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + none - - 4 - - - 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 - - - Encryption - - - groupBox1 - - - True - - - 22 - - - 162, 21 + + plain 127, 123 - - 127, 91 + + 194, 20 - + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - panel2 + + 1 - - 5 + + 127, 154 - + + 194, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + 2 + + True + + + 12, 155 + + + 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 + + + Encryption + label5 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 91 + + + * + + + 278, 21 + + + 5 + txtId 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 - - - 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 - - - 3 + + True 12, 93 - - 194, 20 + + 53, 12 - - 10 + + 4 - - chacha20-ietf + + Password - - True + + label3 - - panel2 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 + + + 6 + + + 127, 59 + 194, 21 + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 62 + + + 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 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtAddress - - 6 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + groupBox1 - - 7 + + 9 - - label13 + + True - - aes-256-gcm + + 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 - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 10 - - label3 + + + Fill - - Server port - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 231 - - - 9 - - - aes-128-gcm - - - 4 - - - &Cancel - - - True - - - 6, 12 - - - True - - - Server address - - - menuServer - - - 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 + + 0, 35 547, 196 - + 3 - - 75, 23 - - - 6 - - - 337, 158 - - - 65, 12 - - - 4 - - - 2 - - - 1 - - - * - - - 75, 23 - - - Import URL from clipboard - - - groupBox1 - Server - - txtRemarks + + groupBox1 - - 12, 155 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + $this - - 278, 21 + + 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 + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 3 True - - 17, 17 - + + 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.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 55fb406d..08f3f3fc 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -123,181 +123,181 @@ - 3, 21 + 3, 17 327, 17 - 423, 24 + 355, 22 Add [VMess] server - 423, 24 + 355, 22 Add [VLESS] server - 423, 24 + 355, 22 Add [Shadowsocks] server - 423, 24 + 355, 22 Add [Socks] server - 423, 24 + 355, 22 Add [Trojan] server - 423, 24 + 355, 22 Add a custom configuration server - 423, 24 + 355, 22 Import bulk URL from clipboard (Ctrl+V) - 423, 24 + 355, 22 Scan QR code on the screen (Ctrl+S) - 420, 6 + 352, 6 - 423, 24 + 355, 22 Remove selected servers (Delete) - 423, 24 + 355, 22 Remove duplicate servers - 423, 24 + 355, 22 Clone selected server - 423, 24 + 355, 22 Set as active server (Enter) - 420, 6 + 352, 6 - 423, 24 + 355, 22 Move to top (T) - 423, 24 + 355, 22 Up (U) - 423, 24 + 355, 22 Down (D) - 423, 24 + 355, 22 Move to bottom (B) - 423, 24 + 355, 22 Select All (Ctrl+A) - 420, 6 + 352, 6 - 423, 24 + 355, 22 Test servers ping (Ctrl+P) - 423, 24 + 355, 22 Test servers with tcping (Ctrl+O) - 423, 24 + 355, 22 Test servers real delay (Ctrl+R) - 423, 24 + 355, 22 Test servers download speed (Ctrl+T) - 423, 24 + 355, 22 Test current service status - 423, 24 + 355, 22 Clear all service statistics - 420, 6 + 352, 6 - 423, 24 + 355, 22 Export selected server for client configuration - 423, 24 + 355, 22 Export selected server for server configuration - 423, 24 + 355, 22 Export share URLs to clipboard (Ctrl+C) - 423, 24 + 355, 22 Export subscription (base64) share to clipboard @@ -306,7 +306,7 @@ Magenta - 77, 56 + 64, 53 Servers @@ -315,7 +315,7 @@ ImageAboveText - 424, 708 + 356, 622 cmsLv @@ -347,7 +347,7 @@ 0, 0 - 1003, 472 + 686, 307 @@ -387,7 +387,7 @@ 4, 4, 4, 4 - 256, 472 + 256, 307 2 @@ -420,10 +420,10 @@ 100 - 1263, 472 + 946, 307 - 1003 + 686 0 @@ -450,64 +450,64 @@ NoControl - 324, 26 + 262, 22 Clear system proxy - 324, 26 + 262, 22 Set system proxy (global mode) - 324, 26 + 262, 22 Do not change system proxy - 309, 24 + 264, 22 Http proxy - 309, 24 + 264, 22 Server - 309, 24 + 264, 22 Import bulk URL from clipboard - 309, 24 + 264, 22 Scan QR code on the screen - 309, 24 + 264, 22 Update subscriptions - 306, 6 + 261, 6 - 309, 24 + 264, 22 Exit - 310, 154 + 265, 142 cmsMain @@ -528,10 +528,10 @@ Fill - 0, 69 + 0, 66 - 1269, 496 + 952, 327 0 @@ -555,7 +555,7 @@ Fill - 3, 21 + 3, 17 0 @@ -567,7 +567,7 @@ Vertical - 1263, 126 + 946, 154 3 @@ -591,43 +591,43 @@ 微软雅黑, 8pt - 65, 20 + 52, 21 SOCKS5: - 0, 20 + 0, 21 微软雅黑, 8pt - 305, 20 + 206, 21 微软雅黑, 8pt - 48, 20 + 39, 21 HTTP: - 0, 20 + 0, 21 微软雅黑, 8pt - 305, 20 + 206, 21 微软雅黑, 8pt - 305, 20 + 206, 21 False @@ -639,7 +639,7 @@ No - 220, 20 + 220, 21 SPEED Disabled @@ -648,13 +648,13 @@ MiddleRight - 0, 20 + 0, 21 - 3, 147 + 3, 171 - 1263, 26 + 946, 26 0 @@ -678,10 +678,10 @@ Bottom - 0, 565 + 0, 393 - 1269, 176 + 952, 200 3 @@ -705,10 +705,10 @@ Top - 0, 59 + 0, 56 - 1269, 10 + 952, 10 2 @@ -729,16 +729,16 @@ 409, 17 - 6, 59 + 6, 56 - 153, 26 + 125, 22 Settings - 153, 26 + 125, 22 Updates @@ -747,7 +747,7 @@ Magenta - 122, 56 + 99, 53 Subscriptions @@ -759,7 +759,7 @@ Magenta - 54, 56 + 45, 53 Share @@ -771,16 +771,16 @@ ImageAboveText - 6, 59 + 6, 56 - 203, 26 + 161, 22 OptionSetting - 203, 26 + 161, 22 RoutingSetting @@ -789,7 +789,7 @@ Magenta - 83, 56 + 67, 53 Settings @@ -798,12 +798,12 @@ ImageAboveText - 6, 59 + 6, 56 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 @@ -818,7 +818,7 @@ Magenta - 120, 56 + 97, 53 Restart service @@ -827,22 +827,22 @@ ImageAboveText - 6, 59 + 6, 56 - 250, 26 + 203, 22 v2rayN (this software) - 250, 26 + 203, 22 Update v2flyCore - 250, 26 + 203, 22 Update XrayCore @@ -851,7 +851,7 @@ Magenta - 155, 56 + 128, 53 Check for updates @@ -860,31 +860,31 @@ ImageAboveText - 6, 59 + 6, 56 - 230, 26 + 187, 22 v2rayN Project - 230, 26 + 187, 22 V2Ray Website - 227, 6 + 184, 6 - 230, 26 + 187, 22 Language-[English] - 230, 26 + 187, 22 语言-[中文简体] @@ -893,7 +893,7 @@ Magenta - 58, 56 + 48, 53 Help @@ -905,7 +905,7 @@ Magenta - 107, 56 + 89, 53 Promotion @@ -914,12 +914,12 @@ ImageAboveText - 6, 59 + 6, 56 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== @@ -927,7 +927,7 @@ Magenta - 61, 56 + 52, 53 Close @@ -939,7 +939,7 @@ 0, 0 - 1269, 59 + 952, 56 1 @@ -963,13 +963,13 @@ 65 - 8, 15 + 6, 12 - 1269, 741 + 952, 593 - 5, 5, 5, 5 + 4, 4, 4, 4 v2rayN diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx index 855817b0..d9472064 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx @@ -271,7 +271,7 @@ 33 - *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> labRoutingTips @@ -420,6 +420,54 @@ 2 + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Bottom + + + 0, 516 + + + 742, 60 + + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + NoControl @@ -474,44 +522,53 @@ 1 - - Bottom + + groupBox2 - - 0, 516 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 742, 60 + + panel2 - - 10 + + 0 - - panel4 + + groupBox1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + panel2 - + 1 - + Fill - - 3, 17 + + 0, 121 - - True + + 742, 395 - - 344, 375 + + 11 - - 25 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 txtIP @@ -552,20 +609,32 @@ 0 - + Fill - + 3, 17 - + True - - 386, 375 + + 344, 375 - - 24 + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 txtDomain @@ -606,28 +675,31 @@ 1 - + Fill - - 0, 121 + + 3, 17 - - 742, 395 + + True - - 11 + + 386, 375 - - panel2 + + 24 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtDomain - - $this + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + 0 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx index c080de59..bac9081a 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - *设置的路由规则,用逗号(,)分隔 + *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 8261890c..0edd1e88 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -55,6 +55,7 @@ this.menuImportRulesFromPreset = new System.Windows.Forms.ToolStripMenuItem(); this.menuImportRulesFromFile = new System.Windows.Forms.ToolStripMenuItem(); this.menuImportRulesFromClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromUrl = new System.Windows.Forms.ToolStripMenuItem(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); this.cmsLv.SuspendLayout(); @@ -65,17 +66,17 @@ // // 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); // // 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 @@ -87,9 +88,9 @@ // // panel1 // + resources.ApplyResources(this.panel1, "panel1"); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // // linkLabelRoutingDoc @@ -101,19 +102,19 @@ // // 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"; // // lvRoutings // - this.lvRoutings.ContextMenuStrip = this.cmsLv; resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.ContextMenuStrip = this.cmsLv; this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -129,6 +130,7 @@ // // 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.menuAdd, @@ -141,116 +143,123 @@ this.menuMoveDown, this.menuMoveBottom}); this.cmsLv.Name = "cmsLv"; - resources.ApplyResources(this.cmsLv, "cmsLv"); + this.cmsLv.OwnerItem = this.MenuItem1; // // menuAdd // - this.menuAdd.Name = "menuAdd"; resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Name = "menuAdd"; this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - this.menuRemove.Name = "menuRemove"; resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Name = "menuRemove"; this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - this.menuSelectAll.Name = "menuSelectAll"; resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuExportSelectedRules // - this.menuExportSelectedRules.Name = "menuExportSelectedRules"; resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); + this.menuExportSelectedRules.Name = "menuExportSelectedRules"; this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_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); // // MenuItem1 // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); this.MenuItem1.DropDown = this.cmsLv; this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // tabControl2 // - this.tabControl2.Controls.Add(this.tabPage2); resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Controls.Add(this.tabPage2); this.tabControl2.Name = "tabControl2"; this.tabControl2.SelectedIndex = 0; // // tabPage2 // - this.tabPage2.Controls.Add(this.lvRoutings); resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Controls.Add(this.lvRoutings); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // // menuServer // + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItem1, this.toolStripMenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // toolStripMenuItem1 // + resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuImportRulesFromPreset, this.menuImportRulesFromFile, - this.menuImportRulesFromClipboard}); + this.menuImportRulesFromClipboard, + this.menuImportRulesFromUrl}); this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); // // menuImportRulesFromPreset // - this.menuImportRulesFromPreset.Name = "menuImportRulesFromPreset"; resources.ApplyResources(this.menuImportRulesFromPreset, "menuImportRulesFromPreset"); + this.menuImportRulesFromPreset.Name = "menuImportRulesFromPreset"; this.menuImportRulesFromPreset.Click += new System.EventHandler(this.menuImportRulesFromPreset_Click); // // menuImportRulesFromFile // - this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); + this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); // // menuImportRulesFromClipboard // - this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); + this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); // + // menuImportRulesFromUrl + // + resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); + this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; + this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click); + // // RoutingSettingForm // resources.ApplyResources(this, "$this"); @@ -302,5 +311,6 @@ private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromFile; private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromClipboard; private System.Windows.Forms.ToolStripMenuItem menuExportSelectedRules; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromUrl; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index b51d56d6..a086d132 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -24,7 +24,7 @@ namespace v2rayN.Forms config.rules = new List(); } InitRoutingsView(); - RefreshRoutingsView(); + RefreshRoutingsView(); } private void InitRoutingsView() @@ -220,7 +220,7 @@ namespace v2rayN.Forms } } - + private void lvRoutings_KeyDown(object sender, KeyEventArgs e) { if (e.Control) @@ -307,6 +307,22 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("OperationSuccess")); } } + private void menuImportRulesFromUrl_Click(object sender, EventArgs e) + { + var fm = new RoutingSubSettingForm(); + if (fm.ShowDialog() != DialogResult.OK) + { + return; + } + var url = fm.Url; + DownloadHandle downloadHandle = new DownloadHandle(); + string clipboardData = downloadHandle.WebDownloadStringSync(url); + if (ConfigHandler.AddBatchRoutingRules(ref config, clipboardData) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } #endregion diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index b773ce33..5e7a353e 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,224 +117,317 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - - 568, 17 - - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 613 - - - 765, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 3 - - NoControl - - - 475, 17 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - linkLabelRoutingDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 0 - cmbdomainStrategy - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + Down (D) + + + + 765, 25 + + + Bottom + + + Edit and Function panel1 - - 1 - - - Top - - - 0, 25 - - - 765, 51 - - - 11 - panel1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + $this - - 2 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl + + 4 - - 6, 21 - - - 0, 0, 0, 0 - - - 95, 12 - - - 19 - - - Domain strategy - - - linkLabelRoutingDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 0 - - - AsIs - - - IPIfNonMatch - - - IPOnDemand - - - 116, 17 - - - 165, 20 - - - 16 - - - cmbdomainStrategy + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel1 + + + 15 - + + 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 + + + 4, 22 + + + 6, 21 + + + $this + + + NoControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Routing Settings + + + Remove selected + + + tabPage2 + + + menuExportSelectedRules + + + 202, 22 + + + 475, 17 + + + Domain strategy + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItem1 + + + 0 + + + 757, 511 + + 1 - - 17, 17 - - - 203, 186 + + 6, 12 + + + IPOnDemand + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + Export Selected Rules + + + 0, 0 + + + 765, 60 + + + 0, 25 + + + 95, 21 + + + menuServer + + + Import Rules + + + 120, 21 + + + 19 + + + Import Rules From Url + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + menuSelectAll + + + menuMoveTop + + + 202, 22 cmsLv - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 - - Fill + + menuMoveDown + + + 165, 20 + + + menuImportRulesFromFile + + + Add + + + 247, 22 + + + toolStripSeparator3 + + + True + + + tabPage2 + + + toolStripMenuItem1 + + + menuMoveBottom + + + menuImportRulesFromUrl + + + 95, 12 + + + Import Rules From File + + + 202, 22 + + + 765, 537 + + + 1 + + + RoutingSettingForm + + + panel2 + + + Import Rules From Preset + + + 202, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.MenuStrip, 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 + + + btnClose + + + Up (U) + + + 12 + + + 203, 186 + + + btnOK + + + 116, 17 + + + 14 + + + NoControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3, 3 + + + menuImportRulesFromClipboard + + + Import Rules From Clipboard + + + menuAdd + + + 0, 76 + + + IPIfNonMatch + + + 247, 22 + + + panel2 + + + Move to top (T) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 765, 51 + + + 751, 505 + + + 202, 22 @@ -353,295 +446,166 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 3, 3 + + menuImportRulesFromPreset - - 751, 505 + + &OK - - 12 + + 0, 0, 0, 0 - - lvRoutings + + 247, 22 + + + $this v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - tabPage2 - - - 0 - - - 202, 22 - - - Add - - - 202, 22 - - - Remove selected - - - 202, 22 - - - Select All (Ctrl+A) - - - 202, 22 - - - Export Selected Rules - - - 199, 6 - - - 202, 22 - - - Move to top (T) - - - 202, 22 - - - Up (U) - - - 202, 22 - - - Down (D) - - - 202, 22 - - - Move to bottom (B) - - - 120, 21 - - - Edit and Function - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 0 - - - Fill - - - 0, 76 - - - 765, 537 - - - 14 - - - tabControl2 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - 4, 22 - - - 3, 3, 3, 3 - - - 757, 511 - - - 0 - - - RuleList - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 0 - - - 139, 17 - - - 247, 22 - - - Import Rules From Preset - - - 247, 22 - - - Import Rules From File - - - 247, 22 - - - Import Rules From Clipboard - - - 95, 21 - - - Import Rules - - - 0, 0 - - - 765, 25 - - - 15 - - - menuServer - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - True - - - 6, 12 - - - 765, 673 - - - Routing Settings - - - menuAdd - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemove - - - 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 - - - menuExportSelectedRules - - - 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 - - - MenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuImportRulesFromPreset - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuImportRulesFromFile - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuImportRulesFromClipboard + + 16 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - RoutingSettingForm + + AsIs + + + 202, 22 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Move to bottom (B) + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + panel2 + + + 7 + + + 0 v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + tabControl2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + 0, 613 + + + menuMoveUp + + + RuleList + + + Select All (Ctrl+A) + + + &Cancel + + + 199, 6 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + panel1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 247, 22 + + + 202, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + lvRoutings + + + linkLabelRoutingDoc + + + 202, 22 + + + menuRemove + + + NoControl + + + 765, 673 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 75, 23 + + + 1 + + + 0 + + + 75, 23 + + + tabControl2 + + + 0 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 568, 17 + + + 0 + + + Top + + + True + + + 17, 17 + + + 139, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index c4e5f695..7e6ffcf9 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -243,6 +243,12 @@ 从剪贴板中导入规则 + + 184, 22 + + + 从Url中导入规则 + 92, 21 diff --git a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs new file mode 100644 index 00000000..e085f27f --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs @@ -0,0 +1,106 @@ +namespace v2rayN.Forms +{ + partial class RoutingSubSettingForm + { + /// + /// 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(RoutingSubSettingForm)); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.panel2.SuspendLayout(); + this.panCon.SuspendLayout(); + this.SuspendLayout(); + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // 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); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Controls.Add(this.txtUrl); + this.panCon.Controls.Add(this.label3); + this.panCon.Name = "panCon"; + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // RoutingSubSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel2); + this.Name = "RoutingSubSettingForm"; + this.Load += new System.EventHandler(this.RoutingSubSettingForm_Load); + this.panel2.ResumeLayout(false); + this.panCon.ResumeLayout(false); + this.panCon.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panCon; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.Label label3; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs new file mode 100644 index 00000000..7ccb683d --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingSubSettingForm : BaseForm + { + public string Url; + public RoutingSubSettingForm() + { + InitializeComponent(); + } + + private void RoutingSubSettingForm_Load(object sender, EventArgs e) + { + if (config.ruleSubItem == null) + { + config.ruleSubItem = new List(); + } + if (config.ruleSubItem.Count <= 0) + { + config.ruleSubItem.Add(new SubItem + { + remarks = "def", + url = Global.CustomRoutingListUrl + "custom_routing_rules" + }); + } + txtUrl.Text = config.ruleSubItem[0].url; + } + + private void btnOK_Click(object sender, EventArgs e) + { + var url = txtUrl.Text.Trim(); + + if (Utils.IsNullOrEmpty(url)) + { + return; + } + Url = url; + config.ruleSubItem[0].url = url; + ConfigHandler.SaveRuleSubItem(ref config); + + this.DialogResult = DialogResult.OK; + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx new file mode 100644 index 00000000..144946ab --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + NoControl + + + + 448, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 355, 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, 166 + + + 545, 60 + + + 8 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 83, 19 + + + True + + + 450, 113 + + + 25 + + + txtUrl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panCon + + + 0 + + + True + + + NoControl + + + 12, 19 + + + 23, 12 + + + 24 + + + Url + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panCon + + + 1 + + + Fill + + + 0, 0 + + + 545, 166 + + + 11 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 12 + + + 545, 226 + + + RoutingSubSetting + + + RoutingSubSettingForm + + + 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/RoutingSubSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.zh-Hans.resx new file mode 100644 index 00000000..614f26d1 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.zh-Hans.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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) + + + 确定(&O) + + + + 65, 12 + + + 地址 (url) + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 478fbbd0..0eaf0665 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -20,7 +20,7 @@ namespace v2rayN 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 /// @@ -96,7 +96,7 @@ namespace v2rayN /// /// 阻止 tag值 /// - public const string blockTag = "block"; + public const string blockTag = "block"; /// /// @@ -189,6 +189,7 @@ namespace v2rayN 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.*"; + public const string RoutingRuleComma = ""; #endregion #region 全局变量 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index abdd02f5..5f905f84 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -136,6 +136,10 @@ namespace v2rayN.Handler { config.subItem = new List(); } + if (config.ruleSubItem == null) + { + config.ruleSubItem = new List(); + } if (config == null || config.index < 0 @@ -525,6 +529,12 @@ namespace v2rayN.Handler vmessItem.id = vmessItem.id.TrimEx(); vmessItem.security = vmessItem.security.TrimEx(); + var securitys = new HashSet() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; + if (!securitys.Contains(vmessItem.security)) + { + return -1; + } + if (index >= 0) { //修改 @@ -1125,5 +1135,29 @@ namespace v2rayN.Handler return 0; } + + /// + /// SaveRuleSubItem + /// + /// + /// + public static int SaveRuleSubItem(ref Config config) + { + if (config.ruleSubItem == null || config.ruleSubItem.Count <= 0) + { + return -1; + } + + foreach (SubItem sub in config.ruleSubItem) + { + if (Utils.IsNullOrEmpty(sub.id)) + { + sub.id = Utils.GetGUID(); + } + } + + ToJsonFile(config); + return 0; + } } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index dd1d057a..66612ac8 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -266,8 +266,8 @@ namespace v2rayN.Handler { ((WebClientEx)sender).Dispose(); TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); - UpdateCompleted(this, new ResultEventArgs(true, speed)); + string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.0")); + UpdateCompleted(this, new ResultEventArgs(true, speed.PadLeft(8, ' '))); return; } @@ -276,8 +276,8 @@ namespace v2rayN.Handler { TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); - UpdateCompleted(this, new ResultEventArgs(true, speed)); + string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.0")); + UpdateCompleted(this, new ResultEventArgs(true, speed.PadLeft(8, ' '))); } else { diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 91523091..fb0bd5dd 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -289,7 +289,7 @@ namespace v2rayN.Handler { return "Timeout"; } - return string.Format("{0}{1}", time, unit).PadLeft(6, ' '); + return string.Format("{0}{1}", time, unit).PadLeft(8, ' '); } } } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 6fa3ecb6..43ef1752 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -146,7 +146,7 @@ namespace v2rayN.Handler try { Inbounds inbound = v2rayConfig.inbounds[0]; - //端口 + inbound.tag = Global.InboundSocks; inbound.port = config.inbound[0].localPort; inbound.protocol = config.inbound[0].protocol; if (config.allowLANConn) @@ -157,12 +157,13 @@ namespace v2rayN.Handler { inbound.listen = Global.Loopback; } - //开启udp + //udp inbound.settings.udp = config.inbound[0].udpEnabled; inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; //http Inbounds inbound2 = v2rayConfig.inbounds[1]; + inbound2.tag = Global.InboundHttp; inbound2.port = config.GetLocalPort(Global.InboundHttp); inbound2.protocol = Global.InboundHttp; inbound2.listen = inbound.listen; @@ -231,6 +232,10 @@ namespace v2rayN.Handler var it = Utils.DeepCopy(rules); it.ip = null; it.type = "field"; + for (int k = 0; k < it.domain.Count; k++) + { + it.domain[k] = it.domain[k].Replace(Global.RoutingRuleComma, ","); + } //if (Utils.IsNullOrEmpty(it.port)) //{ // it.port = null; diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index b1b63fe5..da2983bd 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -165,6 +165,10 @@ namespace v2rayN.Mode { get; set; } + public List ruleSubItem + { + get; set; + } public ECoreType coreType { diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index c8e96058..1b7c1162 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.5")] +[assembly: AssemblyFileVersion("4.6")] diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index ea9c4b89..5776ed1f 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -131,6 +131,12 @@ RoutingSettingDetailsForm.cs + + Form + + + RoutingSubSettingForm.cs + @@ -303,9 +309,17 @@ RoutingSettingDetailsForm.cs + Designer RoutingSettingDetailsForm.cs + Designer + + + RoutingSubSettingForm.cs + + + RoutingSubSettingForm.cs SubSettingControl.cs diff --git a/v2rayN/v2rayN/v2rayN.csproj.user b/v2rayN/v2rayN/v2rayN.csproj.user index a36e9eb4..778969a8 100644 --- a/v2rayN/v2rayN/v2rayN.csproj.user +++ b/v2rayN/v2rayN/v2rayN.csproj.user @@ -9,7 +9,7 @@ zh-CN false - ShowAllFiles + ProjectFiles false From 9c96feb4b508007bfad96a665da4176932f9c07e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 23 Jan 2021 11:34:07 +0800 Subject: [PATCH 014/252] up4.7 --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 175 +- v2rayN/v2rayN/Forms/MainForm.cs | 94 +- v2rayN/v2rayN/Forms/MainForm.resx | 2426 +++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 37 +- .../RoutingRuleSettingDetailsForm.Designer.cs | 218 ++ .../Forms/RoutingRuleSettingDetailsForm.cs | 115 + .../Forms/RoutingRuleSettingDetailsForm.resx | 600 ++++ ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 145 + .../Forms/RoutingRuleSettingForm.Designer.cs | 322 +++ v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 334 +++ .../v2rayN/Forms/RoutingRuleSettingForm.resx | 674 +++++ .../Forms/RoutingRuleSettingForm.zh-Hans.resx | 285 ++ .../Forms/RoutingSettingForm.Designer.cs | 132 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 195 +- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 731 +++-- .../Forms/RoutingSettingForm.zh-Hans.resx | 98 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 41 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 218 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 17 + v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 7 +- v2rayN/v2rayN/Mode/Config.cs | 20 +- v2rayN/v2rayN/Mode/RoutingItem.cs | 26 + v2rayN/v2rayN/Mode/RulesItem.cs | 2 - v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 38 +- v2rayN/v2rayN/Resx/ResUI.resx | 12 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 12 + v2rayN/v2rayN/Sample/custom_routing_global | 6 + v2rayN/v2rayN/Sample/custom_routing_white | 24 + v2rayN/v2rayN/v2rayN.csproj | 33 +- 30 files changed, 4790 insertions(+), 2249 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Mode/RoutingItem.cs create mode 100644 v2rayN/v2rayN/Sample/custom_routing_global create mode 100644 v2rayN/v2rayN/Sample/custom_routing_white diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index a208b5dd..93b3aedb 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -72,7 +72,9 @@ this.menuKeepClear = new System.Windows.Forms.ToolStripMenuItem(); this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRoutings = new System.Windows.Forms.ToolStripMenuItem(); this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem(); @@ -140,17 +142,19 @@ // // scMain.Panel1 // + resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // + 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; @@ -169,6 +173,7 @@ // // 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, @@ -203,196 +208,194 @@ 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 // - this.menuAddVlessServer.Name = "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 // - this.menuAddTrojanServer.Name = "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 // - this.tsbTestMe.Name = "tsbTestMe"; resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); + this.tsbTestMe.Name = "tsbTestMe"; this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - this.menuClearServerStatistics.Name = "menuClearServerStatistics"; resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); + this.menuClearServerStatistics.Name = "menuClearServerStatistics"; this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_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 // + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // // qrCodeControl @@ -402,17 +405,19 @@ // // 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.menuRoutings, this.menuServers, + this.toolStripSeparator13, this.menuAddServers2, this.menuScanScreen2, this.menuUpdateSubscriptions, @@ -425,63 +430,73 @@ // // menuSysAgentMode // + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - this.menuKeepClear.Name = "menuKeepClear"; resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - this.menuGlobal.Name = "menuGlobal"; resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - this.menuKeepNothing.Name = "menuKeepNothing"; resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); + this.menuKeepNothing.Name = "menuKeepNothing"; this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // + // menuRoutings + // + resources.ApplyResources(this.menuRoutings, "menuRoutings"); + this.menuRoutings.Name = "menuRoutings"; + // // menuServers // - this.menuServers.Name = "menuServers"; resources.ApplyResources(this.menuServers, "menuServers"); + this.menuServers.Name = "menuServers"; + // + // toolStripSeparator13 + // + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); + this.toolStripSeparator13.Name = "toolStripSeparator13"; // // 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); // // menuUpdateSubscriptions // - this.menuUpdateSubscriptions.Name = "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 @@ -492,30 +507,31 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.scMain); 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.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, @@ -527,7 +543,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); // @@ -538,8 +553,8 @@ // // toolSslSocksPort // - this.toolSslSocksPort.Name = "toolSslSocksPort"; resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); + this.toolSslSocksPort.Name = "toolSslSocksPort"; // // toolSslBlank1 // @@ -554,8 +569,8 @@ // // toolSslHttpPort // - this.toolSslHttpPort.Name = "toolSslHttpPort"; resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); + this.toolSslHttpPort.Name = "toolSslHttpPort"; // // toolSslBlank2 // @@ -577,8 +592,8 @@ // // toolSslBlank4 // - this.toolSslBlank4.Name = "toolSslBlank4"; resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; // // panel1 // @@ -587,6 +602,7 @@ // // 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, @@ -604,75 +620,74 @@ 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; - resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); 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"; // // tsbSetting // + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - this.tsbOptionSetting.Name = "tsbOptionSetting"; resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Name = "tsbOptionSetting"; this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - this.tsbRoutingSetting.Name = "tsbRoutingSetting"; resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator5 // - this.toolStripSeparator5.Name = "toolStripSeparator5"; resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + this.toolStripSeparator5.Name = "toolStripSeparator5"; // // tsbReload // @@ -682,44 +697,45 @@ // // 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.tsbCheckUpdateXrayCore}); 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); // // tsbCheckUpdateXrayCore // - this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_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, @@ -727,50 +743,49 @@ 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 // - this.tsbV2rayWebsite.Name = "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 // @@ -904,6 +919,8 @@ private System.Windows.Forms.ToolStripMenuItem tsbRoutingSetting; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateXrayCore; private System.Windows.Forms.ToolStripMenuItem menuClearServerStatistics; + private System.Windows.Forms.ToolStripMenuItem menuRoutings; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 54dfd491..a0525134 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -47,6 +47,7 @@ namespace v2rayN.Forms private void MainForm_Load(object sender, EventArgs e) { ConfigHandler.LoadConfig(ref config); + ConfigHandler.InitBuiltinRouting(ref config); v2rayHandler = new V2rayHandler(); v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; @@ -73,6 +74,7 @@ namespace v2rayN.Forms { InitServersView(); RefreshServers(); + RefreshRoutingsMenu(); RestoreUI(); LoadV2ray(); @@ -477,7 +479,6 @@ namespace v2rayN.Forms fm.EditIndex = index; if (fm.ShowDialog() == DialogResult.OK) { - //刷新 RefreshServers(); LoadV2ray(); } @@ -568,7 +569,6 @@ namespace v2rayN.Forms { ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); } - //刷新 RefreshServers(); LoadV2ray(); @@ -583,7 +583,6 @@ namespace v2rayN.Forms { config.vmess = servers; } - //刷新 RefreshServers(); LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); @@ -598,7 +597,6 @@ namespace v2rayN.Forms } if (ConfigHandler.CopyServer(ref config, index) == 0) { - //刷新 RefreshServers(); } } @@ -737,7 +735,6 @@ namespace v2rayN.Forms OptionSettingForm fm = new OptionSettingForm(); if (fm.ShowDialog() == DialogResult.OK) { - //刷新 RefreshServers(); LoadV2ray(); } @@ -745,10 +742,10 @@ namespace v2rayN.Forms private void tsbRoutingSetting_Click(object sender, EventArgs e) { - RoutingSettingForm fm = new RoutingSettingForm(); + var fm = new RoutingSettingForm(); if (fm.ShowDialog() == DialogResult.OK) { - //刷新 + RefreshRoutingsMenu(); RefreshServers(); LoadV2ray(); } @@ -780,7 +777,6 @@ namespace v2rayN.Forms } if (ConfigHandler.SetDefaultServer(ref config, index) == 0) { - //刷新 RefreshServers(); LoadV2ray(); } @@ -837,7 +833,6 @@ namespace v2rayN.Forms if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) { - //刷新 RefreshServers(); //LoadV2ray(); UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); @@ -869,10 +864,11 @@ namespace v2rayN.Forms private void menuAddServers_Click(object sender, EventArgs e) { string clipboardData = Utils.GetClipboardData(); - int result = AddBatchServers(clipboardData); - if (result > 0) + int ret = MainFormHandler.Instance.AddBatchServers(config, clipboardData); + if (ret > 0) { - UI.Show(string.Format(UIRes.I18N("SuccessfullyImportedServerViaClipboard"), result)); + RefreshServers(); + UI.Show(string.Format(UIRes.I18N("SuccessfullyImportedServerViaClipboard"), ret)); } } @@ -882,23 +878,6 @@ namespace v2rayN.Forms 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(); @@ -1388,8 +1367,10 @@ namespace v2rayN.Forms } else { - if (AddBatchServers(result) > 0) + int ret = MainFormHandler.Instance.AddBatchServers(config, result); + if (ret > 0) { + RefreshServers(); UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); } } @@ -1456,7 +1437,8 @@ namespace v2rayN.Forms ConfigHandler.RemoveServerViaSubid(ref config, id); AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); RefreshServers(); - if (AddBatchServers(result, id) > 0) + int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); + if (ret > 0) { } else @@ -1509,5 +1491,55 @@ namespace v2rayN.Forms #endregion + + + #region RoutingsMenu + + /// + /// + /// + private void RefreshRoutingsMenu() + { + menuRoutings.DropDownItems.Clear(); + + List lst = new List(); + for (int k = 0; k < config.routings.Count; k++) + { + var item = config.routings[k]; + string name = item.remarks; + + ToolStripMenuItem ts = new ToolStripMenuItem(name) + { + Tag = k + }; + if (config.routingIndex.Equals(k)) + { + ts.Checked = true; + } + ts.Click += new EventHandler(ts_Routing_Click); + lst.Add(ts); + } + menuRoutings.DropDownItems.AddRange(lst.ToArray()); + } + + private void ts_Routing_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + int index = Utils.ToInt(ts.Tag); + + if (ConfigHandler.SetDefaultRouting(ref config, index) == 0) + { + RefreshRoutingsMenu(); + LoadV2ray(); + } + } + catch + { + } + } + #endregion + } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 08f3f3fc..46211fac 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,214 +117,712 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + Remove duplicate servers - - 3, 17 - - - 327, 17 - - + 355, 22 - - Add [VMess] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 355, 22 + + + 97, 53 + + 355, 22 Add [VLESS] server - - 355, 22 + + 2 - - Add [Shadowsocks] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + Restart service + + + menuCopyServer + + + 264, 22 + + + groupBox2 + + + menuMoveUp Add [Socks] server + + 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 + + + + ImageAboveText + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 语言-[中文简体] + + + NoControl + + + Settings + + + tsbHelp + + + + 0 + + + False + + + toolStripSeparator6 + 355, 22 - - Add [Trojan] server + + 99, 53 - - 355, 22 + + Update subscriptions - - Add a custom configuration server + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + 187, 22 - - Import bulk URL from clipboard (Ctrl+V) + + tsbSetting - - 355, 22 - - - Scan QR code on the screen (Ctrl+S) - - - 352, 6 + + toolSslBlank2 355, 22 - - Remove selected servers (Delete) - - + 355, 22 - - Remove duplicate servers + + tsbCheckUpdateN + + + Do not change system proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + toolStripSeparator7 + + + Update v2flyCore + + + Magenta + + + menuKeepNothing 355, 22 - - Clone selected server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + Fill - - Set as active server (Enter) + + 52, 21 - - 352, 6 + + Share + + + Subscriptions + + + 952, 327 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 - - Move to top (T) - - - 355, 22 - - - Up (U) - - - 355, 22 - - - Down (D) - - - 355, 22 - - - Move to bottom (B) - - - 355, 22 - - - Select All (Ctrl+A) - - - 352, 6 - - - 355, 22 - - - Test servers ping (Ctrl+P) - - - 355, 22 - - - Test servers with tcping (Ctrl+O) - - - 355, 22 - - - Test servers real delay (Ctrl+R) - - - 355, 22 - - - Test servers download speed (Ctrl+T) - - - 355, 22 - - - Test current service status - - - 355, 22 - - - Clear all service statistics - - - 352, 6 - - - 355, 22 - Export selected server for client configuration - - 355, 22 + + tsbRoutingSetting + + + 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 Export selected server for server configuration - - 355, 22 + + 0, 21 - - Export share URLs to clipboard (Ctrl+C) + + toolStripSeparator11 - - 355, 22 + + 952, 56 - - Export subscription (base64) share to clipboard + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Magenta + + 0 - - 64, 53 + + Test servers real delay (Ctrl+R) - - Servers + + menuTcpingServer - + ImageAboveText + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 356, 622 - - cmsLv + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + 355, 22 + + + toolStripSeparator1 + + + 3 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + 125, 22 + + + 256, 307 + + + 187, 22 + + + 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 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + + + + Servers + + + 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, 21 + + + menuAddCustomServer + + + menuMoveDown + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Import bulk URL from clipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Move to bottom (B) + + + toolSslBlank3 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 12 + + + 48, 53 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 206, 21 + + + 0 + + + 686, 307 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepClear + + + 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 + + + Export share URLs to clipboard (Ctrl+C) + + + scMain.Panel2 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 39, 21 + + + menuAddServers2 + + + Fill + + + 3 + + + Add [VMess] server + + + 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.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tsbAbout + + + 206, 21 + + + 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 + + + tsbPromotion + + + 128, 53 + + + 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 + + + 352, 6 + + + groupBox1 + + + 206, 21 + + + 2 + + + 125, 22 + + + Clear all service statistics + + + scMain.Panel2 + + + menuRoutings + + + 161, 22 + + + 355, 22 + + + 187, 22 + + + 6, 56 + + + Test servers download speed (Ctrl+T) + + + ssMain + + + 686 + + + tsbTestMe + + + 265, 170 + + + 243, 22 + + + $this + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + Check for updates + + + tsbCheckUpdateXrayCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 21 + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 203, 22 + + + HTTP: + + + Remove selected servers (Delete) + + + 0 + + + Help + + + menuSelectAll + + + Move to top (T) + + + 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 + + + Scan QR code on the screen (Ctrl+S) + + + ImageAboveText + + + 1 + + + Promotion + + + menuAddServers + + + 355, 22 + + + menuAddVmessServer + + + tsbLanguageZhHans + + + menuRemoveDuplicateServer + + + BottomCenter + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsMain + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + SOCKS5: + + + 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 + + + 5 + + + tsbV2rayWebsite + + + Server + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + menuAddShadowsocksServer + + + txtMsgBox + + + toolSslBlank4 + + + menuAddTrojanServer + + + 261, 6 + + + v2rayN + + + Language-[English] + + + tsbSubSetting + + + 264, 22 + + + 0 + + + Fill + + + Routing + + + Add [Trojan] server + + + 161, 22 + + + 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 + + + ImageAboveText System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill + + 0, 393 + + + 352, 6 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + V2Ray Website + + + No + + + 1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + OptionSetting + + + menuMoveTop + + + tsbCheckUpdateCore @@ -343,1115 +841,641 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 0, 0 - - - 686, 307 - - - - 0 - - - lvServers - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel1 - - - 0 - - - scMain.Panel1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 0 - - - Fill - - - 0, 0 - - - 4, 4, 4, 4 - - - 256, 307 - - - 2 - - - qrCodeControl - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel2 - - - 0 - - - scMain.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 1 - - - 100 - - - 946, 307 - - - 686 - - - 0 - - - scMain - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 17, 17 - - - 137, 17 - - - NoControl - - - 262, 22 - - - Clear system proxy - - - 262, 22 - - - Set system proxy (global mode) - - - 262, 22 - - - Do not change system proxy - - - 264, 22 - - - Http proxy - - - 264, 22 - - - Server - - - 264, 22 - - - Import bulk URL from clipboard - - - 264, 22 - - - Scan QR code on the screen - - - 264, 22 - - - Update subscriptions - - - 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, 327 - - - 0 - - - Servers list - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - Fill - - - 3, 17 - - - 0 - - - True - - - Vertical - - - 946, 154 - - - 3 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - 228, 18 - - - 微软雅黑, 8pt - - - 52, 21 - - - SOCKS5: - - - 0, 21 - - - 微软雅黑, 8pt - - - 206, 21 - - - 微软雅黑, 8pt - - - 39, 21 - - - HTTP: - - - 0, 21 - - - 微软雅黑, 8pt - - - 206, 21 - - - 微软雅黑, 8pt - - - 206, 21 - - - False - - - 微软雅黑, 8pt - - - No - - - 220, 21 - - - SPEED Disabled - - - MiddleRight - - - 0, 21 - - - 3, 171 - - - 946, 26 - - - 0 - - - statusStrip1 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - Bottom - - - 0, 393 - - - 952, 200 - - - 3 - - - Informations - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - Top - - - 0, 56 - - - 952, 10 - - - 2 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - 409, 17 - - - 6, 56 - - - 125, 22 - - - Settings - - - 125, 22 - - - Updates - - - Magenta - - - 99, 53 - - - Subscriptions - - - ImageAboveText - - - Magenta - - - 45, 53 - - - Share - - - BottomCenter - - - ImageAboveText - - - 6, 56 - - - 161, 22 - - - OptionSetting - - - 161, 22 - - - RoutingSetting - - - Magenta - - - 67, 53 - - - Settings + + menuScanScreen ImageAboveText + + cmsLv + + + toolStripSeparator12 + 6, 56 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - + + toolSslBlank1 - - BottomCenter + + scMain.Panel1 - - Magenta + + tsbReload - - 97, 53 + + tsbSubUpdate - - Restart service + + 微软雅黑, 8pt - + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + SPEED Disabled + + + 355, 22 + + + 67, 53 + + + menuSysAgentMode + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText - + + 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 + + + RoutingSetting + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + 3, 171 + + + True + + + 355, 22 + + 6, 56 - - 203, 22 + + 952, 10 - - v2rayN (this software) + + Updates - - 203, 22 + + 264, 22 - - Update v2flyCore + + 0 - - 203, 22 - - - Update XrayCore - - - Magenta - - - 128, 53 - - - Check for updates - - - ImageAboveText - - - 6, 56 - - - 187, 22 - - - v2rayN Project - - - 187, 22 - - - V2Ray Website - - - 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.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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Settings + + + 45, 53 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Http proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + 4, 4, 4, 4 + + + Magenta + + + 355, 22 + + + v2rayN Project + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + Informations + + + $this + + + 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 + + + menuSpeedServer + + + 355, 22 + + + menuRemoveServer + + + tsbServer + + + Test current service status + + + 355, 22 + + + 946, 154 + + + 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) + + + 352, 6 + + + Magenta + + + 243, 22 + + + 355, 22 + + + tsbSub + + + Magenta + + + ImageAboveText + + + Clone selected server + + + 0, 0 + + + 355, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + Vertical + + + 243, 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 + + + $this + + + 0, 0 + + + qrCodeControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Clear system proxy + + + 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 + + + groupBox2 + + + ImageAboveText + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + 184, 6 + + + 0, 0 + + + Up (U) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + Set system proxy + + + 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, 26 + + + 355, 22 + + + Set as active server (Enter) + + + menuAddVlessServer + + + 946, 307 + + + 6, 56 + + + Add [Shadowsocks] server + + + 261, 6 + + + 微软雅黑, 8pt + + + 952, 593 + + + Scan QR code on the screen + + + toolSslSocksPort + + + toolStripSeparator10 + + + toolSslHttpPortLab + + + menuMoveBottom + + + 1 + + + Magenta + + + menuExport2ClientConfig + + + 187, 22 + + + menuExport2ServerConfig + + + 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ImageAboveText + + 264, 22 + 6, 56 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Magenta 52, 53 + + 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 + + + Exit + + + menuClearServerStatistics + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 56 + Close - - ImageAboveText + + 264, 22 - - 0, 0 + + 0, 21 - - 952, 56 + + 0 - - 1 + + Import bulk URL from clipboard (Ctrl+V) - - tsMain + + Update XrayCore - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolStripSeparator2 - - $this + + toolSslSocksPortLab - - 5 + + Add a custom configuration server + + toolSslHttpPort + + + bgwScan + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 952, 200 + + + statusStrip1 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 + + + toolStripSeparator3 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + 355, 22 + + + 355, 22 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 228, 18 + + + zh-Hans + 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 - - - menuAddVlessServer - - - 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 - - - menuAddTrojanServer - - - 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 - - - tsbTestMe - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuClearServerStatistics - - - 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 - - - menuKeepClear - - - 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 - - - menuKeepNothing - - - 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 - - - menuUpdateSubscriptions - - - 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 - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbQRCodeSwitch - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator8 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSetting - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbOptionSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbRoutingSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator5 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbReload - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdate - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateN - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateXrayCore - - - 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 - - - tsbV2rayWebsite - - - 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 - + + 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 f75d3073..42204a5f 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -292,14 +292,8 @@ 批量导出订阅内容至剪贴板(多选) - - 73, 53 - - - 服务器 - - 301, 600 + 301, 622 @@ -318,20 +312,26 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + 73, 53 + + + 服务器 + - 228, 22 + 172, 22 清除系统代理 - 228, 22 + 172, 22 - 自动配置系统代理(全局模式) + 自动配置系统代理 - 228, 22 + 172, 22 不改变系统代理 @@ -342,12 +342,21 @@ 系统代理 + + 195, 22 + + + 路由 + 195, 22 服务器 + + 192, 6 + 195, 22 @@ -376,7 +385,7 @@ 退出 - 196, 142 + 196, 192 服务器列表 @@ -388,13 +397,13 @@ 信息 - 124, 22 + 180, 22 订阅设置 - 124, 22 + 180, 22 更新订阅 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs new file mode 100644 index 00000000..d33ade0f --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -0,0 +1,218 @@ +namespace v2rayN.Forms +{ + partial class RoutingRuleSettingDetailsForm + { + /// + /// 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(RoutingRuleSettingDetailsForm)); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.clbProtocol = new System.Windows.Forms.CheckedListBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); + this.panel4 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtIP = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtDomain = new System.Windows.Forms.TextBox(); + this.panel3.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panel2.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // panel3 + // + this.panel3.Controls.Add(this.clbProtocol); + this.panel3.Controls.Add(this.label3); + this.panel3.Controls.Add(this.txtPort); + this.panel3.Controls.Add(this.label1); + this.panel3.Controls.Add(this.labRoutingTips); + this.panel3.Controls.Add(this.label4); + this.panel3.Controls.Add(this.cmbOutboundTag); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // clbProtocol + // + this.clbProtocol.CheckOnClick = true; + resources.ApplyResources(this.clbProtocol, "clbProtocol"); + this.clbProtocol.FormattingEnabled = true; + this.clbProtocol.Items.AddRange(new object[] { + resources.GetString("clbProtocol.Items"), + resources.GetString("clbProtocol.Items1"), + resources.GetString("clbProtocol.Items2")}); + this.clbProtocol.MultiColumn = true; + this.clbProtocol.Name = "clbProtocol"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbOutboundTag + // + this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutboundTag.FormattingEnabled = true; + this.cmbOutboundTag.Items.AddRange(new object[] { + resources.GetString("cmbOutboundTag.Items"), + resources.GetString("cmbOutboundTag.Items1"), + resources.GetString("cmbOutboundTag.Items2")}); + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); + this.cmbOutboundTag.Name = "cmbOutboundTag"; + // + // panel4 + // + this.panel4.Controls.Add(this.btnClose); + this.panel4.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Name = "panel4"; + // + // 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); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel2 + // + this.panel2.Controls.Add(this.groupBox2); + this.panel2.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.txtIP); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtIP + // + resources.ApplyResources(this.txtIP, "txtIP"); + this.txtIP.Name = "txtIP"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtDomain + // + resources.ApplyResources(this.txtDomain, "txtDomain"); + this.txtDomain.Name = "txtDomain"; + // + // RoutingRuleSettingDetailsForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel4); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.Name = "RoutingRuleSettingDetailsForm"; + this.Load += new System.EventHandler(this.RoutingRuleSettingDetailsForm_Load); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel4.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbOutboundTag; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtDomain; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtIP; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckedListBox clbProtocol; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs new file mode 100644 index 00000000..a11e589d --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingRuleSettingDetailsForm : BaseForm + { + public RulesItem rulesItem + { + get; set; + } + + public RoutingRuleSettingDetailsForm() + { + InitializeComponent(); + } + + private void RoutingRuleSettingDetailsForm_Load(object sender, EventArgs e) + { + if (Utils.IsNullOrEmpty(rulesItem.outboundTag)) + { + ClearBind(); + } + else + { + BindingData(); + } + } + + private void EndBindingData() + { + if (rulesItem != null) + { + rulesItem.port = txtPort.Text.TrimEx(); + rulesItem.outboundTag = cmbOutboundTag.Text; + rulesItem.domain = Utils.String2List(txtDomain.Text); + rulesItem.ip = Utils.String2List(txtIP.Text); + + var protocol = new List(); + for (int i = 0; i < clbProtocol.Items.Count; i++) + { + if (clbProtocol.GetItemChecked(i)) + { + protocol.Add(clbProtocol.Items[i].ToString()); + } + } + rulesItem.protocol = protocol; + } + } + private void BindingData() + { + if (rulesItem != null) + { + txtPort.Text = rulesItem.port ?? string.Empty; + cmbOutboundTag.Text = rulesItem.outboundTag; + txtDomain.Text = Utils.List2String(rulesItem.domain, true); + txtIP.Text = Utils.List2String(rulesItem.ip, true); + + if (rulesItem.protocol != null) + { + for (int i = 0; i < clbProtocol.Items.Count; i++) + { + if (rulesItem.protocol.Contains(clbProtocol.Items[i].ToString())) + { + clbProtocol.SetItemChecked(i, true); + } + } + } + } + } + private void ClearBind() + { + txtPort.Text = string.Empty; + cmbOutboundTag.Text = Global.agentTag; + txtDomain.Text = string.Empty; + txtIP.Text = string.Empty; + } + private void btnOK_Click(object sender, EventArgs e) + { + EndBindingData(); + var hasRule = false; + if (rulesItem.domain != null && rulesItem.domain.Count > 0) + { + hasRule = true; + } + if (rulesItem.ip != null && rulesItem.ip.Count > 0) + { + hasRule = true; + } + if (rulesItem.protocol != null && rulesItem.protocol.Count > 0) + { + hasRule = true; + } + if (!Utils.IsNullOrEmpty(rulesItem.port)) + { + hasRule = true; + } + if (!hasRule) + { + UI.ShowWarning(string.Format(UIRes.I18N("RoutingRuleDetailRequiredTips"), "Port/Protocol/Domain/IP")); + return; + } + this.DialogResult = DialogResult.OK; + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx new file mode 100644 index 00000000..9149d44a --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -0,0 +1,600 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Top + + + + 0, 0 + + + 742, 10 + + + + 7 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 80 + + + http + + + tls + + + bittorrent + + + 347, 43 + + + 245, 20 + + + 39 + + + clbProtocol + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + True + + + NoControl + + + 274, 47 + + + 53, 12 + + + 36 + + + Protocol + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + 107, 43 + + + 119, 21 + + + 35 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + True + + + NoControl + + + 19, 47 + + + 29, 12 + + + 34 + + + Port + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + NoControl + + + 19, 82 + + + 598, 16 + + + 33 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 4 + + + True + + + NoControl + + + 19, 20 + + + 71, 12 + + + 32 + + + outboundTag + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + proxy + + + direct + + + block + + + 107, 16 + + + 119, 20 + + + 31 + + + cmbOutboundTag + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 6 + + + Top + + + 0, 10 + + + 742, 111 + + + 8 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + NoControl + + + 504, 15 + + + 75, 23 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + NoControl + + + 411, 15 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Bottom + + + 0, 516 + + + 742, 60 + + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Fill + + + 3, 17 + + + True + + + 344, 375 + + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 350, 395 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 386, 375 + + + 24 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 395 + + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Fill + + + 0, 121 + + + 742, 395 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 12 + + + 742, 576 + + + RoutingSettingDetailsForm + + + RoutingRuleSettingDetailsForm + + + 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/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx new file mode 100644 index 00000000..bac9081a --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 + + + + 71, 12 + + + OutboundTag + + + 29, 12 + + + 别名 + + + 取消(&C) + + + 确定(&O) + + + 路由规则详情设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs new file mode 100644 index 00000000..a0dbe650 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs @@ -0,0 +1,322 @@ +namespace v2rayN.Forms +{ + partial class RoutingRuleSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); + this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExportSelectedRules = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromFile = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.cmsLv.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.menuServer.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); + // + // 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.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtUrl); + this.panel1.Controls.Add(this.label3); + this.panel1.Controls.Add(this.txtRemarks); + this.panel1.Controls.Add(this.label2); + this.panel1.Name = "panel1"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // lvRoutings + // + resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.ContextMenuStrip = this.cmsLv; + this.lvRoutings.FullRowSelect = true; + this.lvRoutings.GridLines = true; + this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvRoutings.HideSelection = false; + this.lvRoutings.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvRoutings.Items")))}); + this.lvRoutings.MultiSelect = false; + this.lvRoutings.Name = "lvRoutings"; + this.lvRoutings.UseCompatibleStateImageBehavior = false; + this.lvRoutings.View = System.Windows.Forms.View.Details; + this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); + this.lvRoutings.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvRoutings_KeyDown); + // + // 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.menuAdd, + this.menuRemove, + this.menuSelectAll, + this.menuExportSelectedRules, + this.toolStripSeparator3, + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom}); + this.cmsLv.Name = "cmsLv"; + // + // menuAdd + // + resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Name = "menuAdd"; + this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); + // + // menuRemove + // + resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Name = "menuRemove"; + this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); + // + // menuSelectAll + // + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // menuExportSelectedRules + // + resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); + this.menuExportSelectedRules.Name = "menuExportSelectedRules"; + this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_Click); + // + // toolStripSeparator3 + // + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // menuMoveTop + // + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); + this.menuMoveTop.Name = "menuMoveTop"; + this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); + // + // menuMoveUp + // + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); + this.menuMoveUp.Name = "menuMoveUp"; + this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); + // + // menuMoveDown + // + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); + this.menuMoveDown.Name = "menuMoveDown"; + this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); + // + // menuMoveBottom + // + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); + this.menuMoveBottom.Name = "menuMoveBottom"; + this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); + // + // MenuItem1 + // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + this.MenuItem1.DropDown = this.cmsLv; + this.MenuItem1.Name = "MenuItem1"; + // + // tabControl2 + // + resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Controls.Add(this.tabPage2); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + // + // tabPage2 + // + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Controls.Add(this.lvRoutings); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // menuServer + // + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1, + this.toolStripMenuItem1}); + this.menuServer.Name = "menuServer"; + // + // toolStripMenuItem1 + // + resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); + this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuImportRulesFromFile, + this.menuImportRulesFromClipboard, + this.menuImportRulesFromUrl}); + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + // + // menuImportRulesFromFile + // + resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); + this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; + this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); + // + // menuImportRulesFromClipboard + // + resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); + this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; + this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); + // + // menuImportRulesFromUrl + // + resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); + this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; + this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click); + // + // RoutingRuleSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.tabControl2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "RoutingRuleSettingForm"; + this.Load += new System.EventHandler(this.RoutingRuleSettingForm_Load); + this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.cmsLv.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel1; + private Base.ListViewFlickerFree lvRoutings; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.ContextMenuStrip cmsLv; + private System.Windows.Forms.ToolStripMenuItem menuRemove; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripMenuItem menuSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuAdd; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromFile; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromClipboard; + private System.Windows.Forms.ToolStripMenuItem menuExportSelectedRules; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromUrl; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs new file mode 100644 index 00000000..2c708f4a --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingRuleSettingForm : BaseForm + { + public int EditIndex + { + get; set; + } + protected RoutingItem routingItem = null; + + private List lvSelecteds = new List(); + public RoutingRuleSettingForm() + { + InitializeComponent(); + } + + private void RoutingRuleSettingForm_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + routingItem = config.routings[EditIndex]; + } + else + { + routingItem = new RoutingItem(); + } + if (routingItem.rules == null) + { + routingItem.rules = new List(); + } + + txtRemarks.Text = routingItem.remarks ?? string.Empty; + txtUrl.Text = routingItem.url ?? string.Empty; + + InitRoutingsView(); + RefreshRoutingsView(); + } + + private void InitRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + lvRoutings.GridLines = true; + lvRoutings.FullRowSelect = true; + lvRoutings.View = View.Details; + lvRoutings.MultiSelect = true; + lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; + + lvRoutings.Columns.Add("", 30); + lvRoutings.Columns.Add("outboundTag", 80); + lvRoutings.Columns.Add("port", 80); + lvRoutings.Columns.Add("protocol", 100); + lvRoutings.Columns.Add("domain", 160); + lvRoutings.Columns.Add("ip", 160); + + lvRoutings.EndUpdate(); + } + + private void RefreshRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + for (int k = 0; k < routingItem.rules.Count; k++) + { + var item = routingItem.rules[k]; + + ListViewItem lvItem = new ListViewItem(""); + Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); + Utils.AddSubItem(lvItem, "port", item.port); + Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol)); + Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); + Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); + + if (lvItem != null) lvRoutings.Items.Add(lvItem); + } + lvRoutings.EndUpdate(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + routingItem.remarks = txtRemarks.Text.Trim(); + routingItem.url = txtUrl.Text.Trim(); + + if (ConfigHandler.AddRoutingItem(ref config, routingItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void lvRoutings_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + var fm = new RoutingRuleSettingDetailsForm(); + fm.rulesItem = routingItem.rules[index]; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsView(); + } + } + + private int GetLvSelectedIndex() + { + int index = -1; + lvSelecteds.Clear(); + try + { + if (lvRoutings.SelectedIndices.Count <= 0) + { + UI.Show(UIRes.I18N("PleaseSelectRules")); + return index; + } + + index = lvRoutings.SelectedIndices[0]; + foreach (int i in lvRoutings.SelectedIndices) + { + lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + #region Edit function + + private void menuMoveTop_Click(object sender, EventArgs e) + { + MoveRule(EMove.Top); + } + + private void menuMoveUp_Click(object sender, EventArgs e) + { + MoveRule(EMove.Up); + } + + private void menuMoveDown_Click(object sender, EventArgs e) + { + MoveRule(EMove.Down); + } + + private void menuMoveBottom_Click(object sender, EventArgs e) + { + MoveRule(EMove.Bottom); + } + + private void MoveRule(EMove eMove) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectRules")); + return; + } + if (ConfigHandler.MoveRoutingRule(ref routingItem, index, eMove) == 0) + { + RefreshRoutingsView(); + } + } + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvRoutings.Items) + { + item.Selected = true; + } + } + + private void menuAdd_Click(object sender, EventArgs e) + { + var fm = new RoutingRuleSettingDetailsForm(); + fm.rulesItem = new RulesItem(); + if (fm.ShowDialog() == DialogResult.OK) + { + routingItem.rules.Add(fm.rulesItem); + RefreshRoutingsView(); + } + } + + private void menuRemove_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(UIRes.I18N("RemoveRules")) == DialogResult.No) + { + return; + } + for (int k = lvSelecteds.Count - 1; k >= 0; k--) + { + routingItem.rules.RemoveAt(index); + } + RefreshRoutingsView(); + } + private void menuExportSelectedRules_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + var lst = new List(); + foreach (int v in lvSelecteds) + { + lst.Add(routingItem.rules[v]); + } + if (lst.Count > 0) + { + Utils.SetClipboardData(Utils.ToJson(lst)); + UI.Show(UIRes.I18N("OperationSuccess")); + } + + } + + private void lvRoutings_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuSelectAll_Click(null, null); + break; + case Keys.C: + menuExportSelectedRules_Click(null, null); + break; + } + } + else + { + switch (e.KeyCode) + { + case Keys.Delete: + menuRemove_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; + } + } + } + #endregion + + #region preset rules + + private void menuImportRulesFromFile_Click(object sender, EventArgs e) + { + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Rules|*.json|All|*.*" + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + return; + } + + if (ConfigHandler.AddBatchRoutingRules(ref routingItem, result) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } + + private void menuImportRulesFromClipboard_Click(object sender, EventArgs e) + { + string clipboardData = Utils.GetClipboardData(); + if (ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } + private void menuImportRulesFromUrl_Click(object sender, EventArgs e) + { + var url = txtUrl.Text.Trim(); + if (Utils.IsNullOrEmpty(url)) + { + UI.Show(UIRes.I18N("MsgNeedUrl")); + return; + } + DownloadHandle downloadHandle = new DownloadHandle(); + string clipboardData = downloadHandle.WebDownloadStringSync(url); + if (ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData) == 0) + { + RefreshRoutingsView(); + UI.Show(UIRes.I18N("OperationSuccess")); + } + } + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx new file mode 100644 index 00000000..8063cbb9 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + System.Windows.Forms.TabControl, 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 + + + + 199, 6 + + + + Fill + + + menuImportRulesFromUrl + + + Down (D) + + + 762, 25 + + + + 32 + + + 1 + + + 47, 12 + + + Move to bottom (B) + + + Bottom + + + Edit and Function + + + panel1 + + + $this + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + System.Windows.Forms.TabPage, 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 + + + panel1 + + + 15 + + + 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 + + + 4, 22 + + + $this + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Rule Settings + + + Remove selected + + + NoControl + + + tabPage2 + + + 0 + + + 202, 22 + + + 475, 17 + + + 75, 23 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33 + + + MenuItem1 + + + 0 + + + 754, 362 + + + 1 + + + 568, 17 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + Fill + + + 0, 0 + + + label1 + + + 762, 60 + + + Sub Url + + + 95, 21 + + + panel1 + + + menuServer + + + True + + + 120, 21 + + + True + + + Import Rules From Sub Url + + + 2 + + + menuSelectAll + + + menuMoveTop + + + 202, 22 + + + cmsLv + + + 5 + + + Add + + + 12 + + + toolStripSeparator3 + + + panel1 + + + tabPage2 + + + toolStripMenuItem1 + + + menuMoveBottom + + + 0, 25 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 18, 63 + + + Import Rules From File + + + 202, 22 + + + 762, 388 + + + 1 + + + RoutingRuleSettingForm + + + panel2 + + + 202, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.MenuStrip, 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 + + + btnClose + + + Up (U) + + + 203, 186 + + + btnOK + + + 47, 12 + + + 14 + + + Import Rules + + + NoControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3, 3 + + + menuImportRulesFromClipboard + + + Import Rules From Clipboard + + + panel1 + + + menuAdd + + + 0, 127 + + + 247, 22 + + + panel2 + + + Move to top (T) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 762, 102 + + + txtUrl + + + 748, 356 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 34 + + + &OK + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 247, 22 + + + $this + + + 35 + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 18, 45 + + + 31 + + + 91, 45 + + + 166, 21 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 644, 48 + + + menuMoveDown + + + 202, 22 + + + Export Selected Rules + + + menuImportRulesFromFile + + + label3 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + panel2 + + + 7 + + + panel1 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabControl2 + + + Remarks + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + 0, 515 + + + menuMoveUp + + + RuleList + + + Select All (Ctrl+A) + + + 53, 12 + + + 6, 12 + + + menuExportSelectedRules + + + Optional + + + 91, 13 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 247, 22 + + + 202, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + lvRoutings + + + 202, 22 + + + label2 + + + menuRemove + + + True + + + 18, 13 + + + NoControl + + + 762, 575 + + + System.Windows.Forms.ToolStripMenuItem, 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 + + + 202, 22 + + + 2 + + + &Cancel + + + 3 + + + NoControl + + + 4 + + + 3 + + + 75, 23 + + + tabControl2 + + + 0 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtRemarks + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 0 + + + Top + + + True + + + 17, 17 + + + zh-Hans + + + 139, 17 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx new file mode 100644 index 00000000..d81b8ff0 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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) + + + + 0, 613 + + + 785, 60 + + + 确定(&O) + + + 785, 109 + + + 29, 12 + + + 可选 + + + 101, 45 + + + 83, 12 + + + 订阅地址(Url) + + + 101, 13 + + + 29, 12 + + + 别名 + + + 197, 186 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 771, 447 + + + 196, 22 + + + 添加规则 + + + 196, 22 + + + 移除所选规则 + + + 196, 22 + + + 全选 + + + 196, 22 + + + 导出所选规则至剪贴板 + + + 193, 6 + + + 196, 22 + + + 上移至顶 (T) + + + 196, 22 + + + 上移 (U) + + + 196, 22 + + + 下移 (D) + + + 196, 22 + + + 下移至底 (B) + + + 68, 21 + + + 规则功能 + + + 0, 134 + + + 785, 479 + + + 777, 453 + + + 规则列表 + + + 184, 22 + + + 从文件中导入规则 + + + 184, 22 + + + 从剪贴板中导入规则 + + + 189, 22 + + + 从订阅Url中导入规则 + + + 68, 21 + + + 导入规则 + + + 785, 25 + + + 785, 673 + + + 规则集设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 0edd1e88..417a8283 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -41,21 +41,11 @@ this.menuAdd = new System.Windows.Forms.ToolStripMenuItem(); this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.menuExportSelectedRules = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem(); this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.tabControl2 = new System.Windows.Forms.TabControl(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.menuServer = new System.Windows.Forms.MenuStrip(); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.menuImportRulesFromPreset = new System.Windows.Forms.ToolStripMenuItem(); - this.menuImportRulesFromFile = new System.Windows.Forms.ToolStripMenuItem(); - this.menuImportRulesFromClipboard = new System.Windows.Forms.ToolStripMenuItem(); - this.menuImportRulesFromUrl = new System.Windows.Forms.ToolStripMenuItem(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); this.cmsLv.SuspendLayout(); @@ -66,17 +56,17 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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 @@ -88,9 +78,9 @@ // // panel1 // - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // // linkLabelRoutingDoc @@ -102,19 +92,19 @@ // // 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"; // // lvRoutings // - resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -126,140 +116,70 @@ this.lvRoutings.UseCompatibleStateImageBehavior = false; this.lvRoutings.View = System.Windows.Forms.View.Details; this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); - this.lvRoutings.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvRoutings_KeyDown); // // 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.menuAdd, this.menuRemove, this.menuSelectAll, - this.menuExportSelectedRules, - this.toolStripSeparator3, - this.menuMoveTop, - this.menuMoveUp, - this.menuMoveDown, - this.menuMoveBottom}); + this.menuSetDefaultRouting}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.MenuItem1; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // - // menuExportSelectedRules + // menuSetDefaultRouting // - resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); - this.menuExportSelectedRules.Name = "menuExportSelectedRules"; - this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_Click); - // - // toolStripSeparator3 - // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); - this.toolStripSeparator3.Name = "toolStripSeparator3"; - // - // menuMoveTop - // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); - this.menuMoveTop.Name = "menuMoveTop"; - this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); - // - // menuMoveUp - // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); - this.menuMoveUp.Name = "menuMoveUp"; - this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); - // - // menuMoveDown - // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); - this.menuMoveDown.Name = "menuMoveDown"; - this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); - // - // menuMoveBottom - // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); - this.menuMoveBottom.Name = "menuMoveBottom"; - this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); + this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; + resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); + this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); // // MenuItem1 // - resources.ApplyResources(this.MenuItem1, "MenuItem1"); this.MenuItem1.DropDown = this.cmsLv; this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // tabControl2 // - resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Controls.Add(this.tabPage2); + resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Name = "tabControl2"; this.tabControl2.SelectedIndex = 0; // // tabPage2 // - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // // menuServer // - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1, - this.toolStripMenuItem1}); + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // - // toolStripMenuItem1 - // - resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); - this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuImportRulesFromPreset, - this.menuImportRulesFromFile, - this.menuImportRulesFromClipboard, - this.menuImportRulesFromUrl}); - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - // - // menuImportRulesFromPreset - // - resources.ApplyResources(this.menuImportRulesFromPreset, "menuImportRulesFromPreset"); - this.menuImportRulesFromPreset.Name = "menuImportRulesFromPreset"; - this.menuImportRulesFromPreset.Click += new System.EventHandler(this.menuImportRulesFromPreset_Click); - // - // menuImportRulesFromFile - // - resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); - this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; - this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); - // - // menuImportRulesFromClipboard - // - resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); - this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; - this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); - // - // menuImportRulesFromUrl - // - resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); - this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; - this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click); - // // RoutingSettingForm // resources.ApplyResources(this, "$this"); @@ -297,20 +217,10 @@ private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.ContextMenuStrip cmsLv; private System.Windows.Forms.ToolStripMenuItem menuRemove; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem menuMoveTop; - private System.Windows.Forms.ToolStripMenuItem menuMoveUp; - private System.Windows.Forms.ToolStripMenuItem menuMoveDown; - private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; private System.Windows.Forms.ToolStripMenuItem menuSelectAll; private System.Windows.Forms.ToolStripMenuItem menuAdd; private System.Windows.Forms.MenuStrip menuServer; private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromPreset; - private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromFile; - private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromClipboard; - private System.Windows.Forms.ToolStripMenuItem menuExportSelectedRules; - private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromUrl; + private System.Windows.Forms.ToolStripMenuItem menuSetDefaultRouting; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index a086d132..cd7ca2c4 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -17,11 +17,13 @@ namespace v2rayN.Forms private void RoutingSettingForm_Load(object sender, EventArgs e) { + ConfigHandler.InitBuiltinRouting(ref config); + cmbdomainStrategy.Text = config.domainStrategy; - if (config.rules == null) + if (config.routings == null) { - config.rules = new List(); + config.routings = new List(); } InitRoutingsView(); RefreshRoutingsView(); @@ -39,12 +41,9 @@ namespace v2rayN.Forms lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; lvRoutings.Columns.Add("", 30); - lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 100); - lvRoutings.Columns.Add("outboundTag", 80); - lvRoutings.Columns.Add("port", 80); - lvRoutings.Columns.Add("protocol", 100); - lvRoutings.Columns.Add("domain", 160); - lvRoutings.Columns.Add("ip", 160); + lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 200); + lvRoutings.Columns.Add(UIRes.I18N("LvUrl"), 240); + lvRoutings.Columns.Add(UIRes.I18N("LvCount"), 60); lvRoutings.EndUpdate(); } @@ -54,17 +53,20 @@ namespace v2rayN.Forms lvRoutings.BeginUpdate(); lvRoutings.Items.Clear(); - for (int k = 0; k < config.rules.Count; k++) + for (int k = 0; k < config.routings.Count; k++) { - var item = config.rules[k]; + string def = string.Empty; + if (config.routingIndex.Equals(k)) + { + def = "√"; + } - ListViewItem lvItem = new ListViewItem(""); + var item = config.routings[k]; + + ListViewItem lvItem = new ListViewItem(def); Utils.AddSubItem(lvItem, "remarks", item.remarks); - Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); - Utils.AddSubItem(lvItem, "port", item.port); - Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol)); - Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); - Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); + Utils.AddSubItem(lvItem, "url", item.url); + Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString()); if (lvItem != null) lvRoutings.Items.Add(lvItem); } @@ -75,7 +77,7 @@ namespace v2rayN.Forms { config.domainStrategy = cmbdomainStrategy.Text; - if (ConfigHandler.SaveRoutingRulesItem(ref config) == 0) + if (ConfigHandler.SaveRouting(ref config) == 0) { this.DialogResult = DialogResult.OK; } @@ -102,7 +104,7 @@ namespace v2rayN.Forms { return; } - var fm = new RoutingSettingDetailsForm(); + var fm = new RoutingRuleSettingForm(); fm.EditIndex = index; if (fm.ShowDialog() == DialogResult.OK) { @@ -137,39 +139,7 @@ namespace v2rayN.Forms #region Edit function - private void menuMoveTop_Click(object sender, EventArgs e) - { - MoveRule(EMove.Top); - } - private void menuMoveUp_Click(object sender, EventArgs e) - { - MoveRule(EMove.Up); - } - - private void menuMoveDown_Click(object sender, EventArgs e) - { - MoveRule(EMove.Down); - } - - private void menuMoveBottom_Click(object sender, EventArgs e) - { - MoveRule(EMove.Bottom); - } - - private void MoveRule(EMove eMove) - { - int index = GetLvSelectedIndex(); - if (index < 0) - { - UI.Show(UIRes.I18N("PleaseSelectRules")); - return; - } - if (ConfigHandler.MoveRoutingRule(ref config, index, eMove) == 0) - { - RefreshRoutingsView(); - } - } private void menuSelectAll_Click(object sender, EventArgs e) { foreach (ListViewItem item in lvRoutings.Items) @@ -180,7 +150,7 @@ namespace v2rayN.Forms private void menuAdd_Click(object sender, EventArgs e) { - var fm = new RoutingSettingDetailsForm(); + var fm = new RoutingRuleSettingForm(); fm.EditIndex = -1; if (fm.ShowDialog() == DialogResult.OK) { @@ -201,129 +171,32 @@ namespace v2rayN.Forms } for (int k = lvSelecteds.Count - 1; k >= 0; k--) { - config.rules.RemoveAt(index); + config.routings.RemoveAt(index); } RefreshRoutingsView(); } - private void menuExportSelectedRules_Click(object sender, EventArgs e) + private void menuSetDefaultRouting_Click(object sender, EventArgs e) { - GetLvSelectedIndex(); - var lst = new List(); - foreach (int v in lvSelecteds) - { - lst.Add(config.rules[v]); - } - if (lst.Count > 0) - { - Utils.SetClipboardData(Utils.ToJson(lst)); - UI.Show(UIRes.I18N("OperationSuccess")); - } - - } - - private void lvRoutings_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control) - { - switch (e.KeyCode) - { - case Keys.A: - menuSelectAll_Click(null, null); - break; - case Keys.C: - menuExportSelectedRules_Click(null, null); - break; - } - } - else - { - switch (e.KeyCode) - { - case Keys.Delete: - menuRemove_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; - } - } - } - #endregion - - #region preset rules - private void menuImportRulesFromPreset_Click(object sender, EventArgs e) - { - var rules = Utils.GetEmbedText(Global.CustomRoutingFileName + "rules"); - if (ConfigHandler.AddBatchRoutingRules(ref config, rules) == 0) - { - RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); - } - } - - private void menuImportRulesFromFile_Click(object sender, EventArgs e) - { - OpenFileDialog fileDialog = new OpenFileDialog - { - Multiselect = false, - Filter = "Rules|*.json|All|*.*" - }; - if (fileDialog.ShowDialog() != DialogResult.OK) + int index = GetLvSelectedIndex(); + if (index < 0) { return; } - string fileName = fileDialog.FileName; - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - string result = Utils.LoadResource(fileName); - if (Utils.IsNullOrEmpty(result)) - { - return; - } - if (ConfigHandler.AddBatchRoutingRules(ref config, result) == 0) - { - RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); - } + SetDefaultRouting(index); } - - private void menuImportRulesFromClipboard_Click(object sender, EventArgs e) + private int SetDefaultRouting(int index) { - string clipboardData = Utils.GetClipboardData(); - if (ConfigHandler.AddBatchRoutingRules(ref config, clipboardData) == 0) + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return -1; + } + if (ConfigHandler.SetDefaultRouting(ref config, index) == 0) { RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); } + return 0; } - private void menuImportRulesFromUrl_Click(object sender, EventArgs e) - { - var fm = new RoutingSubSettingForm(); - if (fm.ShowDialog() != DialogResult.OK) - { - return; - } - var url = fm.Url; - DownloadHandle downloadHandle = new DownloadHandle(); - string clipboardData = downloadHandle.WebDownloadStringSync(url); - if (ConfigHandler.AddBatchRoutingRules(ref config, clipboardData) == 0) - { - RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); - } - } - #endregion diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 5e7a353e..ec736bae 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,317 +117,218 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - cmbdomainStrategy - - - Fill - - - Down (D) - - - - 765, 25 - - - Bottom - - - Edit and Function - - - panel1 - - - panel1 - - - $this - - - 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 - - - 4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 15 - - - 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 - - - 4, 22 - - - 6, 21 - - - $this - - + NoControl - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 568, 17 - - Routing Settings + + 75, 23 - - Remove selected + + + 4 - - tabPage2 - - - menuExportSelectedRules - - - 202, 22 - - - 475, 17 - - - Domain strategy - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItem1 - - - 0 - - - 757, 511 - - - 1 - - - 6, 12 - - - IPOnDemand - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - Export Selected Rules - - - 0, 0 - - - 765, 60 - - - 0, 25 - - - 95, 21 - - - menuServer - - - Import Rules - - - 120, 21 - - - 19 - - - Import Rules From Url - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - menuSelectAll - - - menuMoveTop - - - 202, 22 - - - cmsLv - - - 5 - - - menuMoveDown - - - 165, 20 - - - menuImportRulesFromFile - - - Add - - - 247, 22 - - - toolStripSeparator3 - - - True - - - tabPage2 - - - toolStripMenuItem1 - - - menuMoveBottom - - - menuImportRulesFromUrl - - - 95, 12 - - - Import Rules From File - - - 202, 22 - - - 765, 537 - - - 1 - - - RoutingSettingForm - - - panel2 - - - Import Rules From Preset - - - 202, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.MenuStrip, 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 + + &Cancel btnClose - - Up (U) - - - 12 - - - 203, 186 - - - btnOK - - - 116, 17 - - - 14 - - - NoControl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3, 3 - - - menuImportRulesFromClipboard - - - Import Rules From Clipboard - - - menuAdd - - - 0, 76 - - - IPIfNonMatch - - - 247, 22 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 panel2 - - Move to top (T) + + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + + + 475, 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, 613 + + + 765, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + Top + + + 0, 25 765, 51 - - 751, 505 + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 194, 22 + + + Add + + + 194, 22 + + + Remove selected - 202, 22 + 194, 22 + + + Select All (Ctrl+A) + + + 194, 22 + + + Set as active routing + + + 120, 21 + + + Edit and Function + + + 195, 114 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill @@ -446,166 +347,148 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - menuImportRulesFromPreset + + 3, 3 - - &OK + + 751, 505 - - 0, 0, 0, 0 - - - 247, 22 - - - $this - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 16 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AsIs - - - 202, 22 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Move to bottom (B) - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - - - panel2 - - - 7 - - - 0 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabControl2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - 0, 613 - - - menuMoveUp - - - RuleList - - - Select All (Ctrl+A) - - - &Cancel - - - 199, 6 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - panel1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 247, 22 - - - 202, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 12 lvRoutings - - linkLabelRoutingDoc + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 202, 22 + + tabPage2 - - menuRemove + + 0 - - NoControl + + 4, 22 - - 765, 673 + + 3, 3, 3, 3 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 75, 23 - - - 1 + + 757, 511 0 - - 75, 23 + + RuleSetList - + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl2 0 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - - 568, 17 + + 0, 76 - - 0 + + 765, 537 - - Top + + 14 + + + tabControl2 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 139, 17 + + + 0, 0 + + + 765, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 True - - 17, 17 - - - 139, 17 - + + 6, 12 + + + 765, 673 + + + Routing Settings + + + menuAdd + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemove + + + 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 + + + menuSetDefaultRouting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + RoutingSettingForm + + + 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/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index 7e6ffcf9..3efb9922 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -124,8 +124,11 @@ 确定(&O) + + 0, 474 + - 785, 60 + 726, 60 77, 12 @@ -134,67 +137,40 @@ 域名解析策略 - 785, 51 + 726, 51 - 196, 22 + 148, 22 - 添加规则 + 添加规则集 - 196, 22 + 148, 22 移除所选规则 - 196, 22 + 148, 22 全选 - - 196, 22 + + 148, 22 - - 导出所选规则至剪贴板 - - - 193, 6 - - - 196, 22 - - - 上移至顶 (T) - - - 196, 22 - - - 上移 (U) - - - 196, 22 - - - 下移 (D) - - - 196, 22 - - - 下移至底 (B) + + 设为活动路由 - 92, 21 + 104, 21 - 路由规则功能 + 路由规则集功能 - 197, 186 + 149, 92 @@ -214,52 +190,22 @@ - 771, 505 + 712, 366 - 777, 511 + 718, 372 - 路由规则列表 + 路由规则集列表 - 785, 537 - - - 184, 22 - - - 从预设中导入规则 - - - 184, 22 - - - 从文件中导入规则 - - - 184, 22 - - - 从剪贴板中导入规则 - - - 184, 22 - - - 从Url中导入规则 - - - 92, 21 - - - 导入路由规则 + 726, 398 - 785, 25 + 726, 25 - 785, 673 + 726, 534 路由设置 diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index fdeefb50..96c09774 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -131,9 +131,6 @@ txtUrl - - 6 - picQRCode @@ -180,6 +177,9 @@ 83, 12 + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 232, 21 @@ -237,6 +237,9 @@ 5 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 47, 12 @@ -258,8 +261,8 @@ NoControl - - 0, 110 + + 619, 310 75, 23 @@ -273,9 +276,6 @@ 25 - - 10 - 23 @@ -309,6 +309,9 @@ label2 + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 619, 110 @@ -321,8 +324,8 @@ NoControl - - 619, 310 + + 0, 110 11 @@ -345,9 +348,6 @@ 75, 23 - - grbMain - 1 @@ -357,17 +357,17 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + grbMain 525, 21 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -381,7 +381,4 @@ True - - zh-Hans - \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 5f905f84..2287c34d 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -16,6 +16,8 @@ namespace v2rayN.Handler { private static string configRes = Global.ConfigFileName; + #region ConfigHandler + /// /// 载入配置文件 /// @@ -87,10 +89,7 @@ namespace v2rayN.Handler { config.domainStrategy = "IPIfNonMatch"; } - if (config.rules == null) - { - config.rules = new List(); - } + //kcp if (config.kcpItem == null) { @@ -136,10 +135,6 @@ namespace v2rayN.Handler { config.subItem = new List(); } - if (config.ruleSubItem == null) - { - config.ruleSubItem = new List(); - } if (config == null || config.index < 0 @@ -164,6 +159,10 @@ namespace v2rayN.Handler return 0; } + #endregion + + #region Server + /// /// 添加服务器或编辑 /// @@ -861,38 +860,6 @@ namespace v2rayN.Handler 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) @@ -984,47 +951,78 @@ namespace v2rayN.Handler return 0; } + #endregion - /// - /// SaveRoutingItem - /// - /// - /// - public static int SaveRoutingRulesItem(ref Config config) + #region UI + + public static int AddformMainLvColWidth(ref Config config, string name, int width) { - if (config.rules == null) + 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; + } + } + + #endregion + + #region Routing + + public static int SaveRouting(ref Config config) + { + if (config.routings == null) { return -1; } - foreach (RulesItem sub in config.rules) + foreach (var item in config.routings) { } + if (config.routingIndex >= config.routings.Count) + { + config.routingIndex = 0; + } + Global.reloadV2ray = true; ToJsonFile(config); return 0; } - /// - /// AddRoutingRulesItem - /// - /// - /// - /// - /// - public static int AddRoutingRule(ref Config config, RulesItem item, int index) + + public static int AddRoutingItem(ref Config config, RoutingItem item, int index) { if (index >= 0) { - config.rules[index] = item; + config.routings[index] = item; } else { - config.rules.Add(item); + config.routings.Add(item); } - Global.reloadV2ray = true; - ToJsonFile(config); return 0; @@ -1036,7 +1034,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddBatchRoutingRules(ref Config config, string clipboardData) + public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) { if (Utils.IsNullOrEmpty(clipboardData)) { @@ -1049,30 +1047,25 @@ namespace v2rayN.Handler return -1; } - config.rules.Clear(); + routingItem.rules.Clear(); foreach (var item in lstRules) { - config.rules.Add(item); + routingItem.rules.Add(item); } - - Global.reloadV2ray = true; - - ToJsonFile(config); - return 0; } /// /// MoveRoutingRule /// - /// + /// /// /// /// - public static int MoveRoutingRule(ref Config config, int index, EMove eMove) + public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove) { - int count = config.rules.Count; - if (index < 0 || index > config.rules.Count - 1) + int count = routingItem.rules.Count; + if (index < 0 || index > routingItem.rules.Count - 1) { return -1; } @@ -1084,9 +1077,9 @@ namespace v2rayN.Handler { return 0; } - var item = Utils.DeepCopy(config.rules[index]); - config.rules.RemoveAt(index); - config.rules.Insert(0, item); + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Insert(0, item); break; } @@ -1096,9 +1089,9 @@ namespace v2rayN.Handler { return 0; } - var item = Utils.DeepCopy(config.rules[index]); - config.rules.RemoveAt(index); - config.rules.Insert(index - 1, item); + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Insert(index - 1, item); break; } @@ -1109,9 +1102,9 @@ namespace v2rayN.Handler { return 0; } - var item = Utils.DeepCopy(config.rules[index]); - config.rules.RemoveAt(index); - config.rules.Insert(index + 1, item); + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Insert(index + 1, item); break; } @@ -1121,14 +1114,30 @@ namespace v2rayN.Handler { return 0; } - var item = Utils.DeepCopy(config.rules[index]); - config.rules.RemoveAt(index); - config.rules.Add(item); + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Add(item); break; } } + return 0; + } + + public static int SetDefaultRouting(ref Config config, int index) + { + if (index < 0 || index > config.routings.Count - 1) + { + return -1; + } + + ////和现在相同 + //if (config.index.Equals(index)) + //{ + // return -1; + //} + config.routingIndex = index; Global.reloadV2ray = true; ToJsonFile(config); @@ -1136,28 +1145,39 @@ namespace v2rayN.Handler return 0; } - /// - /// SaveRuleSubItem - /// - /// - /// - public static int SaveRuleSubItem(ref Config config) + public static int InitBuiltinRouting(ref Config config) { - if (config.ruleSubItem == null || config.ruleSubItem.Count <= 0) + if (config.routings == null) { - return -1; + config.routings = new List(); } + if (config.routings.Count > 0) + { + return 0; + } + config.routingIndex = 0; - foreach (SubItem sub in config.ruleSubItem) - { - if (Utils.IsNullOrEmpty(sub.id)) - { - sub.id = Utils.GetGUID(); - } - } + //Global + var item1 = new RoutingItem(); + item1.remarks = "全局(Global)"; + item1.url = string.Empty; + item1.rules = new List(); + string result = Utils.GetEmbedText(Global.CustomRoutingFileName + "global"); + AddBatchRoutingRules(ref item1, result); + config.routings.Add(item1); + + //Bypass the mainland + var item2 = new RoutingItem(); + item2.remarks = "绕过大陆(Whitelist)"; + item2.url = string.Empty; + item2.rules = new List(); + string result2 = Utils.GetEmbedText(Global.CustomRoutingFileName + "white"); + AddBatchRoutingRules(ref item2, result2); + config.routings.Add(item2); ToJsonFile(config); return 0; } + #endregion } } diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 95142bb5..7f21abe6 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Windows.Forms; +using v2rayN.Base; using v2rayN.Mode; namespace v2rayN.Handler @@ -147,6 +148,22 @@ namespace v2rayN.Handler } } + public int AddBatchServers(Config config, 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(); + } + return counter; + } + } } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 43ef1752..53a0b8c3 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -190,9 +190,12 @@ namespace v2rayN.Handler { v2rayConfig.routing.domainStrategy = config.domainStrategy; - foreach (var item in config.rules) + if (config.routings != null && config.routingIndex < config.routings.Count) { - routingUserRule(item, ref v2rayConfig); + foreach (var item in config.routings[config.routingIndex].rules) + { + routingUserRule(item, ref v2rayConfig); + } } } } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index da2983bd..552b35fb 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -60,13 +60,6 @@ namespace v2rayN.Mode get; set; } - /// - /// 域名解析策略 - /// - public string domainStrategy - { - get; set; - } /// /// KcpItem /// @@ -161,15 +154,22 @@ namespace v2rayN.Mode { get; set; } - public List rules + /// + /// 域名解析策略 + /// + public string domainStrategy { get; set; } - public List ruleSubItem + public int routingIndex { get; set; } - + public List routings + { + get; set; + } + public ECoreType coreType { get; set; diff --git a/v2rayN/v2rayN/Mode/RoutingItem.cs b/v2rayN/v2rayN/Mode/RoutingItem.cs new file mode 100644 index 00000000..a033c227 --- /dev/null +++ b/v2rayN/v2rayN/Mode/RoutingItem.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace v2rayN.Mode +{ + public class RoutingItem + { + public string remarks + { + get; set; + } + public string url + { + get; set; + } + public List rules + { + get; set; + } + public bool enabled { get; set; } = true; + + } +} diff --git a/v2rayN/v2rayN/Mode/RulesItem.cs b/v2rayN/v2rayN/Mode/RulesItem.cs index bb3a85e4..738a889f 100644 --- a/v2rayN/v2rayN/Mode/RulesItem.cs +++ b/v2rayN/v2rayN/Mode/RulesItem.cs @@ -6,8 +6,6 @@ namespace v2rayN.Mode [Serializable] public class RulesItem { - public string remarks { get; set; } - public string type { get; set; } public string port { get; set; } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 1b7c1162..9d36a669 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.6")] +[assembly: AssemblyFileVersion("4.7")] diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index a92b8267..df456572 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", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ResUI { @@ -312,6 +312,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Count 的本地化字符串。 + /// + internal static string LvCount { + get { + return ResourceManager.GetString("LvCount", resourceCulture); + } + } + /// /// 查找类似 Security 的本地化字符串。 /// @@ -330,6 +339,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 remarks 的本地化字符串。 + /// + internal static string LvRemarks { + get { + return ResourceManager.GetString("LvRemarks", resourceCulture); + } + } + /// /// 查找类似 Type 的本地化字符串。 /// @@ -402,6 +420,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Url 的本地化字符串。 + /// + internal static string LvUrl { + get { + return ResourceManager.GetString("LvUrl", resourceCulture); + } + } + /// /// 查找类似 MediumFresh 的本地化字符串。 /// @@ -447,6 +474,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please fill in the address (Url) 的本地化字符串。 + /// + internal static string MsgNeedUrl { + get { + return ResourceManager.GetString("MsgNeedUrl", resourceCulture); + } + } + /// /// 查找类似 No valid subscriptions set 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 21747ecc..5691c92f 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -373,4 +373,16 @@ {0},One of the required. + + remarks + + + Url + + + Count + + + Please fill in the address (Url) + \ 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 59b4f18b..fa947463 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -373,4 +373,16 @@ {0},必填其中一项. + + 别名 + + + 地址(Url) + + + 数量 + + + 请填写地址(Url) + \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_global b/v2rayN/v2rayN/Sample/custom_routing_global new file mode 100644 index 00000000..169d8156 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_global @@ -0,0 +1,6 @@ +[ + { + "port": "0-65535", + "outboundTag": "proxy" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_white b/v2rayN/v2rayN/Sample/custom_routing_white new file mode 100644 index 00000000..7ee814b3 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_white @@ -0,0 +1,24 @@ +[{ + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "outboundTag": "direct", + "domain": [ + "geosite:cn" + ] + }, + { + "outboundTag": "direct", + "ip": [ + "geoip:private", + "geoip:cn" + ] + }, + { + "port": "0-65535", + "outboundTag": "proxy" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 5776ed1f..c38e2c89 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -125,17 +125,17 @@ BaseServerForm.cs - + Form - - RoutingSettingDetailsForm.cs + + RoutingRuleSettingDetailsForm.cs - + Form - - RoutingSubSettingForm.cs + + RoutingRuleSettingForm.cs @@ -196,6 +196,7 @@ + @@ -307,19 +308,20 @@ QRCodeControl.cs Designer - - RoutingSettingDetailsForm.cs + + RoutingRuleSettingDetailsForm.cs Designer - - RoutingSettingDetailsForm.cs + + RoutingRuleSettingDetailsForm.cs Designer - - RoutingSubSettingForm.cs + + RoutingRuleSettingForm.cs + Designer - - RoutingSubSettingForm.cs + + RoutingRuleSettingForm.cs SubSettingControl.cs @@ -384,7 +386,8 @@ - + + From ae79d8c608c9c643ffc20031cbf9ad3a9e2ae342 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 23 Jan 2021 12:44:51 +0800 Subject: [PATCH 015/252] Update MainForm.cs --- v2rayN/v2rayN/Forms/MainForm.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index a0525134..5ef402c0 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1440,6 +1440,7 @@ namespace v2rayN.Forms int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); if (ret > 0) { + RefreshServers(); } else { From 53f9fee834b826fccb3004acc9d3802e342b61d3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 23 Jan 2021 17:25:09 +0800 Subject: [PATCH 016/252] Update RoutingItem.cs --- v2rayN/v2rayN/Mode/RoutingItem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/v2rayN/v2rayN/Mode/RoutingItem.cs b/v2rayN/v2rayN/Mode/RoutingItem.cs index a033c227..544558ed 100644 --- a/v2rayN/v2rayN/Mode/RoutingItem.cs +++ b/v2rayN/v2rayN/Mode/RoutingItem.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; namespace v2rayN.Mode { + [Serializable] public class RoutingItem { public string remarks From 7885893e9b7a6c08866cece4408736deead0fdd8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 23 Jan 2021 17:25:19 +0800 Subject: [PATCH 017/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 9d36a669..01ee1030 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.7")] +[assembly: AssemblyFileVersion("4.8")] From 608417325722252c1f462f60ef13684494b82938 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 29 Jan 2021 20:19:23 +0800 Subject: [PATCH 018/252] up4.9 --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 49 + v2rayN/v2rayN/Forms/MainForm.cs | 51 + v2rayN/v2rayN/Forms/MainForm.resx | 112 +- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 45 +- .../RoutingRuleQuicklyAddForm.Designer.cs | 170 +++ .../v2rayN/Forms/RoutingRuleQuicklyAddForm.cs | 73 ++ .../Forms/RoutingRuleQuicklyAddForm.resx | 462 +++++++ .../RoutingRuleQuicklyAddForm.zh-Hans.resx | 132 ++ .../Forms/RoutingRuleSettingDetailsForm.resx | 3 + .../Forms/RoutingRuleSettingForm.Designer.cs | 1 + v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 2 +- .../v2rayN/Forms/RoutingRuleSettingForm.resx | 71 +- .../Forms/RoutingRuleSettingForm.zh-Hans.resx | 68 +- .../Forms/RoutingSettingForm.Designer.cs | 351 ++++-- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 144 ++- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 1080 ++++++++++++----- .../Forms/RoutingSettingForm.zh-Hans.resx | 97 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 63 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 8 + v2rayN/v2rayN/Mode/RoutingItem.cs | 5 + v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Sample/custom_routing_locked | 21 + v2rayN/v2rayN/Sample/custom_routing_white | 40 +- v2rayN/v2rayN/v2rayN.csproj | 1 + 24 files changed, 2485 insertions(+), 566 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Sample/custom_routing_locked diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 93b3aedb..b69bff7e 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -84,6 +84,11 @@ this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.txtMsgBox = new System.Windows.Forms.TextBox(); + this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); this.ssMain = new System.Windows.Forms.StatusStrip(); this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel(); @@ -130,6 +135,7 @@ this.cmsMain.SuspendLayout(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); + this.cmsMsgBox.SuspendLayout(); this.ssMain.SuspendLayout(); this.tsMain.SuspendLayout(); this.SuspendLayout(); @@ -208,6 +214,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; // // menuAddVmessServer // @@ -525,9 +532,45 @@ 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; + this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); this.txtMsgBox.Name = "txtMsgBox"; this.txtMsgBox.ReadOnly = true; + this.txtMsgBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtMsgBox_KeyDown); + // + // cmsMsgBox + // + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); + this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuMsgBoxSelectAll, + this.menuMsgBoxCopy, + this.menuMsgBoxCopyAll, + this.menuMsgBoxAddRoutingRule}); + this.cmsMsgBox.Name = "cmsMsgBox"; + // + // menuMsgBoxSelectAll + // + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); + this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); + // + // menuMsgBoxCopy + // + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); + this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); + // + // menuMsgBoxCopyAll + // + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); + this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); + // + // menuMsgBoxAddRoutingRule + // + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); + this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // ssMain // @@ -818,6 +861,7 @@ this.groupBox1.ResumeLayout(false); this.groupBox2.ResumeLayout(false); this.groupBox2.PerformLayout(); + this.cmsMsgBox.ResumeLayout(false); this.ssMain.ResumeLayout(false); this.ssMain.PerformLayout(); this.tsMain.ResumeLayout(false); @@ -921,6 +965,11 @@ private System.Windows.Forms.ToolStripMenuItem menuClearServerStatistics; private System.Windows.Forms.ToolStripMenuItem menuRoutings; private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private System.Windows.Forms.ContextMenuStrip cmsMsgBox; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopy; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxAddRoutingRule; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 5ef402c0..6b293a83 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1507,6 +1507,10 @@ namespace v2rayN.Forms for (int k = 0; k < config.routings.Count; k++) { var item = config.routings[k]; + if (item.locked == true) + { + continue; + } string name = item.remarks; ToolStripMenuItem ts = new ToolStripMenuItem(name) @@ -1542,5 +1546,52 @@ namespace v2rayN.Forms } #endregion + #region MsgBoxMenu + private void menuMsgBoxSelectAll_Click(object sender, EventArgs e) + { + this.txtMsgBox.Focus(); + this.txtMsgBox.SelectAll(); + } + + private void menuMsgBoxCopy_Click(object sender, EventArgs e) + { + var data = this.txtMsgBox.SelectedText.TrimEx(); + Utils.SetClipboardData(data); + } + + private void menuMsgBoxCopyAll_Click(object sender, EventArgs e) + { + var data = this.txtMsgBox.Text; + Utils.SetClipboardData(data); + } + private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e) + { + menuMsgBoxCopy_Click(null, null); + tsbRoutingSetting_Click(null, null); + } + + private void txtMsgBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuMsgBoxSelectAll_Click(null, null); + break; + case Keys.C: + menuMsgBoxCopy_Click(null, null); + break; + case Keys.V: + menuMsgBoxAddRoutingRule_Click(null, null); + break; + + } + } + + } + + #endregion + } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 46211fac..df1bd0d6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -140,7 +140,7 @@ Add [VLESS] server - 2 + 3 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -176,6 +176,9 @@ System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 227, 22 + 语言-[中文简体] @@ -201,6 +204,9 @@ 355, 22 + + menuMoveDown + 99, 53 @@ -264,8 +270,8 @@ Share - - Subscriptions + + 227, 22 952, 327 @@ -273,6 +279,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add Routing Rule (Ctrl+V) + 355, 22 @@ -288,9 +297,15 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Copy All + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 227, 22 + Export selected server for server configuration @@ -321,9 +336,6 @@ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 356, 622 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -345,6 +357,9 @@ 203, 22 + + menuMsgBoxCopy + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -387,7 +402,7 @@ Servers - 3 + 4 3, 17 @@ -416,8 +431,8 @@ menuAddCustomServer - - menuMoveDown + + txtMsgBox System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -425,8 +440,8 @@ Import bulk URL from clipboard - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 184, 6 Move to bottom (B) @@ -633,7 +648,7 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 4 + 5 System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -656,6 +671,9 @@ Help + + menuMsgBoxSelectAll + menuSelectAll @@ -695,6 +713,9 @@ menuRemoveDuplicateServer + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + BottomCenter @@ -729,10 +750,10 @@ 0, 66 - 5 + 6 - - tsbV2rayWebsite + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Server @@ -743,9 +764,6 @@ menuAddShadowsocksServer - - txtMsgBox - toolSslBlank4 @@ -800,6 +818,9 @@ 352, 6 + + System.Windows.Forms.ContextMenuStrip, 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 @@ -812,6 +833,12 @@ 1 + + tsbV2rayWebsite + + + cmsMsgBox + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -821,8 +848,8 @@ menuMoveTop - - tsbCheckUpdateCore + + Copy (Ctrl+C) @@ -841,6 +868,9 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + menuMsgBoxAddRoutingRule + menuScanScreen @@ -928,6 +958,9 @@ System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Subscriptions + tsbQRCodeSwitch @@ -958,6 +991,9 @@ toolStripSeparator8 + + menuMsgBoxCopyAll + 89, 53 @@ -1027,6 +1063,9 @@ menuExit + + 227, 22 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1057,6 +1096,9 @@ 2 + + Magenta + 4, 4, 4, 4 @@ -1090,6 +1132,9 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tsbCheckUpdateCore + menuSpeedServer @@ -1150,6 +1195,9 @@ 0, 0 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 355, 22 @@ -1189,6 +1237,9 @@ System.Windows.Forms.ToolStrip, 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 + $this @@ -1231,8 +1282,8 @@ 203, 22 - - 184, 6 + + 356, 622 0, 0 @@ -1255,6 +1306,9 @@ MiddleRight + + Select All (Ctrl+A) + tsbOptionSetting @@ -1273,8 +1327,8 @@ 64, 53 - - Magenta + + 228, 92 946, 26 @@ -1354,6 +1408,9 @@ 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 @@ -1451,8 +1508,8 @@ System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 228, 18 + + 603, 17 zh-Hans @@ -1460,6 +1517,9 @@ True + + 228, 18 + 65 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 42204a5f..c4e9f00c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -292,6 +292,12 @@ 批量导出订阅内容至剪贴板(多选) + + 73, 53 + + + 服务器 + 301, 622 @@ -312,12 +318,6 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 73, 53 - - - 服务器 - 172, 22 @@ -385,11 +385,38 @@ 退出 - 196, 192 + 196, 170 服务器列表 + + 221, 22 + + + 全选 (Ctrl+A) + + + 221, 22 + + + 复制 (Ctrl+C) + + + 221, 22 + + + 复制所有 + + + 221, 22 + + + 快速添加路由规则 (Ctrl+V) + + + 222, 114 + 网速显示未启用 @@ -397,13 +424,13 @@ 信息 - 180, 22 + 124, 22 订阅设置 - 180, 22 + 124, 22 更新订阅 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs new file mode 100644 index 00000000..b187f725 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs @@ -0,0 +1,170 @@ +namespace v2rayN.Forms +{ + partial class RoutingRuleQuicklyAddForm + { + /// + /// 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(RoutingRuleQuicklyAddForm)); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); + this.panel4 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtIP = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtDomain = new System.Windows.Forms.TextBox(); + this.panel3.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panel2.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // panel3 + // + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.label4); + this.panel3.Controls.Add(this.cmbOutboundTag); + this.panel3.Name = "panel3"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbOutboundTag + // + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); + this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutboundTag.FormattingEnabled = true; + this.cmbOutboundTag.Items.AddRange(new object[] { + resources.GetString("cmbOutboundTag.Items"), + resources.GetString("cmbOutboundTag.Items1"), + resources.GetString("cmbOutboundTag.Items2")}); + this.cmbOutboundTag.Name = "cmbOutboundTag"; + // + // panel4 + // + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Controls.Add(this.btnClose); + this.panel4.Controls.Add(this.btnOK); + this.panel4.Name = "panel4"; + // + // 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); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.groupBox2); + this.panel2.Controls.Add(this.groupBox1); + this.panel2.Name = "panel2"; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtIP); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtIP + // + resources.ApplyResources(this.txtIP, "txtIP"); + this.txtIP.Name = "txtIP"; + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtDomain); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtDomain + // + resources.ApplyResources(this.txtDomain, "txtDomain"); + this.txtDomain.Name = "txtDomain"; + // + // RoutingRuleQuicklyAddForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel4); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.Name = "RoutingRuleQuicklyAddForm"; + this.Load += new System.EventHandler(this.RoutingRuleQuicklyAddForm_Load); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel4.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbOutboundTag; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtDomain; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtIP; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs new file mode 100644 index 00000000..51f6d87b --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs @@ -0,0 +1,73 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingRuleQuicklyAddForm : BaseForm + { + public string domain + { + get; set; + } + private RulesItem rulesItem; + + public RoutingRuleQuicklyAddForm() + { + InitializeComponent(); + } + + private void RoutingRuleQuicklyAddForm_Load(object sender, EventArgs e) + { + rulesItem = new RulesItem(); + ClearBind(); + } + + private void EndBindingData() + { + if (rulesItem != null) + { + rulesItem.outboundTag = cmbOutboundTag.Text; + rulesItem.domain = Utils.String2List(txtDomain.Text); + rulesItem.ip = Utils.String2List(txtIP.Text); + } + } + + private void ClearBind() + { + cmbOutboundTag.Text = Global.agentTag; + txtDomain.Text = domain; + } + private void btnOK_Click(object sender, EventArgs e) + { + EndBindingData(); + var hasRule = false; + if (rulesItem.domain != null && rulesItem.domain.Count > 0) + { + hasRule = true; + } + if (rulesItem.ip != null && rulesItem.ip.Count > 0) + { + hasRule = true; + } + if (!hasRule) + { + return; + } + if (ConfigHandler.InsertRoutingRuleItem(ref config, rulesItem) == 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/RoutingRuleQuicklyAddForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.resx new file mode 100644 index 00000000..b081d36d --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.resx @@ -0,0 +1,462 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + txtIP + + + + Fill + + + + 8 + + + + 119, 20 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 + + + 220, 207 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + btnOK + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + RoutingRuleQuicklyAddForm + + + $this + + + 0, 288 + + + Bottom + + + Fill + + + 32 + + + panel4 + + + proxy + + + Left + + + 24 + + + 75, 23 + + + 6, 12 + + + 506, 10 + + + 7 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + panel1 + + + Domain + + + groupBox1 + + + 0, 10 + + + System.Windows.Forms.Button, 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 + + + panel3 + + + 31 + + + 1 + + + 506, 51 + + + Fill + + + txtDomain + + + panel3 + + + NoControl + + + 5 + + + Top + + + panel4 + + + IP + + + 280, 0 + + + 75, 23 + + + 3, 17 + + + label4 + + + outboundTag + + + btnClose + + + block + + + direct + + + 1 + + + 2 + + + 0 + + + 305, 25 + + + panel3 + + + Top + + + 0, 0 + + + 506, 227 + + + True + + + 3 + + + 280, 227 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 3 + + + NoControl + + + &OK + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + cmbOutboundTag + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 506, 60 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &Cancel + + + 226, 227 + + + 107, 16 + + + RoutingRuleQuicklyAddForm + + + NoControl + + + 0 + + + 1 + + + True + + + groupBox2 + + + 19, 20 + + + $this + + + 71, 12 + + + panel2 + + + groupBox2 + + + 4 + + + 0, 0 + + + panel4 + + + $this + + + groupBox1 + + + panel2 + + + 0, 61 + + + 0 + + + 1 + + + 274, 207 + + + 506, 348 + + + 25 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 0 + + + panel2 + + + $this + + + 398, 25 + + + True + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + zh-Hans + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx new file mode 100644 index 00000000..ee735361 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + OutboundTag + + + 取消(&C) + + + 确定(&O) + + + 快速添加路由规则 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index 9149d44a..f92d884b 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -579,6 +579,9 @@ 0 + + zh-Hans + True diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs index a0dbe650..f33f9cdd 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs @@ -155,6 +155,7 @@ this.menuMoveDown, this.menuMoveBottom}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.MenuItem1; // // menuAdd // diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index 2c708f4a..3daed59a 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -194,7 +194,7 @@ namespace v2rayN.Forms fm.rulesItem = new RulesItem(); if (fm.ShowDialog() == DialogResult.OK) { - routingItem.rules.Add(fm.rulesItem); + routingItem.rules.Insert(0, fm.rulesItem); RefreshRoutingsView(); } } diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx index 8063cbb9..2d457319 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -150,9 +150,6 @@ 47, 12 - - Move to bottom (B) - Bottom @@ -225,9 +222,6 @@ 475, 17 - - 75, 23 - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -309,6 +303,9 @@ 5 + + menuImportRulesFromFile + Add @@ -369,9 +366,6 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - btnClose - Up (U) @@ -381,15 +375,15 @@ btnOK + + 53, 12 + 47, 12 14 - - Import Rules - NoControl @@ -423,6 +417,9 @@ panel2 + + 4 + Move to top (T) @@ -438,6 +435,9 @@ 748, 356 + + 202, 22 + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -461,8 +461,8 @@ &OK - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + lvRoutings 247, 22 @@ -491,9 +491,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - 644, 48 @@ -506,8 +503,8 @@ Export Selected Rules - - menuImportRulesFromFile + + Move to bottom (B) label3 @@ -539,6 +536,9 @@ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Top + 3, 3, 3, 3 @@ -554,8 +554,8 @@ Select All (Ctrl+A) - - 53, 12 + + btnClose 6, 12 @@ -581,8 +581,11 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - lvRoutings + + System.Windows.Forms.Label, 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 202, 22 @@ -605,14 +608,11 @@ 762, 575 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Import Rules - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 202, 22 + + 75, 23 2 @@ -626,8 +626,8 @@ NoControl - - 4 + + 0 3 @@ -656,8 +656,8 @@ 0 - - Top + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True @@ -665,9 +665,6 @@ 17, 17 - - zh-Hans - 139, 17 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx index d81b8ff0..06ade53a 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx @@ -120,6 +120,9 @@ 取消(&C) + + 确定(&O) + 0, 613 @@ -127,12 +130,6 @@ 785, 60 - - 确定(&O) - - - 785, 109 - 29, 12 @@ -157,28 +154,8 @@ 别名 - - 197, 186 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA - BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 - bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp - bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz - dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA - CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp - bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 - bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 - ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 - ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - - - 771, 447 + + 785, 109 196, 22 @@ -237,11 +214,28 @@ 规则功能 - - 0, 134 + + 197, 186 - - 785, 479 + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 771, 447 777, 453 @@ -249,14 +243,20 @@ 规则列表 + + 0, 134 + + + 785, 479 + - 184, 22 + 189, 22 从文件中导入规则 - 184, 22 + 189, 22 从剪贴板中导入规则 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 417a8283..513d218e 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -34,39 +34,70 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.labRoutingTips = new System.Windows.Forms.Label(); this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); - this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuAdd = new System.Windows.Forms.ToolStripMenuItem(); this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem(); this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.tabControl2 = new System.Windows.Forms.TabControl(); - this.tabPage2 = new System.Windows.Forms.TabPage(); this.menuServer = new System.Windows.Forms.MenuStrip(); + this.tabNormal = new System.Windows.Forms.TabControl(); + this.tabPageProxy = new System.Windows.Forms.TabPage(); + this.panel5 = new System.Windows.Forms.Panel(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.txtProxyIp = new System.Windows.Forms.TextBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.txtProxyDomain = new System.Windows.Forms.TextBox(); + this.tabPageDirect = new System.Windows.Forms.TabPage(); + this.panel4 = new System.Windows.Forms.Panel(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.txtDirectIp = new System.Windows.Forms.TextBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.txtDirectDomain = new System.Windows.Forms.TextBox(); + this.tabPageBlock = new System.Windows.Forms.TabPage(); + this.panel3 = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtBlockIp = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtBlockDomain = new System.Windows.Forms.TextBox(); + this.tabPageRuleList = new System.Windows.Forms.TabPage(); + this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); this.cmsLv.SuspendLayout(); - this.tabControl2.SuspendLayout(); - this.tabPage2.SuspendLayout(); this.menuServer.SuspendLayout(); + this.tabNormal.SuspendLayout(); + this.tabPageProxy.SuspendLayout(); + this.panel5.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.tabPageDirect.SuspendLayout(); + this.panel4.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.tabPageBlock.SuspendLayout(); + this.panel3.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPageRuleList.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); // // 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 @@ -78,11 +109,18 @@ // // panel1 // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Controls.Add(this.labRoutingTips); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // labRoutingTips + // + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + this.labRoutingTips.Name = "labRoutingTips"; + // // linkLabelRoutingDoc // resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); @@ -92,19 +130,200 @@ // // 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"; // + // 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.menuAdd, + this.menuRemove, + this.menuSelectAll, + this.menuSetDefaultRouting}); + this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.MenuItem1; + // + // menuAdd + // + resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Name = "menuAdd"; + this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); + // + // menuRemove + // + resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Name = "menuRemove"; + this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); + // + // menuSelectAll + // + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // menuSetDefaultRouting + // + resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); + this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; + this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); + // + // MenuItem1 + // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + this.MenuItem1.DropDown = this.cmsLv; + this.MenuItem1.Name = "MenuItem1"; + // + // menuServer + // + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + this.menuServer.Name = "menuServer"; + // + // tabNormal + // + resources.ApplyResources(this.tabNormal, "tabNormal"); + this.tabNormal.Controls.Add(this.tabPageProxy); + this.tabNormal.Controls.Add(this.tabPageDirect); + this.tabNormal.Controls.Add(this.tabPageBlock); + this.tabNormal.Controls.Add(this.tabPageRuleList); + this.tabNormal.Name = "tabNormal"; + this.tabNormal.SelectedIndex = 0; + this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting); + // + // tabPageProxy + // + resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); + this.tabPageProxy.Controls.Add(this.panel5); + this.tabPageProxy.Name = "tabPageProxy"; + this.tabPageProxy.UseVisualStyleBackColor = true; + // + // panel5 + // + resources.ApplyResources(this.panel5, "panel5"); + this.panel5.Controls.Add(this.groupBox5); + this.panel5.Controls.Add(this.groupBox6); + this.panel5.Name = "panel5"; + // + // groupBox5 + // + resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.Controls.Add(this.txtProxyIp); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.TabStop = false; + // + // txtProxyIp + // + resources.ApplyResources(this.txtProxyIp, "txtProxyIp"); + this.txtProxyIp.Name = "txtProxyIp"; + // + // groupBox6 + // + resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.Controls.Add(this.txtProxyDomain); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.TabStop = false; + // + // txtProxyDomain + // + resources.ApplyResources(this.txtProxyDomain, "txtProxyDomain"); + this.txtProxyDomain.Name = "txtProxyDomain"; + // + // tabPageDirect + // + resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); + this.tabPageDirect.Controls.Add(this.panel4); + this.tabPageDirect.Name = "tabPageDirect"; + this.tabPageDirect.UseVisualStyleBackColor = true; + // + // panel4 + // + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Controls.Add(this.groupBox3); + this.panel4.Controls.Add(this.groupBox4); + this.panel4.Name = "panel4"; + // + // groupBox3 + // + resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.Controls.Add(this.txtDirectIp); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.TabStop = false; + // + // txtDirectIp + // + resources.ApplyResources(this.txtDirectIp, "txtDirectIp"); + this.txtDirectIp.Name = "txtDirectIp"; + // + // groupBox4 + // + resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.Controls.Add(this.txtDirectDomain); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.TabStop = false; + // + // txtDirectDomain + // + resources.ApplyResources(this.txtDirectDomain, "txtDirectDomain"); + this.txtDirectDomain.Name = "txtDirectDomain"; + // + // tabPageBlock + // + resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); + this.tabPageBlock.Controls.Add(this.panel3); + this.tabPageBlock.Name = "tabPageBlock"; + this.tabPageBlock.UseVisualStyleBackColor = true; + // + // panel3 + // + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.groupBox2); + this.panel3.Controls.Add(this.groupBox1); + this.panel3.Name = "panel3"; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtBlockIp); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtBlockIp + // + resources.ApplyResources(this.txtBlockIp, "txtBlockIp"); + this.txtBlockIp.Name = "txtBlockIp"; + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtBlockDomain); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtBlockDomain + // + resources.ApplyResources(this.txtBlockDomain, "txtBlockDomain"); + this.txtBlockDomain.Name = "txtBlockDomain"; + // + // tabPageRuleList + // + resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); + this.tabPageRuleList.Controls.Add(this.lvRoutings); + this.tabPageRuleList.Name = "tabPageRuleList"; + this.tabPageRuleList.UseVisualStyleBackColor = true; + // // lvRoutings // - this.lvRoutings.ContextMenuStrip = this.cmsLv; resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.ContextMenuStrip = this.cmsLv; this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -117,75 +336,12 @@ this.lvRoutings.View = System.Windows.Forms.View.Details; this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); // - // cmsLv - // - this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); - this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuAdd, - this.menuRemove, - this.menuSelectAll, - this.menuSetDefaultRouting}); - this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.MenuItem1; - resources.ApplyResources(this.cmsLv, "cmsLv"); - // - // menuAdd - // - this.menuAdd.Name = "menuAdd"; - resources.ApplyResources(this.menuAdd, "menuAdd"); - this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); - // - // menuRemove - // - this.menuRemove.Name = "menuRemove"; - resources.ApplyResources(this.menuRemove, "menuRemove"); - this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); - // - // menuSelectAll - // - this.menuSelectAll.Name = "menuSelectAll"; - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); - this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); - // - // menuSetDefaultRouting - // - this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; - resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); - this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); - // - // MenuItem1 - // - this.MenuItem1.DropDown = this.cmsLv; - this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); - // - // tabControl2 - // - this.tabControl2.Controls.Add(this.tabPage2); - resources.ApplyResources(this.tabControl2, "tabControl2"); - this.tabControl2.Name = "tabControl2"; - this.tabControl2.SelectedIndex = 0; - // - // tabPage2 - // - this.tabPage2.Controls.Add(this.lvRoutings); - resources.ApplyResources(this.tabPage2, "tabPage2"); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.UseVisualStyleBackColor = true; - // - // menuServer - // - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Name = "menuServer"; - // // RoutingSettingForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; - this.Controls.Add(this.tabControl2); + this.Controls.Add(this.tabNormal); this.Controls.Add(this.panel1); this.Controls.Add(this.panel2); this.Controls.Add(this.menuServer); @@ -196,10 +352,28 @@ this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.cmsLv.ResumeLayout(false); - this.tabControl2.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); this.menuServer.ResumeLayout(false); this.menuServer.PerformLayout(); + this.tabNormal.ResumeLayout(false); + this.tabPageProxy.ResumeLayout(false); + this.panel5.ResumeLayout(false); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.tabPageDirect.ResumeLayout(false); + this.panel4.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.tabPageBlock.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.tabPageRuleList.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -212,9 +386,6 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; private System.Windows.Forms.ComboBox cmbdomainStrategy; - private Base.ListViewFlickerFree lvRoutings; - private System.Windows.Forms.TabControl tabControl2; - private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.ContextMenuStrip cmsLv; private System.Windows.Forms.ToolStripMenuItem menuRemove; private System.Windows.Forms.ToolStripMenuItem menuSelectAll; @@ -222,5 +393,27 @@ private System.Windows.Forms.MenuStrip menuServer; private System.Windows.Forms.ToolStripMenuItem MenuItem1; private System.Windows.Forms.ToolStripMenuItem menuSetDefaultRouting; + private System.Windows.Forms.TabControl tabNormal; + private System.Windows.Forms.TabPage tabPageProxy; + private System.Windows.Forms.TabPage tabPageDirect; + private System.Windows.Forms.TabPage tabPageBlock; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox txtProxyIp; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox txtProxyDomain; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox txtDirectIp; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox txtDirectDomain; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtBlockIp; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtBlockDomain; + private System.Windows.Forms.TabPage tabPageRuleList; + private Base.ListViewFlickerFree lvRoutings; + private System.Windows.Forms.Label labRoutingTips; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index cd7ca2c4..9066fb34 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -10,6 +10,7 @@ namespace v2rayN.Forms public partial class RoutingSettingForm : BaseForm { private List lvSelecteds = new List(); + private RoutingItem lockedItem; public RoutingSettingForm() { InitializeComponent(); @@ -27,55 +28,27 @@ namespace v2rayN.Forms } InitRoutingsView(); RefreshRoutingsView(); - } - private void InitRoutingsView() + BindingLockedData(); + + } + + + private void tabNormal_Selecting(object sender, TabControlCancelEventArgs e) { - lvRoutings.BeginUpdate(); - lvRoutings.Items.Clear(); - - lvRoutings.GridLines = true; - lvRoutings.FullRowSelect = true; - lvRoutings.View = View.Details; - lvRoutings.MultiSelect = true; - lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; - - lvRoutings.Columns.Add("", 30); - lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 200); - lvRoutings.Columns.Add(UIRes.I18N("LvUrl"), 240); - lvRoutings.Columns.Add(UIRes.I18N("LvCount"), 60); - - lvRoutings.EndUpdate(); - } - - private void RefreshRoutingsView() - { - lvRoutings.BeginUpdate(); - lvRoutings.Items.Clear(); - - for (int k = 0; k < config.routings.Count; k++) + if (tabNormal.SelectedTab == tabPageRuleList) { - string def = string.Empty; - if (config.routingIndex.Equals(k)) - { - def = "√"; - } - - var item = config.routings[k]; - - ListViewItem lvItem = new ListViewItem(def); - Utils.AddSubItem(lvItem, "remarks", item.remarks); - Utils.AddSubItem(lvItem, "url", item.url); - Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString()); - - if (lvItem != null) lvRoutings.Items.Add(lvItem); + MenuItem1.Enabled = true; + } + else + { + MenuItem1.Enabled = false; } - lvRoutings.EndUpdate(); } - private void btnOK_Click(object sender, EventArgs e) { config.domainStrategy = cmbdomainStrategy.Text; + EndBindingLockedData(); if (ConfigHandler.SaveRouting(ref config) == 0) { @@ -92,6 +65,89 @@ namespace v2rayN.Forms this.DialogResult = DialogResult.Cancel; } + + #region locked + private void BindingLockedData() + { + lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); + if (lockedItem != null) + { + txtProxyDomain.Text = Utils.List2String(lockedItem.rules[0].domain, true); + txtProxyIp.Text = Utils.List2String(lockedItem.rules[0].ip, true); + + txtDirectDomain.Text = Utils.List2String(lockedItem.rules[1].domain, true); + txtDirectIp.Text = Utils.List2String(lockedItem.rules[1].ip, true); + + txtBlockDomain.Text = Utils.List2String(lockedItem.rules[2].domain, true); + txtBlockIp.Text = Utils.List2String(lockedItem.rules[2].ip, true); + } + } + private void EndBindingLockedData() + { + if (lockedItem != null) + { + lockedItem.rules[0].domain = Utils.String2List(txtProxyDomain.Text.TrimEx()); + lockedItem.rules[0].ip = Utils.String2List(txtProxyIp.Text.TrimEx()); + + lockedItem.rules[1].domain = Utils.String2List(txtDirectDomain.Text.TrimEx()); + lockedItem.rules[1].ip = Utils.String2List(txtDirectIp.Text.TrimEx()); + + lockedItem.rules[2].domain = Utils.String2List(txtBlockDomain.Text.TrimEx()); + lockedItem.rules[2].ip = Utils.String2List(txtBlockIp.Text.TrimEx()); + } + } + #endregion + + #region ListView + private void InitRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + lvRoutings.GridLines = true; + lvRoutings.FullRowSelect = true; + lvRoutings.View = View.Details; + lvRoutings.MultiSelect = true; + lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; + + lvRoutings.Columns.Add("", 30); + lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 200); + lvRoutings.Columns.Add(UIRes.I18N("LvCount"), 60); + lvRoutings.Columns.Add(UIRes.I18N("LvUrl"), 240); + + lvRoutings.EndUpdate(); + } + + private void RefreshRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + for (int k = 0; k < config.routings.Count; k++) + { + var item = config.routings[k]; + if (item.locked == true) + { + continue; + } + + string def = string.Empty; + if (config.routingIndex.Equals(k)) + { + def = "√"; + } + + ListViewItem lvItem = new ListViewItem(def); + Utils.AddSubItem(lvItem, "remarks", item.remarks); + Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString()); + Utils.AddSubItem(lvItem, "url", item.url); + + if (lvItem != null) lvRoutings.Items.Add(lvItem); + } + lvRoutings.EndUpdate(); + } + + private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); @@ -137,6 +193,9 @@ namespace v2rayN.Forms } } + #endregion + + #region Edit function @@ -197,8 +256,9 @@ namespace v2rayN.Forms } return 0; } - #endregion + #endregion + } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index ec736bae..8a7aaba4 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,219 +117,486 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl + + cmbdomainStrategy - - 568, 17 + + 839, 505 - - 75, 23 + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 + + + Fill - - &Cancel + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - btnClose + + tabPageRuleList - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 853, 25 - - panel2 + + Fill - + + 441, 485 + + + IP + + + 6, 12 + + 0 - - NoControl - - - 475, 17 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 + + 447, 505 Bottom - - 0, 613 - - - 765, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - NoControl - - - 6, 21 - - - 0, 0, 0, 0 - - - 95, 12 - - - 19 - - - Domain strategy - - - linkLabelRoutingDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 0 - - - AsIs - - - IPIfNonMatch - - - IPOnDemand - - - 116, 17 - - - 165, 20 - - - 16 - - - cmbdomainStrategy - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Edit and Function panel1 - - 1 - - - Top - - - 0, 25 - - - 765, 51 - - - 11 + + tabPageProxy panel1 - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + 3 - - 2 + + IPOnDemand - - 17, 17 - - - 194, 22 + + 0 - - Add + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 194, 22 + + + 25 + + + 3, 17 + + + groupBox5 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Left + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 392, 505 + + + 15 + + + txtProxyDomain + + + 6, 21 + + + groupBox6 + + + 853, 673 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 3, 17 + + + MenuItem1 + + + Routing Settings + + + Fill Remove selected + + Fill + + + IP + + + 4.Pre-defined Rule Set List + + + Domain + + + 2 + + + 475, 17 + + + Domain strategy + + + 1 + + + 447, 505 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + tabPageRuleList + + + tabPageBlock + + + 568, 17 + + + False + 194, 22 - - Select All (Ctrl+A) + + panel5 - - 194, 22 + + panel5 - - Set as active routing + + 0, 0 + + + Fill + + + Domain + + + 853, 60 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 25 + + + 0 + + + 4 + + + 386, 485 + + + menuServer + + + 1 120, 21 - - Edit and Function + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 195, 114 + + panel5 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + 4, 22 + + + 845, 511 + + + panel2 cmsLv - - System.Windows.Forms.ContextMenuStrip, 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 - + + 5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + txtProxyIp + + + 845, 511 + + + 386, 485 + + + Add + + + 25 + + + True + + + groupBox3 + + + tabPageProxy + + + panel1 + + + True + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 2 + + + labRoutingTips + + + 95, 12 + + + panel3 + + + 1 + + + RoutingSettingForm + + + 441, 485 + + + 1 + + + 0 + + + 0 + + + tabPageDirect + + Fill + + $this + + + 25 + + + 392, 505 + + + groupBox2 + + + 0 + + + panel4 + + + 4 + + + True + + + System.Windows.Forms.MenuStrip, 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 + + + groupBox4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3 + + + True + + + 195, 92 + + + btnOK + + + 3, 3, 3, 3 + + + 116, 17 + + + txtBlockIp + + + NoControl + + + 0 + + + 542, 16 + + + $this + + + True + + + Left + + + panel4 + + + 441, 485 + + + 0 + + + 3 + + + 386, 485 + + + 0, 0, 0, 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + IPIfNonMatch + + + 3, 17 + + + 853, 537 + + + 1 + + + 24 + + + Fill + + + panel2 + + + 1 + + + tabPageBlock + + + 16 + + + 0, 0 + + + panel4 + + + groupBox1 + + + panel3 + + + $this + + + tabNormal + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -347,148 +614,391 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 3, 3 + + 165, 20 - - 751, 505 - - - 12 - - - lvRoutings - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabPage2 - - - 0 - - + 4, 22 - - 3, 3, 3, 3 + + groupBox4 - - 757, 511 - - + 0 - - RuleSetList + + tabNormal - - tabPage2 + + &OK - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 0 - - - Fill - - - 0, 76 - - - 765, 537 - - - 14 - - - tabControl2 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - 139, 17 - - - 0, 0 - - - 765, 25 - - - 15 - - - menuServer - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - True - - - 6, 12 - - - 765, 673 - - - Routing Settings - - - menuAdd - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemove - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSelectAll + + tabNormal System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuSetDefaultRouting + + Fill - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 1 - - MenuItem1 + + btnClose + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 845, 511 + + + 3, 17 + + + 4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 16 + + + menuSelectAll + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + AsIs + + + panel2 + + + groupBox1 + + + 194, 22 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - RoutingSettingForm + + 0 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3.Block Domain or IP + + + NoControl + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + groupBox2 + + + 12 + + + txtBlockDomain + + + 7 + + + True v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 392, 0 + + + 12 + + + 845, 511 + + + 19 + + + 0, 0 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + groupBox6 + + + txtDirectDomain + + + 839, 505 + + + 0, 613 + + + 3 + + + 0 + + + tabPageDirect + + + 839, 505 + + + Set as active routing + + + Domain + + + Left + + + txtDirectIp + + + 4 + + + Select All (Ctrl+A) + + + &Cancel + + + 392, 0 + + + 839, 505 + + + tabNormal + + + 3, 3, 3, 3 + + + 15 + + + 0 + + + 3, 3, 3, 3 + + + panel1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 17 + + + menuSetDefaultRouting + + + 3 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 194, 22 + + + 392, 0 + + + 3 + + + lvRoutings + + + linkLabelRoutingDoc + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 24 + + + 3 + + + 0 + + + menuRemove + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + NoControl + + + 2.Direct Domain or IP + + + 4, 22 + + + 0 + + + groupBox3 + + + 12 + + + 4, 22 + + + 3, 3 + + + 392, 505 + + + 194, 22 + + + Fill + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 75, 23 + + + Fill + + + Fill + + + 2 + + + 0 + + + 1.Proxy Domain or IP + + + groupBox5 + + + 4 + + + 24 + + + Fill + + + 0, 0 + + + IP + + + 75, 23 + + + 3, 17 + + + 0, 76 + + + 3, 3 + + + 34 + + + 447, 505 + + + Fill + + + menuAdd + + + 3, 3 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 299, 21 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 853, 51 + + + Top + + + zh-Hans + + + True + + + 17, 17 + + + 139, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index 3efb9922..5c043970 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -125,10 +125,16 @@ - 0, 474 + 0, 545 - 726, 60 + 817, 60 + + + 518, 16 + + + *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 77, 12 @@ -137,7 +143,7 @@ 域名解析策略 - 726, 51 + 817, 51 148, 22 @@ -172,6 +178,72 @@ 149, 92 + + 817, 25 + + + 405, 417 + + + 411, 437 + + + 386, 417 + + + 392, 437 + + + 803, 437 + + + 809, 443 + + + 1.代理的Domain或IP + + + 405, 417 + + + 411, 437 + + + 386, 417 + + + 392, 437 + + + 803, 437 + + + 809, 443 + + + 2.直连的Domain或IP + + + 405, 417 + + + 411, 437 + + + 386, 417 + + + 392, 437 + + + 803, 437 + + + 809, 443 + + + 3.阻止的Domain或IP + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -190,22 +262,19 @@ - 712, 366 + 803, 437 - - 718, 372 + + 809, 443 - - 路由规则集列表 + + 4.预定义规则集列表 - - 726, 398 - - - 726, 25 + + 817, 469 - 726, 534 + 817, 605 路由设置 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2287c34d..38b6d623 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1001,6 +1001,14 @@ namespace v2rayN.Handler foreach (var item in config.routings) { + } + //move locked item + int index = config.routings.FindIndex(it => it.locked == true); + if (index != -1) + { + var item = Utils.DeepCopy(config.routings[index]); + config.routings.RemoveAt(index); + config.routings.Add(item); } if (config.routingIndex >= config.routings.Count) { @@ -1151,32 +1159,43 @@ namespace v2rayN.Handler { config.routings = new List(); } - if (config.routings.Count > 0) + if (config.routings.Count <= 0) { - return 0; + //Bypass the mainland + var item2 = new RoutingItem(); + item2.remarks = "绕过大陆(Whitelist)"; + item2.url = string.Empty; + item2.rules = new List(); + string result2 = Utils.GetEmbedText(Global.CustomRoutingFileName + "white"); + AddBatchRoutingRules(ref item2, result2); + config.routings.Add(item2); + + config.routingIndex = 0; + } + + if (GetLockedRoutingItem(ref config) == null) + { + var item1 = new RoutingItem(); + item1.remarks = "locked"; + item1.url = string.Empty; + item1.rules = new List(); + item1.locked = true; + string result1 = Utils.GetEmbedText(Global.CustomRoutingFileName + "locked"); + AddBatchRoutingRules(ref item1, result1); + config.routings.Add(item1); } - config.routingIndex = 0; - //Global - var item1 = new RoutingItem(); - item1.remarks = "全局(Global)"; - item1.url = string.Empty; - item1.rules = new List(); - string result = Utils.GetEmbedText(Global.CustomRoutingFileName + "global"); - AddBatchRoutingRules(ref item1, result); - config.routings.Add(item1); - - //Bypass the mainland - var item2 = new RoutingItem(); - item2.remarks = "绕过大陆(Whitelist)"; - item2.url = string.Empty; - item2.rules = new List(); - string result2 = Utils.GetEmbedText(Global.CustomRoutingFileName + "white"); - AddBatchRoutingRules(ref item2, result2); - config.routings.Add(item2); - - ToJsonFile(config); + SaveRouting(ref config); return 0; + } + + public static RoutingItem GetLockedRoutingItem(ref Config config) + { + if (config.routings == null) + { + return null; + } + return config.routings.Find(it => it.locked == true); } #endregion } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 53a0b8c3..3f2ba417 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -190,6 +190,14 @@ namespace v2rayN.Handler { v2rayConfig.routing.domainStrategy = config.domainStrategy; + var lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); + if (lockedItem != null) + { + foreach (var item in lockedItem.rules) + { + routingUserRule(item, ref v2rayConfig); + } + } if (config.routings != null && config.routingIndex < config.routings.Count) { foreach (var item in config.routings[config.routingIndex].rules) diff --git a/v2rayN/v2rayN/Mode/RoutingItem.cs b/v2rayN/v2rayN/Mode/RoutingItem.cs index 544558ed..2344e227 100644 --- a/v2rayN/v2rayN/Mode/RoutingItem.cs +++ b/v2rayN/v2rayN/Mode/RoutingItem.cs @@ -23,5 +23,10 @@ namespace v2rayN.Mode } public bool enabled { get; set; } = true; + public bool locked + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 01ee1030..d26a2167 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.8")] +[assembly: AssemblyFileVersion("4.9")] diff --git a/v2rayN/v2rayN/Sample/custom_routing_locked b/v2rayN/v2rayN/Sample/custom_routing_locked new file mode 100644 index 00000000..b4636131 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_locked @@ -0,0 +1,21 @@ +[ + { + "domain": [ + "geosite:google" + ], + "outboundTag": "proxy" + }, + { + "outboundTag": "direct", + "domain": [ + "domain:example.com", + "domain:example2.com" + ] + }, + { + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_white b/v2rayN/v2rayN/Sample/custom_routing_white index 7ee814b3..61c48382 100644 --- a/v2rayN/v2rayN/Sample/custom_routing_white +++ b/v2rayN/v2rayN/Sample/custom_routing_white @@ -1,15 +1,23 @@ -[{ - "outboundTag": "block", - "domain": [ - "geosite:category-ads-all" - ] - }, - { - "outboundTag": "direct", - "domain": [ - "geosite:cn" - ] - }, +[ + { + "outboundTag": "direct", + "domain": [ + "domain:example.com", + "domain:example2.com" + ] + }, + { + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "outboundTag": "direct", + "domain": [ + "geosite:cn" + ] + }, { "outboundTag": "direct", "ip": [ @@ -17,8 +25,8 @@ "geoip:cn" ] }, - { - "port": "0-65535", - "outboundTag": "proxy" - } + { + "port": "0-65535", + "outboundTag": "proxy" + } ] \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index c38e2c89..2f87020d 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -388,6 +388,7 @@ + From 23b0f154f3aca96b5434280ab9478d70e98a054e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 3 Feb 2021 16:46:43 +0800 Subject: [PATCH 019/252] up4.10 --- v2rayN/v2rayN/Forms/MainForm.cs | 6 + .../Forms/RoutingSettingForm.Designer.cs | 22 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 51 +- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 567 +++++++++--------- .../Forms/RoutingSettingForm.zh-Hans.resx | 34 +- v2rayN/v2rayN/Global.cs | 4 + v2rayN/v2rayN/Handler/ConfigHandler.cs | 3 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 37 +- v2rayN/v2rayN/Mode/Config.cs | 6 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Sample/custom_routing_locked | 4 +- v2rayN/v2rayN/Sample/custom_routing_white | 4 +- 12 files changed, 426 insertions(+), 314 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 6b293a83..d472f40b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1501,6 +1501,12 @@ namespace v2rayN.Forms /// private void RefreshRoutingsMenu() { + menuRoutings.Visible = config.enableRoutingAdvanced; + if (!config.enableRoutingAdvanced) + { + return; + } + menuRoutings.DropDownItems.Clear(); List lst = new List(); diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 513d218e..16fa9b00 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -32,9 +32,10 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingForm)); this.btnClose = new System.Windows.Forms.Button(); this.panel2 = new System.Windows.Forms.Panel(); + this.labRoutingTips = new System.Windows.Forms.Label(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.labRoutingTips = new System.Windows.Forms.Label(); + this.chkenableRoutingAdvanced = new System.Windows.Forms.CheckBox(); this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -96,10 +97,17 @@ // panel2 // resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.labRoutingTips); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); this.panel2.Name = "panel2"; // + // labRoutingTips + // + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + this.labRoutingTips.Name = "labRoutingTips"; + // // btnOK // resources.ApplyResources(this.btnOK, "btnOK"); @@ -110,16 +118,17 @@ // panel1 // resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Controls.Add(this.labRoutingTips); + this.panel1.Controls.Add(this.chkenableRoutingAdvanced); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); this.panel1.Name = "panel1"; // - // labRoutingTips + // chkenableRoutingAdvanced // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; - this.labRoutingTips.Name = "labRoutingTips"; + resources.ApplyResources(this.chkenableRoutingAdvanced, "chkenableRoutingAdvanced"); + this.chkenableRoutingAdvanced.Name = "chkenableRoutingAdvanced"; + this.chkenableRoutingAdvanced.UseVisualStyleBackColor = true; + this.chkenableRoutingAdvanced.CheckedChanged += new System.EventHandler(this.chkenableRoutingAdvanced_CheckedChanged_1); // // linkLabelRoutingDoc // @@ -415,5 +424,6 @@ private System.Windows.Forms.TabPage tabPageRuleList; private Base.ListViewFlickerFree lvRoutings; private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.CheckBox chkenableRoutingAdvanced; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 9066fb34..5e015af7 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -21,6 +21,7 @@ namespace v2rayN.Forms ConfigHandler.InitBuiltinRouting(ref config); cmbdomainStrategy.Text = config.domainStrategy; + chkenableRoutingAdvanced.Checked = config.enableRoutingAdvanced; if (config.routings == null) { @@ -30,24 +31,25 @@ namespace v2rayN.Forms RefreshRoutingsView(); BindingLockedData(); - - } + InitUI(); + } private void tabNormal_Selecting(object sender, TabControlCancelEventArgs e) { - if (tabNormal.SelectedTab == tabPageRuleList) - { - MenuItem1.Enabled = true; - } - else - { - MenuItem1.Enabled = false; - } + //if (tabNormal.SelectedTab == tabPageRuleList) + //{ + // MenuItem1.Enabled = true; + //} + //else + //{ + // MenuItem1.Enabled = false; + //} } private void btnOK_Click(object sender, EventArgs e) { config.domainStrategy = cmbdomainStrategy.Text; + config.enableRoutingAdvanced = chkenableRoutingAdvanced.Checked; EndBindingLockedData(); if (ConfigHandler.SaveRouting(ref config) == 0) @@ -64,6 +66,31 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } + private void chkenableRoutingAdvanced_CheckedChanged_1(object sender, EventArgs e) + { + InitUI(); + } + private void InitUI() + { + if (chkenableRoutingAdvanced.Checked) + { + this.tabPageProxy.Parent = null; + this.tabPageDirect.Parent = null; + this.tabPageBlock.Parent = null; + this.tabPageRuleList.Parent = tabNormal; + MenuItem1.Enabled = true; + + } + else + { + this.tabPageProxy.Parent = tabNormal; + this.tabPageDirect.Parent = tabNormal; + this.tabPageBlock.Parent = tabNormal; + this.tabPageRuleList.Parent = null; + MenuItem1.Enabled = false; + } + + } #region locked @@ -94,6 +121,7 @@ namespace v2rayN.Forms lockedItem.rules[2].domain = Utils.String2List(txtBlockDomain.Text.TrimEx()); lockedItem.rules[2].ip = Utils.String2List(txtBlockIp.Text.TrimEx()); + } } #endregion @@ -136,7 +164,7 @@ namespace v2rayN.Forms { def = "√"; } - + ListViewItem lvItem = new ListViewItem(def); Utils.AddSubItem(lvItem, "remarks", item.remarks); Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString()); @@ -260,5 +288,6 @@ namespace v2rayN.Forms #endregion + } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 8a7aaba4..f784cf53 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4 + cmbdomainStrategy @@ -124,42 +127,39 @@ 839, 505 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 386, 485 + + + 392, 0 - + Fill - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPageRuleList - 853, 25 - - Fill - - - 441, 485 + + txtDirectIp IP - - 6, 12 + + Fill - - 0 + + panel1 447, 505 - - Bottom + + 441, 485 Edit and Function @@ -173,30 +173,27 @@ panel1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 25 3 - - IPOnDemand - 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - 25 3, 17 - - groupBox5 + + Domain System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -207,14 +204,17 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 392, 505 + + 3, 3, 3, 3 15 - - txtProxyDomain + + 0 + + + False 6, 21 @@ -225,24 +225,24 @@ 853, 673 + + 392, 0 + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 NoControl - - 3, 17 + + $this - - MenuItem1 + + 0 Routing Settings - - Fill - Remove selected @@ -252,23 +252,23 @@ IP + + 845, 511 + - 4.Pre-defined Rule Set List + Pre-defined Rule Set List - - Domain - - - 2 + + Fill - 475, 17 + 660, 17 Domain strategy - - 1 + + groupBox3 447, 505 @@ -276,44 +276,41 @@ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 853, 60 + tabNormal - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + MenuItem1 - 0 + 1 System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 3, 3, 3 - - - tabPageRuleList - tabPageBlock - - 568, 17 + + groupBox1 - - False + + IPOnDemand - - 194, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel5 + + 318, 17 panel5 - - 0, 0 + + 95, 12 Fill @@ -321,8 +318,8 @@ Domain - - 853, 60 + + System.Windows.Forms.TabControl, 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 @@ -333,11 +330,11 @@ 0 - - 4 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 386, 485 + + 75, 23 menuServer @@ -345,8 +342,11 @@ 1 - - 120, 21 + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -354,8 +354,8 @@ panel5 - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPageRuleList 2 @@ -378,11 +378,8 @@ 5 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True + + NoControl txtProxyIp @@ -390,47 +387,41 @@ 845, 511 - - 386, 485 - Add - - 25 + + 15 True - - groupBox3 + + txtBlockIp - - tabPageProxy + + 0 - panel1 + panel2 - - True - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + tabPageRuleList 2 - - labRoutingTips + + 3 - - 95, 12 + + chkenableRoutingAdvanced - - panel3 + + NoControl - 1 + 2 RoutingSettingForm @@ -438,17 +429,17 @@ 441, 485 - - 1 + + panel2 - - 0 + + 0, 0 0 - - tabPageDirect + + True Fill @@ -456,8 +447,8 @@ $this - - 25 + + 2 392, 505 @@ -465,8 +456,8 @@ groupBox2 - - 0 + + 194, 22 panel4 @@ -486,11 +477,8 @@ groupBox4 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3 + + 1.Proxy Domain or IP True @@ -498,50 +486,50 @@ 195, 92 + + True + btnOK 3, 3, 3, 3 + + 26 + 116, 17 - - txtBlockIp - - - NoControl - - - 0 - - - 542, 16 - - - $this - - - True - - - Left - panel4 + + 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 24 + + + Left + 441, 485 - - 0 + + 3, 3 3 - - 386, 485 + + 3, 17 0, 0, 0, 0 @@ -552,32 +540,26 @@ IPIfNonMatch - - 3, 17 - 853, 537 1 - - 24 + + panel1 - - Fill - - - panel2 + + 25 1 - - tabPageBlock + + 0 - - 16 + + 853, 51 0, 0 @@ -585,8 +567,8 @@ panel4 - - groupBox1 + + 194, 22 panel3 @@ -617,15 +599,18 @@ 165, 20 + + 0 + + + Fill + 4, 22 groupBox4 - - 0 - tabNormal @@ -635,8 +620,11 @@ tabNormal - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + + + 4, 22 Fill @@ -650,8 +638,8 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + panel2 845, 511 @@ -659,12 +647,18 @@ 3, 17 - - 4 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageProxy System.Windows.Forms.TextBox, 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 + panel3 @@ -677,38 +671,44 @@ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 216, 16 + 1 AsIs - - panel2 + + txtDirectDomain groupBox1 - - 194, 22 + + System.Windows.Forms.TabPage, 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.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 0, 76 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill 3.Block Domain or IP - - NoControl - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4 11 @@ -716,6 +716,9 @@ groupBox2 + + 0, 0 + 12 @@ -725,26 +728,32 @@ 7 - - True + + Enable advanced routing function - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 3, 17 - - 392, 0 + + 1 + + + NoControl + + + 0 12 - - 845, 511 + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 19 - - 0, 0 + + 392, 505 *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> @@ -752,38 +761,50 @@ groupBox6 - - txtDirectDomain + + Top + + + Fill 839, 505 + + 2.Direct Domain or IP + 0, 613 - - 3 - - - 0 + + Fill tabPageDirect - - 839, 505 + + 562, 16 - - Set as active routing + + Fill - - Domain + + 3, 17 - - Left + + 120, 21 - - txtDirectIp + + 3 + + + 194, 22 + + + NoControl + + + tabPageDirect 4 @@ -806,29 +827,29 @@ 3, 3, 3, 3 - - 15 + + 6, 12 - - 0 + + 1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 3, 3, 3, 3 - - panel1 + + 3, 3 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 17 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuSetDefaultRouting - - - 3 + + 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 @@ -842,8 +863,8 @@ 194, 22 - - 392, 0 + + Bottom 3 @@ -860,29 +881,32 @@ 24 - - 3 + + tabPageBlock 0 + + 3, 17 + menuRemove - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Left - - Fill + + labRoutingTips - - NoControl + + txtProxyDomain - - 2.Direct Domain or IP + + Domain - - 4, 22 + + groupBox5 0 @@ -896,24 +920,27 @@ 4, 22 - - 3, 3 + + Set as active routing 392, 505 - - 194, 22 + + 0, 0 - - Fill + + 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 75, 23 + + 5, 22 + Fill @@ -923,11 +950,14 @@ 2 - - 0 + + 16 - - 1.Proxy Domain or IP + + panel5 + + + 3 groupBox5 @@ -938,23 +968,23 @@ 24 - - Fill - - - 0, 0 + + menuSetDefaultRouting IP - - 75, 23 + + 839, 505 - - 3, 17 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 76 + + 386, 485 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 3, 3 @@ -965,8 +995,8 @@ 447, 505 - - Fill + + 386, 485 menuAdd @@ -977,21 +1007,18 @@ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 299, 21 + + 753, 17 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 853, 51 + + 0 - - Top + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - zh-Hans - True diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index 5c043970..a5b85f29 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -117,25 +117,37 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 691, 17 + 取消(&C) - - 确定(&O) - - - - 0, 545 - - - 817, 60 - 518, 16 *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 + + 598, 17 + + + 确定(&O) + + + 0, 545 + + + 817, 60 + + + 120, 16 + + + 启用路由高级功能 + 77, 12 @@ -268,7 +280,7 @@ 809, 443 - 4.预定义规则集列表 + 预定义规则集列表 817, 469 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 0eaf0665..5fbf1fdc 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -1,4 +1,6 @@  +using System.Collections.Generic; + namespace v2rayN { class Global @@ -190,6 +192,8 @@ namespace v2rayN 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.*"; public const string RoutingRuleComma = ""; + + public static readonly IEnumerable ssSecuritys = new HashSet { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; #endregion #region 全局变量 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 38b6d623..0fccf551 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -528,8 +528,7 @@ namespace v2rayN.Handler vmessItem.id = vmessItem.id.TrimEx(); vmessItem.security = vmessItem.security.TrimEx(); - var securitys = new HashSet() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; - if (!securitys.Contains(vmessItem.security)) + if (!Global.ssSecuritys.Contains(vmessItem.security)) { return -1; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 3f2ba417..a6a35459 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -190,19 +190,32 @@ namespace v2rayN.Handler { v2rayConfig.routing.domainStrategy = config.domainStrategy; - var lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); - if (lockedItem != null) + if (config.enableRoutingAdvanced) { - foreach (var item in lockedItem.rules) + if (config.routings != null && config.routingIndex < config.routings.Count) { - routingUserRule(item, ref v2rayConfig); + foreach (var item in config.routings[config.routingIndex].rules) + { + routingUserRule(item, ref v2rayConfig); + } } } - if (config.routings != null && config.routingIndex < config.routings.Count) + else { - foreach (var item in config.routings[config.routingIndex].rules) + var lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); + if (lockedItem != null) { - routingUserRule(item, ref v2rayConfig); + foreach (var item in lockedItem.rules) + { + routingUserRule(item, ref v2rayConfig); + } + //Extra to bypass the mainland + string result = Utils.GetEmbedText(Global.CustomRoutingFileName + "white"); + var lstRules = Utils.FromJson>(result); + foreach (var item in lstRules) + { + routingUserRule(item, ref v2rayConfig); + } } } } @@ -378,7 +391,15 @@ namespace v2rayN.Handler serversItem.address = config.address(); serversItem.port = config.port(); serversItem.password = config.id(); - serversItem.method = config.security(); + if (Global.ssSecuritys.Contains(config.security())) + { + serversItem.method = config.security(); + } + else + { + serversItem.method = "none"; + } + serversItem.ota = false; serversItem.level = 1; diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 552b35fb..a7733912 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -169,7 +169,11 @@ namespace v2rayN.Mode { get; set; } - + public bool enableRoutingAdvanced + { + get; set; + } + public ECoreType coreType { get; set; diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index d26a2167..1df9cdb0 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.9")] +[assembly: AssemblyFileVersion("4.10")] diff --git a/v2rayN/v2rayN/Sample/custom_routing_locked b/v2rayN/v2rayN/Sample/custom_routing_locked index b4636131..018ee608 100644 --- a/v2rayN/v2rayN/Sample/custom_routing_locked +++ b/v2rayN/v2rayN/Sample/custom_routing_locked @@ -8,8 +8,8 @@ { "outboundTag": "direct", "domain": [ - "domain:example.com", - "domain:example2.com" + "domain:example-example.com", + "domain:example-example2.com" ] }, { diff --git a/v2rayN/v2rayN/Sample/custom_routing_white b/v2rayN/v2rayN/Sample/custom_routing_white index 61c48382..a708ae0d 100644 --- a/v2rayN/v2rayN/Sample/custom_routing_white +++ b/v2rayN/v2rayN/Sample/custom_routing_white @@ -2,8 +2,8 @@ { "outboundTag": "direct", "domain": [ - "domain:example.com", - "domain:example2.com" + "domain:example-example.com", + "domain:example-example2.com" ] }, { From 83804bd9148cc5cc7e2537cfe989aeee2578a448 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 5 Feb 2021 20:30:51 +0800 Subject: [PATCH 020/252] up4.11 --- .../Forms/RoutingSettingForm.Designer.cs | 86 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 17 +- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 1711 +++++++++-------- .../Forms/RoutingSettingForm.zh-Hans.resx | 110 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 9 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 6 files changed, 994 insertions(+), 941 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 16fa9b00..1d5cf177 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -43,8 +43,10 @@ this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem(); - this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemAdvanced = new System.Windows.Forms.ToolStripMenuItem(); this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItemBasic = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportBasicRules = new System.Windows.Forms.ToolStripMenuItem(); this.tabNormal = new System.Windows.Forms.TabControl(); this.tabPageProxy = new System.Windows.Forms.TabPage(); this.panel5 = new System.Windows.Forms.Panel(); @@ -88,24 +90,24 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.labRoutingTips); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // labRoutingTips // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.Name = "labRoutingTips"; // // btnOK @@ -117,10 +119,10 @@ // // panel1 // - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Controls.Add(this.chkenableRoutingAdvanced); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // // chkenableRoutingAdvanced @@ -139,18 +141,17 @@ // // 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"; // // 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.menuAdd, @@ -158,74 +159,89 @@ this.menuSelectAll, this.menuSetDefaultRouting}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.MenuItem1; + this.cmsLv.OwnerItem = this.MenuItemAdvanced; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuSetDefaultRouting // - resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; + resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); // - // MenuItem1 + // MenuItemAdvanced // - resources.ApplyResources(this.MenuItem1, "MenuItem1"); - this.MenuItem1.DropDown = this.cmsLv; - this.MenuItem1.Name = "MenuItem1"; + this.MenuItemAdvanced.DropDown = this.cmsLv; + this.MenuItemAdvanced.Name = "MenuItemAdvanced"; + resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); // // menuServer // - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); + this.MenuItemBasic, + this.MenuItemAdvanced}); + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // + // MenuItemBasic + // + this.MenuItemBasic.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuImportBasicRules}); + this.MenuItemBasic.Name = "MenuItemBasic"; + resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); + // + // menuImportBasicRules + // + this.menuImportBasicRules.Name = "menuImportBasicRules"; + resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); + this.menuImportBasicRules.Click += new System.EventHandler(this.menuImportBasicRules_Click); + // // tabNormal // - resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Controls.Add(this.tabPageProxy); this.tabNormal.Controls.Add(this.tabPageDirect); this.tabNormal.Controls.Add(this.tabPageBlock); this.tabNormal.Controls.Add(this.tabPageRuleList); + resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Name = "tabNormal"; this.tabNormal.SelectedIndex = 0; this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting); // // tabPageProxy // - resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); this.tabPageProxy.Controls.Add(this.panel5); + resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); this.tabPageProxy.Name = "tabPageProxy"; this.tabPageProxy.UseVisualStyleBackColor = true; // // panel5 // - resources.ApplyResources(this.panel5, "panel5"); this.panel5.Controls.Add(this.groupBox5); this.panel5.Controls.Add(this.groupBox6); + resources.ApplyResources(this.panel5, "panel5"); this.panel5.Name = "panel5"; // // groupBox5 // - resources.ApplyResources(this.groupBox5, "groupBox5"); this.groupBox5.Controls.Add(this.txtProxyIp); + resources.ApplyResources(this.groupBox5, "groupBox5"); this.groupBox5.Name = "groupBox5"; this.groupBox5.TabStop = false; // @@ -236,8 +252,8 @@ // // groupBox6 // - resources.ApplyResources(this.groupBox6, "groupBox6"); this.groupBox6.Controls.Add(this.txtProxyDomain); + resources.ApplyResources(this.groupBox6, "groupBox6"); this.groupBox6.Name = "groupBox6"; this.groupBox6.TabStop = false; // @@ -248,22 +264,22 @@ // // tabPageDirect // - resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); this.tabPageDirect.Controls.Add(this.panel4); + resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); this.tabPageDirect.Name = "tabPageDirect"; this.tabPageDirect.UseVisualStyleBackColor = true; // // panel4 // - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.groupBox3); this.panel4.Controls.Add(this.groupBox4); + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // groupBox3 // - resources.ApplyResources(this.groupBox3, "groupBox3"); this.groupBox3.Controls.Add(this.txtDirectIp); + resources.ApplyResources(this.groupBox3, "groupBox3"); this.groupBox3.Name = "groupBox3"; this.groupBox3.TabStop = false; // @@ -274,8 +290,8 @@ // // groupBox4 // - resources.ApplyResources(this.groupBox4, "groupBox4"); this.groupBox4.Controls.Add(this.txtDirectDomain); + resources.ApplyResources(this.groupBox4, "groupBox4"); this.groupBox4.Name = "groupBox4"; this.groupBox4.TabStop = false; // @@ -286,22 +302,22 @@ // // tabPageBlock // - resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); this.tabPageBlock.Controls.Add(this.panel3); + resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); this.tabPageBlock.Name = "tabPageBlock"; this.tabPageBlock.UseVisualStyleBackColor = true; // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.groupBox2); this.panel3.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtBlockIp); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -312,8 +328,8 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtBlockDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -324,15 +340,15 @@ // // tabPageRuleList // - resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); this.tabPageRuleList.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); this.tabPageRuleList.Name = "tabPageRuleList"; this.tabPageRuleList.UseVisualStyleBackColor = true; // // lvRoutings // - resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -400,7 +416,7 @@ private System.Windows.Forms.ToolStripMenuItem menuSelectAll; private System.Windows.Forms.ToolStripMenuItem menuAdd; private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem MenuItemAdvanced; private System.Windows.Forms.ToolStripMenuItem menuSetDefaultRouting; private System.Windows.Forms.TabControl tabNormal; private System.Windows.Forms.TabPage tabPageProxy; @@ -425,5 +441,7 @@ private Base.ListViewFlickerFree lvRoutings; private System.Windows.Forms.Label labRoutingTips; private System.Windows.Forms.CheckBox chkenableRoutingAdvanced; + private System.Windows.Forms.ToolStripMenuItem MenuItemBasic; + private System.Windows.Forms.ToolStripMenuItem menuImportBasicRules; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 5e015af7..c0fc32b4 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -78,7 +78,8 @@ namespace v2rayN.Forms this.tabPageDirect.Parent = null; this.tabPageBlock.Parent = null; this.tabPageRuleList.Parent = tabNormal; - MenuItem1.Enabled = true; + MenuItemBasic.Enabled = false; + MenuItemAdvanced.Enabled = true; } else @@ -87,9 +88,10 @@ namespace v2rayN.Forms this.tabPageDirect.Parent = tabNormal; this.tabPageBlock.Parent = tabNormal; this.tabPageRuleList.Parent = null; - MenuItem1.Enabled = false; + MenuItemBasic.Enabled = true; + MenuItemAdvanced.Enabled = false; } - + } @@ -285,9 +287,16 @@ namespace v2rayN.Forms return 0; } + private void menuImportBasicRules_Click(object sender, EventArgs e) + { + //Extra to bypass the mainland + txtDirectDomain.Text = "geosite:cn"; + txtDirectIp.Text = "geoip:private,geoip:cn"; + + txtBlockDomain.Text = "geosite:category-ads-all"; + } #endregion - } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index f784cf53..2b12e311 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,468 +117,789 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 4 - - - cmbdomainStrategy - - - - 839, 505 - - - 386, 485 - - - 392, 0 - - - Fill - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 853, 25 - - - txtDirectIp - - - IP - - - Fill - - - panel1 - - - 447, 505 - - - 441, 485 - - - Edit and Function - - - panel1 - - - tabPageProxy - - - panel1 - - - - 25 - - - 3 - - - 0 - - - True - - - 25 - - - 3, 17 - - - Domain - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Left - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - 15 - - - 0 - - - False - - - 6, 21 - - - groupBox6 - - - 853, 673 - - - 392, 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + NoControl - - $this + + + 753, 17 - - 0 + + 75, 23 - - Routing Settings + + + 4 - - Remove selected + + &Cancel - - Fill + + btnClose - - IP + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 845, 511 - - - Pre-defined Rule Set List - - - Fill - - - 660, 17 - - - Domain strategy - - - groupBox3 - - - 447, 505 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 853, 60 - - - tabNormal - - - MenuItem1 + + panel2 1 + + NoControl + + + 5, 22 + + + 562, 16 + + + 34 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 660, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 613 + + + 853, 60 + + + 7 + + + panel2 + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this + + + 3 + + + True + + + NoControl + + + 318, 17 + + + 216, 16 + + + 26 + + + Enable advanced routing function + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + Top + + + 0, 25 + + + 853, 51 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 194, 22 + + + Add + + + 194, 22 + + + Remove selected + + + 194, 22 + + + Select All (Ctrl+A) + + + 194, 22 + + + Set as active routing + + + 129, 21 + + + Advanced Function + + + 195, 92 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 139, 17 + + + 185, 22 + + + Import Basic Rules + + + 102, 21 + + + Basic Function + + + 0, 0 + + + 853, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Fill + + + 3, 17 + + + True + + + 441, 485 + + + 25 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 386, 485 + + + 24 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 0 + + + 1.Proxy Domain or IP + + + tabPageProxy + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 0 + + + Fill + + + 3, 17 + + + True + + + 441, 485 + + + 25 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 386, 485 + + + 24 + + + txtDirectDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 1 + + + 2.Direct Domain or IP + + + tabPageDirect + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 1 + + + Fill + + + 3, 17 + + + True + + + 441, 485 + + + 25 + + + txtBlockIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 386, 485 + + + 24 + + + txtBlockDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + tabPageBlock - - groupBox1 - - - IPOnDemand - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 318, 17 - - - panel5 - - - 95, 12 - - - Fill - - - Domain - - - System.Windows.Forms.TabControl, 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 - - - 0, 25 - - + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 75, 23 - - - menuServer - - - 1 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel5 - - - tabPageRuleList - - - 2 - - + 4, 22 - + + 3, 3, 3, 3 + + 845, 511 - - panel2 - - - cmsLv - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - NoControl - - - txtProxyIp - - - 845, 511 - - - Add - - - 15 - - - True - - - txtBlockIp - - - 0 - - - panel2 - - - tabPageRuleList - - - 2 - - - 3 - - - chkenableRoutingAdvanced - - - NoControl - - - 2 - - - RoutingSettingForm - - - 441, 485 - - - panel2 - - - 0, 0 - - - 0 - - - True - - - Fill - - - $this - 2 - - 392, 505 + + 3.Block Domain or IP - - groupBox2 + + tabPageBlock - - 194, 22 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel4 - - - 4 - - - True - - - System.Windows.Forms.MenuStrip, 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 - - - groupBox4 - - - 1.Proxy Domain or IP - - - True - - - 195, 92 - - - True - - - btnOK - - - 3, 3, 3, 3 - - - 26 - - - 116, 17 - - - panel4 - - - 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 24 - - - Left - - - 441, 485 - - - 3, 3 - - - 3 - - - 3, 17 - - - 0, 0, 0, 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - IPIfNonMatch - - - 853, 537 - - - 1 - - - panel1 - - - 25 - - - 1 - - - 0 - - - 853, 51 - - - 0, 0 - - - panel4 - - - 194, 22 - - - panel3 - - - $this - - + tabNormal + + 2 + + + Fill + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -596,436 +917,136 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 165, 20 - - - 0 - - - Fill - - - 4, 22 - - - groupBox4 - - - tabNormal - - - &OK - - - tabNormal - - - True - - - 4, 22 - - - Fill - - - 1 - - - btnClose - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 845, 511 - - - 3, 17 - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabPageProxy - - - System.Windows.Forms.TextBox, 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 - - - panel3 - - - 16 - - - menuSelectAll - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 216, 16 - - - 1 - - - AsIs - - - txtDirectDomain - - - groupBox1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 0, 76 - - - 0 - - - Fill - - - 3.Block Domain or IP - - - 4 - - - 11 - - - groupBox2 - - - 0, 0 - - - 12 - - - txtBlockDomain - - - 7 - - - Enable advanced routing function - - - 3, 17 - - - 1 - - - NoControl - - - 0 - - - 12 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 19 - - - 392, 505 - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - groupBox6 - - - Top - - - Fill - - - 839, 505 - - - 2.Direct Domain or IP - - - 0, 613 - - - Fill - - - tabPageDirect - - - 562, 16 - - - Fill - - - 3, 17 - - - 120, 21 - - - 3 - - - 194, 22 - - - NoControl - - - tabPageDirect - - - 4 - - - Select All (Ctrl+A) - - - &Cancel - - - 392, 0 - - - 839, 505 - - - tabNormal - - - 3, 3, 3, 3 - - - 6, 12 - - - 1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - + 3, 3 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.GroupBox, 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 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 194, 22 - - - Bottom - - - 3 - - - lvRoutings - - - linkLabelRoutingDoc - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 24 - - - tabPageBlock - - - 0 - - - 3, 17 - - - menuRemove - - - Left - - - labRoutingTips - - - txtProxyDomain - - - Domain - - - groupBox5 - - - 0 - - - groupBox3 - - - 12 - - - 4, 22 - - - Set as active routing - - - 392, 505 - - - 0, 0 - - - 0 - - - 0 - - - 75, 23 - - - 5, 22 - - - Fill - - - Fill - - - 2 - - - 16 - - - panel5 - - - 3 - - - groupBox5 - - - 4 - - - 24 - - - menuSetDefaultRouting - - - IP - 839, 505 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15 - - 386, 485 + + lvRoutings - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 3, 3 - - - 34 - - - 447, 505 - - - 386, 485 - - - menuAdd - - - 3, 3 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 753, 17 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPageRuleList 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 3 + + + Pre-defined Rule Set List + + + tabPageRuleList + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 3 + + + Fill + + + 0, 76 + + + 853, 537 + + + 16 + + + tabNormal + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 True - - 17, 17 - - - 139, 17 - + + 6, 12 + + + 853, 673 + + + Routing Settings + + + menuAdd + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemove + + + 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 + + + menuSetDefaultRouting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemAdvanced + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemBasic + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportBasicRules + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + RoutingSettingForm + + + 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/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index a5b85f29..992f0e9e 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -124,6 +124,12 @@ 取消(&C) + + 0, 545 + + + 817, 60 + 518, 16 @@ -136,11 +142,8 @@ 确定(&O) - - 0, 545 - - - 817, 60 + + 817, 51 120, 16 @@ -154,8 +157,8 @@ 域名解析策略 - - 817, 51 + + 149, 92 148, 22 @@ -181,32 +184,29 @@ 设为活动路由 - - 104, 21 + + 68, 21 - - 路由规则集功能 - - - 149, 92 + + 高级功能 817, 25 - - 405, 417 + + 68, 21 - - 411, 437 + + 基础功能 - - 386, 417 + + 180, 22 - - 392, 437 + + 一键导入基础规则 - - 803, 437 + + 817, 469 809, 443 @@ -214,20 +214,20 @@ 1.代理的Domain或IP - - 405, 417 + + 803, 437 - + 411, 437 - - 386, 417 + + 405, 417 - + 392, 437 - - 803, 437 + + 386, 417 809, 443 @@ -235,20 +235,20 @@ 2.直连的Domain或IP - - 405, 417 + + 803, 437 - + 411, 437 - - 386, 417 + + 405, 417 - + 392, 437 - - 803, 437 + + 386, 417 809, 443 @@ -256,6 +256,27 @@ 3.阻止的Domain或IP + + 803, 437 + + + 411, 437 + + + 405, 417 + + + 392, 437 + + + 386, 417 + + + 809, 443 + + + 预定义规则集列表 + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -276,15 +297,6 @@ 803, 437 - - 809, 443 - - - 预定义规则集列表 - - - 817, 469 - 817, 605 diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index a6a35459..b10e4974 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -208,14 +208,7 @@ namespace v2rayN.Handler foreach (var item in lockedItem.rules) { routingUserRule(item, ref v2rayConfig); - } - //Extra to bypass the mainland - string result = Utils.GetEmbedText(Global.CustomRoutingFileName + "white"); - var lstRules = Utils.FromJson>(result); - foreach (var item in lstRules) - { - routingUserRule(item, ref v2rayConfig); - } + } } } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 1df9cdb0..7eb30d8a 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.10")] +[assembly: AssemblyFileVersion("4.11")] From b30191feb2d717e31dea845fc2416c4a73efee34 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 16 Feb 2021 20:23:32 +0800 Subject: [PATCH 021/252] up4.12 --- .../v2rayN/Forms/AddServer5Form.Designer.cs | 50 +- v2rayN/v2rayN/Forms/AddServer5Form.cs | 6 +- v2rayN/v2rayN/Forms/AddServer5Form.resx | 2328 ++++++++-------- .../v2rayN/Forms/AddServer5Form.zh-Hans.resx | 34 +- .../v2rayN/Forms/AddServer6Form.Designer.cs | 55 +- v2rayN/v2rayN/Forms/AddServer6Form.cs | 18 +- v2rayN/v2rayN/Forms/AddServer6Form.resx | 824 +++--- .../v2rayN/Forms/AddServer6Form.zh-Hans.resx | 26 +- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 48 +- v2rayN/v2rayN/Forms/AddServerForm.cs | 4 + v2rayN/v2rayN/Forms/AddServerForm.resx | 2339 +++++++++-------- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 26 +- v2rayN/v2rayN/Forms/MainForm.cs | 66 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 5 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 74 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 15 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 25 +- v2rayN/v2rayN/Mode/Config.cs | 15 + v2rayN/v2rayN/Mode/VmessQRCode.cs | 6 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 20 files changed, 3181 insertions(+), 2785 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs index 423b7386..e6558407 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -39,6 +39,8 @@ this.label24 = new System.Windows.Forms.Label(); this.label23 = new System.Windows.Forms.Label(); this.panTlsMore = new System.Windows.Forms.Panel(); + this.txtSNI = new System.Windows.Forms.TextBox(); + 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(); @@ -87,14 +89,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.cmbFlow); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.btnGUID); @@ -111,12 +114,12 @@ 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 // + resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.FormattingEnabled = true; this.cmbFlow.Items.AddRange(new object[] { resources.GetString("cmbFlow.Items"), @@ -124,7 +127,6 @@ resources.GetString("cmbFlow.Items2"), resources.GetString("cmbFlow.Items3"), resources.GetString("cmbFlow.Items4")}); - resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.Name = "cmbFlow"; // // label4 @@ -146,6 +148,7 @@ // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label24); this.groupBox2.Controls.Add(this.label23); this.groupBox2.Controls.Add(this.panTlsMore); @@ -166,7 +169,6 @@ 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; // @@ -182,11 +184,23 @@ // // panTlsMore // + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Controls.Add(this.txtSNI); + 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"; // + // txtSNI + // + resources.ApplyResources(this.txtSNI, "txtSNI"); + this.txtSNI.Name = "txtSNI"; + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // // label21 // resources.ApplyResources(this.label21, "label21"); @@ -194,13 +208,13 @@ // // cmbAllowInsecure // + resources.ApplyResources(this.cmbAllowInsecure, "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 @@ -220,6 +234,7 @@ // // cmbNetwork // + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbNetwork.FormattingEnabled = true; this.cmbNetwork.Items.AddRange(new object[] { @@ -228,7 +243,6 @@ 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); // @@ -269,13 +283,13 @@ // // cmbStreamSecurity // + resources.ApplyResources(this.cmbStreamSecurity, "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); // @@ -301,6 +315,7 @@ // // cmbHeaderType // + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbHeaderType.FormattingEnabled = true; this.cmbHeaderType.Items.AddRange(new object[] { @@ -311,7 +326,6 @@ resources.GetString("cmbHeaderType.Items4"), resources.GetString("cmbHeaderType.Items5"), resources.GetString("cmbHeaderType.Items6")}); - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.Name = "cmbHeaderType"; // // label8 @@ -321,11 +335,11 @@ // // cmbSecurity // + resources.ApplyResources(this.cmbSecurity, "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 @@ -375,9 +389,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 @@ -394,42 +408,42 @@ // // 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.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.Name = "MenuItemImportClient"; this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); // // MenuItemImportServer // - this.MenuItemImportServer.Name = "MenuItemImportServer"; resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); + this.MenuItemImportServer.Name = "MenuItemImportServer"; this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); // // toolStripSeparator1 // - this.toolStripSeparator1.Name = "toolStripSeparator1"; resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + this.toolStripSeparator1.Name = "toolStripSeparator1"; // // MenuItemImportClipboard // - this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); + this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // // AddServer5Form @@ -509,5 +523,7 @@ private System.Windows.Forms.Label label23; private System.Windows.Forms.ComboBox cmbFlow; private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtSNI; + private System.Windows.Forms.Label label22; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 32c7e48c..1a389b3d 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer5Form : BaseServerForm - { + { public AddServer5Form() { @@ -45,6 +45,7 @@ namespace v2rayN.Forms txtPath.Text = vmessItem.path; cmbStreamSecurity.Text = vmessItem.streamSecurity; cmbAllowInsecure.Text = vmessItem.allowInsecure; + txtSNI.Text = vmessItem.sni; } @@ -66,6 +67,7 @@ namespace v2rayN.Forms cmbStreamSecurity.Text = ""; cmbAllowInsecure.Text = ""; txtPath.Text = ""; + txtSNI.Text = ""; } @@ -122,6 +124,7 @@ namespace v2rayN.Forms string path = txtPath.Text; string streamSecurity = cmbStreamSecurity.Text; string allowInsecure = cmbAllowInsecure.Text; + string sni = txtSNI.Text; if (Utils.IsNullOrEmpty(address)) { @@ -153,6 +156,7 @@ namespace v2rayN.Forms vmessItem.path = path.Replace(" ", ""); vmessItem.streamSecurity = streamSecurity; vmessItem.allowInsecure = allowInsecure; + vmessItem.sni = sni; if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index e4c57a41..73b868d3 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -117,1270 +117,1324 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6 + - - 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 + + 113, 12 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 + + 8 - - 143, 20 + + Path - - 21 + + 83, 12 - - cmbStreamSecurity + + Transport protocol(network) - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 9 - - groupBox2 + + panTlsMore - - 14 + + groupBox1 - - True + + 1 - - 282, 68 + + 6, 12 - - 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 + + label15 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 + + cmbStreamSecurity + + + 3)h2 host Separated by commas (,) + + + + Top + + + 6 + + + + 3 + + + 17 + + + false + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 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 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 297, 7 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 123 + + + cmbAllowInsecure + + + 21 + + + 411, 91 + + + 18 + + groupBox1 - - 5 + + 59, 12 + + + 1)ws path + + + 19 + + + True + + + 26 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtId + + + label5 + + + True + + + 729, 499 + + + + + + 12, 95 + + + groupBox2 + + + tls + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + 299, 12 + + + 4 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, 91 + + + 16 + + + utp + + + Bottom + + + &Cancel + + + txtSNI + + + label10 + + + 723, 281 + + + 5 + + + label21 + + + 359, 21 + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit or add a [VLESS] server + + + 143, 12 + + + groupBox2 + + + tcp + + + panTlsMore + + + NoControl + + + 21 + + + label11 + + + 158, 100 + + + SNI + + + 0 + + + 2 + + + 29, 12 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 234, 6 + + + 237, 22 + + + 3)QUIC key/Kcp seed + + + 127, 59 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtPort + + + 4 + + + groupBox2 + + + 100, 7 + + + label16 127, 185 - - 211, 21 + + True - - 11 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + NoControl + + + 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 + + + True + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 29, 12 + + + True + + + ws + + + 13 + + + 15 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 65, 12 + + + 9, 169 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15 + + + xtls-rprx-origin-udp443 + + + label17 + + + panel1 + + + groupBox2 + + + 5 + + + 215, 12 + + + 0, 0 + + + 396, 17 + + + Import configuration file + + + 500, 35 + + + 12, 63 + + + MenuItemImportClient + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &Generate + + + 127, 154 txtRemarks - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 29, 12 - + + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + groupBox2 + + + panel2 + + + panTlsMore + + + True + + + cmbNetwork + + + 200, 232 + + + 95, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 353, 32 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label22 + + + 22 + + + 211, 20 + + groupBox1 - - 7 - - + True 12, 189 + + groupBox2 + + + 127, 27 + + + label12 + + + Flow + + + True + + + 282, 68 + + + 12 + + + *tcp or kcp or QUIC camouflage type, default none + + + 25 + + + label23 + + + groupBox1 + + + 9, 68 + + + 119, 12 + + + $this + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + 33 + + + 6 + + + 0 + + + 47, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label8 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9, 32 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + 35 + + + 13 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + True + + + 464, 94 + + + label9 + + + cmbFlow + + + label20 + + + wechat-video + + + label18 + + + MenuItem1 + + + label1 + + + 13 + + + label7 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 211, 20 + + + groupBox2 + + + True + + + groupBox2 + + + True + + + btnClose + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label19 + + + 143, 21 + 95, 12 - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 - - 8 + + 0, 35 - + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtPath + + + 729, 60 + + + allowInsecure + + + True + + + True + + + 464, 124 + + + quic + + + panTlsMore + + + groupBox2 + + + h2 + + + kcp + + + 127, 64 + + + 7 + + + NoControl + + + 211, 21 + + 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 + + 18 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 + + 143, 20 label2 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 729, 594 - + + groupBox2 + + + 60, 20 + + + groupBox2 + + + 119, 12 + + + 278, 21 + + + True + + + 200, 21 + + + 4 + + + 80, 20 + + + 53, 12 + + + 27 + + + groupBox2 + + + 17 + + + Port + + + groupBox2 + + + Fill + + + 12 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - 13 + + 28 - - 127, 27 + + 2 - - 359, 21 + + 75, 23 - - 1 + + xtls-rprx-direct - - txtAddress + + True - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 11 groupBox1 - - 14 + + 8 - + + *Recommended (none) + + + groupBox1 + + + NoControl + + + 34 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + 6 + + + 10 + + + 35 + + + true + + True + + 3, 215 + + + 529, 189 + + + 10 + + + btnOK + + + 75, 23 + + + Import server configuration + + + 465, 140 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 22 + + + 396, 54 + + + 300, 53 + 12, 31 - - 47, 12 + + 14 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + dtls + + + label4 + + + MenuItemImportServer + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + panel2 + + + 14 + + + 5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 534 + + + groupBox1 + + + UUID(id) + + + AddServer5Form + + + wireguard + + + 24 + + + groupBox1 + + + 729, 10 + + + Server + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 303, 17 + + + 2)ws host + + + txtAddress + + + True + + + 2)h2 path + + + True + + + 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 167, 12 + + + 8 + + + Transport + + + groupBox2 + + + * Fill in manually + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 12 + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 29 + + + 1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + True + + + groupBox1 + + + 162, 21 + + + Bottom + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtRequestHost + + + btnGUID + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Alias (remarks) + + + 127, 169 + + + 4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &OK + + + 7 + + + 3 + + + http + + + True + + + 34 + + + 9 + + + groupBox2 + + + Camouflage type + + + menuServer + + + 20 + + + TLS + + + $this + + + 1 + + + 5 + + + 89, 12 + + + srtp + + + MenuItemImportClipboard + + + label13 + + + True + + + $this + + + 3 + + + groupBox1 + + + 237, 22 + + + 143, 20 + + + panTlsMore + + + 8 + + + 24 + + + 15 0 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 113, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 192, 28 + + + 203, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23, 12 + + + 30 + + + 14 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23 + + + 23 + + + 25 + + + 2 + + + 9, 100 + + + label3 + + + 7 + + + groupBox1 + + + xtls-rprx-direct-udp443 + + + Import URL from clipboard + + + 464, 109 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Camouflage domain(host) + + + 0 + + + 529, 172 + + + *Default value tcp + + + 31 + + + 127, 239 + + + 9, 243 + + + 353, 157 + + + Encryption + + + none + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + 16 - - 162, 21 + + 3 - - Import configuration file + + - - 0, 0 + + groupBox2 - - 729, 25 + + xtls-rprx-origin - - 8 + + Import client configuration - - menuServer + + 12, 127 - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4)QUIC securty + + + 0, 25 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + cmbSecurity + + + groupBox2 + + + 267, 11 + + + 75, 23 + + + 23, 12 + + + groupBox1 + + + 12, 11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + NoControl + + + 1)http host Separated by commas (,) + + + + + + label24 + + + 59, 12 + + + panel2 + + + 11 + + + groupBox2 $this - - 3 + + True + + label6 + + + 59, 12 + + + 10 + + + 729, 25 + + + cmbHeaderType + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 529, 207 + + + 2 + + + label14 + + + zh-Hans + 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 - + + 17, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx index 46ec6353..841c0bd2 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx @@ -120,9 +120,6 @@ 取消(&C) - - 服务器 - 220, 20 @@ -139,9 +136,6 @@ *手填,方便识别管理 - - 底层传输方式(transport) - 149, 12 @@ -161,7 +155,7 @@ 跳过证书验证(allowInsecure) - 223, 7 + 181, 7 353, 36 @@ -259,6 +253,9 @@ 127, 67 + + 底层传输方式(transport) + 353, 158 @@ -304,19 +301,12 @@ 地址(address) + + 服务器 + 确定(&O) - - - False - - - 92, 21 - - - 导入配置文件 - 171, 22 @@ -338,6 +328,16 @@ 从剪贴板导入URL + + + False + + + 92, 21 + + + 导入配置文件 + 编辑或添加[VLESS]服务器 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index f14d46e4..fc67c5ec 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -31,8 +31,12 @@ 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.label21 = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.label15 = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); this.label4 = new System.Windows.Forms.Label(); - this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.txtSNI = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); @@ -60,8 +64,12 @@ // groupBox1 // resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.label21); + this.groupBox1.Controls.Add(this.cmbAllowInsecure); + this.groupBox1.Controls.Add(this.label15); + this.groupBox1.Controls.Add(this.cmbStreamSecurity); this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtRequestHost); + this.groupBox1.Controls.Add(this.txtSNI); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); @@ -74,15 +82,46 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // cmbAllowInsecure + // + resources.ApplyResources(this.cmbAllowInsecure, "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")}); + this.cmbAllowInsecure.Name = "cmbAllowInsecure"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // cmbStreamSecurity + // + resources.ApplyResources(this.cmbStreamSecurity, "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")}); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + // // label4 // resources.ApplyResources(this.label4, "label4"); this.label4.Name = "label4"; // - // txtRequestHost + // txtSNI // - resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); - this.txtRequestHost.Name = "txtRequestHost"; + resources.ApplyResources(this.txtSNI, "txtSNI"); + this.txtSNI.Name = "txtSNI"; // // label13 // @@ -184,6 +223,10 @@ private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.TextBox txtSNI; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.ComboBox cmbAllowInsecure; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs index 6911714f..e7d35165 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -35,8 +35,10 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; - txtRequestHost.Text = vmessItem.requestHost; + txtSNI.Text = vmessItem.sni; txtRemarks.Text = vmessItem.remarks; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; } @@ -48,8 +50,10 @@ namespace v2rayN.Forms txtAddress.Text = ""; txtPort.Text = ""; txtId.Text = ""; - txtRequestHost.Text = ""; - txtRemarks.Text = ""; + txtSNI.Text = ""; + txtRemarks.Text = ""; + cmbStreamSecurity.Text = "tls"; + cmbAllowInsecure.Text = ""; } private void btnOK_Click(object sender, EventArgs e) @@ -57,8 +61,10 @@ namespace v2rayN.Forms string address = txtAddress.Text; string port = txtPort.Text; string id = txtId.Text; - string requestHost = txtRequestHost.Text; + string sni = txtSNI.Text; string remarks = txtRemarks.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; if (Utils.IsNullOrEmpty(address)) { @@ -79,8 +85,10 @@ namespace v2rayN.Forms vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; - vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.sni = sni.Replace(" ", ""); vmessItem.remarks = remarks; + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 6d3c8975..7add00f3 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -117,107 +117,332 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + + 113, 12 - - Server address + + 312, 185 + + + 53, 12 - - 3 + + True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + label6 + + + True + + + groupBox1 + + + panel2 + + + 24 + + + 11 + + + allowInsecure Bottom - - NoControl - - - txtPort - - - True - Alias (remarks) - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 3 - - btnOK + + Password - - txtRemarks + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 194, 21 + + NoControl - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AddServer6Form - - - label1 - - - 359, 21 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + groupBox1 - - System.Windows.Forms.TextBox, 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 - - panel2 - - - 12, 155 + + cmbStreamSecurity Fill - - 53, 12 + + groupBox1 - - 127, 123 + + NoControl - - 194, 21 + + 89, 12 + + + 127, 27 + + + 6 + + + Edit or add a [Trojan] server + + + 60, 20 + + + 5 + + + groupBox1 + + + 303, 17 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 0 + + + 359, 21 + + + 1 + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + groupBox1 + + + label1 + + + 25 + + + 0, 0 + + + groupBox1 + + + True + + + 22 + + + 75, 23 + + + True + + + 13 + + + 127, 91 + + + panel2 + + + 3 + + + 5 + + + 2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 groupBox1 - - 6, 12 + + cmbAllowInsecure - - 396, 17 + + txtId - - True + + 12, 156 - - label3 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 127, 154 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 12, 31 + + + 1 + + + 1 + + + AddServer6Form + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 59 + + + 80, 20 + + + 4 + + + 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 32 + + + 547, 60 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 71, 12 + + + $this + + + groupBox1 + + + + + + 23 + + + txtPort + + + panel2 + + + 11 + + + 547, 10 + + + 0, 10 + + + 9 + + + 26 + + + label4 + + + &OK + + + 5 + + + groupBox1 + + + btnClose + + + txtSNI + + + 0 + + + 23, 12 + + + 12, 93 + + + 2 + + + 194, 21 + + + 194, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + true + + + 1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 6 @@ -225,313 +450,208 @@ 7 - - groupBox1 - - - 113, 12 - - - 12, 93 - - - 10 - - - Server - - - 3 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - txtRequestHost - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 547, 60 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 359, 21 - - - Edit or add a [Trojan] server - - - 359, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - * - - - groupBox1 - - - * Fill in manually - - - 11 - - - 10 - - - 71, 12 - - - 24 - - - label4 - - - txtId - - - 303, 17 - - - $this - - - 75, 23 - - - btnClose - - - Host(SNI) - - - label6 - - - 5 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Password - - - 75, 23 - - - 1 - - - txtAddress - - - groupBox1 - - - Top - - - 0, 10 - - - 4 - - - 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 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23 - - - 127, 59 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - 89, 12 - - - groupBox1 - - - 0 - - - 547, 10 - - - 8 - - - &Cancel - - - 12, 31 - - - &OK - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Server port - - - 4 - - - 337, 158 - - - True - - - 12, 62 - - - 127, 91 - - - 12, 126 - - - 7 - - - $this - - - 59, 12 - - - 1 - - - groupBox1 - - - 0, 0 - - - 1 - label13 - - 5 + + 359, 21 - - 95, 12 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - label2 - - - 2 - - - panel2 - - - 0, 231 - - - 22 - - - 9 - - - 547, 291 - - - 0 + + groupBox1 v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - groupBox1 + + label3 - - $this + + Server port - - 6 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + Top + + + 396, 17 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + 0, 231 - - panel2 + + tls - - panel1 + + txtRemarks + + + 33 + + + NoControl + + + 12, 189 + + + &Cancel + + + True + + + xtls + + + 6, 12 + + + label21 + + + Server address + + + false + + + TLS + + + 95, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 185 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 2 + + * Fill in manually + + + 14 + + + label2 + + + groupBox1 + + + panel1 + + + 12, 62 + + + 547, 291 + + + btnOK + + + 0 + + + $this + + + 547, 221 + + + 8 + + + 75, 23 + + + 10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 83, 12 + + + 337, 125 + + + True + + + 4 + + + 7 + + + 127, 121 + + + * + + + txtAddress + + + 23, 12 + + + 224, 189 + + + groupBox1 + + + label15 + + + groupBox1 + + + Server + + + 127, 152 + + + 10 + + + 12, 125 + + + True + + + SNI + + + 359, 21 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 True + + zh-Hans + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx index 375c223d..dd715fc9 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx @@ -120,16 +120,29 @@ 取消(&C) - - 服务器 + + + 167, 12 - - 域名(SNI) + + 跳过证书验证(allowInsecure) + + + 406, 185 + + + 107, 12 + + + 底层传输安全(tls) + + + + False *手填,方便识别管理 - 83, 12 @@ -154,6 +167,9 @@ 服务器地址 + + 服务器 + 确定(&O) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index a96b32ab..7db28ff7 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -37,6 +37,8 @@ this.label24 = new System.Windows.Forms.Label(); this.label23 = new System.Windows.Forms.Label(); this.panTlsMore = new System.Windows.Forms.Panel(); + this.txtSNI = new System.Windows.Forms.TextBox(); + 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(); @@ -87,14 +89,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.btnGUID); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.groupBox2); @@ -111,7 +114,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; // @@ -129,6 +131,7 @@ // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label24); this.groupBox2.Controls.Add(this.label23); this.groupBox2.Controls.Add(this.panTlsMore); @@ -149,7 +152,6 @@ 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; // @@ -165,11 +167,23 @@ // // panTlsMore // + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Controls.Add(this.txtSNI); + 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"; // + // txtSNI + // + resources.ApplyResources(this.txtSNI, "txtSNI"); + this.txtSNI.Name = "txtSNI"; + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // // label21 // resources.ApplyResources(this.label21, "label21"); @@ -177,13 +191,13 @@ // // cmbAllowInsecure // + resources.ApplyResources(this.cmbAllowInsecure, "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 @@ -203,6 +217,7 @@ // // cmbNetwork // + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbNetwork.FormattingEnabled = true; this.cmbNetwork.Items.AddRange(new object[] { @@ -211,7 +226,6 @@ 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); // @@ -252,12 +266,12 @@ // // cmbStreamSecurity // + resources.ApplyResources(this.cmbStreamSecurity, "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.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); this.cmbStreamSecurity.Name = "cmbStreamSecurity"; this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); // @@ -283,6 +297,7 @@ // // cmbHeaderType // + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbHeaderType.FormattingEnabled = true; this.cmbHeaderType.Items.AddRange(new object[] { @@ -293,7 +308,6 @@ resources.GetString("cmbHeaderType.Items4"), resources.GetString("cmbHeaderType.Items5"), resources.GetString("cmbHeaderType.Items6")}); - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.Name = "cmbHeaderType"; // // label8 @@ -303,6 +317,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[] { @@ -310,7 +325,6 @@ resources.GetString("cmbSecurity.Items1"), resources.GetString("cmbSecurity.Items2"), resources.GetString("cmbSecurity.Items3")}); - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // // txtRemarks @@ -370,9 +384,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 @@ -389,42 +403,42 @@ // // 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.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.Name = "MenuItemImportClient"; this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); // // MenuItemImportServer // - this.MenuItemImportServer.Name = "MenuItemImportServer"; resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); + this.MenuItemImportServer.Name = "MenuItemImportServer"; this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); // // toolStripSeparator1 // - this.toolStripSeparator1.Name = "toolStripSeparator1"; resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + this.toolStripSeparator1.Name = "toolStripSeparator1"; // // MenuItemImportClipboard // - this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); + this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // // AddServerForm @@ -504,5 +518,7 @@ private System.Windows.Forms.Panel panTlsMore; private System.Windows.Forms.Label label24; private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.TextBox txtSNI; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index ab54fd9b..99eb4916 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -45,6 +45,7 @@ namespace v2rayN.Forms txtPath.Text = vmessItem.path; cmbStreamSecurity.Text = vmessItem.streamSecurity; cmbAllowInsecure.Text = vmessItem.allowInsecure; + txtSNI.Text = vmessItem.sni; } @@ -66,6 +67,7 @@ namespace v2rayN.Forms cmbStreamSecurity.Text = ""; cmbAllowInsecure.Text = ""; txtPath.Text = ""; + txtSNI.Text = ""; } @@ -122,6 +124,7 @@ namespace v2rayN.Forms string path = txtPath.Text; string streamSecurity = cmbStreamSecurity.Text; string allowInsecure = cmbAllowInsecure.Text; + string sni = txtSNI.Text; if (Utils.IsNullOrEmpty(address)) { @@ -157,6 +160,7 @@ namespace v2rayN.Forms vmessItem.path = path.Replace(" ", ""); vmessItem.streamSecurity = streamSecurity; vmessItem.allowInsecure = allowInsecure; + vmessItem.sni = sni; if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) { diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 156f1f49..adff72fe 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -117,1202 +117,1295 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 396, 17 - - - 75, 23 - - - + 4 - - &Cancel + + + 113, 12 - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - 411, 83 - - - 75, 23 - - - 23 - - - &Generate - - - btnGUID - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True + + 9 285, 175 - - 113, 12 + + 127, 64 - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - 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, 146 - - - 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 - - - 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, 234 - - - 338, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 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 - - - 464, 130 - - - 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 + + 83, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Transport protocol(network) - - groupBox2 + + 7 - - 8 + + groupBox1 - - 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, 115 - - - 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, 100 - - - 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 + + 1 label15 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 13 - - - - - - tls - - - 127, 239 - - - 143, 20 - - - 21 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 cmbStreamSecurity - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 143, 20 - + + 200, 21 + + + + Top + + + 6 + + + + 3 + + + 17 + + + false + + + System.Windows.Forms.ToolStripSeparator, 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 + + + 19 + + + True + + + System.Windows.Forms.Label, 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 + + + 300, 7 + + + System.Windows.Forms.TextBox, 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 + + + 21 + + + 411, 83 + + + groupBox1 + + + 75, 23 + + + 59, 12 + + + 1)ws path + + + 19 + + + True + + + 26 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtId + + + True + + + 729, 499 + + + + + + 12, 89 + + groupBox2 - - 14 + + tls - + + True + + + 299, 12 + + + aes-128-gcm + + + groupBox1 + + + 127, 85 + + + 16 + + + utp + + + 12, 175 + + + &Cancel + + + txtSNI + + + label10 + + + 723, 281 + + + 5 + + + label21 + + + 359, 21 + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit or add a [VMess] server + + + 143, 12 + + + groupBox2 + + + toolStripSeparator1 + + + panTlsMore + + + NoControl + + + 21 + + + label11 + + + 5 + + + SNI + + + 158, 100 + + + 2 + + + 29, 12 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 237, 22 + + + 3)QUIC key/Kcp seed + + + 127, 56 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtPort + + + 2 + + + groupBox2 + + + Bottom + + + True + + + 127, 171 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 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 + + + True + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 29, 12 + + + ws + + + 13 + + + 9, 66 + + + 15 + + + Import server configuration + + + 6, 12 + + + 1 + + + 7 + + + 15 + + + label17 + + + panel1 + + + groupBox2 + + + 215, 12 + + + 0, 0 + + + 396, 17 + + + 500, 35 + + + 12, 60 + + + MenuItemImportClient + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &Generate + + + Encryption method (security) + + + none + + + txtRemarks + + + 47, 12 + + + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + groupBox2 + + + true + + + panTlsMore + + + True + + + 127, 114 + + + 200, 234 + + + 95, 12 + + + 350, 32 + + + cmbNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label22 + + + 22 + + + groupBox1 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 24 + + + 127, 27 + + + label12 + + + label2 + + + AlterId + + True 282, 66 - - 299, 12 - - - 20 + + 12 *tcp or kcp or QUIC camouflage type, default none - - label12 + + 25 + + + label23 + + + groupBox1 + + + 60, 20 + + + $this + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33 + + + 6 + + + 0 + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label8 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label13 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtAlterId + + + 35 + + + 13 + + + 11 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + True + + + 464, 100 + + + label9 + + + label20 + + + 127, 169 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + label18 + + + MenuItem1 + + + label1 + + + 13 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 143, 20 + + groupBox2 - - 15 - - - 158, 100 - - + True - - 300, 53 + + btnClose - - 16 + + label7 - - txtRequestHost + + Address - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + label19 - - groupBox2 + + 143, 21 - - 16 - - - True - - - 9, 66 - - + 95, 12 - - 19 + + groupBox1 - - Camouflage type + + 0, 35 - - label11 + + panTlsMore - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 729, 60 + + + allowInsecure + + + True + + + True + + + 464, 130 + + + quic + + + panTlsMore groupBox2 + + h2 + + + kcp + + + 7 + + + 143, 21 + + + 529, 172 + + + 18 + + + 12, 147 + + + 18 + + + groupBox1 + + + 34 + + + 3, 215 + + + 729, 594 + + + groupBox2 + + + 234, 6 + + + groupBox2 + + + 119, 12 + + + 278, 21 + + + True + + + True + + + 4 + + + 80, 20 + + + 53, 12 + + + 27 + + + groupBox2 + 17 - - True + + Port - - 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 + + Fill - - none + + chacha20-poly1305 - - http + + 12 - - 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 - - - 2 - - - True - - - 353, 147 - - - 119, 12 - - - 14 - - - *Recommended (auto) - - - label8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - aes-128-gcm - - - chacha20-poly1305 - - - auto - - - none - - - 195, 143 - - - 143, 20 - - - 6 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 127, 171 - - - 143, 21 - - - 11 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 - - 5 - - - True - - - 12, 175 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - True - - - 12, 147 - - - 173, 12 - - - 8 - - - Encryption method (security) - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - 127, 114 - - - 143, 21 - - - 7 - - - txtAlterId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - True - - - 12, 118 - - - 47, 12 - - - 6 - - - AlterId - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - 127, 85 - - - 278, 21 - - - 5 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - True - - - 12, 89 - - - 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, 56 - - - 143, 21 - - - 3 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - True - - - 12, 60 - - - 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 + + 75, 23 - - Import client configuration + + 4 - - 237, 22 + + True - - Import server configuration + + 11 - - 234, 6 - - - 237, 22 - - - Import URL from clipboard - - - 162, 21 - - - Import configuration file - - - 0, 0 - - - 729, 25 + + groupBox1 8 + + *Recommended (auto) + + + 195, 143 + + + groupBox1 + + + panel2 + + + 32 + + + 23 + + + 1 + + + 6 + + + 10 + + + groupBox2 + + + 14 + + + True + + + 173, 12 + + + Import configuration file + + + wechat-video + + + 9, 32 + + + btnOK + + + 729, 10 + + + 100, 7 + + + 465, 146 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 22 + + + 396, 54 + + + 300, 53 + + + 12, 31 + + + 14 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + dtls + + + 47, 12 + + + label4 + + + groupBox2 + + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 534 + + + groupBox1 + + + AddServerForm + + + wireguard + + + groupBox1 + + + Server + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 303, 17 + + + 2)ws host + + + txtAddress + + + True + + + 2)h2 path + + + True + + + 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 167, 12 + + + 8 + + + Transport + + + groupBox2 + + + * Fill in manually + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 12 + + + True + + + 12, 11 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 29 + + + 1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 143, 21 + + + 1 + + + True + + + txtPath + + + 162, 21 + + + Bottom + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnGUID + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Alias (remarks) + + + groupBox2 + + + 3)h2 host Separated by commas (,) + + + 4 + + + 9, 169 + + + &OK + + + 7 + + + 3 + + + http + + + True + + + 529, 189 + + + 9 + + + groupBox2 + menuServer - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 20 + + + TLS + + + 1 + + + 3 + + + UUID(id) + + + $this + + + MenuItemImportClipboard + + + True + + + $this + + + 3 + + + groupBox1 + + + cmbAllowInsecure + + + 237, 22 + + + 143, 20 + + + panTlsMore + + + 8 + + + 0 + + + 15 + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 113, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 192, 28 + + + 203, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23, 12 + + + 30 + + + 14 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23 + + + 10 + + + auto + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + 464, 115 + + + 2 + + + 9, 100 + + + label3 + + + srtp + + + 5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 89, 12 + + + Import URL from clipboard + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Camouflage domain(host) + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + *Default value tcp + + + MenuItemImportServer + + + 5 + + + 31 + + + 127, 239 + + + 9, 243 + + + 353, 147 + + + none + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 8 + + + groupBox1 + + + label5 + + + cmbSecurity + + + 3 + + + label16 + + + groupBox1 + + + 237, 22 + + + 16 + + + 3 + + + 28 + + + + + + groupBox2 + + + Import client configuration + + + 12, 118 + + + 4)QUIC securty + + + 0, 25 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + tcp + + + groupBox2 + + + 270, 11 + + + 75, 23 + + + 23, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + Camouflage type + + + 0 + + + groupBox2 + + + NoControl + + + 1)http host Separated by commas (,) + + + 33 + + + label24 + + + 59, 12 + + + panel2 + + + 119, 12 + + + groupBox2 $this - - 3 + + True + + + label6 + + + 59, 12 + + + 10 + + + 729, 25 + + + cmbHeaderType + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 529, 207 + + + label14 True @@ -1320,49 +1413,7 @@ 114 - - 6, 12 - - - 729, 594 - - - Edit or add a [VMess] 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 - - - AddServerForm - - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + + 17, 17 + \ 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 489f5fd2..4bbfcc1f 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -120,18 +120,12 @@ 取消(&C) - - 服务器 - 生成(&G) *手填,方便识别管理 - - 底层传输方式(transport) - 149, 12 @@ -152,7 +146,7 @@ 跳过证书验证(allowInsecure) - 223, 7 + 180, 7 350, 36 @@ -250,6 +244,9 @@ 127, 67 + + 底层传输方式(transport) + 113, 12 @@ -298,15 +295,12 @@ 地址(address) + + 服务器 + 确定(&O) - - 92, 21 - - - 导入配置文件 - 171, 22 @@ -328,6 +322,12 @@ 从剪贴板导入URL + + 92, 21 + + + 导入配置文件 + 编辑或添加[VMess]服务器 diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index d472f40b..b13e60cc 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1398,69 +1398,15 @@ namespace v2rayN.Forms /// private void UpdateSubscriptionProcess() { - AppendText(false, UIRes.I18N("MsgUpdateSubscriptionStart")); - - if (config.subItem == null || config.subItem.Count <= 0) + void _updateUI(bool refresh, string msg) { - 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) + AppendText(false, msg); + if (refresh) { - continue; + RefreshServers(); } - 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(); - int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); - if (ret > 0) - { - RefreshServers(); - } - 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")}"); - } + }; + MainFormHandler.Instance.UpdateSubscriptionProcess(config, _updateUI); } private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 0fccf551..2636752f 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -614,7 +614,10 @@ namespace v2rayN.Handler vmessItem.id = vmessItem.id.TrimEx(); vmessItem.streamSecurity = Global.StreamSecurity; - vmessItem.allowInsecure = "false"; + if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) + { + vmessItem.allowInsecure = config.defAllowInsecure.ToString(); + } if (index >= 0) { diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 7f21abe6..6842a5b9 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -9,6 +9,7 @@ namespace v2rayN.Handler class MainFormHandler { private static MainFormHandler instance; + Action updateUI; //private DownloadHandle downloadHandle2; //private Config _config; @@ -164,6 +165,77 @@ namespace v2rayN.Handler return counter; } - + + + public void UpdateSubscriptionProcess(Config config, Action update) + { + updateUI = update; + + updateUI(false, UIRes.I18N("MsgUpdateSubscriptionStart")); + + if (config.subItem == null || config.subItem.Count <= 0) + { + updateUI(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)) + { + updateUI(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); + continue; + } + + DownloadHandle downloadHandle3 = new DownloadHandle(); + downloadHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + updateUI(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + string result = Utils.Base64Decode(args.Msg); + if (Utils.IsNullOrEmpty(result)) + { + updateUI(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); + return; + } + + ConfigHandler.RemoveServerViaSubid(ref config, id); + updateUI(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + // RefreshServers(); + int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); + if (ret > 0) + { + // RefreshServers(); + } + else + { + updateUI(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); + } + updateUI(true, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); + } + else + { + updateUI(false, args.Msg); + } + }; + downloadHandle3.Error += (sender2, args) => + { + updateUI(false, args.GetException().Message); + }; + + downloadHandle3.WebDownloadString(url); + updateUI(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); + } + + } + } } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 157988c8..b523f145 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -44,7 +44,8 @@ namespace v2rayN.Handler type = item.headerType, host = item.requestHost, path = item.path, - tls = item.streamSecurity + tls = item.streamSecurity, + sni = item.sni }; url = Utils.ToJson(vmessQRCode); @@ -90,9 +91,9 @@ namespace v2rayN.Handler remark = "#" + Utils.UrlEncode(item.remarks); } string query = string.Empty; - if (!Utils.IsNullOrEmpty(item.requestHost)) + if (!Utils.IsNullOrEmpty(item.sni)) { - query = string.Format("?sni={0}", Utils.UrlEncode(item.requestHost)); + query = string.Format("?sni={0}", Utils.UrlEncode(item.sni)); } url = string.Format("{0}@{1}:{2}", item.id, @@ -128,6 +129,10 @@ namespace v2rayN.Handler { dicQuery.Add("security", "none"); } + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } if (!Utils.IsNullOrEmpty(item.network)) { dicQuery.Add("type", item.network); @@ -294,6 +299,7 @@ namespace v2rayN.Handler vmessItem.requestHost = Utils.ToString(vmessQRCode.host); vmessItem.path = Utils.ToString(vmessQRCode.path); vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); + vmessItem.sni = Utils.ToString(vmessQRCode.sni); } ConfigHandler.UpgradeServerVersion(ref vmessItem); @@ -374,7 +380,7 @@ namespace v2rayN.Handler vmessItem.id = uri.UserInfo; var qurery = HttpUtility.ParseQueryString(uri.Query); - vmessItem.requestHost = qurery["sni"] ?? ""; + vmessItem.sni = qurery["sni"] ?? ""; var remarks = uri.Fragment.Replace("#", ""); if (Utils.IsNullOrEmpty(remarks)) @@ -640,6 +646,7 @@ namespace v2rayN.Handler item.flow = query["flow"] ?? ""; item.security = query["encryption"] ?? "none"; item.streamSecurity = query["security"] ?? ""; + item.sni = query["sni"] ?? ""; item.network = query["type"] ?? "tcp"; switch (item.network) { diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index b10e4974..e72a4c20 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -208,7 +208,7 @@ namespace v2rayN.Handler foreach (var item in lockedItem.rules) { routingUserRule(item, ref v2rayConfig); - } + } } } } @@ -553,6 +553,8 @@ namespace v2rayN.Handler //远程服务器底层传输配置 streamSettings.network = config.network(); string host = config.requestHost(); + string sni = config.sni(); + //if tls if (config.streamSecurity() == Global.StreamSecurity) { @@ -562,7 +564,11 @@ namespace v2rayN.Handler { allowInsecure = config.allowInsecure() }; - if (!string.IsNullOrWhiteSpace(host)) + if (!string.IsNullOrWhiteSpace(sni)) + { + tlsSettings.serverName = sni; + } + else if (!string.IsNullOrWhiteSpace(host)) { tlsSettings.serverName = Utils.String2List(host)[0]; } @@ -578,7 +584,11 @@ namespace v2rayN.Handler { allowInsecure = config.allowInsecure() }; - if (!string.IsNullOrWhiteSpace(host)) + if (!string.IsNullOrWhiteSpace(sni)) + { + xtlsSettings.serverName = sni; + } + else if (!string.IsNullOrWhiteSpace(host)) { xtlsSettings.serverName = Utils.String2List(host)[0]; } @@ -682,7 +692,14 @@ namespace v2rayN.Handler streamSettings.quicSettings = quicsettings; if (config.streamSecurity() == Global.StreamSecurity) { - streamSettings.tlsSettings.serverName = config.address(); + if (!string.IsNullOrWhiteSpace(sni)) + { + streamSettings.tlsSettings.serverName = sni; + } + else + { + streamSettings.tlsSettings.serverName = config.address(); + } } break; default: diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index a7733912..90189fe9 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -346,6 +346,14 @@ namespace v2rayN.Mode } return vmess[index].flow.TrimEx(); } + public string sni() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].sni.TrimEx(); + } #endregion } @@ -572,6 +580,13 @@ namespace v2rayN.Mode { get; set; } + /// + /// tls sni + /// + public string sni + { + get; set; + } } [Serializable] diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs index 0a9cc8ab..32fdbbd1 100644 --- a/v2rayN/v2rayN/Mode/VmessQRCode.cs +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -49,5 +49,9 @@ namespace v2rayN.Mode /// 底层传输安全 /// public string tls { get; set; } = string.Empty; - } + /// + /// SNI + /// + public string sni { get; set; } = string.Empty; + } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 7eb30d8a..bc383876 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.11")] +[assembly: AssemblyFileVersion("4.12")] From af000a27a671698459a318b5f6db77daf4683d93 Mon Sep 17 00:00:00 2001 From: GHM <61134763+Funny-T@users.noreply.github.com> Date: Fri, 26 Feb 2021 23:46:29 +0800 Subject: [PATCH 022/252] From v2ray-core to Core Fixed the display of v2ray-core when updating xray-core --- v2rayN/v2rayN/Forms/MainForm.cs | 4 ++-- v2rayN/v2rayN/Resx/ResUI.resx | 10 +++++----- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index b13e60cc..08783e41 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1272,7 +1272,7 @@ namespace v2rayN.Forms { if (args.Success) { - AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayCore")); + AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "Core")); string url = args.Msg; this.Invoke((MethodInvoker)(delegate @@ -1323,7 +1323,7 @@ namespace v2rayN.Forms }; } - AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayCore")); + AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "Core")); downloadHandle.CheckUpdateAsync(type); } #endregion diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 5691c92f..0b848e00 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -238,7 +238,7 @@ Clear original subscription content - Download V2ray successfully + Download Core successfully Failed to import subscription content @@ -283,10 +283,10 @@ Update subscription starts - Update V2rayCore successfully + Update Core successfully - Update V2rayCore successfully! Restarting service... + Update Core successfully! Restarting service... This feature relies on the Http global proxy, please set it correctly first. @@ -298,7 +298,7 @@ non-Vmess service, this feature is invalid - V2ray-core not found, please download: {0} + Core not found, please download: {0} Scan completed, no valid QR code found @@ -385,4 +385,4 @@ Please fill in the address (Url) - \ 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 fa947463..cde15548 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -238,7 +238,7 @@ 清除原订阅内容 - 下载V2ray成功 + 下载Core成功 导入订阅内容失败 @@ -283,10 +283,10 @@ 更新订阅开始 - 更新V2rayCore成功 + 更新Core成功 - 更新V2rayCore成功!正在重启服务... + 更新Core成功!正在重启服务... 此功能依赖Http全局代理,请先设置正确。 @@ -298,7 +298,7 @@ 非Vmess服务,此功能无效 - 找不到 v2ray-core,下载地址: {0} + 找不到Core,下载地址: {0} 扫描完成,未发现有效二维码 @@ -385,4 +385,4 @@ 请填写地址(Url) - \ No newline at end of file + From 35cbc54f99529e90e04f725490957d58acd33c2b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 21 Mar 2021 10:09:39 +0800 Subject: [PATCH 023/252] up4.13 --- .../v2rayN/Forms/AddServer5Form.Designer.cs | 45 +- v2rayN/v2rayN/Forms/AddServer5Form.resx | 2306 ++++++++-------- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 43 +- v2rayN/v2rayN/Forms/AddServerForm.resx | 2441 +++++++++-------- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 1259 +++------ .../RoutingRuleSettingDetailsForm.Designer.cs | 18 +- .../Forms/RoutingRuleSettingDetailsForm.resx | 866 +++--- ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 17 +- .../Forms/RoutingRuleSettingForm.Designer.cs | 44 +- .../v2rayN/Forms/RoutingRuleSettingForm.resx | 955 +++---- v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 18 + .../Forms/SubSettingControl.Designer.cs | 2 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 409 +-- v2rayN/v2rayN/Handler/ConfigHandler.cs | 3 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 8 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 6 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 12 + v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 18 + 19 files changed, 4099 insertions(+), 4373 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs index e6558407..9e7cab4f 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -80,6 +80,7 @@ this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.label25 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.panTlsMore.SuspendLayout(); @@ -89,15 +90,14 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.cmbFlow); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.btnGUID); @@ -114,12 +114,12 @@ 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 // - resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.FormattingEnabled = true; this.cmbFlow.Items.AddRange(new object[] { resources.GetString("cmbFlow.Items"), @@ -127,6 +127,7 @@ resources.GetString("cmbFlow.Items2"), resources.GetString("cmbFlow.Items3"), resources.GetString("cmbFlow.Items4")}); + resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.Name = "cmbFlow"; // // label4 @@ -148,7 +149,7 @@ // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.label25); this.groupBox2.Controls.Add(this.label24); this.groupBox2.Controls.Add(this.label23); this.groupBox2.Controls.Add(this.panTlsMore); @@ -169,6 +170,7 @@ 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; // @@ -184,11 +186,11 @@ // // panTlsMore // - resources.ApplyResources(this.panTlsMore, "panTlsMore"); this.panTlsMore.Controls.Add(this.txtSNI); 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"; // // txtSNI @@ -208,13 +210,13 @@ // // cmbAllowInsecure // - resources.ApplyResources(this.cmbAllowInsecure, "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 @@ -234,7 +236,6 @@ // // cmbNetwork // - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbNetwork.FormattingEnabled = true; this.cmbNetwork.Items.AddRange(new object[] { @@ -242,7 +243,9 @@ resources.GetString("cmbNetwork.Items1"), resources.GetString("cmbNetwork.Items2"), resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4")}); + resources.GetString("cmbNetwork.Items4"), + resources.GetString("cmbNetwork.Items5")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.Name = "cmbNetwork"; this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); // @@ -283,13 +286,13 @@ // // cmbStreamSecurity // - resources.ApplyResources(this.cmbStreamSecurity, "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); // @@ -315,7 +318,6 @@ // // cmbHeaderType // - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbHeaderType.FormattingEnabled = true; this.cmbHeaderType.Items.AddRange(new object[] { @@ -326,6 +328,7 @@ resources.GetString("cmbHeaderType.Items4"), resources.GetString("cmbHeaderType.Items5"), resources.GetString("cmbHeaderType.Items6")}); + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.Name = "cmbHeaderType"; // // label8 @@ -335,11 +338,11 @@ // // cmbSecurity // - resources.ApplyResources(this.cmbSecurity, "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 @@ -389,9 +392,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 @@ -408,44 +411,49 @@ // // 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.MenuItemImportClient, this.MenuItemImportServer, this.toolStripSeparator1, this.MenuItemImportClipboard}); this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // MenuItemImportClient // - resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); this.MenuItemImportClient.Name = "MenuItemImportClient"; + resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); // // MenuItemImportServer // - resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); this.MenuItemImportServer.Name = "MenuItemImportServer"; + resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // MenuItemImportClipboard // - resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; + resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // + // label25 + // + resources.ApplyResources(this.label25, "label25"); + this.label25.Name = "label25"; + // // AddServer5Form // resources.ApplyResources(this, "$this"); @@ -525,5 +533,6 @@ private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox txtSNI; private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label label25; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index 73b868d3..5a9fa9be 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -117,1324 +117,1354 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 - - - 113, 12 + + 396, 17 - - 1 - - - 353, 189 - - - xtls - - - 8 - - - Path - - - 83, 12 - - - Transport protocol(network) - - - 9 - - - panTlsMore - - - groupBox1 - - - 1 - - - 6, 12 - - - label15 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbStreamSecurity - - - 3)h2 host Separated by commas (,) - - - - Top - - - 6 + + 75, 23 - - 3 - - - 17 - - - false - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 19 - - - True - - - System.Windows.Forms.Label, 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 - - - 297, 7 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 127, 123 - - - cmbAllowInsecure - - - 21 - - - 411, 91 - - - 18 - - - groupBox1 - - - 59, 12 - - - 1)ws path - - - 19 - - - True - - - 26 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtId - - - label5 - - - True - - - 729, 499 - - - - - - 12, 95 - - - groupBox2 - - - tls - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator1 - - - 299, 12 - - + 4 - - none - - - groupBox1 - - - 127, 91 - - - 16 - - - utp - - - Bottom - &Cancel - - txtSNI - - - label10 - - - 723, 281 - - - 5 - - - label21 - - - 359, 21 - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Edit or add a [VLESS] server - - - 143, 12 - - - groupBox2 - - - tcp - - - panTlsMore - - - NoControl - - - 21 - - - label11 - - - 158, 100 - - - SNI - - - 0 - - - 2 - - - 29, 12 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 234, 6 - - - 237, 22 - - - 3)QUIC key/Kcp seed - - - 127, 59 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtPort - - - 4 - - - groupBox2 - - - 100, 7 - - - label16 - - - 127, 185 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - NoControl - - - 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 - - - True + + btnClose System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 29, 12 + + panel2 - - True + + 0 - - ws + + - - 13 - - - 15 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 65, 12 - - - 9, 169 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15 + + xtls-rprx-origin xtls-rprx-origin-udp443 - - label17 + + xtls-rprx-direct - - panel1 + + xtls-rprx-direct-udp443 - - groupBox2 - - - 5 - - - 215, 12 - - - 0, 0 - - - 396, 17 - - - Import configuration file - - - 500, 35 - - - 12, 63 - - - MenuItemImportClient - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &Generate - - - 127, 154 - - - txtRemarks - - - 29, 12 - - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - groupBox2 - - - panel2 - - - panTlsMore - - - True - - - cmbNetwork - - - 200, 232 - - - 95, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 353, 32 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label22 - - - 22 + + 127, 123 211, 20 - - groupBox1 - - - True - - - 12, 189 - - - groupBox2 - - - 127, 27 - - - label12 - - - Flow - - - True - - - 282, 68 - - - 12 - - - *tcp or kcp or QUIC camouflage type, default none - - - 25 - - - label23 - - - groupBox1 - - - 9, 68 - - - 119, 12 - - - $this - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 33 - - - 6 - - - 0 - - - 47, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label8 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9, 32 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - 35 - - - 13 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - - - True - - - 464, 94 - - - label9 + + 24 cmbFlow - - label20 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - wechat-video + + groupBox1 - - label18 - - - MenuItem1 - - - label1 - - - 13 - - - label7 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 211, 20 - - - groupBox2 - - - True - - - groupBox2 + + 0 True - - btnClose + + + NoControl - + + 12, 127 + + + 29, 12 + + + 25 + + + Flow + + + label4 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - label19 - - - 143, 21 - - - 95, 12 - - + groupBox1 - - 0, 35 + + 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 - - txtPath + + groupBox1 - - 729, 60 + + 3 + + + True + + + NoControl + + + 529, 210 + + + 113, 12 + + + 37 + + + 4)grpc serviceName + + + label25 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + NoControl + + + 529, 197 + + + 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 + + + 1 + + + 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 + + + 2 + + + 297, 7 + + + 200, 21 + + + 35 + + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + NoControl + + + 267, 11 + + + 23, 12 + + + 34 + + + SNI + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 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 + + + 2 + + + + + + true + + + false + + + 100, 7 + + + 80, 20 + + + 30 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 3 + + + 200, 232 + + + 500, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + 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 + + + 4 + + True 464, 124 - - quic + + 203, 12 - - panTlsMore + + 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 - - h2 + + 5 - - kcp - - - 127, 64 - - - 7 - - - NoControl - - - 211, 21 - - - True - - - 12, 158 - - - 18 - - - groupBox1 - - - 143, 20 - - - label2 - - - 729, 594 - - - groupBox2 - - - 60, 20 - - - groupBox2 - - - 119, 12 - - - 278, 21 + + 127, 169 True - - 200, 21 + + 396, 54 - - 4 + + 28 - - 80, 20 + + txtPath - - 53, 12 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + grpc + + + 192, 28 + + + 143, 20 + + + 12 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 + + + 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 + + + 8 + + + 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 - - 17 + + 9 - - Port + + True + + + 529, 183 + + + 59, 12 + + + 26 + + + 2)h2 path + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 10 + + + 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 - - Fill + + 11 - + + True + + + 529, 169 + + + 59, 12 + + + 24 + + + 1)ws path + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + 12 - + + 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 + + + 13 + + + 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 + + + 14 + + + + + + tls + + + xtls + + + 127, 239 + + + 60, 20 + + + 21 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15 + + + 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 + + + 16 + + + 158, 100 + + + True + + + 300, 53 + + + 16 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 17 + + + 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 + + + 18 + + + 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 + + + 19 + + + 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 + + + 20 + + + 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 - - - 28 - - - 2 - - - 75, 23 - - - xtls-rprx-direct - - - True - - - 11 - - - groupBox1 - - - 8 - - - *Recommended (none) - groupBox1 + + 4 + + + True + NoControl - - 34 + + 353, 157 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 6 - - - 10 - - - 35 - - - true - - - True - - - 3, 215 - - - 529, 189 - - - 10 - - - btnOK - - - 75, 23 - - - Import server configuration - - - 465, 140 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 22 - - - 396, 54 - - - 300, 53 - - - 12, 31 - - - 14 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - dtls - - - label4 - - - MenuItemImportServer - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - panel2 + + 119, 12 14 - - 5 + + *Recommended (none) - + + label8 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 534 - - + groupBox1 - - UUID(id) - - - AddServer5Form - - - wireguard - - - 24 - - - groupBox1 - - - 729, 10 - - - Server - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 303, 17 - - - 2)ws host - - - txtAddress - - - True - - - 2)h2 path - - - True - - - 0 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 167, 12 - - - 8 - - - Transport - - - groupBox2 - - - * Fill in manually - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 12 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 29 - - - 1 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - True - - - groupBox1 - - - 162, 21 - - - Bottom - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtRequestHost - - - btnGUID - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Alias (remarks) - - - 127, 169 - - - 4 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &OK - - - 7 - - - 3 - - - http - - - True - - - 34 - - - 9 - - - groupBox2 - - - Camouflage type - - - menuServer - - - 20 - - - TLS - - - $this - - - 1 - 5 - - 89, 12 + + none - - srtp + + 127, 154 - - MenuItemImportClipboard + + 211, 20 - - label13 + + 6 - - True + + cmbSecurity - - $this - - - 3 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 237, 22 + + 6 - - 143, 20 + + 127, 185 - - panTlsMore + + 211, 21 - - 8 + + 11 - - 24 + + txtRemarks - - 15 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 113, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 192, 28 - - - 203, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23, 12 - - - 30 - - - 14 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23 - - - 23 - - - 25 - - - 2 - - - 9, 100 - - - label3 + + groupBox1 7 - - groupBox1 + + True - - xtls-rprx-direct-udp443 + + 12, 189 - - Import URL from clipboard + + 95, 12 - - 464, 109 + + 10 - + + Alias (remarks) + + + label6 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Camouflage domain(host) + + groupBox1 - - 0 + + 8 - - 529, 172 + + True - - *Default value tcp + + 12, 158 - - 31 + + 65, 12 - - 127, 239 - - - 9, 243 - - - 353, 157 + + 8 Encryption - - none + + 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 - - 3 + + label1 - - groupBox1 - - - 237, 22 - - - 16 - - - 3 - - - - - - groupBox2 - - - xtls-rprx-origin - - - Import client configuration - - - 12, 127 - - - 4)QUIC securty - - - 0, 25 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbSecurity - - - groupBox2 - - - 267, 11 - - - 75, 23 - - - 23, 12 - - - groupBox1 - - - 12, 11 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 + + groupBox1 - - NoControl + + 15 - - 1)http host Separated by commas (,) + + Fill - - + + 0, 35 - - label24 + + 729, 499 - - 59, 12 + + 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 - - 11 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 - - + $this - - True + + 1 - - label6 + + Top - - 59, 12 + + 0, 25 - - 10 + + 729, 10 - - 729, 25 + + 6 - - cmbHeaderType + + panel1 - - System.Windows.Forms.ToolStripMenuItem, 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 - - 529, 207 + + $this 2 - - label14 - - - zh-Hans + + 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 - - 17, 17 - + + 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/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index 7db28ff7..22f776c2 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -80,6 +80,7 @@ this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.label25 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.panTlsMore.SuspendLayout(); @@ -89,15 +90,14 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.btnGUID); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.groupBox2); @@ -114,6 +114,7 @@ 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; // @@ -131,7 +132,7 @@ // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.label25); this.groupBox2.Controls.Add(this.label24); this.groupBox2.Controls.Add(this.label23); this.groupBox2.Controls.Add(this.panTlsMore); @@ -152,6 +153,7 @@ 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; // @@ -167,11 +169,11 @@ // // panTlsMore // - resources.ApplyResources(this.panTlsMore, "panTlsMore"); this.panTlsMore.Controls.Add(this.txtSNI); 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"; // // txtSNI @@ -191,13 +193,13 @@ // // cmbAllowInsecure // - resources.ApplyResources(this.cmbAllowInsecure, "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 @@ -217,7 +219,6 @@ // // cmbNetwork // - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbNetwork.FormattingEnabled = true; this.cmbNetwork.Items.AddRange(new object[] { @@ -225,7 +226,9 @@ resources.GetString("cmbNetwork.Items1"), resources.GetString("cmbNetwork.Items2"), resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4")}); + resources.GetString("cmbNetwork.Items4"), + resources.GetString("cmbNetwork.Items5")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.Name = "cmbNetwork"; this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); // @@ -266,12 +269,12 @@ // // cmbStreamSecurity // - resources.ApplyResources(this.cmbStreamSecurity, "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.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); this.cmbStreamSecurity.Name = "cmbStreamSecurity"; this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); // @@ -297,7 +300,6 @@ // // cmbHeaderType // - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbHeaderType.FormattingEnabled = true; this.cmbHeaderType.Items.AddRange(new object[] { @@ -308,6 +310,7 @@ resources.GetString("cmbHeaderType.Items4"), resources.GetString("cmbHeaderType.Items5"), resources.GetString("cmbHeaderType.Items6")}); + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.Name = "cmbHeaderType"; // // label8 @@ -317,7 +320,6 @@ // // cmbSecurity // - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; this.cmbSecurity.Items.AddRange(new object[] { @@ -325,6 +327,7 @@ resources.GetString("cmbSecurity.Items1"), resources.GetString("cmbSecurity.Items2"), resources.GetString("cmbSecurity.Items3")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // // txtRemarks @@ -384,9 +387,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 @@ -403,44 +406,49 @@ // // 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.MenuItemImportClient, this.MenuItemImportServer, this.toolStripSeparator1, this.MenuItemImportClipboard}); this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // MenuItemImportClient // - resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); this.MenuItemImportClient.Name = "MenuItemImportClient"; + resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); // // MenuItemImportServer // - resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); this.MenuItemImportServer.Name = "MenuItemImportServer"; + resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // MenuItemImportClipboard // - resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; + resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // + // label25 + // + resources.ApplyResources(this.label25, "label25"); + this.label25.Name = "label25"; + // // AddServerForm // resources.ApplyResources(this, "$this"); @@ -520,5 +528,6 @@ private System.Windows.Forms.Label label23; private System.Windows.Forms.Label label22; private System.Windows.Forms.TextBox txtSNI; + private System.Windows.Forms.Label label25; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index adff72fe..7e9939e7 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -117,1303 +117,1336 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 4 - - - 113, 12 + + 396, 17 - - 9 - - - 285, 175 - - - 127, 64 - - - 6 - - - Path - - - 83, 12 - - - Transport protocol(network) - - - 7 - - - groupBox1 - - - 1 - - - label15 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbStreamSecurity - - - 143, 20 - - - 200, 21 - - - - Top - - - 6 - - - - 3 - - - 17 - - - false - - - System.Windows.Forms.ToolStripSeparator, 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 - - - 19 - - - True - - - System.Windows.Forms.Label, 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 - - - 300, 7 - - - System.Windows.Forms.TextBox, 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 - - - 21 - - - 411, 83 - - - groupBox1 - - + 75, 23 - - 59, 12 - - - 1)ws path - - - 19 - - - True - - - 26 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtId - - - True - - - 729, 499 - - - - - - 12, 89 - - - groupBox2 - - - tls - - - True - - - 299, 12 - - - aes-128-gcm - - - groupBox1 - - - 127, 85 - - - 16 - - - utp - - - 12, 175 + + + 4 &Cancel - - txtSNI - - - label10 - - - 723, 281 - - - 5 - - - label21 - - - 359, 21 - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Edit or add a [VMess] server - - - 143, 12 - - - groupBox2 - - - toolStripSeparator1 - - - panTlsMore - - - NoControl - - - 21 - - - label11 - - - 5 - - - SNI - - - 158, 100 - - - 2 - - - 29, 12 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 237, 22 - - - 3)QUIC key/Kcp seed - - - 127, 56 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtPort - - - 2 - - - groupBox2 - - - Bottom - - - True - - - 127, 171 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - 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 - - - True + + btnClose System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 29, 12 + + panel2 - - ws - - - 13 - - - 9, 66 - - - 15 - - - Import server configuration - - - 6, 12 - - - 1 - - - 7 - - - 15 - - - label17 - - - panel1 - - - groupBox2 - - - 215, 12 - - - 0, 0 - - - 396, 17 - - - 500, 35 - - - 12, 60 - - - MenuItemImportClient - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &Generate - - - Encryption method (security) - - - none - - - txtRemarks - - - 47, 12 - - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - groupBox2 - - - true - - - panTlsMore - - - True - - - 127, 114 - - - 200, 234 - - - 95, 12 - - - 350, 32 - - - cmbNetwork - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label22 - - - 22 - - - groupBox1 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 24 - - - 127, 27 - - - label12 - - - label2 - - - AlterId - - - True - - - 282, 66 - - - 12 - - - *tcp or kcp or QUIC camouflage type, default none - - - 25 - - - label23 - - - groupBox1 - - - 60, 20 - - - $this - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 33 - - - 6 - - + 0 - - 2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label8 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label13 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtAlterId - - - 35 - - - 13 - - - 11 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - - - True - - - 464, 100 - - - label9 - - - label20 - - - 127, 169 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - label18 - - - MenuItem1 - - - label1 - - - 13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 143, 20 - - - groupBox2 - - - True - - - btnClose - - - label7 - - - Address - - - label19 - - - 143, 21 - - - 95, 12 - - - groupBox1 - - - 0, 35 - - - panTlsMore - - - 729, 60 - - - allowInsecure - - - True - - - True - - - 464, 130 - - - quic - - - panTlsMore - - - groupBox2 - - - h2 - - - kcp - - - 7 - - - 143, 21 - - - 529, 172 - - - 18 - - - 12, 147 - - - 18 - - - groupBox1 - - - 34 - - - 3, 215 - - - 729, 594 - - - groupBox2 - - - 234, 6 - - - groupBox2 - - - 119, 12 - - - 278, 21 - - - True - - - True - - - 4 - - - 80, 20 - - - 53, 12 - - - 27 - - - groupBox2 - - - 17 - - - Port - - - groupBox2 - - - Fill - - - chacha20-poly1305 - - - 12 - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 + + 411, 83 75, 23 - - 4 - - - True - - - 11 - - - groupBox1 - - - 8 - - - *Recommended (auto) - - - 195, 143 - - - groupBox1 - - - panel2 - - - 32 - - + 23 - - 1 + + &Generate - - 6 + + btnGUID - - 10 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 - - - 14 - - - True - - - 173, 12 - - - Import configuration file - - - wechat-video - - - 9, 32 - - - btnOK - - - 729, 10 - - - 100, 7 - - - 465, 146 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 22 - - - 396, 54 - - - 300, 53 - - - 12, 31 - - - 14 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - dtls - - - 47, 12 - - - label4 - - - groupBox2 - - - panel2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 534 - - + groupBox1 - - AddServerForm - - - wireguard - - - groupBox1 - - - Server - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 303, 17 - - - 2)ws host - - - txtAddress + + 0 True - - 2)h2 path + + 285, 175 - - True + + 113, 12 - - 0 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 167, 12 - - - 8 - - - Transport - - - groupBox2 + + 22 * Fill in manually + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + + NoControl + + + 529, 211 + + + 113, 12 + + + 36 + + + 4)grpc serviceName + + + label25 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + NoControl + + + 529, 197 + + + 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 - - 12 + + groupBox2 - + + 1 + + + True + + + NoControl + + + 465, 146 + + + 89, 12 + + + 34 + + + 4)QUIC securty + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + 300, 7 + + + 200, 21 + + + 33 + + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + NoControl + + + 270, 11 + + + 23, 12 + + + 32 + + + SNI + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + True 12, 11 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 29 - - - 1 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 143, 21 - - - 1 - - - True - - - txtPath - - - 162, 21 - - - Bottom - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnGUID - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Alias (remarks) - - - groupBox2 - - - 3)h2 host Separated by commas (,) - - - 4 - - - 9, 169 - - - &OK - - - 7 - - - 3 - - - http - - - True - - - 529, 189 - - - 9 - - - groupBox2 - - - menuServer - - - 20 - - - TLS - - - 1 - - - 3 - - - UUID(id) - - - $this - - - MenuItemImportClipboard - - - True - - - $this - - - 3 - - - groupBox1 - - - cmbAllowInsecure - - - 237, 22 - - - 143, 20 - - - panTlsMore - - - 8 - - - 0 - - - 15 - - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 113, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 192, 28 - - - 203, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23, 12 - - - 30 - - - 14 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23 - - - 10 - - - auto - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - - - 464, 115 - - - 2 - - - 9, 100 - - - label3 - - - srtp - - - 5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 89, 12 - - - Import URL from clipboard - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Camouflage domain(host) - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - *Default value tcp - - - MenuItemImportServer - - - 5 + + 83, 12 31 - - 127, 239 + + allowInsecure - - 9, 243 - - - 353, 147 - - - none + + label21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 + + panTlsMore - - groupBox1 + + 2 - - label5 + + - - cmbSecurity + + true - - 3 + + false - - label16 + + 100, 7 - - groupBox1 + + 80, 20 - - 237, 22 + + 30 - - 16 + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore 3 - - 28 + + 200, 234 - - + + 500, 35 - - groupBox2 + + 33 - - Import client configuration + + panTlsMore - - 12, 118 - - - 4)QUIC securty - - - 0, 25 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - tcp - - - groupBox2 - - - 270, 11 - - - 75, 23 - - - 23, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - Camouflage type - - - 0 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox2 - - NoControl + + 3 - - 1)http host Separated by commas (,) - - - 33 - - - label24 - - - 59, 12 - - - panel2 - - - 119, 12 - - - groupBox2 - - - $this - - + True - - label6 + + 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 + + + 4 + + + True + + + 464, 130 + + + 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 + + + 5 + + + 127, 169 + + + True + + + 396, 54 + + + 28 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + grpc + + + 192, 28 + + + 143, 20 + + + 12 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 + + + 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 + + + 8 + + + 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 + + + 9 + + + True + + + 529, 183 59, 12 - + + 26 + + + 2)h2 path + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + 10 - - 729, 25 + + True + + + 464, 115 + + + 59, 12 + + + 25 + + + 2)ws host + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 11 + + + True + + + 529, 169 + + + 59, 12 + + + 24 + + + 1)ws path + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 12 + + + True + + + 464, 100 + + + 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 + + + 13 + + + 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 + + + 14 + + + + + + tls + + + 127, 239 + + + 60, 20 + + + 21 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15 + + + True + + + 282, 66 + + + 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 + + + 16 + + + 158, 100 + + + True + + + 300, 53 + + + 16 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 17 + + + True + + + 9, 66 + + + 95, 12 + + + 19 + + + Camouflage type + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 18 + + + 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 + + + 19 + + + none + + + http + + + srtp + + + utp + + + wechat-video + + + dtls + + + wireguard + + + 127, 64 + + + 143, 20 + + + 18 cmbHeaderType - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 529, 207 + + groupBox2 - - label14 + + 20 + + + 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 + + + 2 + + + True + + + 353, 147 + + + 119, 12 + + + 14 + + + *Recommended (auto) + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + aes-128-gcm + + + chacha20-poly1305 + + + auto + + + none + + + 195, 143 + + + 143, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 171 + + + 143, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 175 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + True + + + 12, 147 + + + 173, 12 + + + 8 + + + Encryption method (security) + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + 127, 114 + + + 143, 21 + + + 7 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + True + + + 12, 118 + + + 47, 12 + + + 6 + + + AlterId + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + 127, 85 + + + 278, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + True + + + 12, 89 + + + 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, 56 + + + 143, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + True + + + 12, 60 + + + 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 - 114 - - - 17, 17 + 25 + + 6, 12 + + + 729, 594 + + + Edit or add a [VMess] 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 + + + AddServerForm + + + 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/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index a0268ac7..4ce51c06 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -143,823 +143,10 @@ 0 - - 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, 427 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 0 - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 1 - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 2 - - - 4, 22 - - - 654, 427 - - - 4 - - - Core: DNS settings - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 1 - - - chkKcpcongestion - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 0 - - - txtKcpwriteBufferSize - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 1 - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 2 - - - txtKcpreadBufferSize - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 3 - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 4 - - - txtKcpdownlinkCapacity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 5 - - - label8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 6 - - - txtKcpuplinkCapacity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 7 - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 8 - - - txtKcptti - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 9 - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 10 - - - txtKcpmtu - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 11 - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 12 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 427 - - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - - True - - - NoControl - - - 15, 132 - - - 234, 16 - - - 36 - - - Ignore Geo files when updating core - - - chkIgnoreGeoUpdateCore - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - v2fly_core - - - Xray_core - - - 325, 130 - - - 97, 20 - - - 34 - - - cmbCoreType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 1 - - - True - - - NoControl - - - 253, 134 - - - 59, 12 - - - 35 - - - Core Type - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - True - - - NoControl - - - 15, 108 - - - 198, 16 - - - 33 - - - Keep older when deduplication - - - chkKeepOlderDedupl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - 161, 84 - - - 58, 20 - - - 32 - - - cbFreshrate - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 4 - - - True - - - NoControl - - - 30, 88 - - - 125, 12 - - - 30 - - - Statistics freshrate - - - lbFreshrate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 5 - - - True - - - NoControl - - - 15, 64 - - - 576, 16 - - - 29 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - chkEnableStatistics - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 6 - - - True - - - 15, 40 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 7 - - - True - - - 15, 16 - - - 246, 16 - - - 23 - - - Automatically start at system startup - - - chkAutoRun - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 8 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 427 - - - 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, 453 - - - 10 - - - tabControl1 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - chkdefAllowInsecure - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - chksniffingEnabled2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - chksniffingEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - chkmuxEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - chkAllowIn2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - chkudpEnabled2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - cmbprotocol2 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - txtlocalPort2 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - cmbprotocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - chkudpEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - chklogEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - cmbloglevel - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 13 - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 14 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 15 - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 16 - - - Fill - - - 3, 3 - - - 648, 421 - - - 6 - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 0 - True + NoControl @@ -1443,6 +630,57 @@ 16 + + Fill + + + 3, 3 + + + 648, 421 + + + 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, 427 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + True @@ -1482,6 +720,9 @@ True + + Vertical + 638, 356 @@ -1530,6 +771,30 @@ 2 + + 4, 22 + + + 654, 427 + + + 4 + + + Core: DNS settings + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + True @@ -1845,6 +1110,348 @@ 12 + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 2 + + + Core: KCP settings + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + True + + + NoControl + + + 15, 132 + + + 234, 16 + + + 36 + + + Ignore Geo files when updating core + + + chkIgnoreGeoUpdateCore + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + v2fly_core + + + Xray_core + + + 325, 130 + + + 97, 20 + + + 34 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + True + + + NoControl + + + 253, 134 + + + 59, 12 + + + 35 + + + Core Type + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + NoControl + + + 15, 108 + + + 198, 16 + + + 33 + + + Keep older when deduplication + + + chkKeepOlderDedupl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + 161, 84 + + + 58, 20 + + + 32 + + + cbFreshrate + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + NoControl + + + 30, 88 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 5 + + + True + + + NoControl + + + 15, 64 + + + 576, 16 + + + 29 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 6 + + + True + + + 15, 40 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 7 + + + True + + + 15, 16 + + + 246, 16 + + + 23 + + + Automatically start at system startup + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 8 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 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, 453 + + + 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 @@ -1881,30 +1488,6 @@ 1 - - 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 - Top diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs index d33ade0f..9f70e165 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -60,6 +60,7 @@ // // panel3 // + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.clbProtocol); this.panel3.Controls.Add(this.label3); this.panel3.Controls.Add(this.txtPort); @@ -67,13 +68,12 @@ this.panel3.Controls.Add(this.labRoutingTips); this.panel3.Controls.Add(this.label4); this.panel3.Controls.Add(this.cmbOutboundTag); - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // clbProtocol // - this.clbProtocol.CheckOnClick = true; resources.ApplyResources(this.clbProtocol, "clbProtocol"); + this.clbProtocol.CheckOnClick = true; this.clbProtocol.FormattingEnabled = true; this.clbProtocol.Items.AddRange(new object[] { resources.GetString("clbProtocol.Items"), @@ -99,8 +99,8 @@ // // labRoutingTips // - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; this.labRoutingTips.Name = "labRoutingTips"; // // label4 @@ -110,26 +110,26 @@ // // cmbOutboundTag // + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbOutboundTag.FormattingEnabled = true; this.cmbOutboundTag.Items.AddRange(new object[] { resources.GetString("cmbOutboundTag.Items"), resources.GetString("cmbOutboundTag.Items1"), resources.GetString("cmbOutboundTag.Items2")}); - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.Name = "cmbOutboundTag"; // // panel4 // + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.btnClose); this.panel4.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // 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); @@ -143,15 +143,15 @@ // // panel2 // + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.groupBox2); this.panel2.Controls.Add(this.groupBox1); - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // groupBox2 // - this.groupBox2.Controls.Add(this.txtIP); resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtIP); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -162,8 +162,8 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.txtDomain); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtDomain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index f92d884b..9070a6d9 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -117,487 +117,487 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - 0, 0 + + 53, 12 - - 742, 10 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 7 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 80 - - - http - - - tls - - - bittorrent - - - 347, 43 + + 32 245, 20 - - 39 - - - clbProtocol - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 0 - - - True - - - NoControl - - - 274, 47 - - - 53, 12 - - - 36 - - - Protocol - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 1 - - - 107, 43 - - - 119, 21 - - - 35 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 2 - - - True - - - NoControl - - - 19, 47 - - - 29, 12 - - - 34 - - - Port - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 3 - - - NoControl - - - 19, 82 - - - 598, 16 - - - 33 - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - labRoutingTips - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 4 - - - True - - - NoControl - - - 19, 20 - - - 71, 12 - - - 32 - - - outboundTag - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 5 - - - proxy - direct - - block - - - 107, 16 - - - 119, 20 - 31 - - cmbOutboundTag + + proxy - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 107, 16 - - panel3 + + + Fill - - 6 + + panel1 - - Top + + 3 - - 0, 10 + + clbProtocol - - 742, 111 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - NoControl - - - 504, 15 - - - 75, 23 - - + 4 - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 0 - - + NoControl - - 411, 15 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 1 - - - Bottom - - - 0, 516 - - - 742, 60 - - - 10 - - - panel4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Fill - - - 3, 17 - - - True - - - 344, 375 - - - 25 - - - txtIP - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - Fill - - - 392, 0 - - - 350, 395 - - - 4 - - - IP - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - Fill - 3, 17 - - True - - - 386, 375 - - - 24 - - - txtDomain - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - + 0 Left - - 0, 0 + + panel3 - - 392, 395 + + NoControl - - 3 - - - Domain - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Fill - - - 0, 121 - - - 742, 395 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - + 0 - - zh-Hans - - - True - - - 6, 12 + + 29, 12 742, 576 + + panel2 + + + tls + RoutingSettingDetailsForm + + NoControl + + + Fill + + + 3 + + + Fill + + + 411, 15 + + + 119, 20 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 36 + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 344, 375 + + + $this + + + 598, 16 + + + groupBox1 + + + NoControl + + + 0, 121 + + + label1 + + + 742, 395 + + + Protocol + + + 6 + + + panel3 + + + True + + + 3 + + + panel4 + + + 5 + + + bittorrent + + + 19, 82 + + + 25 + + + panel3 + + + 0, 0 + + + 19, 20 + + + labRoutingTips + + + 19, 47 + + + 39 + + + Fill + + + 1 + RoutingRuleSettingDetailsForm + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 107, 43 + + + groupBox2 + + + 5 + + + Bottom + + + 386, 375 + + + panel3 + + + 392, 0 + + + 8 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + panel4 + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + Top + + + $this + + + groupBox2 + + + System.Windows.Forms.Panel, 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 + + + http + + + txtPort + + + 3, 17 + + + 1 + + + 742, 10 + + + 0, 0 + + + groupBox1 + + + 24 + + + 11 + + + label4 + + + &OK + + + 75, 23 + + + btnClose + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 34 + + + 274, 47 + + + block + + + 33 + + + 1 + + + 347, 43 + + + 0 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + 2 + + + 119, 21 + + + 4 + + + 7 + + + 0 + + + label3 + + + 0 + + + panel3 + + + panel3 + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 0, 10 + + + 80 + + + 742, 60 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + &Cancel + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + 742, 111 + + + True + + + 6, 12 + + + Port + + + 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 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtIP + + + 2 + + + cmbOutboundTag + + + True + + + NoControl + + + Domain + + + 10 + + + $this + + + 392, 395 + + + 75, 23 + + + 1 + + + True + + + 4 + + + txtDomain + + + IP + + + 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 + + + 0, 516 + + + 71, 12 + + + 350, 395 + + + panel3 + + + 504, 15 + + + True + + + outboundTag + + + Top + + + 35 + + + True + + + zh-Hans + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index bac9081a..80928b68 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -120,25 +120,22 @@ *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 - - - 71, 12 - OutboundTag - - 29, 12 - - - 别名 - 取消(&C) 确定(&O) + + + Vertical + + + Vertical + 路由规则详情设置 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs index f33f9cdd..6a5f5c23 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs @@ -68,17 +68,17 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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 @@ -90,12 +90,12 @@ // // panel1 // - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Controls.Add(this.label1); this.panel1.Controls.Add(this.txtUrl); this.panel1.Controls.Add(this.label3); this.panel1.Controls.Add(this.txtRemarks); this.panel1.Controls.Add(this.label2); + resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // // label1 @@ -125,8 +125,8 @@ // // lvRoutings // - resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -142,7 +142,6 @@ // // 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.menuAdd, @@ -156,113 +155,114 @@ this.menuMoveBottom}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.MenuItem1; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuExportSelectedRules // - resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); this.menuExportSelectedRules.Name = "menuExportSelectedRules"; + resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // MenuItem1 // - resources.ApplyResources(this.MenuItem1, "MenuItem1"); this.MenuItem1.DropDown = this.cmsLv; this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // tabControl2 // - resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Controls.Add(this.tabPage2); + resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Name = "tabControl2"; this.tabControl2.SelectedIndex = 0; // // tabPage2 // - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // // menuServer // - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItem1, this.toolStripMenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // toolStripMenuItem1 // - resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuImportRulesFromFile, this.menuImportRulesFromClipboard, this.menuImportRulesFromUrl}); this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); // // menuImportRulesFromFile // - resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; + resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); // // menuImportRulesFromClipboard // - resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; + resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); // // menuImportRulesFromUrl // - resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; + resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click); // // RoutingRuleSettingForm diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx index 2d457319..426ce16c 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -117,327 +117,321 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.TabControl, 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 - - - - 199, 6 - - - Fill - - - menuImportRulesFromUrl - - - Down (D) - - - 762, 25 - - - - 32 - - - 1 - - - 47, 12 - - - Bottom - - - Edit and Function - - - panel1 - - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - System.Windows.Forms.TabPage, 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 - - - panel1 - - - 15 - - - 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 - - - 4, 22 - - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Rule Settings - - - Remove selected - - - NoControl - - - tabPage2 - - - 0 - - - 202, 22 - - - 475, 17 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 33 - - - MenuItem1 - - - 0 - - - 754, 362 - - - 1 - - - 568, 17 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - Fill - - - 0, 0 - - - label1 - - - 762, 60 - - - Sub Url - - - 95, 21 - - - panel1 - - - menuServer - - - True - - - 120, 21 - - - True - - - Import Rules From Sub Url - - - 2 - - - menuSelectAll - - - menuMoveTop - - - 202, 22 - - - cmsLv - - - 5 - - - menuImportRulesFromFile - - - Add - - - 12 - - - toolStripSeparator3 - - - panel1 - - - tabPage2 - - - toolStripMenuItem1 - - - menuMoveBottom - - - 0, 25 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 18, 63 - - - Import Rules From File - - - 202, 22 - - - 762, 388 - - - 1 - - - RoutingRuleSettingForm - - - panel2 - - - 202, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.MenuStrip, 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 - - - Up (U) - - - 203, 186 - - - btnOK - - - 53, 12 - - - 47, 12 - - - 14 - NoControl - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 568, 17 - - $this + + 75, 23 - - 3, 3 + + + 4 - - menuImportRulesFromClipboard + + &Cancel - - Import Rules From Clipboard + + btnClose - - panel1 - - - menuAdd - - - 0, 127 - - - 247, 22 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 panel2 - - 4 + + 0 - - Move to top (T) + + NoControl - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 475, 17 - - 762, 102 + + 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, 515 + + + 762, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + NoControl + + + 18, 63 + + + 53, 12 + + + 35 + + + Optional + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + 91, 45 + + + True + + + Vertical + + + 644, 48 + + + 34 txtUrl - - 748, 356 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + True + + + NoControl + + + 18, 45 + + + 47, 12 + + + 33 + + + Sub Url + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + 91, 13 + + + 166, 21 + + + 32 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + True + + + NoControl + + + 18, 13 + + + 47, 12 + + + 31 + + + Remarks + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + Top + + + 0, 25 + + + 762, 102 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 202, 22 + + + Add + + + 202, 22 + + + Remove selected 202, 22 + + Select All (Ctrl+A) + + + 202, 22 + + + Export Selected Rules + + + 199, 6 + + + 202, 22 + + + Move to top (T) + + + 202, 22 + + + Up (U) + + + 202, 22 + + + Down (D) + + + 202, 22 + + + Move to bottom (B) + + + 120, 21 + + + Edit and Function + + + 203, 186 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -455,217 +449,226 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 34 + + 3, 3 - - &OK + + 748, 356 + + + 12 lvRoutings - - 247, 22 - - - $this - - - 35 - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 18, 45 + + tabPage2 - - 31 + + 0 - - 91, 45 - - - 166, 21 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 644, 48 - - - menuMoveDown - - - 202, 22 - - - Export Selected Rules - - - Move to bottom (B) - - - label3 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - - - panel2 - - - 7 - - - panel1 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabControl2 - - - Remarks - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top + + 4, 22 3, 3, 3, 3 - - 0, 515 - - - menuMoveUp - - - RuleList - - - Select All (Ctrl+A) - - - btnClose - - - 6, 12 - - - menuExportSelectedRules - - - Optional - - - 91, 13 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 247, 22 - - - 202, 22 - - - System.Windows.Forms.ToolStripMenuItem, 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 202, 22 - - - label2 - - - menuRemove - - - True - - - 18, 13 - - - NoControl - - - 762, 575 - - - Import Rules - - - 75, 23 - - - 2 - - - &Cancel - - - 3 - - - NoControl + + 754, 362 0 - - 3 + + RuleList - - 75, 23 + + tabPage2 - + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl2 0 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - - txtRemarks + + 0, 127 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 762, 388 - - True + + 14 - - 0 + + tabControl2 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 139, 17 + + + 247, 22 + + + Import Rules From File + + + 247, 22 + + + Import Rules From Clipboard + + + 247, 22 + + + Import Rules From Sub Url + + + 95, 21 + + + Import Rules + + + 0, 0 + + + 762, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 True - - 17, 17 - - - 139, 17 - + + 6, 12 + + + 762, 575 + + + Rule Settings + + + menuAdd + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemove + + + 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 + + + menuExportSelectedRules + + + 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 + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromFile + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + RoutingRuleSettingForm + + + 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/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 2b12e311..8e33444c 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -429,6 +429,9 @@ True + + Vertical + 441, 485 @@ -483,6 +486,9 @@ True + + Vertical + 386, 485 @@ -588,6 +594,9 @@ True + + Vertical + 441, 485 @@ -642,6 +651,9 @@ True + + Vertical + 386, 485 @@ -747,6 +759,9 @@ True + + Vertical + 441, 485 @@ -801,6 +816,9 @@ True + + Vertical + 386, 485 diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index b23cac62..8ffe9ca4 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -44,7 +44,6 @@ // // grbMain // - resources.ApplyResources(this.grbMain, "grbMain"); this.grbMain.Controls.Add(this.btnShare); this.grbMain.Controls.Add(this.chkEnabled); this.grbMain.Controls.Add(this.btnRemove); @@ -52,6 +51,7 @@ this.grbMain.Controls.Add(this.txtRemarks); this.grbMain.Controls.Add(this.label2); this.grbMain.Controls.Add(this.label3); + resources.ApplyResources(this.grbMain, "grbMain"); this.grbMain.Name = "grbMain"; this.grbMain.TabStop = false; // diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index 96c09774..f06a5702 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -118,136 +118,49 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + NoControl - - grbMain - - - 60, 16 - - - txtUrl - - - picQRCode - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Remove - - - txtRemarks - - - - 24 - - - grbMain - - - SubSettingControl - - - Zoom - - - Subscription details - - - 26 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - grbMain - 434, 21 - - 83, 12 + + 75, 23 - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 232, 21 - - - Top - - - 6, 12 - - - label3 - - - 127, 21 - - - True + + + 26 Share - - 619, 200 + + btnShare - - 1 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 12, 55 - - - NoControl - - - Fill - - - $this - - - 25 - - - 127, 55 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - + grbMain - - 5 + + 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - 47, 12 + + NoControl - - btnRemove + + 368, 23 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 60, 16 + + + 25 Enable @@ -255,130 +168,220 @@ chkEnabled - - 4 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 1 NoControl - - 619, 310 + + 525, 21 - + 75, 23 - - 2 + + 24 - - grbMain + + Remove - - 25 + + btnRemove - - 23 - - - grbMain + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 grbMain - - 368, 23 + + 2 + + + 127, 55 + + + True + + + Vertical + + + 473, 46 + + + 23 + + + txtUrl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 3 + + + 127, 21 + + + 232, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 4 True - + + NoControl + + + 12, 25 + + + 47, 12 + + + 10 + + + Remarks + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 5 + + True + + NoControl + + + 12, 55 + + + 83, 12 + + + 0 + + + Address (url) + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 6 + + + Top + 0, 0 + + 619, 110 + + + 10 + + + Subscription details + + + grbMain + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Fill + + + NoControl + + + 0, 110 + + + 619, 200 + + + Zoom + + + 25 + + + picQRCode + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + $this 0 - - NoControl + + True + + + 6, 12 - - label2 + + 619, 310 + + + SubSettingControl System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 619, 110 - - - btnShare - - - 0 - - - NoControl - - - 0, 110 - - - 11 - - - Remarks - - - 0 - - - NoControl - - - 473, 46 - - - 12, 25 - - - 75, 23 - - - 1 - - - Address (url) - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - - - grbMain - - - 525, 21 - - - 6 - - - System.Windows.Forms.CheckBox, 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 - - - 10 - - - True - \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2636752f..61cd330f 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -283,7 +283,8 @@ namespace v2rayN.Handler streamSecurity = config.vmess[index].streamSecurity, allowInsecure = config.vmess[index].allowInsecure, configType = config.vmess[index].configType, - flow = config.vmess[index].flow + flow = config.vmess[index].flow, + sni = config.vmess[index].sni }; config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index b523f145..810dbc1c 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -97,7 +97,7 @@ namespace v2rayN.Handler } url = string.Format("{0}@{1}:{2}", item.id, - item.address, + GetIpv6(item.address), item.port); url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); } @@ -214,7 +214,7 @@ namespace v2rayN.Handler url = string.Format("{0}@{1}:{2}", item.id, - item.address, + GetIpv6(item.address), item.port); url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); } @@ -229,6 +229,10 @@ namespace v2rayN.Handler } } + private static string GetIpv6(string address) + { + return Utils.IsIpv6(address) ? $"[{address}]" : address; + } #endregion #region ImportShareUrl diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index e72a4c20..bd4da3f0 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -702,6 +702,12 @@ namespace v2rayN.Handler } } break; + case "grpc": + var grpcSettings = new GrpcSettings(); + + grpcSettings.serviceName = config.path(); + streamSettings.grpcSettings = grpcSettings; + break; default: //tcp带http伪装 if (config.headerType().Equals(Global.TcpHeaderHttp)) diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 94a33f8c..c52957e9 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -377,6 +377,10 @@ namespace v2rayN.Mode /// VLESS xtls /// public TlsSettings xtlsSettings { get; set; } + /// + /// grpc + /// + public GrpcSettings grpcSettings { get; set; } } @@ -508,4 +512,12 @@ namespace v2rayN.Mode public Header header { get; set; } } + public class GrpcSettings + { + /// + /// + /// + public string serviceName { get; set; } + } + } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index bc383876..705703f6 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.12")] +[assembly: AssemblyFileVersion("4.13")] diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 1e1e9444..9ec80dcf 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -487,6 +487,24 @@ namespace v2rayN return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase); } + public static bool IsIpv6(string ip) + { + IPAddress address; + if (IPAddress.TryParse(ip, out address)) + { + switch (address.AddressFamily) + { + case AddressFamily.InterNetwork: + return false; + case AddressFamily.InterNetworkV6: + return true; + default: + return false; + } + } + return false; + } + #endregion #region 开机自动启动 From f0c59e38cc19343cf7ba39dd258b58fa791edccc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 17 Apr 2021 12:56:51 +0800 Subject: [PATCH 024/252] up4.14 --- v2rayN/v2rayN/Forms/AddServer3Form.resx | 260 +- v2rayN/v2rayN/Forms/AddServer4Form.resx | 9 +- .../v2rayN/Forms/AddServer4Form.zh-Hans.resx | 24 +- .../v2rayN/Forms/AddServer6Form.Designer.cs | 10 +- v2rayN/v2rayN/Forms/AddServer6Form.resx | 941 ++++--- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 15 +- v2rayN/v2rayN/Forms/AddServerForm.resx | 750 ++++- .../Forms/OptionSettingForm.Designer.cs | 26 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 2469 +++++++++-------- .../Forms/OptionSettingForm.zh-Hans.resx | 5 +- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 17 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 1 + v2rayN/v2rayN/Forms/SubSettingForm.resx | 6 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 12 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 13 +- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 6 +- v2rayN/v2rayN/Mode/VmessQRCode.cs | 13 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 19 +- v2rayN/v2rayN/Resx/ResUI.resx | 5 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 5 +- 21 files changed, 2655 insertions(+), 1953 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index f17e4d82..bfe58c25 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -143,11 +143,174 @@ 0 + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + + 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 + True + + NoControl + - 337, 158 + 426, 158 113, 12 @@ -192,7 +355,7 @@ 127, 123 - 194, 20 + 278, 20 6 @@ -213,7 +376,7 @@ 127, 154 - 194, 21 + 278, 21 11 @@ -431,46 +594,6 @@ 10 - - - 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 @@ -507,6 +630,30 @@ 1 + + 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 + Top @@ -534,18 +681,6 @@ 17, 17 - - 235, 22 - - - Import URL from clipboard - - - 162, 21 - - - Import configuration file - 0, 0 @@ -567,6 +702,21 @@ 3 + + 162, 21 + + + Import configuration file + + + 235, 22 + + + Import URL from clipboard + + + zh-CN + True diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx index d245b984..5cfed0ed 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -328,7 +328,7 @@ AddServer4Form - 194, 21 + 278, 21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -448,7 +448,7 @@ 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 + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null label3 @@ -532,7 +532,7 @@ 127, 89 - 337, 155 + 422, 155 True @@ -582,6 +582,9 @@ True + + zh-Hans + 17, 17 diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx index 2e8e0912..eb8fc4d7 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx @@ -120,22 +120,13 @@ 取消(&C) - - 服务器 - - - 194, 21 - 77, 12 用户名(可选) - - 194, 21 - 65, 12 @@ -163,21 +154,24 @@ 服务器地址 + + 服务器 + 确定(&O) - - 92, 21 - - - 导入配置文件 - 171, 22 从剪贴板导入URL + + 92, 21 + + + 导入配置文件 + 编辑或添加[Socks]服务器 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index fc67c5ec..a50084f4 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -55,15 +55,14 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.label21); this.groupBox1.Controls.Add(this.cmbAllowInsecure); this.groupBox1.Controls.Add(this.label15); @@ -79,6 +78,7 @@ 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; // @@ -89,13 +89,13 @@ // // cmbAllowInsecure // - resources.ApplyResources(this.cmbAllowInsecure, "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"; // // label15 @@ -105,12 +105,12 @@ // // cmbStreamSecurity // - resources.ApplyResources(this.cmbStreamSecurity, "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.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); this.cmbStreamSecurity.Name = "cmbStreamSecurity"; // // label4 @@ -170,9 +170,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 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 7add00f3..9bf31819 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -118,382 +118,94 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 113, 12 + + 396, 17 - - 312, 185 - - - 53, 12 - - - - True - - - label6 - - - True - - - groupBox1 - - - panel2 - - - 24 - - - 11 - - - allowInsecure - - - - Bottom - - - Alias (remarks) - - - 3 - - - Password - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - groupBox1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbStreamSecurity - - - Fill - - - groupBox1 - - - NoControl - - - 89, 12 - - - 127, 27 - - - 6 - - - Edit or add a [Trojan] server - - - 60, 20 - - - 5 - - - groupBox1 - - - 303, 17 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 0 - - - 359, 21 - - - 1 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - groupBox1 - - - label1 - - - 25 - - - 0, 0 - - - groupBox1 - - - True - - - 22 - - + 75, 23 - - True - - - 13 - - - 127, 91 - - - panel2 - - - 3 - - - 5 - - - 2 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - groupBox1 - - - cmbAllowInsecure - - - txtId - - - 12, 156 - - - 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 - - - 1 - - - 1 - - - AddServer6Form - - - 2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 127, 59 - - - 80, 20 - - + + 4 - - 0 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 32 - - - 547, 60 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 71, 12 - - - $this - - - groupBox1 - - - - - - 23 - - - txtPort - - - panel2 - - - 11 - - - 547, 10 - - - 0, 10 - - - 9 - - - 26 - - - label4 - - - &OK - - - 5 - - - groupBox1 + + &Cancel btnClose - - txtSNI - - - 0 - - - 23, 12 - - - 12, 93 - - - 2 - - - 194, 21 - - - 194, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - true - - - 1 - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 + + panel2 - - 7 + + 0 - - label13 + + True - - 359, 21 + + + NoControl - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 224, 189 - - groupBox1 + + 83, 12 - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 33 - - label3 + + allowInsecure - - Server port - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - 396, 17 + + label21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 231 + + groupBox1 - - tls + + 0 - - txtRemarks + + - - 33 + + true + + + false + + + 312, 185 + + + 80, 20 + + + 32 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True NoControl @@ -501,157 +213,442 @@ 12, 189 - - &Cancel + + 23, 12 - - True - - - xtls - - - 6, 12 - - - label21 - - - Server address - - - false + + 26 TLS - - 95, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 127, 185 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - * Fill in manually - - - 14 - - - label2 - - - groupBox1 - - - panel1 - - - 12, 62 - - - 547, 291 - - - btnOK - - - 0 - - - $this - - - 547, 221 - - - 8 - - - 75, 23 - - - 10 + + label15 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 83, 12 - - - 337, 125 - - - True - - - 4 - - - 7 - - - 127, 121 - - - * - - - txtAddress - - - 23, 12 - - - 224, 189 - - + groupBox1 - - label15 + + 2 - + + tls + + + xtls + + + 127, 185 + + + 60, 20 + + + 25 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - Server - - - 127, 152 - - - 10 - - - 12, 125 + + 3 True + + NoControl + + + 12, 156 + + + 23, 12 + + + 24 + SNI - + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 152 + + 359, 21 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 23 + + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 428, 124 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + 127, 121 + + + 265, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 125 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 127, 91 + + + * + + + 265, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 12, 93 + + + 53, 12 + + + 4 + + + Password + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + 127, 59 + + + 194, 21 3 + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + True + + + 12, 62 + + + 71, 12 + + + 2 + + + Server port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + 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 + + + 14 + + + Fill + + + 0, 10 + + + 547, 221 + + + 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, 0 + + + 547, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + True - - zh-Hans - + + 6, 12 + + + 547, 291 + + + Edit or add a [Trojan] server + + + AddServer6Form + + + 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.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index 22f776c2..3f862d35 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -34,6 +34,7 @@ this.btnGUID = new System.Windows.Forms.Button(); this.label13 = new System.Windows.Forms.Label(); this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label25 = new System.Windows.Forms.Label(); this.label24 = new System.Windows.Forms.Label(); this.label23 = new System.Windows.Forms.Label(); this.panTlsMore = new System.Windows.Forms.Panel(); @@ -80,7 +81,6 @@ this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); - this.label25 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.panTlsMore.SuspendLayout(); @@ -157,6 +157,11 @@ this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // + // label25 + // + resources.ApplyResources(this.label25, "label25"); + this.label25.Name = "label25"; + // // label24 // resources.ApplyResources(this.label24, "label24"); @@ -326,7 +331,8 @@ resources.GetString("cmbSecurity.Items"), resources.GetString("cmbSecurity.Items1"), resources.GetString("cmbSecurity.Items2"), - resources.GetString("cmbSecurity.Items3")}); + resources.GetString("cmbSecurity.Items3"), + resources.GetString("cmbSecurity.Items4")}); resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // @@ -444,11 +450,6 @@ resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // - // label25 - // - resources.ApplyResources(this.label25, "label25"); - this.label25.Name = "label25"; - // // AddServerForm // resources.ApplyResources(this, "$this"); diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 7e9939e7..8289c639 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -143,6 +143,226 @@ 0 + + btnGUID + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + 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 + 411, 83 @@ -171,7 +391,7 @@ True - 285, 175 + 411, 175 113, 12 @@ -194,10 +414,288 @@ 1 + + label25 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 4 + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 5 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 8 + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 9 + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 10 + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 11 + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 12 + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 13 + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 14 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15 + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 16 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 17 + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 18 + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 19 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 20 + + + 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 + + + 2 + True - NoControl @@ -285,11 +783,80 @@ 2 + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 2 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 3 + + + 200, 234 + + + 500, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + 300, 7 - 200, 21 + 197, 21 33 @@ -393,27 +960,6 @@ 3 - - 200, 234 - - - 500, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - True @@ -894,38 +1440,11 @@ 20 - - 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 - - - 2 - True - 353, 147 + 411, 147 119, 12 @@ -960,11 +1479,14 @@ none + + zero + 195, 143 - 143, 20 + 210, 20 6 @@ -985,7 +1507,7 @@ 127, 171 - 143, 21 + 278, 21 11 @@ -1248,45 +1770,6 @@ 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 @@ -1323,6 +1806,30 @@ 1 + + 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 + Top @@ -1350,33 +1857,6 @@ 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 @@ -1398,6 +1878,36 @@ 3 + + 162, 21 + + + Import configuration file + + + 237, 22 + + + Import client configuration + + + 237, 22 + + + Import server configuration + + + 234, 6 + + + 237, 22 + + + Import URL from clipboard + + + zh-CN + True diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index ddbc4857..8a2f03e2 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -92,31 +92,32 @@ // // 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.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.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); @@ -134,7 +135,6 @@ 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; // @@ -177,12 +177,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 @@ -197,8 +197,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"), @@ -224,6 +224,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[] { @@ -232,7 +233,6 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -252,10 +252,10 @@ // // tabPage2 // + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -278,6 +278,7 @@ // // tabPage6 // + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -291,7 +292,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; // @@ -363,6 +363,7 @@ // // tabPage7 // + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); this.tabPage7.Controls.Add(this.cmbCoreType); this.tabPage7.Controls.Add(this.label4); @@ -372,7 +373,6 @@ this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // @@ -384,12 +384,12 @@ // // cmbCoreType // + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType.FormattingEnabled = true; this.cmbCoreType.Items.AddRange(new object[] { resources.GetString("cmbCoreType.Items"), resources.GetString("cmbCoreType.Items1")}); - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.Name = "cmbCoreType"; // // label4 @@ -405,9 +405,9 @@ // // 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 @@ -435,9 +435,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 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 4ce51c06..99b34537 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1420 +117,1423 @@ 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 - - - 15, 192 - - - 102, 16 - - - 35 - - - allowInsecure - - - chkdefAllowInsecure - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 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 - - - 1 - - - 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 - - - 2 - - - 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 - - - 3 - True - - 15, 63 + + Xray_core - - 120, 16 + + 11 - - 19 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - listening port 2 + + Keep older when deduplication - - False + + 2 - - chkAllowIn2 + + Record local logs - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 - - groupBox1 - - + 4 - - True + + 0 - - 369, 62 + + txtKcpwriteBufferSize - - 84, 16 - - - 18 - - - Enable UDP - - - False - - - chkudpEnabled2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + groupBox1 - + 5 - - socks + + tti - - http + + 14 - - 257, 60 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 97, 20 + + tabControl1 - - 17 - - - False - - - cmbprotocol2 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 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 + + label10 groupBox1 - - 7 + + 9 - - 124, 60 + + groupBox1 - - 78, 21 + + + 662, 523 - + + 35 + + + 1 + + + 468, 60 + + + + Top + + + 102, 16 + + + 6 + + 14 - - False + + 12 - - txtlocalPort2 + + 30, 88 + + + 111, 100 + + + True + + + System.Windows.Forms.Label, 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 + + + 84, 16 + + + 40 + + + True + + + 120, 16 + + + True + + + 234, 16 + + + 4, 22 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 36 + + + 7 + + + tabPage7 + + + 12 + + + label7 + + + http + + + 7 + + + chkdefAllowInsecure + + + 648, 421 + + + 206, 64 + + + 95, 12 + + + tabPage6 + + + 15, 63 + + + 2 + + + Enable UDP System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 2 + + + &Cancel + + + 111, 62 + + groupBox1 - - 8 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False + + 662, 10 - - socks + + Settings - - http + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 257, 25 + + label4 - - 97, 20 + + txtKcpmtu - + + lbFreshrate + + 12 - - cmbprotocol - - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + label11 + + + 29 + + + True + + + 0, 10 + + + 58, 20 + + + Support DnsObject + + + tabPage6 + + + False + + groupBox1 - - 9 + + $this + + + 3 + + + 7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + tabPage7 + + + 19 + + + Bottom + + + 576, 16 + + + 18 True - - 206, 29 - - - 53, 12 - - - 11 - - - protocol - - - label1 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 15, 40 + + + congestion + + + NoControl + + + 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 + + + 89, 12 + + + info + + + 0 + + + tabPage7 + + + v2rayN settings + + + 16 + + groupBox1 10 - - True + + 32 - - 369, 27 + + 6, 12 - - 84, 16 - - - 10 - - - Enable UDP - - - chkudpEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + groupBox1 - - 11 - - - 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 - - - 12 - - - 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 - - - 13 - - - 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 - - - 14 - - - 124, 25 - - - 78, 21 - - - 3 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 15 - - - 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 - - - 16 - - - Fill - - - 3, 3 - - - 648, 421 - - - 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, 427 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 0 + + 1 True - - NoControl + + 8 - - 342, 17 - - - 0, 0, 0, 0 - - - 107, 12 - - - 40 - - - Support DnsObject - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - 8, 41 - - + True + + 198, 16 + + + Automatically start at system startup + + + 654, 427 + + + 1 + + + 4, 4, 4, 4 + + + txtKcptti + Vertical - - 638, 356 - - - 39 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 1 - - - True - - - NoControl - - - 8, 17 + + Turn on Sniffing 281, 12 - - 38 + + Ignore Geo files when updating core - - Custom DNS (multiple, separated by commas (,)) + + 2 - - label14 + + 3, 3, 3, 3 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 3 + + + 662, 453 + + + 33, 29 + + + 325, 130 + + + 124, 60 + + + 78, 21 + + + Log level + + + tabControl1 + + + 59, 12 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + warning tabPage2 - - 2 + + panel2 - - 4, 22 + + Statistics freshrate - - 654, 427 + + 120, 16 - - 4 + + 89, 12 - - Core: DNS settings + + btnOK - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 1 - - - True + + 18, 66 20, 143 - - 84, 16 + + 11 - - 20 + + True - - congestion - - - chkKcpcongestion - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + tabPage6 - + + tabPage6 + + + tabPage6 + + + 5 + + + Turn on Sniffing + + + groupBox1 + + + 18, 28 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 20 + + + 29 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 + + + 5 + + + Core Type + + + True + + + chksniffingEnabled + + + 2 + + + 174, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + 0 - - 345, 100 + + 18, 104 + + + tabPage2 + + + mtu + + + socks + + + tabPage1 + + + System.Windows.Forms.GroupBox, 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 + + + panel1 + + + 30 + + + 53, 12 + + + 13 + + + label8 + + + 468, 27 + + + 236, 28 + + + chkAutoRun 94, 21 - - 15 + + 345, 62 - - txtKcpwriteBufferSize + + 11 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 129 - - tabPage6 + + chkudpEnabled - + 1 True - - 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 - - - 94, 21 - - - 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 + + 8, 17 label9 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + tabPage6 - - 8 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 345, 24 + + 1 - - 94, 21 + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 7 + + 84, 16 - - txtKcptti - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 9 - - - True - - - 236, 28 - - - 23, 12 + + 15 6 - - tti + + False - - label7 + + tabPage6 - + + txtlocalPort + + + tabPage7 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 125, 12 + + tabPage6 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnClose + + + 124, 25 + + + protocol + + + 23, 12 + + + 638, 356 + + + socks + + + 3, 3 + + + chkAllowLANConn + + + 84, 16 + + + tabControl1 + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 1 + + + 10 + + + 369, 62 + + + 161, 84 + + + 9 + + + groupBox1 + 10 - - 111, 24 + + NoControl - - 94, 21 + + chkEnableStatistics - - 5 + + 4 - - txtKcpmtu + + 355, 16 - + + 53, 12 + + + 193, 162 + + + True + + + 369, 27 + + 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 - - - 12 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 427 - - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - - True - - - NoControl + + label2 15, 132 - - 234, 16 + + False - - 36 - - - Ignore Geo files when updating core - - - chkIgnoreGeoUpdateCore - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - v2fly_core - - - Xray_core - - - 325, 130 - - - 97, 20 - - - 34 - - - cmbCoreType - - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage7 + + 9 - - 1 - - - True - - - NoControl - - - 253, 134 - - - 59, 12 - - - 35 - - - Core Type - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - True - - - NoControl - - - 15, 108 - - - 198, 16 - - - 33 - - - Keep older when deduplication - - - chkKeepOlderDedupl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - 161, 84 - - - 58, 20 - - - 32 - - - cbFreshrate - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 4 - - - True - - - NoControl - - - 30, 88 - - - 125, 12 - - - 30 - - - Statistics freshrate - - - lbFreshrate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 5 - - - True - - - NoControl - - - 15, 64 - - - 576, 16 - - - 29 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - chkEnableStatistics - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 6 - - - True - - - 15, 40 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 7 - - - True - - - 15, 16 - - - 246, 16 - - - 23 - - - Automatically start at system startup - - - chkAutoRun - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - + 8 - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 427 - - - 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, 453 - - - 10 - - - tabControl1 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - 0 - - 267, 16 + + 101, 12 - - 75, 23 + + 6 - - 8 + + 12 - - &OK + + 20 - - btnOK + + cmbprotocol - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - panel2 + + NoControl - - 1 - - - Bottom - - - 0, 463 - - - 662, 60 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Top - - - 0, 0 - - - 662, 10 - - - 9 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 204, 16 $this + + 4 + + + Listening port + + + Fill + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 257, 60 + + + 0 + + + 94, 21 + + + True + + + 34 + + + cmbprotocol2 + + + chkKeepOlderDedupl + + + True + + + 16 + + + True + + + True + + + True + + + chkKcpcongestion + + + Core: basic settings + + + 0 + + + 257, 25 + + + tabPage2 + + + tabControl1 + + + listening port 2 + + + 97, 20 + + + chkAllowIn2 + + + System.Windows.Forms.TabControl, 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 + + + True + + + 15, 160 + + + 38 + + + 33 + + + 4, 22 + + + v2fly_core + + + 9 + + + label1 + + + Core: KCP settings + + + 10 + + + tabPage6 + + + error + + + 59, 12 + + + System.Windows.Forms.CheckBox, 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 + + + downlinkCapacity + + + 120, 16 + + + 75, 23 + + + txtlocalPort2 + + + 2 + + + 246, 16 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 654, 427 + + + 15, 108 + + + False + + + 206, 29 + 2 - + + chkudpEnabled2 + + + chkIgnoreGeoUpdateCore + + + Allow connections from the LAN + + + tabPage1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + panel2 + + + 39 + + + 8 + + + linkDnsObjectDoc + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtKcpreadBufferSize + + + none + + + groupBox1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + protocol + + + 4, 22 + + + 15 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 64 + + + 8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + 13 + + + 97, 20 + + + 0 + + True - - - 6, 12 - - 662, 523 + + 78, 21 - - 4, 4, 4, 4 + + tabPage7 - - Settings + + tabPage7 + + + True + + + allowInsecure + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23, 12 + + + 654, 427 + + + 8 + + + tabControl1 + + + 345, 100 + + + NoControl + + + True + + + 10 + + + NoControl + + + 17 + + + 23 + + + 94, 21 + + + 6 + + + 0, 463 + + + groupBox1 + + + 3 + + + http + + + 0 + + + 97, 20 + + + tabPage6 + + + tabPage6 + + + 7 + + + False + + + 257, 158 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &OK + + + 94, 21 + + + 1 + + + 94, 21 + + + txtKcpuplinkCapacity + + + tabPage2 + + + chklogEnabled + + + chksniffingEnabled2 + + + tabPage7 + + + 4, 22 + + + $this + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + groupBox1 + + + NoControl + + + 6 + + + 236, 66 + + + tabPage7 + + + 15, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 3 + + + 8 + + + txtremoteDNS + + + True + + + True + + + 3 + + + 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 + + + 31 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + Core: DNS settings + + + groupBox1 + + + 32 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 345, 24 + + + tabPage7 + + + cbFreshrate OptionSettingForm - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 236, 104 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 94, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 8, 41 + + + 0, 0, 0, 0 + + + uplinkCapacity + + + txtKcpdownlinkCapacity + + + 35 + + + 6 + + + 4 + + + 3, 3, 3, 3 + + + 107, 12 + + + label5 + + + 15, 192 + + + tabPage6 + + + False + + + debug + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkmuxEnabled + + + label3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + 253, 134 + + + 0, 0 + + + Enable UDP + + + cmbCoreType + + + 3, 3, 3, 3 + + + groupBox1 + + + 126, 16 + + + 267, 16 + + + 75, 23 + + + groupBox1 + + + NoControl + + + readBufferSize + + + 9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 342, 17 + + + 97, 20 + + + 3 + + + Custom DNS (multiple, separated by commas (,)) + + + 654, 427 + + + 11 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + NoControl + + + panel2 + + + 7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Turn on Mux Multiplexing + + + cmbloglevel + + + label6 + + + 111, 24 + + + 4 + + + 662, 60 + + + label14 + + + True + + + zh-Hans + \ 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 eccd6e2c..e2026b67 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -139,8 +139,11 @@ 开启流量探测 + + 114, 16 + - 开启Mux多路复用(默认开启) + 开启Mux多路复用 102, 16 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index 3daed59a..b4384682 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -227,7 +227,7 @@ namespace v2rayN.Forms if (lst.Count > 0) { Utils.SetClipboardData(Utils.ToJson(lst)); - UI.Show(UIRes.I18N("OperationSuccess")); + //UI.Show(UIRes.I18N("OperationSuccess")); } } @@ -294,7 +294,7 @@ namespace v2rayN.Forms return; } - if (ConfigHandler.AddBatchRoutingRules(ref routingItem, result) == 0) + if (AddBatchRoutingRules(ref routingItem, result) == 0) { RefreshRoutingsView(); UI.Show(UIRes.I18N("OperationSuccess")); @@ -304,7 +304,7 @@ namespace v2rayN.Forms private void menuImportRulesFromClipboard_Click(object sender, EventArgs e) { string clipboardData = Utils.GetClipboardData(); - if (ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData) == 0) + if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0) { RefreshRoutingsView(); UI.Show(UIRes.I18N("OperationSuccess")); @@ -320,12 +320,21 @@ namespace v2rayN.Forms } DownloadHandle downloadHandle = new DownloadHandle(); string clipboardData = downloadHandle.WebDownloadStringSync(url); - if (ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData) == 0) + if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0) { RefreshRoutingsView(); UI.Show(UIRes.I18N("OperationSuccess")); } } + private int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) + { + bool blReplace = false; + if (UI.ShowYesNo(UIRes.I18N("AddBatchRoutingRulesYesNo")) == DialogResult.No) + { + blReplace = true; + } + return ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData, blReplace); + } #endregion diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index c0fc32b4..52a10bbd 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -290,6 +290,7 @@ namespace v2rayN.Forms private void menuImportBasicRules_Click(object sender, EventArgs e) { //Extra to bypass the mainland + txtProxyDomain.Text = "geosite:google"; txtDirectDomain.Text = "geosite:cn"; txtDirectIp.Text = "geoip:private,geoip:cn"; diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index 0f5ca1f3..923a69e4 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -157,7 +157,7 @@ 0, 0 - 614, 569 + 614, 351 10 @@ -232,7 +232,7 @@ Bottom - 0, 569 + 0, 351 614, 60 @@ -259,7 +259,7 @@ 6, 12 - 614, 629 + 614, 411 Subscription settings diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 61cd330f..2443ec06 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1045,7 +1045,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) + public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData, bool blReplace = true) { if (Utils.IsNullOrEmpty(clipboardData)) { @@ -1057,8 +1057,10 @@ namespace v2rayN.Handler { return -1; } - - routingItem.rules.Clear(); + if (blReplace) + { + routingItem.rules.Clear(); + } foreach (var item in lstRules) { routingItem.rules.Add(item); @@ -1175,7 +1177,7 @@ namespace v2rayN.Handler config.routingIndex = 0; } - + if (GetLockedRoutingItem(ref config) == null) { var item1 = new RoutingItem(); @@ -1190,7 +1192,7 @@ namespace v2rayN.Handler SaveRouting(ref config); return 0; - } + } public static RoutingItem GetLockedRoutingItem(ref Config config) { diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 810dbc1c..ce69371a 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -40,6 +40,7 @@ namespace v2rayN.Handler port = item.port.ToString(), id = item.id, aid = item.alterId.ToString(), + scy = item.security, net = item.network, type = item.headerType, host = item.requestHost, @@ -279,18 +280,26 @@ namespace v2rayN.Handler msg = UIRes.I18N("FailedConversionConfiguration"); return null; } - vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; vmessItem.headerType = Global.None; - vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); vmessItem.remarks = Utils.ToString(vmessQRCode.ps); vmessItem.address = Utils.ToString(vmessQRCode.add); vmessItem.port = Utils.ToInt(vmessQRCode.port); vmessItem.id = Utils.ToString(vmessQRCode.id); vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + vmessItem.security = Utils.ToString(vmessQRCode.scy); + if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) + { + vmessItem.security = vmessQRCode.scy; + } + else + { + vmessItem.security = Global.DefaultSecurity; + } if (!Utils.IsNullOrEmpty(vmessQRCode.net)) { vmessItem.network = vmessQRCode.net; diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index de013922..988cc7c8 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -111,7 +111,7 @@ namespace v2rayN.Handler } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); + //Utils.SaveLog(ex.Message, ex); } if (res != null) @@ -138,7 +138,7 @@ namespace v2rayN.Handler } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); + //Utils.SaveLog(ex.Message, ex); } } } @@ -271,7 +271,7 @@ namespace v2rayN.Handler } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); + //Utils.SaveLog(ex.Message, ex); } } diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs index 32fdbbd1..34317b74 100644 --- a/v2rayN/v2rayN/Mode/VmessQRCode.cs +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -14,21 +14,26 @@ namespace v2rayN.Mode /// public string ps { get; set; } = string.Empty; /// - /// 远程服务器地址 + /// VMess 远程服务器地址 /// public string add { get; set; } = string.Empty; /// - /// 远程服务器端口 + /// VMess 远程服务器端口 /// public string port { get; set; } = string.Empty; /// - /// 远程服务器ID + /// VMess 远程服务器ID /// public string id { get; set; } = string.Empty; /// - /// 远程服务器额外ID + /// VMess 远程服务器额外ID /// public string aid { get; set; } = string.Empty; + /// + /// VMess Security + /// + public string scy { get; set; } = string.Empty; + /// /// 传输协议tcp,kcp,ws /// diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 705703f6..a26e5f34 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.13")] +[assembly: AssemblyFileVersion("4.14")] diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index df456572..b88f7983 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 { @@ -60,6 +60,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 + /// + internal static string AddBatchRoutingRulesYesNo { + get { + return ResourceManager.GetString("AddBatchRoutingRulesYesNo", resourceCulture); + } + } + /// /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 /// @@ -448,7 +457,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Download V2ray successfully 的本地化字符串。 + /// 查找类似 Download Core successfully 的本地化字符串。 /// internal static string MsgDownloadV2rayCoreSuccessfully { get { @@ -592,7 +601,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update V2rayCore successfully 的本地化字符串。 + /// 查找类似 Update Core successfully 的本地化字符串。 /// internal static string MsgUpdateV2rayCoreSuccessfully { get { @@ -601,7 +610,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update V2rayCore successfully! Restarting service... 的本地化字符串。 + /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 /// internal static string MsgUpdateV2rayCoreSuccessfullyMore { get { @@ -637,7 +646,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 V2ray-core not found, please download: {0} 的本地化字符串。 + /// 查找类似 Core not found, please download: {0} 的本地化字符串。 /// internal static string NotFoundCore { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 0b848e00..8ad2a6f6 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -385,4 +385,7 @@ Please fill in the address (Url) - + + Do you want to append rules? Choose yes to append, choose otherwise to replace + + \ 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 cde15548..562095b9 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -385,4 +385,7 @@ 请填写地址(Url) - + + 是否追加规则?选择是则追加,选择否则替换 + + \ No newline at end of file From 777427787a964b1d8b63c70282d9ca7547424298 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 11 May 2021 20:10:02 +0800 Subject: [PATCH 025/252] remove PasswordChar --- .../v2rayN/Forms/AddServer3Form.Designer.cs | 14 +- v2rayN/v2rayN/Forms/AddServer3Form.resx | 877 ++++++++---------- v2rayN/v2rayN/Forms/AddServer4Form.resx | 17 +- v2rayN/v2rayN/Forms/AddServer6Form.resx | 3 - 4 files changed, 379 insertions(+), 532 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs index 27b7c91c..0722261f 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[] { @@ -94,7 +95,6 @@ resources.GetString("cmbSecurity.Items3"), resources.GetString("cmbSecurity.Items4"), resources.GetString("cmbSecurity.Items5")}); - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // // txtRemarks @@ -144,9 +144,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 @@ -163,22 +163,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.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index bfe58c25..2f1a661e 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -118,217 +118,85 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 396, 17 + + 113, 12 - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 + + 53, 12 label6 - + + groupBox1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 547, 25 + + + + 11 + + + + NoControl + + + $this + + + groupBox1 + + + 8 + + + Bottom + + + Import configuration file + + + Alias (remarks) + + + 3 + + + Password + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 3 - - - label5 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + menuItemImportClipboard - - 4 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill groupBox1 - - 6 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - + 8 - - txtAddress + + 89, 12 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 127, 27 - - groupBox1 - - - 9 - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - - 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 - - - True - - - NoControl - - - 426, 158 - - - 113, 12 - - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 0 @@ -336,415 +204,400 @@ aes-256-gcm - - aes-128-gcm - - - chacha20-poly1305 - - - chacha20-ietf-poly1305 - - - none - - - plain - - - 127, 123 - - - 278, 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 - - 278, 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, 155 - - - 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 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + groupBox1 - - 4 + + True + + + 22 + + + 162, 21 + + + 127, 123 127, 91 - - * + + groupBox1 - - 278, 21 + + panel2 - + 5 + + 2 + + + groupBox1 + + + True + + + label5 + txtId System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - - 5 - - - True - - - 12, 93 - - - 53, 12 - - - 4 - - - Password - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 59 - - - 194, 21 - - - 3 - - - txtPort - - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - - 7 - - - True - - - 12, 62 - - - 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 + + + 278, 21 + + + groupBox1 + + + 127, 59 + + + 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + $this + + + 71, 12 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12, 124 + + + 2 + + + groupBox1 + + + txtPort + + + aes-128-gcm + + + 7 + + + 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-poly1305 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 75, 23 + + + btnClose + + + panel2 0 - - Server address + + 3 - - label1 + + 12, 93 - + + 278, 20 + + + 10 + + + chacha20-ietf-poly1305 + + + 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 + + + none + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 10 + + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - btnOK + + label3 - - 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 - - - 1 - - - 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 - Top - - 0, 25 + + 0, 231 - - 547, 10 + + 9 - - 6 + + plain - - panel1 + + 4 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + &Cancel - - $this + + True - - 2 + + 6, 12 - - 17, 17 - - - 0, 0 + + True - - 547, 25 - - - 8 + + Server address menuServer - - System.Windows.Forms.MenuStrip, 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 + + 127, 154 - - 3 + + 95, 12 - - 162, 21 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Import configuration file + + * Fill in manually - - 235, 22 + + 10 - - Import URL from clipboard + + label2 - - zh-CN - - - True - - - 6, 12 + + panel1 + + + 12, 62 547, 291 - - Edit or add a [Shadowsocks] server + + cmbSecurity - - MenuItem1 + + $this - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 547, 196 - - menuItemImportClipboard + + 3 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 75, 23 - - AddServer3Form + + 6 - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 426, 158 + + 65, 12 + + + 4 + + + 2 + + + 1 + + + + + + txtAddress + + + Import URL from clipboard + + + groupBox1 + + + Server + + + txtRemarks + + + 12, 155 + + + True + + + 278, 21 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + True + + + 17, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx index 5cfed0ed..396e263d 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -264,9 +264,6 @@ True - - Server - 127, 120 @@ -375,8 +372,8 @@ 547, 10 - - * + + 0, 35 2 @@ -543,6 +540,9 @@ 5 + + + 75, 23 @@ -555,8 +555,8 @@ groupBox1 - - 0, 35 + + Server txtRemarks @@ -582,9 +582,6 @@ True - - zh-Hans - 17, 17 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 9bf31819..37224494 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -390,9 +390,6 @@ 127, 91 - - * - 265, 21 From 03dec5b6047bd16a8fdb4f8c07a341b0351c99db Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 11 May 2021 20:11:15 +0800 Subject: [PATCH 026/252] BackupGuiConfig --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 19 +++- v2rayN/v2rayN/Forms/MainForm.cs | 63 ++++++------ v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 114 +++++++++++----------- v2rayN/v2rayN/Handler/MainFormHandler.cs | 27 +++++ 4 files changed, 133 insertions(+), 90 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index b69bff7e..15a2db24 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -110,6 +110,8 @@ this.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbBackupGuiNConfig = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.tsbReload = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); @@ -711,7 +713,9 @@ resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, - this.tsbRoutingSetting}); + this.tsbRoutingSetting, + this.toolStripSeparator14, + this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; this.tsbSetting.Name = "tsbSetting"; // @@ -727,6 +731,17 @@ this.tsbRoutingSetting.Name = "tsbRoutingSetting"; this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // + // toolStripSeparator14 + // + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); + this.toolStripSeparator14.Name = "toolStripSeparator14"; + // + // tsbBackupGuiNConfig + // + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); + this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); + // // toolStripSeparator5 // resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); @@ -970,6 +985,8 @@ private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopy; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxAddRoutingRule; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 08783e41..fb38528e 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -33,14 +33,7 @@ namespace v2rayN.Forms Application.ApplicationExit += (sender, args) => { - v2rayHandler.V2rayStop(); - - //HttpProxyHandle.CloseHttpAgent(config); - HttpProxyHandle.UpdateSysProxy(config, true); - - ConfigHandler.SaveConfig(ref config); - statistics?.SaveToFile(); - statistics?.Close(); + MyAppExit(); }; } @@ -85,12 +78,19 @@ namespace v2rayN.Forms private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { - if (e.CloseReason == CloseReason.UserClosing) + switch (e.CloseReason) { - StorageUI(); - e.Cancel = true; - HideForm(); - return; + case CloseReason.UserClosing: + StorageUI(); + e.Cancel = true; + HideForm(); + break; + case CloseReason.ApplicationExitCall: + case CloseReason.FormOwnerClosing: + case CloseReason.TaskManagerClosing: + case CloseReason.WindowsShutDown: + MyAppExit(); + break; } } @@ -105,26 +105,21 @@ namespace v2rayN.Forms //} } + private void MyAppExit() + { + try + { + v2rayHandler.V2rayStop(); + //HttpProxyHandle.CloseHttpAgent(config); + HttpProxyHandle.UpdateSysProxy(config, true); - //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; - // } - //} + ConfigHandler.SaveConfig(ref config); + statistics?.SaveToFile(); + statistics?.Close(); + } + catch { } + } private void RestoreUI() { @@ -883,6 +878,10 @@ namespace v2rayN.Forms UpdateSubscriptionProcess(); } + private void tsbBackupGuiNConfig_Click(object sender, EventArgs e) + { + MainFormHandler.Instance.BackupGuiNConfig(config); + } #endregion @@ -1406,7 +1405,7 @@ namespace v2rayN.Forms RefreshServers(); } }; - MainFormHandler.Instance.UpdateSubscriptionProcess(config, _updateUI); + MainFormHandler.Instance.UpdateSubscriptionProcess(config, _updateUI); } private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index c4e9f00c..b51b78f3 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -318,6 +318,15 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + 196, 170 + + + 195, 22 + + + 系统代理 + 172, 22 @@ -336,12 +345,6 @@ 不改变系统代理 - - 195, 22 - - - 系统代理 - 195, 22 @@ -384,12 +387,15 @@ 退出 - - 196, 170 - 服务器列表 + + 信息 + + + 222, 92 + 221, 22 @@ -414,27 +420,9 @@ 快速添加路由规则 (Ctrl+V) - - 222, 114 - 网速显示未启用 - - 信息 - - - 124, 22 - - - 订阅设置 - - - 124, 22 - - - 更新订阅 - 61, 53 @@ -447,18 +435,18 @@ 分享 - - 124, 22 - 参数设置 - - 124, 22 - 路由设置 + + 189, 22 + + + 备份v2rayN配置文件 + 61, 53 @@ -482,36 +470,12 @@ 重启服务 - - 135, 22 - - - v2rayN - - - 135, 22 - - - v2fly-Core - - - 135, 22 - - - Xray-Core - 85, 53 检查更新 - - v2rayN 项目 - - - V2Ray 官网 - 69, 53 @@ -537,4 +501,40 @@ 关闭窗口 + + 124, 22 + + + 订阅设置 + + + 124, 22 + + + 更新订阅 + + + 135, 22 + + + v2rayN + + + 135, 22 + + + v2fly-Core + + + 135, 22 + + + Xray-Core + + + v2rayN 项目 + + + V2Ray 官网 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 6842a5b9..6b74923f 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -236,6 +236,33 @@ namespace v2rayN.Handler } } + + public void BackupGuiNConfig(Config config) + { + SaveFileDialog fileDialog = new SaveFileDialog + { + Filter = "guiNConfig|*.json", + FilterIndex = 2, + RestoreDirectory = true + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + if (Utils.ToJsonFile(config, fileName) == 0) + { + UI.Show(UIRes.I18N("OperationSuccess")); + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } } } From 545e1c54029f9ce0a2254adb62a48abe777379fc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 11 May 2021 20:11:28 +0800 Subject: [PATCH 027/252] BackupGuiConfig --- v2rayN/v2rayN/Forms/MainForm.resx | 385 ++++++++++++++++-------------- 1 file changed, 203 insertions(+), 182 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index df1bd0d6..63c24d03 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -133,8 +133,8 @@ 97, 53 - - 355, 22 + + groupBox2 Add [VLESS] server @@ -148,8 +148,8 @@ Restart service - - menuCopyServer + + tsbSubSetting 264, 22 @@ -163,8 +163,8 @@ Add [Socks] server - - 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 @@ -173,9 +173,6 @@ ImageAboveText - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 227, 22 @@ -201,12 +198,6 @@ toolStripSeparator6 - - 355, 22 - - - menuMoveDown - 99, 53 @@ -225,6 +216,9 @@ toolSslBlank2 + + menuAddVmessServer + 355, 22 @@ -234,15 +228,15 @@ tsbCheckUpdateN + + 45, 53 + Do not change system proxy System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuExport2SubContent - toolStripSeparator7 @@ -252,8 +246,8 @@ Magenta - - menuKeepNothing + + menuMsgBoxAddRoutingRule 355, 22 @@ -261,8 +255,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill + + menuExport2SubContent 52, 21 @@ -273,11 +267,8 @@ 227, 22 - - 952, 327 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tsbQRCodeSwitch Add Routing Rule (Ctrl+V) @@ -294,9 +285,6 @@ 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 - Copy All @@ -309,11 +297,8 @@ Export selected server for server configuration - - 0, 21 - - - toolStripSeparator11 + + ImageAboveText 952, 56 @@ -324,18 +309,24 @@ 0 + + menuRealPingServer + Test servers real delay (Ctrl+R) menuTcpingServer - - ImageAboveText + + 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 + + 356, 622 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -357,6 +348,9 @@ 203, 22 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + menuMsgBoxCopy @@ -366,14 +360,14 @@ tsbClose - - 125, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 256, 307 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 187, 22 + + 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 @@ -389,13 +383,13 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM + mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY + FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr + flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh + VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh + 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC @@ -404,8 +398,8 @@ 4 - - 3, 17 + + Bottom 355, 22 @@ -431,17 +425,14 @@ menuAddCustomServer - - txtMsgBox - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuMoveDown Import bulk URL from clipboard - - 184, 6 + + 243, 22 Move to bottom (B) @@ -485,20 +476,20 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuKeepClear + + 180, 22 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 3, 17 + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Bottom - - - Export share URLs to clipboard (Ctrl+C) + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 scMain.Panel2 @@ -515,14 +506,14 @@ Fill - - 3 + + 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 @@ -554,8 +545,8 @@ tsbPromotion - - 128, 53 + + 256, 307 4, 4, 4, 4 @@ -566,8 +557,11 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 352, 6 + + 6, 56 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 @@ -591,7 +585,7 @@ menuRoutings - 161, 22 + 180, 22 355, 22 @@ -611,20 +605,17 @@ 686 - - tsbTestMe - 265, 170 - - 243, 22 + + 355, 22 $this - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuUpdateSubscriptions scMain @@ -635,9 +626,6 @@ tsbCheckUpdateXrayCore - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 0, 21 @@ -650,8 +638,8 @@ 5 - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 125, 22 scMain @@ -662,8 +650,8 @@ HTTP: - - Remove selected servers (Delete) + + tsbReload 0 @@ -683,6 +671,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Vertical + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -692,20 +683,20 @@ ImageAboveText - - 1 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Promotion - - menuAddServers + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 - - menuAddVmessServer + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tsbLanguageZhHans @@ -722,12 +713,6 @@ menuExport2ShareUrl - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsMain - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -749,8 +734,8 @@ 0, 66 - - 6 + + 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 @@ -764,6 +749,9 @@ menuAddShadowsocksServer + + txtMsgBox + toolSslBlank4 @@ -779,9 +767,6 @@ Language-[English] - - tsbSubSetting - 264, 22 @@ -794,20 +779,20 @@ Routing + + 128, 53 + Add [Trojan] server - 161, 22 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 180, 22 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ImageAboveText + + toolStripSeparator11 System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -827,15 +812,15 @@ V2Ray Website + + menuKeepClear + No 1 - - tsbV2rayWebsite - cmsMsgBox @@ -868,8 +853,8 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - menuMsgBoxAddRoutingRule + + 952, 327 menuScanScreen @@ -886,20 +871,17 @@ 6, 56 + + Fill + toolSslBlank1 - - scMain.Panel1 - - - tsbReload - tsbSubUpdate - - 微软雅黑, 8pt + + tsMain System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -916,12 +898,18 @@ menuSysAgentMode + + menuKeepNothing + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ImageAboveText + + 187, 22 + Export subscription (base64) share to clipboard @@ -940,9 +928,6 @@ menuServers - - menuUpdateSubscriptions - $this @@ -958,11 +943,8 @@ System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Subscriptions - - - tsbQRCodeSwitch + + 0, 21 3, 171 @@ -973,18 +955,24 @@ 355, 22 - - 6, 56 + + Subscriptions 952, 10 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Updates 264, 22 + + toolStripSeparator14 + 0 @@ -1018,12 +1006,6 @@ System.Windows.Forms.ToolStripDropDownButton, 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.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Top @@ -1036,11 +1018,8 @@ Settings - - 45, 53 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuCopyServer Http proxy @@ -1057,8 +1036,8 @@ MainForm - - toolStripSeparator9 + + 微软雅黑, 8pt menuExit @@ -1078,8 +1057,8 @@ lvServers - - menuRealPingServer + + scMain.Panel1 Magenta @@ -1090,8 +1069,8 @@ menuGlobal - - 100 + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 2 @@ -1123,8 +1102,8 @@ Informations - - $this + + 3 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1144,11 +1123,11 @@ menuRemoveServer - - tsbServer + + tsbBackupGuiNConfig - - Test current service status + + tsbTestMe 355, 22 @@ -1177,6 +1156,9 @@ 243, 22 + + Remove selected servers (Delete) + 355, 22 @@ -1201,6 +1183,12 @@ 355, 22 + + 1 + + + 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 @@ -1219,8 +1207,8 @@ 微软雅黑, 8pt - - Vertical + + Export share URLs to clipboard (Ctrl+C) 243, 22 @@ -1270,8 +1258,8 @@ 微软雅黑, 8pt - - groupBox2 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ImageAboveText @@ -1282,11 +1270,11 @@ 203, 22 - - 356, 622 + + 184, 6 - - 0, 0 + + 355, 22 Up (U) @@ -1312,6 +1300,9 @@ tsbOptionSetting + + 100 + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1333,6 +1324,9 @@ 946, 26 + + 6 + 355, 22 @@ -1360,8 +1354,8 @@ 952, 593 - - Scan QR code on the screen + + Test current service status toolSslSocksPort @@ -1393,18 +1387,18 @@ 0 - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ImageAboveText - 264, 22 6, 56 + + toolStripSeparator9 + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1417,8 +1411,11 @@ 52, 53 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText + + + menuAddServers System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1432,6 +1429,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Scan QR code on the screen + 0, 56 @@ -1450,6 +1450,9 @@ Import bulk URL from clipboard (Ctrl+V) + + $this + Update XrayCore @@ -1462,6 +1465,9 @@ Add a custom configuration server + + 177, 6 + toolSslHttpPort @@ -1471,6 +1477,12 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 352, 6 + + + 3, 17 + 952, 200 @@ -1480,20 +1492,26 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 0 + Fill - - 3, 17 + + tsbV2rayWebsite toolStripSeparator3 + + BackupGuiConfig + - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC @@ -1505,9 +1523,15 @@ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 228, 18 + 603, 17 @@ -1517,9 +1541,6 @@ True - - 228, 18 - 65 From 4408d67c491b186c30a4d18e09d0580aa3e9e223 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 11 May 2021 20:11:59 +0800 Subject: [PATCH 028/252] fix something --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 12 +++++++++++- v2rayN/v2rayN/Handler/ShareHandler.cs | 12 ++++++++++-- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 10 ++++++++++ v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs | 4 +++- v2rayN/v2rayN/Tool/Utils.cs | 4 ++-- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2443ec06..304241bc 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1164,8 +1164,18 @@ namespace v2rayN.Handler { config.routings = new List(); } - if (config.routings.Count <= 0) + + if (config.routings.Count(it => it.locked != true) <= 0) { + //Global + var item1 = new RoutingItem(); + item1.remarks = "全局(Global)"; + item1.url = string.Empty; + item1.rules = new List(); + string result1 = Utils.GetEmbedText(Global.CustomRoutingFileName + "global"); + AddBatchRoutingRules(ref item1, result1); + config.routings.Add(item1); + //Bypass the mainland var item2 = new RoutingItem(); item2.remarks = "绕过大陆(Whitelist)"; diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index ce69371a..03fdb0c2 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -210,6 +210,12 @@ namespace v2rayN.Handler dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); dicQuery.Add("key", Utils.UrlEncode(item.path)); break; + case "grpc": + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); + } + break; } string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); @@ -280,7 +286,7 @@ namespace v2rayN.Handler msg = UIRes.I18N("FailedConversionConfiguration"); return null; } - + vmessItem.network = Global.DefaultNetwork; vmessItem.headerType = Global.None; @@ -690,7 +696,9 @@ namespace v2rayN.Handler item.requestHost = query["quicSecurity"] ?? "none"; item.path = Utils.UrlDecode(query["key"] ?? ""); break; - + case "grpc": + item.path = Utils.UrlDecode(query["serviceName"] ?? ""); + break; default: return null; } diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index fb0bd5dd..8532fea4 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -97,6 +97,11 @@ namespace v2rayN.Handler string msg = string.Empty; pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); + if (pid < 0) + { + _updateFunc(_selecteds[0], UIRes.I18N("OperationFailed")); + return; + } //Thread.Sleep(5000); int httpPort = _config.GetLocalPort("speedtest"); @@ -178,6 +183,11 @@ namespace v2rayN.Handler } pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); + if (pid < 0) + { + _updateFunc(_selecteds[0], UIRes.I18N("OperationFailed")); + return; + } string url = _config.speedTestUrl; DownloadHandle downloadHandle2 = new DownloadHandle(); diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index cab3c055..e6a02a49 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -151,7 +151,7 @@ namespace v2rayN.HttpProxyHandler { var type = config.sysProxyType; - if (forceDisable) + if (forceDisable && type == ESysProxyType.ForcedChange) { type = ESysProxyType.ForcedClear; } @@ -170,6 +170,8 @@ namespace v2rayN.HttpProxyHandler } else if (type == ESysProxyType.ForcedClear) { + //TODO To be verified + Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); SysProxyHandle.ResetIEProxy(); } else if (type == ESysProxyType.Unchanged) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 9ec80dcf..4731aba3 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -618,13 +618,13 @@ namespace v2rayN return def; } - public static void RegWriteValue(string path, string name, string value) + public static void RegWriteValue(string path, string name, object value) { RegistryKey regKey = null; try { regKey = Registry.CurrentUser.CreateSubKey(path); - if (IsNullOrEmpty(value)) + if (IsNullOrEmpty(value.ToString())) { regKey?.DeleteValue(name, false); } From 4d872e9143b7c5ea514f3f3b7dfbee613ec48da9 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 11 May 2021 21:01:36 +0800 Subject: [PATCH 029/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index a26e5f34..8b248492 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.14")] +[assembly: AssemblyFileVersion("4.15")] From 7513ff860b7c44854306ce4125ffef94e797517a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 13 May 2021 20:51:20 +0800 Subject: [PATCH 030/252] up4.16 --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 204 +- v2rayN/v2rayN/Forms/MainForm.cs | 196 +- v2rayN/v2rayN/Forms/MainForm.resx | 2627 ++++++++++--------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 111 +- v2rayN/v2rayN/Global.cs | 2 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 175 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 4 + v2rayN/v2rayN/Handler/UpdateHandle.cs | 453 ++++ v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 8 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 4 +- v2rayN/v2rayN/v2rayN.csproj | 1 + 12 files changed, 2041 insertions(+), 1746 deletions(-) create mode 100644 v2rayN/v2rayN/Handler/UpdateHandle.cs diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 15a2db24..ea1413a1 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -129,6 +129,9 @@ this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.tsbClose = new System.Windows.Forms.ToolStripButton(); + this.tsbCheckUpdateGeoSite = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateGeoIP = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); this.scMain.Panel1.SuspendLayout(); this.scMain.Panel2.SuspendLayout(); @@ -150,19 +153,17 @@ // // scMain.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); this.scMain.Panel2.Controls.Add(this.qrCodeControl); this.scMain.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -181,7 +182,6 @@ // // 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, @@ -217,194 +217,195 @@ this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // // tsbServer // - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // // qrCodeControl @@ -414,14 +415,14 @@ // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuRoutings, @@ -439,73 +440,73 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - resources.ApplyResources(this.menuRoutings, "menuRoutings"); this.menuRoutings.Name = "menuRoutings"; + resources.ApplyResources(this.menuRoutings, "menuRoutings"); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); // // toolStripSeparator13 // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); this.toolStripSeparator13.Name = "toolStripSeparator13"; + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -516,25 +517,25 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.scMain); + resources.ApplyResources(this.groupBox1, "groupBox1"); 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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + 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; @@ -542,41 +543,40 @@ // // cmsMsgBox // - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, this.menuMsgBoxCopyAll, this.menuMsgBoxAddRoutingRule}); this.cmsMsgBox.Name = "cmsMsgBox"; + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxAddRoutingRule // - resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // ssMain // - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, @@ -588,6 +588,7 @@ 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); // @@ -598,8 +599,8 @@ // // toolSslSocksPort // - resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); this.toolSslSocksPort.Name = "toolSslSocksPort"; + resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); // // toolSslBlank1 // @@ -614,8 +615,8 @@ // // toolSslHttpPort // - resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); this.toolSslHttpPort.Name = "toolSslHttpPort"; + resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); // // toolSslBlank2 // @@ -637,8 +638,8 @@ // // toolSslBlank4 // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); // // panel1 // @@ -647,7 +648,6 @@ // // 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, @@ -665,87 +665,88 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "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 // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "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; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); // // tsbSetting // - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator14 // - resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); this.toolStripSeparator14.Name = "toolStripSeparator14"; + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); // // tsbBackupGuiNConfig // - resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // @@ -755,45 +756,47 @@ // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, - this.tsbCheckUpdateXrayCore}); + this.tsbCheckUpdateXrayCore, + this.toolStripSeparator15, + this.tsbCheckUpdateGeoSite, + this.tsbCheckUpdateGeoIP}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -801,49 +804,50 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "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 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // @@ -851,6 +855,23 @@ this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); // + // tsbCheckUpdateGeoSite + // + this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; + resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); + this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); + // + // tsbCheckUpdateGeoIP + // + this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; + resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); + this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); + // // MainForm // resources.ApplyResources(this, "$this"); @@ -987,6 +1008,9 @@ private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoSite; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoIP; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index fb38528e..cabc221d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -650,7 +650,8 @@ namespace v2rayN.Forms private void tsbTestMe_Click(object sender, EventArgs e) { - string result = httpProxyTest() + "ms"; + SpeedtestHandler statistics = new SpeedtestHandler(ref config); + string result = statistics.RunAvailabilityCheck() + "ms"; AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); } @@ -662,12 +663,6 @@ namespace v2rayN.Forms } } - 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(); @@ -1167,88 +1162,17 @@ namespace v2rayN.Forms #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) + void _updateUI(bool success, string msg) { - downloadHandle = new DownloadHandle(); - downloadHandle.AbsoluteCompleted += (sender2, args) => + AppendText(false, msg); + if (success) { - 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"); + menuExit_Click(null, null); + } + }; + (new UpdateHandle()).CheckUpdateGuiN(config, _updateUI); } private void tsbCheckUpdateCore_Click(object sender, EventArgs e) @@ -1263,67 +1187,52 @@ namespace v2rayN.Forms private void CheckUpdateCore(string type) { - DownloadHandle downloadHandle = null; - if (downloadHandle == null) + void _updateUI(bool success, string msg) { - downloadHandle = new DownloadHandle(); - downloadHandle.AbsoluteCompleted += (sender2, args) => + AppendText(false, msg); + if (success) { - if (args.Success) - { - AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "Core")); + CloseV2ray(); - string url = args.Msg; - this.Invoke((MethodInvoker)(delegate - { - askToDownload(downloadHandle, url); - })); - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.UpdateCompleted += (sender2, args) => + string fileName = Global.DownloadFileName; + fileName = Utils.GetPath(fileName); + FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : ""); + + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); + + Global.reloadV2ray = true; + LoadV2ray(); + + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); + } + }; + (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); + } + + private void tsbCheckUpdateGeoSite_Click(object sender, EventArgs e) + { + (new UpdateHandle()).UpdateGeoFile("geosite", config, (bool success, string msg) => + { + AppendText(false, msg); + if (success) { - if (args.Success) - { - AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); - AppendText(false, UIRes.I18N("MsgUnpacking")); + Global.reloadV2ray = true; + LoadV2ray(); + } + }); + } - try - { - CloseV2ray(); - - string fileName = downloadHandle.DownloadFileName; - fileName = Utils.GetPath(fileName); - FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : ""); - - 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) => + private void tsbCheckUpdateGeoIP_Click(object sender, EventArgs e) + { + (new UpdateHandle()).UpdateGeoFile("geoip", config, (bool success, string msg) => + { + AppendText(false, msg); + if (success) { - AppendText(true, args.GetException().Message); - }; - } - - AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "Core")); - downloadHandle.CheckUpdateAsync(type); + Global.reloadV2ray = true; + LoadV2ray(); + } + }); } #endregion @@ -1397,15 +1306,16 @@ namespace v2rayN.Forms /// private void UpdateSubscriptionProcess() { - void _updateUI(bool refresh, string msg) + void _updateUI(bool success, string msg) { AppendText(false, msg); - if (refresh) + if (success) { RefreshServers(); } }; - MainFormHandler.Instance.UpdateSubscriptionProcess(config, _updateUI); + + (new UpdateHandle()).UpdateSubscriptionProcess(config, _updateUI); } private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 63c24d03..9c5d5251 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,724 +117,214 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - + + 3, 17 + + + 327, 17 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VMess] server - + 355, 22 - - 97, 53 - - - groupBox2 - Add [VLESS] server - - 3 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [Shadowsocks] server - - Restart service - - - tsbSubSetting - - - 264, 22 - - - groupBox2 - - - menuMoveUp + + 355, 22 Add [Socks] server - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [Trojan] server - - - ImageAboveText + + 355, 22 - - 227, 22 + + Add a custom configuration server - - 语言-[中文简体] + + 355, 22 - - NoControl + + Import bulk URL from clipboard (Ctrl+V) - - Settings + + 355, 22 - - tsbHelp + + Scan QR code on the screen (Ctrl+S) - - - 0 - - - False - - - toolStripSeparator6 - - - 99, 53 - - - Update subscriptions - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - tsbSetting - - - toolSslBlank2 - - - menuAddVmessServer + + 352, 6 355, 22 - + + Remove selected servers (Delete) + + 355, 22 - - tsbCheckUpdateN - - - 45, 53 - - - Do not change system proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - Update v2flyCore - - - Magenta - - - menuMsgBoxAddRoutingRule + + Remove duplicate servers 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Clone selected server - - menuExport2SubContent + + 355, 22 - - 52, 21 + + Set as active server (Enter) - - Share - - - 227, 22 - - - tsbQRCodeSwitch - - - Add Routing Rule (Ctrl+V) + + 352, 6 355, 22 + + Move to top (T) + + + 355, 22 + + + Up (U) + + + 355, 22 + + + Down (D) + + + 355, 22 + + + Move to bottom (B) + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Test current service status + + + 355, 22 + + + Clear all service statistics + + + 352, 6 + + + 355, 22 + Export selected server for client configuration - - tsbRoutingSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copy All - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 227, 22 + + 355, 22 Export selected server for server configuration - - ImageAboveText - - - 952, 56 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - menuRealPingServer - - - 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 - - - 356, 622 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - + 355, 22 - - toolStripSeparator1 + + Export share URLs to clipboard (Ctrl+C) - - 3 + + 355, 22 - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Export subscription (base64) share to clipboard - - 203, 22 + + Magenta - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - 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 - - - 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 - + + 64, 53 Servers - - 4 - - - Bottom - - - 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, 21 - - - menuAddCustomServer - - - menuMoveDown - - - Import bulk URL from clipboard - - - 243, 22 - - - Move to bottom (B) - - - toolSslBlank3 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6, 12 - - - 48, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 206, 21 - - - 0 - - - 686, 307 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 180, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 17 - - - System.Windows.Forms.ToolStripSeparator, 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 - - - scMain.Panel2 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 39, 21 - - - menuAddServers2 - - - Fill - - - tsbServer - - - Add [VMess] server - - - 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 - - - 206, 21 - - - 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 - - - tsbPromotion - - - 256, 307 - - - 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 - - - 206, 21 - - - 2 - - - 125, 22 - - - Clear all service statistics - - - scMain.Panel2 - - - menuRoutings - - - 180, 22 - - - 355, 22 - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - ssMain - - - 686 - - - 265, 170 - - - 355, 22 - - - $this - - - menuUpdateSubscriptions - - - scMain - - - Check for updates - - - tsbCheckUpdateXrayCore - - - 0, 21 - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - 125, 22 - - - scMain - - - 203, 22 - - - HTTP: - - - tsbReload - - - 0 - - - Help - - - menuMsgBoxSelectAll - - - menuSelectAll - - - Move to top (T) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - 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 + + 356, 622 - - Promotion - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - menuExport2ShareUrl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - SOCKS5: - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - txtMsgBox - - - toolSslBlank4 - - - menuAddTrojanServer - - - 261, 6 - - - v2rayN - - - Language-[English] - - - 264, 22 - - - 0 - - - Fill - - - Routing - - - 128, 53 - - - Add [Trojan] server - - - 180, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator11 + + cmsLv System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 393 - - - 352, 6 - - - System.Windows.Forms.ContextMenuStrip, 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 - - - V2Ray Website - - - menuKeepClear - - - No - - - 1 - - - cmsMsgBox - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OptionSetting - - - menuMoveTop - - - Copy (Ctrl+C) + + Fill @@ -853,710 +343,1277 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 327 + + 0, 0 - - menuScanScreen + + 686, 307 - - ImageAboveText - - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - Fill - - - toolSslBlank1 - - - tsbSubUpdate - - - tsMain - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - SPEED Disabled - - - 355, 22 - - - 67, 53 - - - menuSysAgentMode - - - menuKeepNothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - 187, 22 - - - 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 - - - $this - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - RoutingSetting - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 21 - - - 3, 171 - - - True - - - 355, 22 - - - Subscriptions - - - 952, 10 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Updates - - - 264, 22 - - - toolStripSeparator14 - - + + 0 - - toolStripSeparator8 - - - menuMsgBoxCopyAll - - - 89, 53 - - - 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.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 - - - Top - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - menuCopyServer - - - Http proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - groupBox1 - - - MainForm - - - 微软雅黑, 8pt - - - menuExit - - - 227, 22 - - - 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 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + scMain.Panel1 - - Magenta - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - Magenta - - - 4, 4, 4, 4 - - - Magenta - - - 355, 22 - - - v2rayN Project - - + 0 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - Informations - - - 3 - - - 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 - - - tsbCheckUpdateCore - - - menuSpeedServer - - - 355, 22 - - - menuRemoveServer - - - tsbBackupGuiNConfig - - - tsbTestMe - - - 355, 22 - - - 946, 154 - - - 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) - - - 352, 6 - - - Magenta - - - 243, 22 - - - Remove selected servers (Delete) - - - 355, 22 - - - tsbSub - - - Magenta - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - 1 - - - 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 - - - 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) - - - 243, 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0, 0 - - - qrCodeControl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Clear system proxy - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - 184, 6 - - - 355, 22 - - - Up (U) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - Set system proxy - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MiddleRight - - - Select All (Ctrl+A) - - - tsbOptionSetting - - - 100 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer - scMain.Panel1 - - 微软雅黑, 8pt + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 64, 53 + + scMain - - 228, 92 + + 0 - - 946, 26 + + Fill - - 6 + + 0, 0 - - 355, 22 + + 4, 4, 4, 4 - - Set as active server (Enter) + + 256, 307 - - menuAddVlessServer + + 2 + + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scMain.Panel2 + + + 0 + + + scMain.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 1 + + + 100 946, 307 - - 6, 56 + + 686 - - Add [Shadowsocks] server - - - 261, 6 - - - 微软雅黑, 8pt - - - 952, 593 - - - Test current service status - - - toolSslSocksPort - - - toolStripSeparator10 - - - toolSslHttpPortLab - - - menuMoveBottom - - - 1 - - - Magenta - - - menuExport2ClientConfig - - - 187, 22 - - - menuExport2ServerConfig - - + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + scMain + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 265, 170 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 264, 22 + + + Http proxy + + + 243, 22 + + + Clear system proxy + + + 243, 22 + + + Set system proxy + + + 243, 22 + + + Do not change system proxy 264, 22 + + Routing + + + 264, 22 + + + Server + + + 261, 6 + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Update subscriptions + + + 261, 6 + + + 264, 22 + + + Exit + + + 498, 17 + + + Fill + + + 0, 66 + + + 952, 327 + + + 0 + + + Servers list + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 228, 18 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + Bottom + + + 0, 393 + + + 952, 200 + + + 3 + + + Informations + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 603, 17 + + + 228, 92 + + + cmsMsgBox + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 + + + 0 + + + True + + + Vertical + + + 946, 154 + + + 3 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + 227, 22 + + + Select All (Ctrl+A) + + + 227, 22 + + + Copy (Ctrl+C) + + + 227, 22 + + + Copy All + + + 227, 22 + + + Add Routing Rule (Ctrl+V) + + + 228, 18 + + + 3, 171 + + + 946, 26 + + + 0 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + 微软雅黑, 8pt + + + 52, 21 + + + SOCKS5: + + + 0, 21 + + + 微软雅黑, 8pt + + + 206, 21 + + + 微软雅黑, 8pt + + + 39, 21 + + + HTTP: + + + 0, 21 + + + 微软雅黑, 8pt + + + 206, 21 + + + 微软雅黑, 8pt + + + 206, 21 + + + False + + + 微软雅黑, 8pt + + + No + + + 220, 21 + + + SPEED Disabled + + + MiddleRight + + + 0, 21 + + + Top + + + 0, 56 + + + 952, 10 + + + 2 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 409, 17 + + + 6, 56 + + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + + + Magenta + + + 45, 53 + + + Share + + + BottomCenter + + + ImageAboveText + + + 6, 56 + + + Magenta + + + 67, 53 + + + Settings + + + 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 + + + 203, 22 + + + v2rayN (this software) + + + 203, 22 + + + Update v2flyCore + + + 203, 22 + + + Update XrayCore + + + 200, 6 + + + 203, 22 + + + Update GeoSite + + + 203, 22 + + + Update GeoIP + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + + + 6, 56 + + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + 6, 56 - - toolStripSeparator9 + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + - - 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 - - ImageAboveText - - - menuAddServers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Exit - - - menuClearServerStatistics - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scan QR code on the screen - - - 0, 56 - Close - - 264, 22 + + ImageAboveText - - 0, 21 + + 0, 0 - - 0 + + 952, 56 - - Import bulk URL from clipboard (Ctrl+V) + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this - - Update XrayCore + + 6 - - toolStripSeparator2 + + 125, 22 - - toolSslSocksPortLab + + Settings - - Add a custom configuration server + + 125, 22 + + + Updates + + + 176, 22 + + + OptionSetting + + + 176, 22 + + + RoutingSetting - 177, 6 + 173, 6 - - toolSslHttpPort - - - bgwScan - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 352, 6 - - - 3, 17 - - - 952, 200 - - - statusStrip1 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0 - - - Fill - - - tsbV2rayWebsite - - - toolStripSeparator3 + + 176, 22 BackupGuiConfig - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - + + 187, 22 - - 355, 22 + + v2rayN Project - - 355, 22 + + 187, 22 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + V2Ray Website - - ImageAboveText + + 184, 6 - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] - - 228, 18 - - - 603, 17 - - - zh-Hans - True 65 - - 137, 17 - - - 498, 17 - - - 17, 17 - - - 409, 17 - - - 327, 17 - + + 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 + + + menuAddVlessServer + + + 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 + + + menuAddTrojanServer + + + 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 + + + tsbTestMe + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuClearServerStatistics + + + 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 + + + menuKeepClear + + + 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 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRoutings + + + 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 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, 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 + + + menuUpdateSubscriptions + + + 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 + + + menuMsgBoxSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopyAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxAddRoutingRule + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, 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 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator14 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbBackupGuiNConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + 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 + + + tsbV2rayWebsite + + + 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 + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoIP + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator15 + + + System.Windows.Forms.ToolStripSeparator, 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 + \ 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 b51b78f3..8ba53acb 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -318,15 +318,6 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 196, 170 - - - 195, 22 - - - 系统代理 - 172, 22 @@ -345,6 +336,12 @@ 不改变系统代理 + + 195, 22 + + + 系统代理 + 195, 22 @@ -387,15 +384,12 @@ 退出 + + 196, 170 + 服务器列表 - - 信息 - - - 222, 92 - 221, 22 @@ -420,9 +414,27 @@ 快速添加路由规则 (Ctrl+V) + + 222, 92 + 网速显示未启用 + + 信息 + + + 124, 22 + + + 订阅设置 + + + 124, 22 + + + 更新订阅 + 61, 53 @@ -435,12 +447,21 @@ 分享 + + 189, 22 + 参数设置 + + 189, 22 + 路由设置 + + 186, 6 + 189, 22 @@ -470,12 +491,36 @@ 重启服务 + + 135, 22 + + + v2rayN + + + 135, 22 + + + v2fly-Core + + + 135, 22 + + + Xray-Core + 85, 53 检查更新 + + v2rayN 项目 + + + V2Ray 官网 + 69, 53 @@ -501,40 +546,4 @@ 关闭窗口 - - 124, 22 - - - 订阅设置 - - - 124, 22 - - - 更新订阅 - - - 135, 22 - - - v2rayN - - - 135, 22 - - - v2fly-Core - - - 135, 22 - - - Xray-Core - - - v2rayN 项目 - - - V2Ray 官网 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 5fbf1fdc..e5c50c12 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -7,7 +7,7 @@ namespace v2rayN { #region 常量 - + public const string DownloadFileName = "v2ray-windows.zip"; public const string v2rayWebsiteUrl = @"https://www.v2fly.org/"; public const string AboutUrl = @"https://github.com/2dust/v2rayN"; public const string UpdateUrl = AboutUrl + @"/releases"; diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 66612ac8..0bdde6c2 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -1,16 +1,7 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Diagnostics; +using System; 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 { @@ -19,19 +10,10 @@ namespace v2rayN.Handler /// class DownloadHandle { - public event EventHandler AbsoluteCompleted; - public event EventHandler UpdateCompleted; public event ErrorEventHandler Error; - - public string DownloadFileName - { - get - { - return "v2ray-windows.zip"; - } - } + public class ResultEventArgs : EventArgs { @@ -49,155 +31,7 @@ namespace v2rayN.Handler private long totalBytesToReceive = 0; private DateTime totalDatetime = new DateTime(); private int DownloadTimeout = -1; - - #region Check for updates - - private readonly string nLatestUrl = Global.NUrl + "/latest"; - private const string nUrl = Global.NUrl + "/download/{0}/v2rayN.zip"; - private readonly string v2flyCoreLatestUrl = Global.v2flyCoreUrl + "/latest"; - private const string v2flyCoreUrl = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip"; - private readonly string xrayCoreLatestUrl = Global.xrayCoreUrl + "/latest"; - private const string xrayCoreUrl = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip"; - - public async void CheckUpdateAsync(string type) - { - Utils.SetSecurityProtocol(); - WebRequestHandler webRequestHandler = new WebRequestHandler - { - AllowAutoRedirect = false - }; - HttpClient httpClient = new HttpClient(webRequestHandler); - - string url; - if (type == "v2fly") - { - url = v2flyCoreLatestUrl; - } - else if (type == "xray") - { - url = xrayCoreLatestUrl; - } - 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; - } - } - - /// - /// 获取V2RayCore版本 - /// - public string getCoreVersion(string type) - { - try - { - var core = string.Empty; - var match = string.Empty; - if (type == "v2fly") - { - core = "v2ray.exe"; - match = "V2Ray"; - } - else if (type == "xray") - { - core = "xray.exe"; - match = "Xray"; - } - string filePath = Utils.GetPath(core); - if (!File.Exists(filePath)) - { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @""); - //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, $"{match} ([0-9.]+) \\(").Groups[1].Value; - return version; - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - return ""; - } - } - private void responseHandler(string type, string redirectUrl) - { - try - { - string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); - - string curVersion; - string message; - string url; - if (type == "v2fly") - { - curVersion = "v" + getCoreVersion(type); - message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); - string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(v2flyCoreUrl, version, osBit); - } - else if (type == "xray") - { - curVersion = "v" + getCoreVersion(type); - message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); - string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(xrayCoreUrl, 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 - { - throw new ArgumentException("Type"); - } - - if (curVersion == version) - { - AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message)); - return; - } - - AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url)); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - - Error?.Invoke(this, new ErrorEventArgs(ex)); - } - } - - #endregion - - #region Download - + public WebClientEx DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout) { WebClientEx ws = new WebClientEx(); @@ -218,7 +52,7 @@ 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(Global.DownloadFileName)); } catch (Exception ex) { @@ -354,7 +188,6 @@ namespace v2rayN.Handler return string.Empty; } } - #endregion } } diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 8532fea4..09fc71e7 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -16,6 +16,10 @@ namespace v2rayN.Handler private List _selecteds; Action _updateFunc; + public SpeedtestHandler(ref Config config) + { + _config = config; + } public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) { diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs new file mode 100644 index 00000000..8b3dd7c6 --- /dev/null +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -0,0 +1,453 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + class UpdateHandle + { + Action _updateFunc; + private Config _config; + + public event EventHandler AbsoluteCompleted; + + public class ResultEventArgs : EventArgs + { + public bool Success; + public string Msg; + + public ResultEventArgs(bool success, string msg) + { + this.Success = success; + this.Msg = msg; + } + } + + private readonly string nLatestUrl = Global.NUrl + "/latest"; + private const string nUrl = Global.NUrl + "/download/{0}/v2rayN.zip"; + private readonly string v2flyCoreLatestUrl = Global.v2flyCoreUrl + "/latest"; + private const string v2flyCoreUrl = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip"; + private readonly string xrayCoreLatestUrl = Global.xrayCoreUrl + "/latest"; + private const string xrayCoreUrl = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip"; + private const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat"; + + public void CheckUpdateGuiN(Config config, Action update) + { + _config = config; + _updateFunc = update; + + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + + try + { + string fileName = Utils.GetPath(Global.DownloadFileName); + Process process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "v2rayUpgrade.exe", + Arguments = "\"" + fileName + "\"", + WorkingDirectory = Utils.StartupPath() + } + }; + process.Start(); + if (process.Id > 0) + { + _updateFunc(true, ""); + } + } + catch (Exception ex) + { + _updateFunc(false, ex.Message); + } + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc(false, args.GetException().Message); + }; + } + AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayN")); + + string url = args.Msg; + askToDownload(downloadHandle, url); + } + else + { + _updateFunc(false, args.Msg); + } + }; + _updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); + CheckUpdateAsync("v2rayN"); + } + + + public void CheckUpdateCore(string type, Config config, Action update) + { + _config = config; + _updateFunc = update; + + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + _updateFunc(false, UIRes.I18N("MsgUnpacking")); + + try + { + _updateFunc(true, ""); + } + catch (Exception ex) + { + _updateFunc(false, ex.Message); + } + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc(true, args.GetException().Message); + }; + } + + AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "Core")); + string url = args.Msg; + askToDownload(downloadHandle, url); + } + else + { + _updateFunc(false, args.Msg); + } + }; + _updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "Core")); + CheckUpdateAsync(type); + } + + + public void UpdateSubscriptionProcess(Config config, Action update) + { + _config = config; + _updateFunc = update; + + _updateFunc(false, UIRes.I18N("MsgUpdateSubscriptionStart")); + + if (config.subItem == null || config.subItem.Count <= 0) + { + _updateFunc(false, UIRes.I18N("MsgNoValidSubscription")); + return; + } + + for (int k = 1; k <= config.subItem.Count; k++) + { + string id = config.subItem[k - 1].id.Trim(); + string url = config.subItem[k - 1].url.Trim(); + string hashCode = $"{k}->"; + if (config.subItem[k - 1].enabled == false) + { + continue; + } + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) + { + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); + continue; + } + + DownloadHandle downloadHandle3 = new DownloadHandle(); + downloadHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + string result = Utils.Base64Decode(args.Msg); + if (Utils.IsNullOrEmpty(result)) + { + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); + return; + } + + ConfigHandler.RemoveServerViaSubid(ref config, id); + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + // RefreshServers(); + int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); + if (ret > 0) + { + // RefreshServers(); + } + else + { + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); + } + _updateFunc(true, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle3.Error += (sender2, args) => + { + _updateFunc(false, args.GetException().Message); + }; + + downloadHandle3.WebDownloadString(url); + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); + } + + } + + + public void UpdateGeoFile(string geoName, Config config, Action update) + { + _config = config; + _updateFunc = update; + + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + + try + { + string fileName = Utils.GetPath(Global.DownloadFileName); + if (File.Exists(fileName)) + { + string targetPath = Utils.GetPath($"{geoName}.dat"); + if (File.Exists(targetPath)) + { + File.Delete(targetPath); + } + File.Move(fileName, targetPath); + _updateFunc(true, ""); + } + } + catch (Exception ex) + { + _updateFunc(false, ex.Message); + } + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc(false, args.GetException().Message); + }; + } + + var url = string.Format(geoUrl, geoName); + askToDownload(downloadHandle, url); + } + + #region private + + private async void CheckUpdateAsync(string type) + { + try + { + Utils.SetSecurityProtocol(); + WebRequestHandler webRequestHandler = new WebRequestHandler + { + AllowAutoRedirect = false + }; + HttpClient httpClient = new HttpClient(webRequestHandler); + + string url; + if (type == "v2fly") + { + url = v2flyCoreLatestUrl; + } + else if (type == "xray") + { + url = xrayCoreLatestUrl; + } + 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; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + _updateFunc(false, ex.Message); + } + } + + /// + /// 获取V2RayCore版本 + /// + private string getCoreVersion(string type) + { + try + { + var core = string.Empty; + var match = string.Empty; + if (type == "v2fly") + { + core = "v2ray.exe"; + match = "V2Ray"; + } + else if (type == "xray") + { + core = "xray.exe"; + match = "Xray"; + } + string filePath = Utils.GetPath(core); + if (!File.Exists(filePath)) + { + string msg = string.Format(UIRes.I18N("NotFoundCore"), @""); + //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, $"{match} ([0-9.]+) \\(").Groups[1].Value; + return version; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + _updateFunc(false, ex.Message); + return ""; + } + } + private void responseHandler(string type, string redirectUrl) + { + try + { + string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); + + string curVersion; + string message; + string url; + if (type == "v2fly") + { + curVersion = "v" + getCoreVersion(type); + message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(v2flyCoreUrl, version, osBit); + } + else if (type == "xray") + { + curVersion = "v" + getCoreVersion(type); + message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(xrayCoreUrl, 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 + { + throw new ArgumentException("Type"); + } + + if (curVersion == version) + { + AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message)); + return; + } + + AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + _updateFunc(false, ex.Message); + } + } + + 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 int httpProxyTest() + { + SpeedtestHandler statistics = new SpeedtestHandler(ref _config); + return statistics.RunAvailabilityCheck(); + } + #endregion + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index bd4da3f0..0e9ba524 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -249,8 +249,12 @@ namespace v2rayN.Handler var it = Utils.DeepCopy(rules); it.ip = null; it.type = "field"; - for (int k = 0; k < it.domain.Count; k++) + for (int k = it.domain.Count - 1; k >= 0; k--) { + if (it.domain[k].StartsWith("#")) + { + it.domain.RemoveAt(k); + } it.domain[k] = it.domain[k].Replace(Global.RoutingRuleComma, ","); } //if (Utils.IsNullOrEmpty(it.port)) @@ -704,7 +708,7 @@ namespace v2rayN.Handler break; case "grpc": var grpcSettings = new GrpcSettings(); - + grpcSettings.serviceName = config.path(); streamSettings.grpcSettings = grpcSettings; break; diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 8b248492..d4384b65 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.15")] +[assembly: AssemblyFileVersion("4.16")] diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 4731aba3..522db7c8 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -766,9 +766,9 @@ namespace v2rayN try { IDataObject data = Clipboard.GetDataObject(); - if (data.GetDataPresent(DataFormats.Text)) + if (data.GetDataPresent(DataFormats.UnicodeText)) { - strData = data.GetData(DataFormats.Text).ToString(); + strData = data.GetData(DataFormats.UnicodeText).ToString(); } return strData; } diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 2f87020d..41818af2 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -138,6 +138,7 @@ RoutingRuleSettingForm.cs + Form From a70b5eeef595b68d254196de363e8e56c35f3f10 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 15 May 2021 11:53:39 +0800 Subject: [PATCH 031/252] up4.17 --- v2rayN/v2rayN/Forms/MainForm.cs | 17 +++++++++++++---- .../v2rayN/HttpProxyHandler/HttpProxyHandle.cs | 14 ++++++++++++-- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index cabc221d..d6fdd983 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -33,7 +33,7 @@ namespace v2rayN.Forms Application.ApplicationExit += (sender, args) => { - MyAppExit(); + MyAppExit(false); }; } @@ -88,8 +88,10 @@ namespace v2rayN.Forms case CloseReason.ApplicationExitCall: case CloseReason.FormOwnerClosing: case CloseReason.TaskManagerClosing: + MyAppExit(false); + break; case CloseReason.WindowsShutDown: - MyAppExit(); + MyAppExit(true); break; } } @@ -105,14 +107,21 @@ namespace v2rayN.Forms //} } - private void MyAppExit() + private void MyAppExit(bool blWindowsShutDown) { try { v2rayHandler.V2rayStop(); //HttpProxyHandle.CloseHttpAgent(config); - HttpProxyHandle.UpdateSysProxy(config, true); + if (blWindowsShutDown) + { + HttpProxyHandle.ResetIEProxy4WindowsShutDown(); + } + else + { + HttpProxyHandle.UpdateSysProxy(config, true); + } ConfigHandler.SaveConfig(ref config); statistics?.SaveToFile(); diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index e6a02a49..890352dc 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -170,8 +170,6 @@ namespace v2rayN.HttpProxyHandler } else if (type == ESysProxyType.ForcedClear) { - //TODO To be verified - Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); SysProxyHandle.ResetIEProxy(); } else if (type == ESysProxyType.Unchanged) @@ -184,5 +182,17 @@ namespace v2rayN.HttpProxyHandler } return true; } + + public static void ResetIEProxy4WindowsShutDown() + { + try + { + //TODO To be verified + Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); + } + catch + { + } + } } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index d4384b65..0807f7b5 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.16")] +[assembly: AssemblyFileVersion("4.17")] From d46838eb55267aa12a273c953e44999932979f1b Mon Sep 17 00:00:00 2001 From: Mozi <29089388+pzhlkj6612@users.noreply.github.com> Date: Sun, 16 May 2021 22:34:45 +0800 Subject: [PATCH 032/252] Correct log info after downloading GeoFiles They are not the Core. --- v2rayN/v2rayN/Handler/UpdateHandle.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 +++++++++ v2rayN/v2rayN/Resx/ResUI.resx | 3 +++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 +++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 8b3dd7c6..2a35d676 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -245,7 +245,7 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + _updateFunc(false, string.Format(UIRes.I18N("MsgDownloadGeoFileSuccessfully"), geoName)); try { diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index b88f7983..ed0e2ed1 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -456,6 +456,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 + /// + internal static string MsgDownloadGeoFileSuccessfully { + get { + return ResourceManager.GetString("MsgDownloadGeoFileSuccessfully", resourceCulture); + } + } + /// /// 查找类似 Download Core successfully 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 8ad2a6f6..1709fd87 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -388,4 +388,7 @@ Do you want to append rules? Choose yes to append, choose otherwise to replace + + Download GeoFile: {0} successfully + \ 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 562095b9..5c46aecf 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -388,4 +388,7 @@ 是否追加规则?选择是则追加,选择否则替换 + + 下载 GeoFile: {0} 成功 + \ No newline at end of file From bcd051e5a38f52a80ed480229706978d47d6ad72 Mon Sep 17 00:00:00 2001 From: windfallw <51202308+windfallw@users.noreply.github.com> Date: Sun, 23 May 2021 16:14:10 +0800 Subject: [PATCH 033/252] routing rule: add inboundTag --- .../RoutingRuleSettingDetailsForm.Designer.cs | 22 ++ .../Forms/RoutingRuleSettingDetailsForm.cs | 21 ++ .../Forms/RoutingRuleSettingDetailsForm.resx | 250 +++++++++++++----- ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 106 +++++++- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 4 +- 5 files changed, 339 insertions(+), 64 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs index 9f70e165..81a54d06 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -31,6 +31,8 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingDetailsForm)); this.panel1 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); + this.clbInboundTag = new System.Windows.Forms.CheckedListBox(); + this.label2 = new System.Windows.Forms.Label(); this.clbProtocol = new System.Windows.Forms.CheckedListBox(); this.label3 = new System.Windows.Forms.Label(); this.txtPort = new System.Windows.Forms.TextBox(); @@ -61,6 +63,8 @@ // panel3 // resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.clbInboundTag); + this.panel3.Controls.Add(this.label2); this.panel3.Controls.Add(this.clbProtocol); this.panel3.Controls.Add(this.label3); this.panel3.Controls.Add(this.txtPort); @@ -70,6 +74,22 @@ this.panel3.Controls.Add(this.cmbOutboundTag); this.panel3.Name = "panel3"; // + // clbInboundTag + // + resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); + this.clbInboundTag.CheckOnClick = true; + this.clbInboundTag.FormattingEnabled = true; + this.clbInboundTag.Items.AddRange(new object[] { + resources.GetString("clbInboundTag.Items"), + resources.GetString("clbInboundTag.Items1")}); + this.clbInboundTag.MultiColumn = true; + this.clbInboundTag.Name = "clbInboundTag"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // // clbProtocol // resources.ApplyResources(this.clbProtocol, "clbProtocol"); @@ -214,5 +234,7 @@ private System.Windows.Forms.TextBox txtPort; private System.Windows.Forms.Label label3; private System.Windows.Forms.CheckedListBox clbProtocol; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckedListBox clbInboundTag; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index a11e589d..8b861f08 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -36,6 +36,16 @@ namespace v2rayN.Forms if (rulesItem != null) { rulesItem.port = txtPort.Text.TrimEx(); + + var inboundTag = new List(); + for (int i = 0; i < clbInboundTag.Items.Count; i++) + { + if (clbInboundTag.GetItemChecked(i)) + { + inboundTag.Add(clbInboundTag.Items[i].ToString()); + } + } + rulesItem.inboundTag = inboundTag; rulesItem.outboundTag = cmbOutboundTag.Text; rulesItem.domain = Utils.String2List(txtDomain.Text); rulesItem.ip = Utils.String2List(txtIP.Text); @@ -60,6 +70,17 @@ namespace v2rayN.Forms txtDomain.Text = Utils.List2String(rulesItem.domain, true); txtIP.Text = Utils.List2String(rulesItem.ip, true); + if (rulesItem.inboundTag != null) + { + for (int i = 0; i < clbInboundTag.Items.Count; i++) + { + if (rulesItem.inboundTag.Contains(clbInboundTag.Items[i].ToString())) + { + clbInboundTag.SetItemChecked(i, true); + } + } + } + if (rulesItem.protocol != null) { for (int i = 0; i < clbProtocol.Items.Count; i++) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index 9070a6d9..b64b2d4f 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -124,6 +124,9 @@ System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 32 @@ -147,8 +150,8 @@ Fill - - panel1 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 3 @@ -156,20 +159,20 @@ clbProtocol - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - 4 + 6 NoControl - - 3, 17 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 + + socks Left @@ -186,8 +189,11 @@ 29, 12 - - 742, 576 + + 0 + + + tls panel2 @@ -198,14 +204,20 @@ RoutingSettingDetailsForm + + socks + NoControl - - Fill + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 40 - 3 + 5 Fill @@ -222,6 +234,9 @@ 36 + + Bottom + 0 @@ -234,8 +249,8 @@ $this - - 598, 16 + + groupBox1 groupBox1 @@ -243,6 +258,9 @@ NoControl + + 1 + 0, 121 @@ -256,17 +274,23 @@ Protocol - 6 + 8 panel3 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + True 3 + + 40 + panel4 @@ -276,15 +300,30 @@ bittorrent + + http + + + True + 19, 82 25 + + 372, 20 + + + 3, 17 + panel3 + + 1 + 0, 0 @@ -303,6 +342,9 @@ Fill + + direct + 1 @@ -318,17 +360,17 @@ panel3 - - 107, 43 + + proxy groupBox2 - 5 + 7 - - Bottom + + 1 386, 375 @@ -339,8 +381,11 @@ 392, 0 - - 8 + + panel3 + + + http System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -348,17 +393,20 @@ panel2 + + Fill + panel4 - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - NoControl - - Top + + bittorrent + + + 598, 16 $this @@ -366,12 +414,27 @@ groupBox2 + + panel3 + + + panel3 + + + 1 + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel3 + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 2 + http @@ -390,26 +453,26 @@ 0, 0 - - groupBox1 - 24 + + cmbinboundTag + 11 label4 + + panel3 + &OK - - 75, 23 - - - btnClose + + block System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -420,17 +483,23 @@ 34 + + 71, 12 + 274, 47 + + 41 + block - - 33 + + null - - 1 + + 367, 16 347, 43 @@ -456,11 +525,8 @@ 7 - - 0 - - - label3 + + 1 0 @@ -468,29 +534,41 @@ panel3 - - panel3 + + 8 v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 0, 10 + + label3 80 + + comboBox1 + + + 504, 15 + 742, 60 System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + null + $this - - &Cancel + + label2 + + + btnClose *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> @@ -507,12 +585,24 @@ Port + + 0, 10 + + + 40 + 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 + + http + + + System.Windows.Forms.ComboBox, 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 @@ -520,34 +610,55 @@ txtIP - 2 + 4 + + + 107, 43 cmbOutboundTag - - True + + panel1 + + + 279, 20 NoControl - - Domain + + 742, 576 10 + + 367, 16 + $this 392, 395 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 75, 23 + + clbInboundTag + - 1 + 3 + + + Top + + + &Cancel True @@ -555,12 +666,21 @@ 4 + + 75, 23 + txtDomain + + 42 + IP + + panel3 + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -570,8 +690,11 @@ 0, 516 - - 71, 12 + + 33 + + + cmbInboundTag 350, 395 @@ -579,8 +702,11 @@ panel3 - - 504, 15 + + Domain + + + 367, 16 True diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index 80928b68..a1eb9933 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -117,25 +117,129 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 989, 10 + + + + 80 + + + socks + + + http + + + 372, 15 + + + 272, 24 + + + True + + + + NoControl + + + 87, 15 + + + inboundTag + + + 372, 47 + + + 272, 24 + + + 279, 46 + + + 71, 15 + + + 120, 46 + + + 119, 25 + + + 19, 46 + + + 39, 15 + *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 + + 95, 15 + OutboundTag + + 120, 16 + + + 119, 23 + + + 989, 111 + 取消(&C) 确定(&O) - + + 0, 660 + + + 989, 60 + + + 3, 21 + Vertical + + 591, 515 + + + 597, 539 + + + 3, 21 + Vertical + + 386, 515 + + + 392, 539 + + + 989, 539 + + + 8, 15 + + + 989, 720 + + + 5, 5, 5, 5 + 路由规则详情设置 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index b4384682..ca703f77 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -55,7 +55,8 @@ namespace v2rayN.Forms lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; lvRoutings.Columns.Add("", 30); - lvRoutings.Columns.Add("outboundTag", 80); + lvRoutings.Columns.Add("inboundTag", 100); + lvRoutings.Columns.Add("outboundTag", 100); lvRoutings.Columns.Add("port", 80); lvRoutings.Columns.Add("protocol", 100); lvRoutings.Columns.Add("domain", 160); @@ -74,6 +75,7 @@ namespace v2rayN.Forms var item = routingItem.rules[k]; ListViewItem lvItem = new ListViewItem(""); + Utils.AddSubItem(lvItem, "inboundTag", Utils.List2String(item.inboundTag)); Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); Utils.AddSubItem(lvItem, "port", item.port); Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol)); From 43d8515e23149bfbd0c6c99e5370d6c9b9a55644 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 May 2021 18:34:12 +0800 Subject: [PATCH 034/252] remove something --- .../v2rayN/Forms/AddServer3Form.Designer.cs | 39 +- v2rayN/v2rayN/Forms/AddServer3Form.cs | 36 +- v2rayN/v2rayN/Forms/AddServer3Form.resx | 731 ++++++++-------- .../v2rayN/Forms/AddServer4Form.Designer.cs | 37 +- v2rayN/v2rayN/Forms/AddServer4Form.cs | 35 +- v2rayN/v2rayN/Forms/AddServer4Form.resx | 815 ++++++++---------- .../v2rayN/Forms/AddServer5Form.Designer.cs | 69 +- v2rayN/v2rayN/Forms/AddServer5Form.cs | 96 --- v2rayN/v2rayN/Forms/AddServer5Form.resx | 89 +- 9 files changed, 741 insertions(+), 1206 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs index 0722261f..f8e5a6cb 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs @@ -45,25 +45,20 @@ 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.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); this.groupBox1.SuspendLayout(); this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); this.SuspendLayout(); // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.cmbSecurity); this.groupBox1.Controls.Add(this.txtRemarks); @@ -75,6 +70,7 @@ 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,7 +81,6 @@ // // cmbSecurity // - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; this.cmbSecurity.Items.AddRange(new object[] { @@ -95,6 +90,7 @@ resources.GetString("cmbSecurity.Items3"), resources.GetString("cmbSecurity.Items4"), resources.GetString("cmbSecurity.Items5")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // // txtRemarks @@ -144,9 +140,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 @@ -161,26 +157,6 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // - // menuServer - // - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - 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"; - // - // menuItemImportClipboard - // - resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); - this.menuItemImportClipboard.Name = "menuItemImportClipboard"; - this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); - // // AddServer3Form // resources.ApplyResources(this, "$this"); @@ -189,7 +165,6 @@ 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.MinimizeBox = true; this.Name = "AddServer3Form"; @@ -197,10 +172,7 @@ this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); this.ResumeLayout(false); - this.PerformLayout(); } @@ -222,8 +194,5 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; - private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index d1a4a858..6eda1582 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -100,41 +100,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; - } - - - #region 导入配置 - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void menuItemImportClipboard_Click(object sender, EventArgs e) - { - ImportConfig(); - } - - private void ImportConfig() - { - ClearServer(); - - VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - cmbSecurity.Text = vmessItem.security; - txtId.Text = vmessItem.id; - txtRemarks.Text = vmessItem.remarks; - } - - #endregion - + } } } diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index 2f1a661e..11e4d167 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -118,486 +118,435 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 113, 12 + + 396, 17 - - 53, 12 - - - label6 - - - groupBox1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 547, 25 + + 75, 23 - - 11 + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + True NoControl - - $this + + 426, 158 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 8 - - - Bottom - - - Import configuration file - - - Alias (remarks) - - - 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-gcm - - 6 + + aes-128-gcm - - 5 + + chacha20-poly1305 - - 303, 17 + + chacha20-ietf-poly1305 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + none - - 4 - - - 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 - - - Encryption - - - groupBox1 - - - True - - - 22 - - - 162, 21 + + plain 127, 123 - - 127, 91 + + 278, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 127, 154 + + + 278, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 12, 155 + + + 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 + + + Encryption + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - panel2 + + 4 - + + 127, 91 + + + 278, 21 + + 5 - - 2 - - - groupBox1 - - - True - - - label5 - txtId 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 - - - AddServer3Form - - - 278, 21 - - - groupBox1 - - - 127, 59 - - - 0 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnOK - - - $this - - - 71, 12 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 12, 124 - - - 2 - - - groupBox1 - - - txtPort - - - aes-128-gcm - - - 7 - - - 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-poly1305 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 75, 23 - - - btnClose - - - panel2 - - - 0 - - - 3 + + True 12, 93 - - 278, 20 + + 53, 12 - - 10 + + 4 - - chacha20-ietf-poly1305 + + Password - - True + + label3 - - panel2 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 + + + 6 + + + 127, 59 + 194, 21 + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 62 + + + 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 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtAddress - - 6 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + groupBox1 - - 7 + + 9 - - label13 + + True - - none + + 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 - - v2rayN.Forms.BaseServerForm, 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 - - - Top - - - 0, 231 - - - 9 - - - plain - - - 4 - - - &Cancel - - - True - - - 6, 12 - - - True - - - Server address - - - menuServer - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 127, 154 - - - 95, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - * Fill in manually - 10 - - label2 + + Fill - - panel1 - - - 12, 62 - - - 547, 291 - - - cmbSecurity - - - $this + + 0, 10 - 547, 196 + 547, 221 - + 3 - - 75, 23 - - - 6 - - - 426, 158 - - - 65, 12 - - - 4 - - - 2 - - - 1 - - - - - - txtAddress - - - Import URL from clipboard - - - groupBox1 - Server - - txtRemarks - - - 12, 155 - - - True - - - 278, 21 + + groupBox1 System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3 + + $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, 0 + + + 547, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 True - - 17, 17 - + + 6, 12 + + + 547, 291 + + + Edit or add a [Shadowsocks] server + + + AddServer3Form + + + 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/AddServer4Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs index bdcd694a..628e6c9e 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs @@ -45,25 +45,20 @@ 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.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); this.groupBox1.SuspendLayout(); this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); this.SuspendLayout(); // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtSecurity); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtId); @@ -75,6 +70,7 @@ 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 +131,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 @@ -152,26 +148,6 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // - // menuServer - // - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - 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"; - // - // menuItemImportClipboard - // - resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); - this.menuItemImportClipboard.Name = "menuItemImportClipboard"; - this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); - // // AddServer4Form // resources.ApplyResources(this, "$this"); @@ -180,7 +156,6 @@ 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.MinimizeBox = true; this.Name = "AddServer4Form"; @@ -188,10 +163,7 @@ this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); this.ResumeLayout(false); - this.PerformLayout(); } @@ -209,9 +181,6 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; - private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; private System.Windows.Forms.TextBox txtId; private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txtSecurity; diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs index 29102347..66d63999 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -90,40 +90,7 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } - - - #region 导入配置 - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void menuItemImportClipboard_Click(object sender, EventArgs e) - { - ImportConfig(); - } - - private void ImportConfig() - { - ClearServer(); - - VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtSecurity.Text = vmessItem.security; - txtId.Text = vmessItem.id; - txtRemarks.Text = vmessItem.remarks; - } - - #endregion - + } } diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx index 396e263d..e70189c3 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -118,471 +118,420 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 113, 12 + + 396, 17 - - 113, 12 + + 75, 23 - - label6 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + 127, 89 + + + 278, 21 + + + 26 + + + txtSecurity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - + + 0 + + True - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 547, 25 - - - 11 - - - Bottom + + NoControl - - Import configuration file + + 12, 93 - - panel1 + + 89, 12 - - 3 + + 25 + + + User(Optional) + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 127, 120 + + + 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, 124 + + + 113, 12 + + + 23 Password(Optional) - + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 422, 155 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 151 + + + 278, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 155 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + 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 - - - 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 - - - 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 - - - 278, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 + + 6 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 - - - 0, 35 - - - 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.BaseServerForm, 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 - - - 422, 155 - - - True - - - 4 - - - 5 - - - - - - 75, 23 - - - 89, 12 - - - groupBox1 - - - groupBox1 - - - Server - - - txtRemarks - - - 12, 155 - - - True - - - User(Optional) - - - 278, 21 - - - Top - 3 + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 62 + + + 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 + + + Fill + + + 0, 10 + + + 547, 221 + + + 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, 0 + + + 547, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + True - - 17, 17 - + + 6, 12 + + + 547, 291 + + + Edit or add a [Socks] server + + + AddServer4Form + + + 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.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs index 9e7cab4f..bd68c62f 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -36,6 +36,7 @@ this.btnGUID = new System.Windows.Forms.Button(); this.label13 = new System.Windows.Forms.Label(); this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label25 = new System.Windows.Forms.Label(); this.label24 = new System.Windows.Forms.Label(); this.label23 = new System.Windows.Forms.Label(); this.panTlsMore = new System.Windows.Forms.Panel(); @@ -74,18 +75,10 @@ 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.label25 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.panTlsMore.SuspendLayout(); this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -174,6 +167,11 @@ this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // + // label25 + // + resources.ApplyResources(this.label25, "label25"); + this.label25.Name = "label25"; + // // label24 // resources.ApplyResources(this.label24, "label24"); @@ -409,51 +407,6 @@ 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); - // - // label25 - // - resources.ApplyResources(this.label25, "label25"); - this.label25.Name = "label25"; - // // AddServer5Form // resources.ApplyResources(this, "$this"); @@ -462,7 +415,6 @@ 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); @@ -473,10 +425,7 @@ this.panTlsMore.ResumeLayout(false); this.panTlsMore.PerformLayout(); this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); this.ResumeLayout(false); - this.PerformLayout(); } @@ -508,14 +457,8 @@ 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; diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 1a389b3d..6fd71ad6 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -190,101 +190,5 @@ namespace v2rayN.Forms 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 = ShareHandler.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 index 5a9fa9be..0bd3ebb9 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -970,7 +970,7 @@ Bottom - 3, 215 + 3, 240 723, 281 @@ -1270,10 +1270,10 @@ Fill - 0, 35 + 0, 10 - 729, 499 + 729, 524 3 @@ -1345,7 +1345,7 @@ Top - 0, 25 + 0, 0 729, 10 @@ -1365,57 +1365,6 @@ 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 @@ -1431,36 +1380,6 @@ 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 From 790bd1217c1bd02debe8851d486279ab8de5ab18 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 May 2021 18:34:30 +0800 Subject: [PATCH 035/252] add message filter --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 477 +-- v2rayN/v2rayN/Forms/MainForm.cs | 19 +- v2rayN/v2rayN/Forms/MainForm.resx | 2681 +++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 93 +- .../v2rayN/Forms/MsgFilterSetForm.Designer.cs | 98 + v2rayN/v2rayN/Forms/MsgFilterSetForm.cs | 38 + v2rayN/v2rayN/Forms/MsgFilterSetForm.resx | 267 ++ .../Forms/MsgFilterSetForm.zh-Hans.resx | 132 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 + v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + v2rayN/v2rayN/v2rayN.csproj | 12 + 12 files changed, 2250 insertions(+), 1582 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/MsgFilterSetForm.cs create mode 100644 v2rayN/v2rayN/Forms/MsgFilterSetForm.resx create mode 100644 v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index ea1413a1..108fd727 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -66,6 +66,26 @@ this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.gbMsgTitle = new System.Windows.Forms.GroupBox(); + this.txtMsgBox = new System.Windows.Forms.TextBox(); + this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem(); + this.ssMain = new System.Windows.Forms.StatusStrip(); + this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); 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(); @@ -81,24 +101,6 @@ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); this.bgwScan = new System.ComponentModel.BackgroundWorker(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.txtMsgBox = new System.Windows.Forms.TextBox(); - this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components); - this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); - this.ssMain = new System.Windows.Forms.StatusStrip(); - this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.panel1 = new System.Windows.Forms.Panel(); this.tsMain = new System.Windows.Forms.ToolStrip(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); @@ -119,6 +121,9 @@ this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateXrayCore = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbCheckUpdateGeoSite = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateGeoIP = 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(); @@ -129,19 +134,20 @@ this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.tsbClose = new System.Windows.Forms.ToolStripButton(); - this.tsbCheckUpdateGeoSite = new System.Windows.Forms.ToolStripMenuItem(); - this.tsbCheckUpdateGeoIP = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); this.scMain.Panel1.SuspendLayout(); this.scMain.Panel2.SuspendLayout(); this.scMain.SuspendLayout(); this.cmsLv.SuspendLayout(); - this.cmsMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); + this.gbMsgTitle.SuspendLayout(); this.cmsMsgBox.SuspendLayout(); this.ssMain.SuspendLayout(); + this.cmsMain.SuspendLayout(); this.tsMain.SuspendLayout(); this.SuspendLayout(); // @@ -153,17 +159,19 @@ // // scMain.Panel1 // + resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // + 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; @@ -182,6 +190,7 @@ // // 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, @@ -217,195 +226,194 @@ 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 // - this.menuAddVlessServer.Name = "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 // - this.menuAddTrojanServer.Name = "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 // - this.tsbTestMe.Name = "tsbTestMe"; resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); + this.tsbTestMe.Name = "tsbTestMe"; this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - this.menuClearServerStatistics.Name = "menuClearServerStatistics"; resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); + this.menuClearServerStatistics.Name = "menuClearServerStatistics"; this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_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 // + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // // qrCodeControl @@ -413,129 +421,42 @@ resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // - // notifyMain + // splitContainer1 // - this.notifyMain.ContextMenuStrip = this.cmsMain; - resources.ApplyResources(this.notifyMain, "notifyMain"); - this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.Name = "splitContainer1"; // - // cmsMain + // splitContainer1.Panel1 // - this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); - resources.ApplyResources(this.cmsMain, "cmsMain"); - this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuSysAgentMode, - this.menuRoutings, - this.menuServers, - this.toolStripSeparator13, - this.menuAddServers2, - this.menuScanScreen2, - this.menuUpdateSubscriptions, - this.toolStripSeparator2, - this.menuExit}); - this.cmsMain.Name = "contextMenuStrip1"; - this.cmsMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; - this.cmsMain.ShowCheckMargin = true; - this.cmsMain.ShowImageMargin = false; + resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); + this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // - // menuSysAgentMode + // splitContainer1.Panel2 // - this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuKeepClear, - this.menuGlobal, - this.menuKeepNothing}); - this.menuSysAgentMode.Name = "menuSysAgentMode"; - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); - // - // menuKeepClear - // - this.menuKeepClear.Name = "menuKeepClear"; - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); - this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); - // - // menuGlobal - // - this.menuGlobal.Name = "menuGlobal"; - resources.ApplyResources(this.menuGlobal, "menuGlobal"); - this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); - // - // menuKeepNothing - // - this.menuKeepNothing.Name = "menuKeepNothing"; - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); - this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); - // - // menuRoutings - // - this.menuRoutings.Name = "menuRoutings"; - resources.ApplyResources(this.menuRoutings, "menuRoutings"); - // - // menuServers - // - this.menuServers.Name = "menuServers"; - resources.ApplyResources(this.menuServers, "menuServers"); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); - // - // menuAddServers2 - // - this.menuAddServers2.Name = "menuAddServers2"; - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); - this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); - // - // menuScanScreen2 - // - this.menuScanScreen2.Name = "menuScanScreen2"; - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); - this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); - // - // menuUpdateSubscriptions - // - this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); - this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); - // - // menuExit - // - this.menuExit.Name = "menuExit"; - resources.ApplyResources(this.menuExit, "menuExit"); - this.menuExit.Click += new System.EventHandler(this.menuExit_Click); - // - // bgwScan - // - this.bgwScan.WorkerReportsProgress = true; - this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork); - this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged); + resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); + this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - this.groupBox1.Controls.Add(this.scMain); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.scMain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // - // groupBox2 + // gbMsgTitle // - 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; + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); + this.gbMsgTitle.Controls.Add(this.txtMsgBox); + this.gbMsgTitle.Controls.Add(this.ssMain); + this.gbMsgTitle.Name = "gbMsgTitle"; + this.gbMsgTitle.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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; - 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; @@ -543,40 +464,48 @@ // // cmsMsgBox // + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, this.menuMsgBoxCopyAll, - this.menuMsgBoxAddRoutingRule}); + this.menuMsgBoxAddRoutingRule, + this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); + this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); + this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); + this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxAddRoutingRule // - this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); + this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // + // menuMsgBoxFilter + // + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); + this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); + // // ssMain // + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, @@ -588,7 +517,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); // @@ -599,8 +527,8 @@ // // toolSslSocksPort // - this.toolSslSocksPort.Name = "toolSslSocksPort"; resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); + this.toolSslSocksPort.Name = "toolSslSocksPort"; // // toolSslBlank1 // @@ -615,8 +543,8 @@ // // toolSslHttpPort // - this.toolSslHttpPort.Name = "toolSslHttpPort"; resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); + this.toolSslHttpPort.Name = "toolSslHttpPort"; // // toolSslBlank2 // @@ -638,8 +566,110 @@ // // toolSslBlank4 // - this.toolSslBlank4.Name = "toolSslBlank4"; resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; + // + // notifyMain + // + resources.ApplyResources(this.notifyMain, "notifyMain"); + this.notifyMain.ContextMenuStrip = this.cmsMain; + this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); + // + // cmsMain + // + 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.menuRoutings, + this.menuServers, + this.toolStripSeparator13, + this.menuAddServers2, + this.menuScanScreen2, + this.menuUpdateSubscriptions, + this.toolStripSeparator2, + this.menuExit}); + this.cmsMain.Name = "contextMenuStrip1"; + this.cmsMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.cmsMain.ShowCheckMargin = true; + this.cmsMain.ShowImageMargin = false; + // + // menuSysAgentMode + // + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); + this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuKeepClear, + this.menuGlobal, + this.menuKeepNothing}); + this.menuSysAgentMode.Name = "menuSysAgentMode"; + // + // menuKeepClear + // + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; + this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); + // + // menuGlobal + // + resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; + this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); + // + // menuKeepNothing + // + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); + this.menuKeepNothing.Name = "menuKeepNothing"; + this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); + // + // menuRoutings + // + resources.ApplyResources(this.menuRoutings, "menuRoutings"); + this.menuRoutings.Name = "menuRoutings"; + // + // menuServers + // + resources.ApplyResources(this.menuServers, "menuServers"); + this.menuServers.Name = "menuServers"; + // + // toolStripSeparator13 + // + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); + this.toolStripSeparator13.Name = "toolStripSeparator13"; + // + // menuAddServers2 + // + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); + this.menuAddServers2.Name = "menuAddServers2"; + this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); + // + // menuScanScreen2 + // + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); + this.menuScanScreen2.Name = "menuScanScreen2"; + this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); + // + // menuUpdateSubscriptions + // + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); + this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); + // + // toolStripSeparator2 + // + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // menuExit + // + resources.ApplyResources(this.menuExit, "menuExit"); + this.menuExit.Name = "menuExit"; + this.menuExit.Click += new System.EventHandler(this.menuExit_Click); + // + // bgwScan + // + this.bgwScan.WorkerReportsProgress = true; + this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork); + this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged); // // panel1 // @@ -648,6 +678,7 @@ // // 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, @@ -665,88 +696,87 @@ 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; - resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); 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"; // // tsbSetting // + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - this.tsbOptionSetting.Name = "tsbOptionSetting"; resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Name = "tsbOptionSetting"; this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - this.tsbRoutingSetting.Name = "tsbRoutingSetting"; resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator14 // - this.toolStripSeparator14.Name = "toolStripSeparator14"; resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); + this.toolStripSeparator14.Name = "toolStripSeparator14"; // // tsbBackupGuiNConfig // - this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); + this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - this.toolStripSeparator5.Name = "toolStripSeparator5"; resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + this.toolStripSeparator5.Name = "toolStripSeparator5"; // // tsbReload // @@ -756,11 +786,12 @@ // // 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, @@ -769,34 +800,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); 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); // // tsbCheckUpdateXrayCore // - this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // + // toolStripSeparator15 + // + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); + this.toolStripSeparator15.Name = "toolStripSeparator15"; + // + // tsbCheckUpdateGeoSite + // + resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); + this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; + this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); + // + // tsbCheckUpdateGeoIP + // + resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); + this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; + this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_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, @@ -804,50 +852,49 @@ 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 // - this.tsbV2rayWebsite.Name = "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 // @@ -855,29 +902,11 @@ this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); // - // tsbCheckUpdateGeoSite - // - this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; - resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); - this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); - // - // tsbCheckUpdateGeoIP - // - this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; - resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); - this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); - // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); - // // MainForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.groupBox2); + this.Controls.Add(this.splitContainer1); this.Controls.Add(this.panel1); this.Controls.Add(this.tsMain); this.MaximizeBox = true; @@ -893,13 +922,17 @@ ((System.ComponentModel.ISupportInitialize)(this.scMain)).EndInit(); this.scMain.ResumeLayout(false); this.cmsLv.ResumeLayout(false); - this.cmsMain.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); this.groupBox1.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); + this.gbMsgTitle.ResumeLayout(false); + this.gbMsgTitle.PerformLayout(); this.cmsMsgBox.ResumeLayout(false); this.ssMain.ResumeLayout(false); this.ssMain.PerformLayout(); + this.cmsMain.ResumeLayout(false); this.tsMain.ResumeLayout(false); this.tsMain.PerformLayout(); this.ResumeLayout(false); @@ -910,7 +943,7 @@ #endregion private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox gbMsgTitle; private System.Windows.Forms.TextBox txtMsgBox; private v2rayN.Base.ListViewFlickerFree lvServers; private System.Windows.Forms.NotifyIcon notifyMain; @@ -1011,6 +1044,8 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoSite; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoIP; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index d6fdd983..830fff4f 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -19,6 +19,7 @@ namespace v2rayN.Forms private V2rayHandler v2rayHandler; private List lvSelecteds = new List(); private StatisticsHandler statistics = null; + private string MsgFilter = string.Empty; #region Window 事件 @@ -925,6 +926,13 @@ namespace v2rayN.Forms } else { + if (!Utils.IsNullOrEmpty(MsgFilter)) + { + if (!text.Contains(MsgFilter)) + { + return; + } + } //this.txtMsgBox.AppendText(text); ShowMsg(text); } @@ -1460,7 +1468,16 @@ namespace v2rayN.Forms } } - + private void menuMsgBoxFilter_Click(object sender, EventArgs e) + { + var fm = new MsgFilterSetForm(); + fm.MsgFilter = MsgFilter; + if (fm.ShowDialog() == DialogResult.OK) + { + MsgFilter = fm.MsgFilter; + gbMsgTitle.Text = string.Format(UIRes.I18N("MsgInformationTitle"), MsgFilter); + } + } #endregion } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 9c5d5251..c110104b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,215 +117,776 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + Remove duplicate servers - - 3, 17 - - - 327, 17 - - + 355, 22 - - Add [VMess] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 355, 22 + + + 97, 53 + + 355, 22 Add [VLESS] server - - 355, 22 + + 0 - - Add [Shadowsocks] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Restart service + + + tsbSubSetting + + + 264, 22 + + + gbMsgTitle + + + menuMoveUp Add [Socks] server + + 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 + + + + ImageAboveText + + + 227, 22 + + + 语言-[中文简体] + + + NoControl + + + Settings + + + tsbHelp + + + System.Windows.Forms.ToolStripMenuItem, 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 + + + toolStripSeparator6 + 355, 22 - - Add [Trojan] server + + menuMoveDown - - 355, 22 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Add a custom configuration server + + 99, 53 - - 355, 22 + + Update subscriptions - - Import bulk URL from clipboard (Ctrl+V) + + $this - - 355, 22 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Scan QR code on the screen (Ctrl+S) + + 187, 22 - - 352, 6 + + gbMsgTitle + + + tsbSetting + + + toolSslBlank2 355, 22 - - Remove selected servers (Delete) - - + 355, 22 - - Remove duplicate servers + + tsbCheckUpdateN + + + 45, 53 + + + Do not change system proxy + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + Update v2flyCore + + + Update GeoSite + + + Magenta + + + menuMsgBoxAddRoutingRule 355, 22 - - Clone selected server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + menuExport2SubContent - - Set as active server (Enter) + + 52, 21 - - 352, 6 + + Share + + + 227, 22 + + + tsbQRCodeSwitch + + + Add Routing Rule (Ctrl+V) 355, 22 - - Move to top (T) - - - 355, 22 - - - Up (U) - - - 355, 22 - - - Down (D) - - - 355, 22 - - - Move to bottom (B) - - - 355, 22 - - - Select All (Ctrl+A) - - - 352, 6 - - - 355, 22 - - - Test servers ping (Ctrl+P) - - - 355, 22 - - - Test servers with tcping (Ctrl+O) - - - 355, 22 - - - Test servers real delay (Ctrl+R) - - - 355, 22 - - - Test servers download speed (Ctrl+T) - - - 355, 22 - - - Test current service status - - - 355, 22 - - - Clear all service statistics - - - 352, 6 - - - 355, 22 + + Horizontal Export selected server for client configuration - - 355, 22 + + tsbRoutingSetting + + + 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 + + + 227, 22 Export selected server for server configuration - - 355, 22 + + splitContainer1 - - Export share URLs to clipboard (Ctrl+C) + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + 128, 53 - - Export subscription (base64) share to clipboard + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Magenta + + 0 - - 64, 53 + + Test servers real delay (Ctrl+R) - - Servers + + menuTcpingServer - + ImageAboveText + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 356, 622 - - cmsLv + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + 355, 22 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + 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 + + + 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 + + + + Servers + + + Export subscription (base64) share to clipboard + + + 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, 21 + + + menuAddCustomServer + + + txtMsgBox + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Import bulk URL from clipboard + + + 0 + + + Move to bottom (B) + + + toolSslBlank3 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 12 + + + 48, 53 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Copy All + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 206, 21 + + + Fill + + + 0 + + + 686, 280 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 176, 22 + + + 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 + + + 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, 21 + + + menuAddServers2 + + + Fill + + + + 3 + + + Add [VMess] server + + + $this + + + 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 + + + 206, 21 + + + 0 + + + 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 + + + tsbPromotion + + + 256, 280 + + + 355, 22 + + + 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 + + + 352, 6 + + + groupBox1 + + + 206, 21 + + + 2 + + + 125, 22 + + + Clear all service statistics + + + scMain.Panel2 + + + 176, 22 + + + 3 + + + 187, 22 + + + 6, 56 + + + Test servers download speed (Ctrl+T) + + + ssMain + + + 686 + + + splitContainer1 + + + 265, 170 + + + 243, 22 + + + splitContainer1.Panel1 + + + menuUpdateSubscriptions + + + scMain + + + Check for updates + + + tsbCheckUpdateXrayCore + + + 0, 21 + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 125, 22 + + + scMain + + + 203, 22 + + + HTTP: + + + 952, 56 + + + tsbReload + + + menuCopyServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + Help + + + menuMsgBoxSelectAll + + + menuSelectAll + + + Move to top (T) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + 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 + + + Promotion + + + menuAddServers + + + 355, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + BottomCenter + + + menuExport2ShareUrl + + + 3 + + + splitContainer1.Panel1 + + + SOCKS5: + + + v2rayN (this software) + + + tsbOptionSetting + + + 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, 0 + + + 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 + + + Server + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + menuAddShadowsocksServer + + + toolSslBlank4 + + + menuAddTrojanServer + + + 261, 6 + + + v2rayN + + + Language-[English] + + + 264, 22 + + + menuScanScreen2 + + + 0 + + + Fill + + + Routing + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add [Trojan] server + + + 176, 22 + + + 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 - + + Set message filters + + + 352, 6 + + + System.Windows.Forms.ContextMenuStrip, 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 + + + V2Ray Website + + Fill + + No + + + 1 + + + tsbV2rayWebsite + + + cmsMsgBox + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + OptionSetting + + + menuMoveTop + + + Copy (Ctrl+C) + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -343,1277 +904,755 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 0, 0 - - - 686, 307 - - - - 0 - - - lvServers - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel1 - - - 0 - - - scMain.Panel1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 0 - - - Fill - - - 0, 0 - - - 4, 4, 4, 4 - - - 256, 307 - - - 2 - - - qrCodeControl - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel2 - - - 0 - - - scMain.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 1 - - - 100 - - - 946, 307 - - - 686 - - - 0 - - - scMain - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 17, 17 - - - 137, 17 - - - NoControl - - - 265, 170 - - - cmsMain - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - True - - - 264, 22 - - - Http proxy - - - 243, 22 - - - Clear system proxy - - - 243, 22 - - - Set system proxy - - - 243, 22 - - - Do not change system proxy - - - 264, 22 - - - Routing - - - 264, 22 - - - Server - - - 261, 6 - - - 264, 22 - - - Import bulk URL from clipboard - - - 264, 22 - - - Scan QR code on the screen - - - 264, 22 - - - Update subscriptions - - - 261, 6 - - - 264, 22 - - - Exit - - - 498, 17 - - - Fill - - - 0, 66 - - 952, 327 + 952, 300 - - 0 + + tsbCheckUpdateGeoIP - - Servers list - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 228, 18 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - Bottom - - - 0, 393 - - - 952, 200 - - - 3 - - - Informations - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - 603, 17 - - - 228, 92 - - - cmsMsgBox - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 3, 17 - - - 0 - - - True - - - Vertical - - - 946, 154 - - - 3 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - 227, 22 - - - Select All (Ctrl+A) - - - 227, 22 - - - Copy (Ctrl+C) - - - 227, 22 - - - Copy All - - - 227, 22 - - - Add Routing Rule (Ctrl+V) - - - 228, 18 - - - 3, 171 - - - 946, 26 - - - 0 - - - statusStrip1 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - 微软雅黑, 8pt - - - 52, 21 - - - SOCKS5: - - - 0, 21 - - - 微软雅黑, 8pt - - - 206, 21 - - - 微软雅黑, 8pt - - - 39, 21 - - - HTTP: - - - 0, 21 - - - 微软雅黑, 8pt - - - 206, 21 - - - 微软雅黑, 8pt - - - 206, 21 - - - False - - - 微软雅黑, 8pt - - - No - - - 220, 21 - - - SPEED Disabled - - - MiddleRight - - - 0, 21 - - - Top - - - 0, 56 - - - 952, 10 - - - 2 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 5 - - - 409, 17 - - - 6, 56 - - - Magenta - - - 99, 53 - - - Subscriptions - - - ImageAboveText - - - Magenta - - - 45, 53 - - - Share - - - BottomCenter - - - ImageAboveText - - - 6, 56 - - - Magenta - - - 67, 53 - - - Settings + + menuScanScreen ImageAboveText + + cmsLv + + + toolStripSeparator12 + 6, 56 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - + + Fill - - BottomCenter + + toolSslBlank1 - - Magenta + + tsbSubUpdate - - 97, 53 + + tsMain - - Restart service + + 5 - + + SPEED Disabled + + + 355, 22 + + + 67, 53 + + + menuSysAgentMode + + + menuKeepNothing + + + 952, 527 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText - - 6, 56 + + 187, 22 - - 203, 22 + + 227, 22 - - v2rayN (this software) + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 203, 22 + + 1 - - Update v2flyCore + + cmsMain - - 203, 22 + + 264, 22 - - Update XrayCore + + menuServers - - 200, 6 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + menuMsgBoxFilter 203, 22 - - Update GeoSite + + RoutingSetting - - 203, 22 + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Update GeoIP - - Magenta + + 3, 194 - - 128, 53 + + True - - Check for updates + + 355, 22 - - ImageAboveText + + Subscriptions - - 6, 56 + + 952, 10 - - Magenta + + Updates - - 48, 53 + + 264, 22 - - Help + + toolStripSeparator14 - - ImageAboveText + + 0 - - Magenta + + toolStripSeparator8 + + + menuMsgBoxCopyAll + + + menuExport2ServerConfig 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.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 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + Settings + + + 0, 21 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Http proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + groupBox1 + + + MainForm + + + 微软雅黑, 8pt + + + menuExit + + + 227, 22 + + + False + + + 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 + + + 300 + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + 4, 4, 4, 4 + + + Magenta + + + 355, 22 + + + v2rayN Project + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslHttpPort + + + Select All (Ctrl+A) + + + menuRoutings + + + gbMsgTitle + + + 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 + + + tsbCheckUpdateCore + + + menuSpeedServer + + + 355, 22 + + + menuRemoveServer + + + tsbBackupGuiNConfig + + + tsbServer + + + tsbTestMe + + + 355, 22 + + + 946, 177 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddVmessServer + + + scMain + + + Down (D) + + + 352, 6 + + + Magenta + + + 243, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + tsbSub + + + Magenta + + ImageAboveText + + Clone selected server + + + 0, 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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) + + + 243, 22 + + + 355, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ClientConfig + + + $this + + + 0, 0 + + + qrCodeControl + + + 228, 114 + + + Clear system proxy + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ImageAboveText + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + 184, 6 + + + splitContainer1.Panel2 + + + 0, 0 + + + scMain.Panel1 + + + Up (U) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + Set system proxy + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MiddleRight + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + 0, 66 + + + 100 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + scMain.Panel1 + + + 微软雅黑, 8pt + + + 64, 53 + + + Magenta + + + 946, 26 + + + 5 + + + 355, 22 + + + Set as active server (Enter) + + + menuAddVlessServer + + + 946, 280 + + + 6, 56 + + + Add [Shadowsocks] server + + + 261, 6 + + + 微软雅黑, 8pt + + + splitContainer1 + + + 952, 593 + + + Test current service status + + + toolSslSocksPort + + + toolStripSeparator10 + + + toolSslHttpPortLab + + + menuMoveBottom + + + 355, 22 + + + 1 + + + Magenta + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 187, 22 + + + Informations + + + 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 264, 22 + 6, 56 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - + + toolStripSeparator9 - + + splitContainer1.Panel2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Magenta 52, 53 + + ImageAboveText + + + System.Windows.Forms.NotifyIcon, 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 + + + Exit + + + menuClearServerStatistics + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Scan QR code on the screen + + + 0, 56 + Close - - ImageAboveText + + 264, 22 - - 0, 0 + + 0, 21 - - 952, 56 + + 0 - - 1 + + Import bulk URL from clipboard (Ctrl+V) - - tsMain + + 952, 223 - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Update XrayCore - - $this + + toolStripSeparator2 - - 6 + + toolSslSocksPortLab - - 125, 22 - - - Settings - - - 125, 22 - - - Updates - - - 176, 22 - - - OptionSetting - - - 176, 22 - - - RoutingSetting + + Add a custom configuration server 173, 6 - - 176, 22 + + 1 + + + bgwScan + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + statusStrip1 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0 + + + Fill + + + 3, 17 + + + toolStripSeparator3 BackupGuiConfig - - 187, 22 + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + - - v2rayN Project + + 355, 22 - - 187, 22 + + 355, 22 - - V2Ray Website + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 184, 6 + + menuKeepClear - - 187, 22 + + ImageAboveText - - Language-[English] + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 187, 22 + + 200, 6 - - 语言-[中文简体] + + toolStripSeparator15 + + 228, 18 + + + 603, 17 + 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 - - - menuAddVlessServer - - - 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 - - - menuAddTrojanServer - - - 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 - - - tsbTestMe - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuClearServerStatistics - - - 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 - - - menuKeepClear - - - 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 - - - menuKeepNothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRoutings - - - 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 - - - toolStripSeparator13 - - - System.Windows.Forms.ToolStripSeparator, 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 - - - menuUpdateSubscriptions - - - 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 - - - menuMsgBoxSelectAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopyAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxAddRoutingRule - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, 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 - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbQRCodeSwitch - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator8 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSetting - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbOptionSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbRoutingSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator14 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbBackupGuiNConfig - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator5 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbReload - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdate - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateN - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateXrayCore - - - 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 - - - tsbV2rayWebsite - - - 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 - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateGeoIP - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator15 - - - System.Windows.Forms.ToolStripSeparator, 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 - + + 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 8ba53acb..96153b28 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -318,6 +318,48 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + 服务器列表 + + + 221, 22 + + + 全选 (Ctrl+A) + + + 221, 22 + + + 复制 (Ctrl+C) + + + 221, 22 + + + 复制所有 + + + 221, 22 + + + 快速添加路由规则 (Ctrl+V) + + + 221, 22 + + + 设置信息过滤器 + + + 222, 114 + + + 网速显示未启用 + + + 信息 + 172, 22 @@ -387,42 +429,6 @@ 196, 170 - - 服务器列表 - - - 221, 22 - - - 全选 (Ctrl+A) - - - 221, 22 - - - 复制 (Ctrl+C) - - - 221, 22 - - - 复制所有 - - - 221, 22 - - - 快速添加路由规则 (Ctrl+V) - - - 222, 92 - - - 网速显示未启用 - - - 信息 - 124, 22 @@ -492,23 +498,32 @@ 重启服务 - 135, 22 + 168, 22 v2rayN - 135, 22 + 168, 22 v2fly-Core - 135, 22 + 168, 22 Xray-Core + + 165, 6 + + + 168, 22 + + + 168, 22 + 85, 53 diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs new file mode 100644 index 00000000..616c5634 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs @@ -0,0 +1,98 @@ +namespace v2rayN.Forms +{ + partial class MsgFilterSetForm + { + /// + /// 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(MsgFilterSetForm)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtMsgFilter = new System.Windows.Forms.TextBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtMsgFilter); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtMsgFilter + // + resources.ApplyResources(this.txtMsgFilter, "txtMsgFilter"); + this.txtMsgFilter.Name = "txtMsgFilter"; + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // 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); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // MsgFilterSetForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Name = "MsgFilterSetForm"; + this.Load += new System.EventHandler(this.MsgFilterSetForm_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.TextBox txtMsgFilter; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs new file mode 100644 index 00000000..cbfdd0cd --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace v2rayN.Forms +{ + public partial class MsgFilterSetForm : BaseForm + { + public string MsgFilter { get; set; } + + public MsgFilterSetForm() + { + InitializeComponent(); + } + + private void MsgFilterSetForm_Load(object sender, EventArgs e) + { + txtMsgFilter.Text = MsgFilter; + } + + private void btnOK_Click(object sender, EventArgs e) + { + MsgFilter = txtMsgFilter.Text; + this.DialogResult = DialogResult.OK; + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx new file mode 100644 index 00000000..7a65393f --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + Fill + + + 0 + + + txtMsgFilter + + + &OK + + + NoControl + + + &Cancel + + + groupBox1 + + + + 41, 29 + + + 490, 60 + + + + 11 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel2 + + + $this + + + 1 + + + 396, 17 + + + 0 + + + 1 + + + 0 + + + 75, 23 + + + 9 + + + 5 + + + groupBox1 + + + 8 + + + System.Windows.Forms.Button, 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 + + + NoControl + + + panel2 + + + 4 + + + MsgFilterSetForm + + + 409, 21 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0 + + + 0, 76 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bottom + + + 490, 76 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnClose + + + panel2 + + + Filter + + + btnOK + + + 490, 136 + + + 75, 23 + + + 303, 17 + + + 6, 12 + + + $this + + + MsgFilterSetForm + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx new file mode 100644 index 00000000..351a04cb --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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) + + + 确定(&O) + + + 设置过滤器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index b88f7983..cb11c04c 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -483,6 +483,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Informations (Filter : {0}) 的本地化字符串。 + /// + internal static string MsgInformationTitle { + get { + return ResourceManager.GetString("MsgInformationTitle", resourceCulture); + } + } + /// /// 查找类似 Please fill in the address (Url) 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 8ad2a6f6..cc5ad253 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -388,4 +388,7 @@ Do you want to append rules? Choose yes to append, choose otherwise to replace + + Informations (Filter : {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 562095b9..86b969d4 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -388,4 +388,7 @@ 是否追加规则?选择是则追加,选择否则替换 + + 信息 (过滤器 : {0}) + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 41818af2..3d925fa0 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -125,6 +125,12 @@ BaseServerForm.cs + + Form + + + MsgFilterSetForm.cs + Form @@ -302,6 +308,12 @@ MainForm.cs Designer + + MsgFilterSetForm.cs + + + MsgFilterSetForm.cs + OptionSettingForm.cs From d99763381000d19258ab32f6d5315550ef5eb789 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 May 2021 18:58:39 +0800 Subject: [PATCH 036/252] fix --- .../Forms/RoutingRuleSettingDetailsForm.resx | 45 ++++--------------- 1 file changed, 9 insertions(+), 36 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index b64b2d4f..79486491 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -149,10 +149,7 @@ Fill - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 3 @@ -203,19 +200,13 @@ RoutingSettingDetailsForm - - - socks - + NoControl System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 40 - + 5 @@ -320,10 +311,7 @@ panel3 - - - 1 - + 0, 0 @@ -383,10 +371,7 @@ panel3 - - - http - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -455,19 +440,13 @@ 24 - - - cmbinboundTag - + 11 label4 - - - panel3 - + &OK @@ -494,10 +473,7 @@ block - - - null - + 367, 16 @@ -632,10 +608,7 @@ 10 - - - 367, 16 - + $this From 0d17a112a6e8ee6d34fe226bce8e6a35cefce0b4 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 May 2021 19:09:41 +0800 Subject: [PATCH 037/252] fix --- .../RoutingRuleSettingDetailsForm.Designer.cs | 22 +- .../Forms/RoutingRuleSettingDetailsForm.resx | 983 +++++++++--------- ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 94 +- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 4 +- 4 files changed, 494 insertions(+), 609 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs index 81a54d06..504b60ea 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -62,7 +62,6 @@ // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.clbInboundTag); this.panel3.Controls.Add(this.label2); this.panel3.Controls.Add(this.clbProtocol); @@ -72,12 +71,13 @@ this.panel3.Controls.Add(this.labRoutingTips); this.panel3.Controls.Add(this.label4); this.panel3.Controls.Add(this.cmbOutboundTag); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // clbInboundTag // - resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); this.clbInboundTag.CheckOnClick = true; + resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); this.clbInboundTag.FormattingEnabled = true; this.clbInboundTag.Items.AddRange(new object[] { resources.GetString("clbInboundTag.Items"), @@ -92,8 +92,8 @@ // // clbProtocol // - resources.ApplyResources(this.clbProtocol, "clbProtocol"); this.clbProtocol.CheckOnClick = true; + resources.ApplyResources(this.clbProtocol, "clbProtocol"); this.clbProtocol.FormattingEnabled = true; this.clbProtocol.Items.AddRange(new object[] { resources.GetString("clbProtocol.Items"), @@ -119,8 +119,8 @@ // // labRoutingTips // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.Name = "labRoutingTips"; // // label4 @@ -130,26 +130,26 @@ // // cmbOutboundTag // - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbOutboundTag.FormattingEnabled = true; this.cmbOutboundTag.Items.AddRange(new object[] { resources.GetString("cmbOutboundTag.Items"), resources.GetString("cmbOutboundTag.Items1"), resources.GetString("cmbOutboundTag.Items2")}); + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.Name = "cmbOutboundTag"; // // panel4 // - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.btnClose); this.panel4.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // btnClose // - resources.ApplyResources(this.btnClose, "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); @@ -163,15 +163,15 @@ // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.groupBox2); this.panel2.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtIP); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -182,8 +182,8 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -234,7 +234,7 @@ private System.Windows.Forms.TextBox txtPort; private System.Windows.Forms.Label label3; private System.Windows.Forms.CheckedListBox clbProtocol; - private System.Windows.Forms.Label label2; private System.Windows.Forms.CheckedListBox clbInboundTag; + private System.Windows.Forms.Label label2; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index 79486491..23589990 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -117,586 +117,547 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + - - 53, 12 + + 0, 0 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 742, 10 - - 32 + + 7 - - 245, 20 - - - direct - - - 31 - - - proxy - - - 107, 16 - - - - Fill - - - 3 - - - clbProtocol - - - 0 - - - 6 - - - NoControl - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - socks - - - Left - - - panel3 - - - NoControl - - - 0 - - - 29, 12 - - - 0 - - - tls - - - panel2 - - - tls - - - RoutingSettingDetailsForm - - - NoControl - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - Fill - - - 411, 15 - - - 119, 20 + + panel1 System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 36 - - - Bottom - - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 344, 375 - - + $this - - groupBox1 + + 3 - - groupBox1 + + 80 - + + socks + + + http + + + 347, 16 + + + 245, 20 + + + 41 + + + clbInboundTag + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + True + + NoControl + + 274, 20 + + + 65, 12 + + + 40 + + + inboundTag + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + 1 - - 0, 121 + + 80 - - label1 + + http - - 742, 395 + + tls + + + bittorrent + + + 347, 43 + + + 245, 20 + + + 39 + + + clbProtocol + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + True + + + NoControl + + + 274, 47 + + + 53, 12 + + + 36 Protocol + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + 107, 43 + + + 119, 21 + + + 35 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 4 + + + True + + + NoControl + + + 19, 47 + + + 29, 12 + + + 34 + + + Port + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + NoControl + + + 19, 82 + + + 598, 16 + + + 33 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 6 + + + True + + + NoControl + + + 19, 20 + + + 71, 12 + + + 32 + + + outboundTag + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 7 + + + proxy + + + direct + + + block + + + 107, 16 + + + 119, 20 + + + 31 + + + cmbOutboundTag + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + 8 + + Top + + + 0, 10 + + + 742, 111 + + + 8 + panel3 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 3 - - - 40 - - - panel4 - - - 5 - - - bittorrent - - - http - - - True - - - 19, 82 - - - 25 - - - 372, 20 - - - 3, 17 - - - panel3 - - - 0, 0 - - - 19, 20 - - - labRoutingTips - - - 19, 47 - - - 39 - - - Fill - - - direct - - - 1 - - - RoutingRuleSettingDetailsForm - - - panel2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - proxy - - - groupBox2 - - - 7 - - - 1 - - - 386, 375 - - - panel3 - - - 392, 0 - - - panel3 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - Fill - - - panel4 - - - NoControl - - - bittorrent - - - 598, 16 - - - $this - - - groupBox2 - - - panel3 - - - panel3 - - - 1 - - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel3 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - http - - - txtPort - - - 3, 17 - - - 1 - - - 742, 10 - - - 0, 0 - - - 24 - - - 11 - - - label4 - - - &OK - - - block - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 34 - - - 71, 12 - - - 274, 47 - - - 41 - - - block - - - 367, 16 - - - 347, 43 - - - 0 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnOK + + $this 2 - - 119, 21 - - - 4 - - - 7 - - - 1 - - - 0 - - - panel3 - - - 8 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - label3 - - - 80 - - - comboBox1 + + NoControl 504, 15 - - 742, 60 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - null - - - $this - - - label2 - - - btnClose - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - 742, 111 - - - True - - - 6, 12 - - - Port - - - 0, 10 - - - 40 - - - 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 - - - http - - - System.Windows.Forms.ComboBox, 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 - - - txtIP - - - 4 - - - 107, 43 - - - cmbOutboundTag - - - panel1 - - - 279, 20 - - - NoControl - - - 742, 576 - - - 10 - - - $this - - - 392, 395 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 75, 23 - - clbInboundTag - - - 3 - - - Top - - - &Cancel - - - True - 4 - - 75, 23 + + &Cancel - - txtDomain - - - 42 - - - IP - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + btnClose System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel4 + + + 0 + + + NoControl + + + 411, 15 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Bottom + 0, 516 - - 33 + + 742, 60 - - cmbInboundTag + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Fill + + + 3, 17 + + + True + + + 344, 375 + + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 350, 395 - - panel3 + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 386, 375 + + + 24 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 395 + + + 3 Domain - - 367, 16 + + groupBox1 - - True + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - outboundTag + + panel2 - - Top + + 1 - - 35 + + Fill + + + 0, 121 + + + 742, 395 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 True - - zh-Hans - + + 6, 12 + + + 742, 576 + + + 4, 4, 4, 4 + + + RoutingSettingDetailsForm + + + RoutingRuleSettingDetailsForm + + + 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/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index a1eb9933..15246bd3 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -118,128 +118,52 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 989, 10 - - - - 80 - - - socks - - - http - - 372, 15 + 372, 16 - 272, 24 + 272, 20 - - True - - - - NoControl - - - 87, 15 - - - inboundTag + + 279, 20 - 372, 47 + 372, 46 - 272, 24 + 272, 20 - 279, 46 - - - 71, 15 + 279, 50 120, 46 - - 119, 25 - - 19, 46 - - - 39, 15 + 19, 50 *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 - - 95, 15 - OutboundTag 120, 16 - - 119, 23 - - - 989, 111 - 取消(&C) 确定(&O) - - 0, 660 - - - 989, 60 - - - 3, 21 - + Vertical - - 591, 515 - - - 597, 539 - - - 3, 21 - Vertical - - 386, 515 - - - 392, 539 - - - 989, 539 - - - 8, 15 - - - 989, 720 - - - 5, 5, 5, 5 - 路由规则详情设置 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index ca703f77..6376feb8 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -55,10 +55,10 @@ namespace v2rayN.Forms lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; lvRoutings.Columns.Add("", 30); - lvRoutings.Columns.Add("inboundTag", 100); lvRoutings.Columns.Add("outboundTag", 100); lvRoutings.Columns.Add("port", 80); lvRoutings.Columns.Add("protocol", 100); + lvRoutings.Columns.Add("inboundTag", 100); lvRoutings.Columns.Add("domain", 160); lvRoutings.Columns.Add("ip", 160); @@ -75,10 +75,10 @@ namespace v2rayN.Forms var item = routingItem.rules[k]; ListViewItem lvItem = new ListViewItem(""); - Utils.AddSubItem(lvItem, "inboundTag", Utils.List2String(item.inboundTag)); Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); Utils.AddSubItem(lvItem, "port", item.port); Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol)); + Utils.AddSubItem(lvItem, "inboundTag", Utils.List2String(item.inboundTag)); Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); From 8b63a19161f5057d2d041494548733720c064899 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 May 2021 20:25:22 +0800 Subject: [PATCH 038/252] add grpc mode --- v2rayN/v2rayN/Forms/AddServer5Form.cs | 12 +- v2rayN/v2rayN/Forms/AddServer5Form.resx | 4 +- .../v2rayN/Forms/AddServer5Form.zh-Hans.resx | 2 +- v2rayN/v2rayN/Forms/AddServerForm.cs | 13 +- v2rayN/v2rayN/Forms/AddServerForm.resx | 741 +++--------------- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 2 +- v2rayN/v2rayN/Global.cs | 4 + v2rayN/v2rayN/Handler/ShareHandler.cs | 5 + v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 1 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 4 + 10 files changed, 155 insertions(+), 633 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 6fd71ad6..9c2f350a 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -76,6 +76,7 @@ namespace v2rayN.Forms SetHeaderType(); } + /// /// 设置伪装选项 /// @@ -90,23 +91,30 @@ namespace v2rayN.Forms return; } - cmbHeaderType.Items.Add(Global.None); if (network.Equals(Global.DefaultNetwork)) { + cmbHeaderType.Items.Add(Global.None); cmbHeaderType.Items.Add(Global.TcpHeaderHttp); } else if (network.Equals("kcp") || network.Equals("quic")) { + cmbHeaderType.Items.Add(Global.None); cmbHeaderType.Items.Add("srtp"); cmbHeaderType.Items.Add("utp"); cmbHeaderType.Items.Add("wechat-video"); cmbHeaderType.Items.Add("dtls"); cmbHeaderType.Items.Add("wireguard"); } + else if (network.Equals("grpc")) + { + cmbHeaderType.Items.Add(Global.GrpcgunMode); + cmbHeaderType.Items.Add(Global.GrpcmultiMode); + } else { + cmbHeaderType.Items.Add(Global.None); } - cmbHeaderType.Text = Global.None; + cmbHeaderType.SelectedIndex = 0; } private void btnOK_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index 0bd3ebb9..b86110a6 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -826,13 +826,13 @@ 282, 68 - 299, 12 + 293, 12 20 - *tcp or kcp or QUIC camouflage type, default none + *tcp or kcp or QUIC camouflage type or grpc mode label12 diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx index 841c0bd2..bd048332 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx @@ -224,7 +224,7 @@ 197, 12 - *tcp或kcp或QUIC伪装类型,默认none + *tcp或kcp或QUIC伪装类型或grpc模式 127, 102 diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 99eb4916..a7de10ad 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServerForm : BaseServerForm - { + { public AddServerForm() { @@ -90,23 +90,30 @@ namespace v2rayN.Forms return; } - cmbHeaderType.Items.Add(Global.None); if (network.Equals(Global.DefaultNetwork)) { + cmbHeaderType.Items.Add(Global.None); cmbHeaderType.Items.Add(Global.TcpHeaderHttp); } else if (network.Equals("kcp") || network.Equals("quic")) { + cmbHeaderType.Items.Add(Global.None); cmbHeaderType.Items.Add("srtp"); cmbHeaderType.Items.Add("utp"); cmbHeaderType.Items.Add("wechat-video"); cmbHeaderType.Items.Add("dtls"); cmbHeaderType.Items.Add("wireguard"); } + else if (network.Equals("grpc")) + { + cmbHeaderType.Items.Add(Global.GrpcgunMode); + cmbHeaderType.Items.Add(Global.GrpcmultiMode); + } else { + cmbHeaderType.Items.Add(Global.None); } - cmbHeaderType.Text = Global.None; + cmbHeaderType.SelectedIndex = 0; } private void btnOK_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 8289c639..a13e5ab4 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -143,226 +143,6 @@ 0 - - btnGUID - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - label8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - txtAlterId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 13 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 14 - - - 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 - 411, 83 @@ -414,288 +194,10 @@ 1 - - label25 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - label24 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - label23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - label20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 5 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 8 - - - label19 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 9 - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 10 - - - label17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 11 - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 12 - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 13 - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 14 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 15 - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 16 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 17 - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 18 - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 19 - - - cmbHeaderType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 20 - - - 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 - - - 2 - True + NoControl @@ -783,75 +285,6 @@ 2 - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - label22 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 1 - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 2 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 3 - - - 200, 234 - - - 500, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - 300, 7 @@ -960,6 +393,27 @@ 3 + + 200, 234 + + + 500, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + True @@ -1300,13 +754,13 @@ 282, 66 - 299, 12 + 293, 12 20 - *tcp or kcp or QUIC camouflage type, default none + *tcp or kcp or QUIC camouflage type or grpc mode label12 @@ -1440,6 +894,33 @@ 20 + + 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 + + + 2 + True @@ -1770,6 +1251,45 @@ 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 @@ -1806,30 +1326,6 @@ 1 - - 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 - Top @@ -1857,33 +1353,6 @@ 17, 17 - - 0, 0 - - - 729, 25 - - - 8 - - - menuServer - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 162, 21 - - - Import configuration file - 237, 22 @@ -1905,9 +1374,33 @@ Import URL from clipboard - - zh-CN - + + 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 diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 4bbfcc1f..a8f9b0ae 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -215,7 +215,7 @@ 197, 12 - *tcp或kcp或QUIC伪装类型,默认none + *tcp或kcp或QUIC伪装类型或grpc模式 127, 102 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index e5c50c12..a44cc1ee 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -194,6 +194,10 @@ namespace v2rayN public const string RoutingRuleComma = ""; public static readonly IEnumerable ssSecuritys = new HashSet { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; + + public const string GrpcgunMode = "gun"; + public const string GrpcmultiMode = "multi"; + #endregion #region 全局变量 diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 03fdb0c2..325b6654 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -214,6 +214,10 @@ namespace v2rayN.Handler if (!Utils.IsNullOrEmpty(item.path)) { dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); + if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode) + { + dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); + } } break; } @@ -698,6 +702,7 @@ namespace v2rayN.Handler break; case "grpc": item.path = Utils.UrlDecode(query["serviceName"] ?? ""); + item.headerType= Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); break; default: return null; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 0e9ba524..28893b9d 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -710,6 +710,7 @@ namespace v2rayN.Handler var grpcSettings = new GrpcSettings(); grpcSettings.serviceName = config.path(); + grpcSettings.multiMode = (config.headerType() == Global.GrpcmultiMode ? true : false); streamSettings.grpcSettings = grpcSettings; break; default: diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index c52957e9..d86b587b 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -518,6 +518,10 @@ namespace v2rayN.Mode /// /// public string serviceName { get; set; } + /// + /// + /// + public bool multiMode { get; set; } } } From 5b271108c0aaf8f3837cd47533a92afb188266df Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 May 2021 20:38:28 +0800 Subject: [PATCH 039/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 0807f7b5..24d1e627 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.17")] +[assembly: AssemblyFileVersion("4.18")] From c9a150565d7057c37b0e6a7434e7972584b8c31c Mon Sep 17 00:00:00 2001 From: Owen Chang Date: Fri, 25 Jun 2021 12:32:37 +0800 Subject: [PATCH 040/252] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=AD=A3=E5=88=99?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E4=BD=9C=E4=B8=BA=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E5=A2=9E=E5=BC=BA=E5=AE=9E=E7=94=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2rayN/v2rayN/Forms/MainForm.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 830fff4f..56c63c23 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -11,6 +11,7 @@ using v2rayN.Tool; using System.Diagnostics; using System.Drawing; using System.Net; +using System.Text.RegularExpressions; namespace v2rayN.Forms { @@ -928,7 +929,7 @@ namespace v2rayN.Forms { if (!Utils.IsNullOrEmpty(MsgFilter)) { - if (!text.Contains(MsgFilter)) + if (!Regex.IsMatch(text,MsgFilter)) { return; } From a665dc9db78d8a58b4fd026180bef4d4f2e226a7 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 3 Jul 2021 16:34:41 +0800 Subject: [PATCH 041/252] up 4.19 --- .../Forms/OptionSettingForm.Designer.cs | 47 + v2rayN/v2rayN/Forms/OptionSettingForm.cs | 6 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 562 +++-- .../Forms/OptionSettingForm.zh-Hans.resx | 88 +- .../Forms/RoutingSettingForm.Designer.cs | 79 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 5 + v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 1822 +++++++++-------- .../Forms/RoutingSettingForm.zh-Hans.resx | 124 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 4 + v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 1 + .../HttpProxyHandler/HttpProxyHandle.cs | 2 +- .../v2rayN/HttpProxyHandler/SysProxyHandle.cs | 19 + v2rayN/v2rayN/Mode/Config.cs | 12 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 4 + v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 15 files changed, 1560 insertions(+), 1217 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 8a2f03e2..2d895f88 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -78,6 +78,11 @@ this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label13 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.txtsystemProxyExceptions = new System.Windows.Forms.TextBox(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); @@ -87,6 +92,8 @@ this.tabPage2.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.groupBox2.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // @@ -105,6 +112,7 @@ this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage6); this.tabControl1.Controls.Add(this.tabPage7); + this.tabControl1.Controls.Add(this.tabPage3); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // @@ -433,6 +441,37 @@ this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.UseVisualStyleBackColor = true; // + // tabPage3 + // + resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Controls.Add(this.groupBox2); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.label13); + this.groupBox2.Controls.Add(this.label12); + this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // txtsystemProxyExceptions + // + resources.ApplyResources(this.txtsystemProxyExceptions, "txtsystemProxyExceptions"); + this.txtsystemProxyExceptions.Name = "txtsystemProxyExceptions"; + // // panel2 // resources.ApplyResources(this.panel2, "panel2"); @@ -473,6 +512,9 @@ this.tabPage6.PerformLayout(); this.tabPage7.ResumeLayout(false); this.tabPage7.PerformLayout(); + this.tabPage3.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -532,5 +574,10 @@ private System.Windows.Forms.ComboBox cmbCoreType; private System.Windows.Forms.Label label4; private System.Windows.Forms.CheckBox chkIgnoreGeoUpdateCore; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TextBox txtsystemProxyExceptions; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label13; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 95dbb622..e6acb0d8 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -65,8 +65,9 @@ namespace v2rayN.Forms //remoteDNS txtremoteDNS.Text = config.remoteDNS; - chkdefAllowInsecure.Checked = config.defAllowInsecure; + + txtsystemProxyExceptions.Text = config.systemProxyExceptions; } @@ -228,9 +229,10 @@ namespace v2rayN.Forms //remoteDNS config.remoteDNS = txtremoteDNS.Text.TrimEx(); - config.defAllowInsecure = chkdefAllowInsecure.Checked; + config.systemProxyExceptions = txtsystemProxyExceptions.Text.TrimEx(); + return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 99b34537..1cec3650 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -136,17 +136,21 @@ 2 + + + 6, 283 + Record local logs tabPage7 - - 4 + + 12 - - 0 + + 4, 22 txtKcpwriteBufferSize @@ -181,15 +185,14 @@ groupBox1 - 662, 523 35 - - 1 + + 111, 24 468, 60 @@ -201,14 +204,20 @@ 102, 16 + + cmbprotocol + 6 14 - - 12 + + tabPage3 + + + 5 30, 88 @@ -240,18 +249,18 @@ True - - 234, 16 + + tabPage6 - - 4, 22 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage6 36 + + 75, 23 + 7 @@ -261,9 +270,6 @@ 12 - - label7 - http @@ -285,9 +291,18 @@ tabPage6 + + 317, 12 + 15, 63 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + 2 @@ -306,32 +321,38 @@ 111, 62 - - groupBox1 + + 654, 427 + + + 654, 427 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 662, 10 - Settings + + True + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 label4 + + 42 + txtKcpmtu lbFreshrate - - 12 + + 4 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -345,12 +366,12 @@ True + + Turn on Sniffing + 0, 10 - - 58, 20 - Support DnsObject @@ -360,8 +381,8 @@ False - - groupBox1 + + tabControl1 $this @@ -369,8 +390,8 @@ 3 - - 7 + + none System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -378,14 +399,20 @@ NoControl + + 6 + tabPage7 - - 19 + + 0 - - Bottom + + tabPage6 + + + Fill 576, 16 @@ -399,9 +426,6 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 40 - congestion @@ -429,12 +453,18 @@ v2rayN settings - - 16 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 + + 12 + + + NoControl + 10 @@ -465,23 +495,17 @@ Automatically start at system startup - - 654, 427 - 1 - - 4, 4, 4, 4 - txtKcptti Vertical - - Turn on Sniffing + + 15, 160 281, 12 @@ -498,8 +522,11 @@ 3 - - 662, 453 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True 33, 29 @@ -522,6 +549,9 @@ 59, 12 + + cmbCoreType + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -531,12 +561,18 @@ tabPage2 - - panel2 + + 4 + + + True Statistics freshrate + + 107, 12 + 120, 16 @@ -558,11 +594,8 @@ True - - tabPage6 - - - tabPage6 + + 4, 4, 4, 4 tabPage6 @@ -597,12 +630,18 @@ 5 + + label12 + Core Type True + + 8, 28 + chksniffingEnabled @@ -642,6 +681,12 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 + + + True + panel1 @@ -660,8 +705,8 @@ 468, 27 - - 236, 28 + + label13 chkAutoRun @@ -672,11 +717,11 @@ 345, 62 - - 11 + + 15, 16 - - 15, 129 + + 3, 3, 3, 3 chkudpEnabled @@ -717,20 +762,23 @@ False - - tabPage6 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 txtlocalPort + + 236, 28 + tabPage7 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 19 - - 125, 12 + + 4, 22 tabPage6 @@ -747,26 +795,29 @@ protocol + + 84, 16 + 23, 12 638, 356 - - socks + + True 3, 3 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + chkAllowLANConn - - 84, 16 - - - tabControl1 + + True True @@ -774,29 +825,23 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 15, 40 1 - - 10 + + tabPage6 369, 62 - - 161, 84 - 9 - - groupBox1 - - - 10 + + System proxy settings NoControl @@ -804,6 +849,9 @@ chkEnableStatistics + + socks + 4 @@ -831,15 +879,12 @@ label2 - - 15, 132 + + 234, 16 False - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 9 @@ -861,18 +906,24 @@ 20 - - cmbprotocol + + allowInsecure + + + groupBox2 Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - NoControl + + 107, 12 204, 16 + + 662, 453 + $this @@ -882,23 +933,26 @@ Listening port + + protocol + Fill - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 41 257, 60 - - 0 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 94, 21 + + tabControl1 - - True + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 34 @@ -909,14 +963,14 @@ chkKeepOlderDedupl - - True + + 15, 129 16 - - True + + 7 True @@ -954,14 +1008,14 @@ System.Windows.Forms.TabControl, 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 + + tabPage3 - - True + + panel2 - - 15, 160 + + Vertical 38 @@ -972,9 +1026,6 @@ 4, 22 - - v2fly_core - 9 @@ -987,35 +1038,38 @@ 10 - - tabPage6 - error 59, 12 + + NoControl + + + txtKcpdownlinkCapacity + System.Windows.Forms.CheckBox, 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 + + 654, 427 downlinkCapacity - - 120, 16 + + tabControl1 - - 75, 23 + + 662, 10 txtlocalPort2 - - 2 + + True 246, 16 @@ -1029,6 +1083,9 @@ 654, 427 + + 42 + 15, 108 @@ -1050,8 +1107,8 @@ Allow connections from the LAN - - tabPage1 + + 161, 84 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1062,6 +1119,9 @@ 2 + + groupBox2 + panel2 @@ -1077,11 +1137,14 @@ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Bottom + txtKcpreadBufferSize - - none + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 @@ -1092,29 +1155,29 @@ Fill - - protocol + + 638, 219 - - 4, 22 + + OptionSettingForm - - 15 + + 2 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 64 - 8 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox2 - - 5 + + 58, 20 + + + 1 13 @@ -1125,6 +1188,12 @@ 0 + + 8, 52 + + + 9 + True @@ -1140,8 +1209,8 @@ True - - allowInsecure + + v2fly_core True @@ -1149,26 +1218,35 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6 + 23, 12 - - 654, 427 + + 11 8 - - tabControl1 + + Exception + + + Use semicolon (;) 345, 100 + + 94, 21 + NoControl - - True + + 654, 427 10 @@ -1185,14 +1263,26 @@ 94, 21 - - 6 + + debug + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 0, 463 - - groupBox1 + + 0 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 3 @@ -1206,11 +1296,8 @@ 97, 20 - - tabPage6 - - - tabPage6 + + label7 7 @@ -1227,8 +1314,8 @@ &OK - - 94, 21 + + 10 1 @@ -1251,17 +1338,26 @@ tabPage7 + + txtsystemProxyExceptions + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + 4, 22 - - $this + + 40 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 4, 22 groupBox1 @@ -1272,20 +1368,20 @@ 6 - - 236, 66 + + Custom DNS (multiple, separated by commas (,)) tabPage7 - - 15, 16 + + $this System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 15, 132 3 @@ -1296,6 +1392,9 @@ txtremoteDNS + + 0, 0 + True @@ -1305,8 +1404,8 @@ 3 - - writeBufferSize + + 1 11 @@ -1317,6 +1416,9 @@ 89, 12 + + 16 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1329,8 +1431,8 @@ groupBox1 - - Core: DNS settings + + groupBox1 groupBox1 @@ -1341,23 +1443,26 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + 345, 24 tabPage7 - - cbFreshrate - - - OptionSettingForm + + Core: DNS settings 236, 104 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + label3 + + + 125, 12 NoControl @@ -1371,6 +1476,12 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + writeBufferSize + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 8, 41 @@ -1380,14 +1491,14 @@ uplinkCapacity - - txtKcpdownlinkCapacity + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 35 - - 6 + + 5 4 @@ -1395,8 +1506,11 @@ 3, 3, 3, 3 - - 107, 12 + + 10 + + + cmbloglevel label5 @@ -1410,8 +1524,8 @@ False - - debug + + tabPage6 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1419,8 +1533,8 @@ chkmuxEnabled - - label3 + + True System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1437,15 +1551,18 @@ Enable UDP - - cmbCoreType + + 15, 64 - - 3, 3, 3, 3 + + True groupBox1 + + 15 + 126, 16 @@ -1455,17 +1572,20 @@ 75, 23 + + Do not use proxy server for addresses beginning with + groupBox1 - - NoControl + + 120, 16 readBufferSize - - 9 + + 2 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1476,14 +1596,17 @@ 342, 17 + + 94, 21 + 97, 20 3 - - Custom DNS (multiple, separated by commas (,)) + + groupBox1 654, 427 @@ -1497,6 +1620,9 @@ 0 + + groupBox1 + NoControl @@ -1509,21 +1635,33 @@ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + cbFreshrate + Turn on Mux Multiplexing - - cmbloglevel + + tabPage6 label6 - - 111, 24 + + 236, 66 + + + NoControl 4 + + NoControl + + + True + 662, 60 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index e2026b67..1740c11e 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,6 +121,60 @@ 取消(&C) + + 654, 443 + + + Core:基础设置 + + + 654, 443 + + + Core:DNS设置 + + + 654, 443 + + + Core:KCP设置 + + + 654, 443 + + + v2rayN设置 + + + 95, 12 + + + 使用分号(;)分隔 + + + 239, 12 + + + 对于下列字符开头的地址不使用代理服务器: + + + 654, 443 + + + 例外 + + + 654, 443 + + + 系统代理设置 + + + 662, 469 + + + 648, 437 + 336, 16 @@ -193,15 +247,6 @@ 本地监听端口 - - 648, 437 - - - 654, 443 - - - Core:基础设置 - 161, 12 @@ -214,18 +259,6 @@ 自定义DNS(可多个,用逗号(,)隔开) - - 654, 443 - - - Core:DNS设置 - - - 654, 443 - - - Core:KCP设置 - 150, 16 @@ -268,21 +301,12 @@ 开机自动启动(可能会不成功) - - 654, 443 - - - v2rayN设置 - - - 662, 469 + + 0, 479 确定(&O) - - 0, 479 - 662, 539 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index 1d5cf177..d24ecee8 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -35,6 +35,8 @@ this.labRoutingTips = new System.Windows.Forms.Label(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.cmbdomainMatcher = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); this.chkenableRoutingAdvanced = new System.Windows.Forms.CheckBox(); this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); @@ -90,24 +92,24 @@ // // 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); // // panel2 // + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.labRoutingTips); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // labRoutingTips // - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; this.labRoutingTips.Name = "labRoutingTips"; // // btnOK @@ -119,12 +121,29 @@ // // panel1 // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Controls.Add(this.cmbdomainMatcher); + this.panel1.Controls.Add(this.label6); this.panel1.Controls.Add(this.chkenableRoutingAdvanced); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // cmbdomainMatcher + // + resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher"); + this.cmbdomainMatcher.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbdomainMatcher.FormattingEnabled = true; + this.cmbdomainMatcher.Items.AddRange(new object[] { + resources.GetString("cmbdomainMatcher.Items"), + resources.GetString("cmbdomainMatcher.Items1")}); + this.cmbdomainMatcher.Name = "cmbdomainMatcher"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // // chkenableRoutingAdvanced // resources.ApplyResources(this.chkenableRoutingAdvanced, "chkenableRoutingAdvanced"); @@ -141,17 +160,18 @@ // // 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"; // // 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.menuAdd, @@ -160,88 +180,87 @@ this.menuSetDefaultRouting}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.MenuItemAdvanced; - resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - this.menuAdd.Name = "menuAdd"; resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Name = "menuAdd"; this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - this.menuRemove.Name = "menuRemove"; resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Name = "menuRemove"; this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - this.menuSelectAll.Name = "menuSelectAll"; resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuSetDefaultRouting // - this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); + this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); // // MenuItemAdvanced // + resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); this.MenuItemAdvanced.DropDown = this.cmsLv; this.MenuItemAdvanced.Name = "MenuItemAdvanced"; - resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); // // menuServer // + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItemBasic, this.MenuItemAdvanced}); - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // MenuItemBasic // + resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); this.MenuItemBasic.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuImportBasicRules}); this.MenuItemBasic.Name = "MenuItemBasic"; - resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); // // menuImportBasicRules // - this.menuImportBasicRules.Name = "menuImportBasicRules"; resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); + this.menuImportBasicRules.Name = "menuImportBasicRules"; this.menuImportBasicRules.Click += new System.EventHandler(this.menuImportBasicRules_Click); // // tabNormal // + resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Controls.Add(this.tabPageProxy); this.tabNormal.Controls.Add(this.tabPageDirect); this.tabNormal.Controls.Add(this.tabPageBlock); this.tabNormal.Controls.Add(this.tabPageRuleList); - resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Name = "tabNormal"; this.tabNormal.SelectedIndex = 0; this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting); // // tabPageProxy // - this.tabPageProxy.Controls.Add(this.panel5); resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); + this.tabPageProxy.Controls.Add(this.panel5); this.tabPageProxy.Name = "tabPageProxy"; this.tabPageProxy.UseVisualStyleBackColor = true; // // panel5 // + resources.ApplyResources(this.panel5, "panel5"); this.panel5.Controls.Add(this.groupBox5); this.panel5.Controls.Add(this.groupBox6); - resources.ApplyResources(this.panel5, "panel5"); this.panel5.Name = "panel5"; // // groupBox5 // - this.groupBox5.Controls.Add(this.txtProxyIp); resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.Controls.Add(this.txtProxyIp); this.groupBox5.Name = "groupBox5"; this.groupBox5.TabStop = false; // @@ -252,8 +271,8 @@ // // groupBox6 // - this.groupBox6.Controls.Add(this.txtProxyDomain); resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.Controls.Add(this.txtProxyDomain); this.groupBox6.Name = "groupBox6"; this.groupBox6.TabStop = false; // @@ -264,22 +283,22 @@ // // tabPageDirect // - this.tabPageDirect.Controls.Add(this.panel4); resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); + this.tabPageDirect.Controls.Add(this.panel4); this.tabPageDirect.Name = "tabPageDirect"; this.tabPageDirect.UseVisualStyleBackColor = true; // // panel4 // + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.groupBox3); this.panel4.Controls.Add(this.groupBox4); - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // groupBox3 // - this.groupBox3.Controls.Add(this.txtDirectIp); resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.Controls.Add(this.txtDirectIp); this.groupBox3.Name = "groupBox3"; this.groupBox3.TabStop = false; // @@ -290,8 +309,8 @@ // // groupBox4 // - this.groupBox4.Controls.Add(this.txtDirectDomain); resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.Controls.Add(this.txtDirectDomain); this.groupBox4.Name = "groupBox4"; this.groupBox4.TabStop = false; // @@ -302,22 +321,22 @@ // // tabPageBlock // - this.tabPageBlock.Controls.Add(this.panel3); resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); + this.tabPageBlock.Controls.Add(this.panel3); this.tabPageBlock.Name = "tabPageBlock"; this.tabPageBlock.UseVisualStyleBackColor = true; // // panel3 // + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.groupBox2); this.panel3.Controls.Add(this.groupBox1); - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // groupBox2 // - this.groupBox2.Controls.Add(this.txtBlockIp); resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtBlockIp); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -328,8 +347,8 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.txtBlockDomain); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtBlockDomain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -340,15 +359,15 @@ // // tabPageRuleList // - this.tabPageRuleList.Controls.Add(this.lvRoutings); resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); + this.tabPageRuleList.Controls.Add(this.lvRoutings); this.tabPageRuleList.Name = "tabPageRuleList"; this.tabPageRuleList.UseVisualStyleBackColor = true; // // lvRoutings // - this.lvRoutings.ContextMenuStrip = this.cmsLv; resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.ContextMenuStrip = this.cmsLv; this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -443,5 +462,7 @@ private System.Windows.Forms.CheckBox chkenableRoutingAdvanced; private System.Windows.Forms.ToolStripMenuItem MenuItemBasic; private System.Windows.Forms.ToolStripMenuItem menuImportBasicRules; + private System.Windows.Forms.ComboBox cmbdomainMatcher; + private System.Windows.Forms.Label label6; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 52a10bbd..732671c2 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -22,6 +22,7 @@ namespace v2rayN.Forms cmbdomainStrategy.Text = config.domainStrategy; chkenableRoutingAdvanced.Checked = config.enableRoutingAdvanced; + cmbdomainMatcher.Text = config.domainMatcher; if (config.routings == null) { @@ -50,6 +51,8 @@ namespace v2rayN.Forms { config.domainStrategy = cmbdomainStrategy.Text; config.enableRoutingAdvanced = chkenableRoutingAdvanced.Checked; + config.domainMatcher = cmbdomainMatcher.Text; + EndBindingLockedData(); if (ConfigHandler.SaveRouting(ref config) == 0) @@ -295,6 +298,8 @@ namespace v2rayN.Forms txtDirectIp.Text = "geoip:private,geoip:cn"; txtBlockDomain.Text = "geosite:category-ads-all"; + + UI.Show(UIRes.I18N("OperationSuccess")); } #endregion diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 8e33444c..707462c4 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,807 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - - 753, 17 - - - 75, 23 - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - NoControl - - - 5, 22 - - - 562, 16 - - - 34 - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - labRoutingTips - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - NoControl - - - 660, 17 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 2 - - - Bottom - - - 0, 613 - - - 853, 60 - 7 - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - NoControl - - - 318, 17 - - - 216, 16 - - - 26 - - - Enable advanced routing function - - - chkenableRoutingAdvanced - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 0 - - - True - - - NoControl - - - 6, 21 - - - 0, 0, 0, 0 - - - 95, 12 - - - 19 - - - Domain strategy - - - linkLabelRoutingDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 1 - - - AsIs - - - IPIfNonMatch - - - IPOnDemand - - - 116, 17 - - - 165, 20 - - - 16 - - - cmbdomainStrategy - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 2 - - - Top - - - 0, 25 - - - 853, 51 - - - 11 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - 17, 17 - - - 194, 22 - - - Add - - - 194, 22 - - - Remove selected - - - 194, 22 - - - Select All (Ctrl+A) - - - 194, 22 - - - Set as active routing - - - 129, 21 - - - Advanced Function - - - 195, 92 - - - cmsLv - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 139, 17 - - - 185, 22 - - - Import Basic Rules - - - 102, 21 - - - Basic Function - - - 0, 0 - - - 853, 25 - - - 15 - - - menuServer - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - Fill - - - 3, 17 - - - True - - - Vertical - - - 441, 485 - - - 25 - - - txtProxyIp - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox5 - - - 0 - - - Fill - - - 392, 0 - - - 447, 505 - - - 4 - - - IP - - - groupBox5 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel5 - - - 0 - - - Fill - - - 3, 17 - - - True - - - Vertical - - - 386, 485 - - - 24 - - - txtProxyDomain - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox6 - - - 0 - - - Left - - - 0, 0 - - - 392, 505 - - - 3 - - - Domain - - - groupBox6 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel5 - - - 1 - - - Fill - - - 3, 3 - - - 839, 505 - - - 12 - - - panel5 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageProxy - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 845, 511 - - - 0 - - - 1.Proxy Domain or IP - - - tabPageProxy - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabNormal - - - 0 - - - Fill - - - 3, 17 - - - True - - - Vertical - - - 441, 485 - - - 25 - - - txtDirectIp - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox3 - - - 0 - - - Fill - - - 392, 0 - - - 447, 505 - - - 4 - - - IP - - - groupBox3 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 0 - - - Fill - - - 3, 17 - - - True - - - Vertical - - - 386, 485 - - - 24 - - - txtDirectDomain - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox4 - - - 0 - - - Left - - - 0, 0 - - - 392, 505 - - - 3 - - - Domain - - - groupBox4 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 1 - - - Fill - - - 3, 3 - - - 839, 505 - - - 12 - - - panel4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageDirect - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 845, 511 - - - 1 - - - 2.Direct Domain or IP - - - tabPageDirect - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabNormal - - - 1 - - - Fill - - - 3, 17 - - - True - - - Vertical - - - 441, 485 - - - 25 - - - txtBlockIp - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - Fill - - - 392, 0 - - - 447, 505 - - - 4 - - - IP - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 0 - - - Fill - - - 3, 17 - - - True - - - Vertical - - - 386, 485 - - - 24 - - - txtBlockDomain - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - Left - - - 0, 0 - - - 392, 505 - - - 3 - - - Domain - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 1 - - - Fill - - - 3, 3 - - - 839, 505 - - - 12 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageBlock - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 845, 511 - - - 2 - - - 3.Block Domain or IP - - - tabPageBlock - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabNormal - - - 2 - - - Fill - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -935,136 +138,993 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 3, 3 - - - 839, 505 - - - 15 - - - lvRoutings - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabPageRuleList - - + 0 - - 4, 22 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 3, 3, 3 + + 1 - - 845, 511 + + 1 - + + txtBlockIp + + + + 386, 485 + + + 24 + + + 15 + + + 0 + + + linkLabelRoutingDoc + + + + Top + + + groupBox2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 3 - - Pre-defined Rule Set List + + tabNormal + + + 25 + + + 839, 505 + + + 0 + + + True + + + 562, 16 + + + 441, 485 + + + panel2 + + + tabNormal + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + NoControl + + + Fill + + + 12 + + + 5, 22 + + + mph + + + groupBox5 + + + 392, 505 + + + Basic Function + + + cmbdomainStrategy + + + 3, 3, 3, 3 + + + groupBox3 + + + 386, 485 + + + 2 + + + panel5 tabPageRuleList - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox3 - - tabNormal + + 1 - - 3 - - - Fill - - - 0, 76 - - - 853, 537 - - - 16 - - - tabNormal - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 447, 505 $this - - 1 + + 575, 21 - - True - - - 6, 12 + + &Cancel - - 853, 673 + + 447, 505 - - Routing Settings + + 4 + + + 195, 92 + + + Fill + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 0, 0 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 853, 537 menuAdd - + + 0 + + + 24 + + + 4 + + + txtBlockDomain + + + 3, 17 + + + tabNormal + + + 5 + + + 441, 485 + + + Vertical + + + 2.Direct Domain or IP + + + 447, 505 + + + 2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + NoControl + + + linear + + + panel3 + + + Fill + + + 4, 22 + + + Left + + + 392, 505 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + tabPageBlock + + + 392, 0 + + + 3, 3, 3, 3 + + + 16 + + + 165, 20 + + + 3, 17 + + + 6, 12 + + + 16 + + + 2 + + + Fill + + + System.Windows.Forms.ComboBox, 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 - - menuRemove + + Fill - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel1 - - menuSelectAll + + panel5 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - - menuSetDefaultRouting + + 0, 0 + + + 753, 17 + + + Fill + + + Left System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - MenuItemAdvanced + + 392, 505 - + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 681, 17 + + + panel2 + + + tabPageProxy + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemove + + + 318, 17 + + + 0 + + + btnClose + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 441, 485 + + + 25 + + + 12 + + + 28 + + + NoControl + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + NoControl + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + 2 + + + 26 + + + Vertical + + + panel3 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3.Block Domain or IP + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + tabNormal + + + 3, 3 + + + labRoutingTips + + + 0 + + + 89, 12 + + + 845, 511 + + + panel1 + + + 0, 0 + + + 853, 60 + + + txtDirectIp + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 MenuItemBasic - + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + chkenableRoutingAdvanced + + + Fill + + + 185, 22 + + + label6 + + + 3, 3 + + + 25 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 392, 0 + + + 194, 22 + + + Remove selected + + + panel4 + + + Domain strategy + + + Bottom + + + groupBox4 + + + 102, 21 + + + 0 + + + Vertical + + + cmsLv + + + Left + + + Add + + + 3 + + + System.Windows.Forms.GroupBox, 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 + + + 392, 0 + + + 24 + + + tabPageBlock + + + 12 + + + 3 + + + lvRoutings + + + groupBox6 + + + 2 + + + panel4 + + + Fill + + + panel3 + + + tabPageDirect + + + 0, 613 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuImportBasicRules + + True - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPageProxy + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 6, 21 + + + Import Basic Rules + + + 853, 51 + + + Fill + + + 116, 20 + + + 0, 0, 0, 0 + + + 3, 3, 3, 3 + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 3, 17 + + + groupBox6 + + + panel2 + + + 0 + + + Domain + + + 1 + + + 95, 12 + + + 386, 485 + + + 0 + + + 845, 511 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Advanced Function + + + AsIs + + + tabPageRuleList + + + 3 + + + groupBox5 + + + 660, 17 + + + 34 + + + 11 + + + 19 + + + MenuItemAdvanced + + + 194, 22 + + + Vertical + + + Select All (Ctrl+A) + + + IP + + + 839, 505 + + + txtProxyIp + + + True + + + Fill + + + 1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Set as active routing + + + 4, 22 + + + 1 + + + NoControl + + + Domain Matcher + + + 4 RoutingSettingForm - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 194, 22 + + &OK + + + 4, 22 + + + IP + + + panel2 + + + 116, 17 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + Pre-defined Rule Set List + + + 845, 511 + + + menuServer + + + True + + + IPIfNonMatch + + + menuSetDefaultRouting + + + Domain + + + Vertical + + + 4 + + + 0 + + + NoControl + + + $this + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 194, 22 + + + panel1 + + + $this + + + txtProxyDomain + + + groupBox1 + + + 0 + + + 3, 17 + + + txtDirectDomain + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + IP + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportBasicRules + + + 0 + + + True + + + 129, 21 + + + 0, 76 + + + 839, 505 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + cmbdomainMatcher + + + 0 + + + 3, 17 + + + Domain + + + panel5 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable advanced routing function + + + 839, 505 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 75, 23 + + + 216, 16 + + + 853, 673 + + + True + + + IPOnDemand + + + 3 + + + 3 + + + 0, 0 + + + Routing Settings + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + panel1 + + + menuSelectAll + + + 4 + + + 3 + + + 0 + + + btnOK + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15 + + + 3, 3 + + + 0, 25 + + + 0 + + + 75, 23 + + + 845, 511 + + + 1 + + + True + + + 3, 3 + + + Fill + + + 1.Proxy Domain or IP + + + groupBox2 + + + $this + + + tabPageDirect + + + Fill + + + 3, 17 + + + 27 + + + 853, 25 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + zh-Hans + + + True + + + 17, 17 + + + 139, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index 992f0e9e..8b98b506 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -124,12 +124,6 @@ 取消(&C) - - 0, 545 - - - 817, 60 - 518, 16 @@ -142,8 +136,17 @@ 确定(&O) - - 817, 51 + + 0, 545 + + + 817, 60 + + + 77, 12 + + + 域名匹配算法 120, 16 @@ -157,8 +160,8 @@ 域名解析策略 - - 149, 92 + + 817, 51 148, 22 @@ -190,8 +193,14 @@ 高级功能 - - 817, 25 + + 149, 92 + + + 172, 22 + + + 一键导入基础规则 68, 21 @@ -199,14 +208,23 @@ 基础功能 - - 180, 22 + + 817, 25 - - 一键导入基础规则 + + 405, 417 - - 817, 469 + + 411, 437 + + + 386, 417 + + + 392, 437 + + + 803, 437 809, 443 @@ -214,20 +232,20 @@ 1.代理的Domain或IP - - 803, 437 - - - 411, 437 - - + 405, 417 - + + 411, 437 + + + 386, 417 + + 392, 437 - - 386, 417 + + 803, 437 809, 443 @@ -235,20 +253,20 @@ 2.直连的Domain或IP - - 803, 437 - - - 411, 437 - - + 405, 417 - + + 411, 437 + + + 386, 417 + + 392, 437 - - 386, 417 + + 803, 437 809, 443 @@ -256,27 +274,6 @@ 3.阻止的Domain或IP - - 803, 437 - - - 411, 437 - - - 405, 417 - - - 392, 437 - - - 386, 417 - - - 809, 443 - - - 预定义规则集列表 - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -297,6 +294,15 @@ 803, 437 + + 809, 443 + + + 预定义规则集列表 + + + 817, 469 + 817, 605 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 304241bc..41f354b9 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -89,6 +89,10 @@ namespace v2rayN.Handler { config.domainStrategy = "IPIfNonMatch"; } + if (Utils.IsNullOrEmpty(config.domainMatcher)) + { + config.domainMatcher = "linear"; + } //kcp if (config.kcpItem == null) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 28893b9d..3712c228 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -189,6 +189,7 @@ namespace v2rayN.Handler && v2rayConfig.routing.rules != null) { v2rayConfig.routing.domainStrategy = config.domainStrategy; + v2rayConfig.routing.domainMatcher = config.domainMatcher; if (config.enableRoutingAdvanced) { diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index 890352dc..e0143799 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -166,7 +166,7 @@ namespace v2rayN.HttpProxyHandler } if (type == ESysProxyType.ForcedChange) { - SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); + SysProxyHandle.SetIEProxy(true, $"{Global.httpProtocol}{Global.Loopback}:{port}", config.systemProxyExceptions); } else if (type == ESysProxyType.ForcedClear) { diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs index 7c5410ca..6fedd91b 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs @@ -82,6 +82,25 @@ namespace v2rayN.HttpProxyHandler ExecSysproxy(arguments); } + + public static void SetIEProxy(bool global, string strProxy, string strExceptions) + { + if (Utils.IsNullOrEmpty(strExceptions)) + { + strExceptions = Global.IEProxyExceptions; + } + else + { + strExceptions = $"{Global.IEProxyExceptions};{strExceptions}"; + } + + string arguments = global + ? $"global {strProxy} {strExceptions}" + : $"pac {strProxy}"; + + ExecSysproxy(arguments); + } + // set system proxy to 1 (null) (null) (null) public static bool ResetIEProxy() { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 90189fe9..67bafaea 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -161,6 +161,10 @@ namespace v2rayN.Mode { get; set; } + public string domainMatcher + { + get; set; + } public int routingIndex { get; set; @@ -183,6 +187,14 @@ namespace v2rayN.Mode get; set; } + /// + /// systemProxyExceptions + /// + public string systemProxyExceptions + { + get; set; + } + #region 函数 public string address() diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index d86b587b..3cbd5c9a 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -332,6 +332,10 @@ namespace v2rayN.Mode /// /// /// + public string domainMatcher { get; set; } + /// + /// + /// public List rules { get; set; } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 24d1e627..46dc64a6 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.18")] +[assembly: AssemblyFileVersion("4.19")] From 2fc3e846df4a86db4f92f8a4899c74c825d4153f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 7 Jul 2021 20:41:13 +0800 Subject: [PATCH 042/252] up4.20 --- v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs | 2 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index e0143799..5372fd79 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -166,7 +166,7 @@ namespace v2rayN.HttpProxyHandler } if (type == ESysProxyType.ForcedChange) { - SysProxyHandle.SetIEProxy(true, $"{Global.httpProtocol}{Global.Loopback}:{port}", config.systemProxyExceptions); + SysProxyHandle.SetIEProxy(true, $"{Global.Loopback}:{port}", config.systemProxyExceptions); } else if (type == ESysProxyType.ForcedClear) { diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 46dc64a6..82c50b3f 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.19")] +[assembly: AssemblyFileVersion("4.20")] From c85e418afac88c7d455b4be9e64c2b1a18c9f9eb Mon Sep 17 00:00:00 2001 From: Yurun Date: Mon, 23 Aug 2021 08:46:31 +0800 Subject: [PATCH 043/252] Fix autorun --- v2rayN/v2rayN/Tool/Utils.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 522db7c8..79a42f70 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -536,7 +536,7 @@ namespace v2rayN try { string exePath = GetExePath(); - RegWriteValue(autoRunRegPath, autoRunName, run ? exePath : ""); + RegWriteValue(autoRunRegPath, autoRunName, run ? ("\"" + exePath + "\"") : ""); } catch { @@ -553,7 +553,7 @@ namespace v2rayN { string value = RegReadValue(autoRunRegPath, autoRunName, ""); string exePath = GetExePath(); - if (value?.Equals(exePath) == true) + if (value?.Equals(exePath) == true || value?.Equals("\"" + exePath + "\"") == true) { return true; } From 5076f4567476fb185ce3dfab0670e65edb8e29af Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:35:53 +0800 Subject: [PATCH 044/252] fix upgrade bug --- v2rayN/v2rayN/Handler/UpdateHandle.cs | 1 + v2rayN/v2rayUpgrade/MainForm.cs | 4 +++- v2rayN/v2rayUpgrade/v2rayUpgrade.csproj | 1 + v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 2a35d676..fcfcea40 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -56,6 +56,7 @@ namespace v2rayN.Handler try { string fileName = Utils.GetPath(Global.DownloadFileName); + fileName = Utils.UrlEncode(fileName); Process process = new Process { StartInfo = new ProcessStartInfo diff --git a/v2rayN/v2rayUpgrade/MainForm.cs b/v2rayN/v2rayUpgrade/MainForm.cs index 8b30a2cb..6b9ff16c 100644 --- a/v2rayN/v2rayUpgrade/MainForm.cs +++ b/v2rayN/v2rayUpgrade/MainForm.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Text; +using System.Web; using System.Windows.Forms; namespace v2rayUpgrade @@ -17,7 +18,8 @@ namespace v2rayUpgrade InitializeComponent(); if (args.Length > 0) { - fileName = args[0]; + fileName = string.Join(" ", args); + fileName = HttpUtility.UrlDecode(fileName); } } private void showWarn(string message) diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj index b7d6307f..43372325 100644 --- a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj @@ -39,6 +39,7 @@ + diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user index 60d6da27..91242901 100644 --- a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user @@ -1,6 +1,6 @@  - D:\Github\v2rayN\v2rayN\v2rayUpgrade\bin\Debug\v2ray-windows.zip + C:\Githubb\v2rayN\v2rayN\新建ee 文件夹\bin\Debug\v2ray-windows.zip \ No newline at end of file From 565a7b1680378cab6353def79a3aadae4683c551 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:36:48 +0800 Subject: [PATCH 045/252] Optimize storage performance --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 49 +++++++++++++++++--------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 41f354b9..2381a77a 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -174,7 +174,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddServer(ref Config config, VmessItem vmessItem, int index) + public static int AddServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Vmess; @@ -212,8 +212,10 @@ namespace v2rayN.Handler } } - ToJsonFile(config); - + if (toFile) + { + ToJsonFile(config); + } return 0; } @@ -524,7 +526,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index) + public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Shadowsocks; @@ -557,8 +559,11 @@ namespace v2rayN.Handler Global.reloadV2ray = true; } } - - ToJsonFile(config); + + if (toFile) + { + ToJsonFile(config); + } return 0; } @@ -570,7 +575,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index) + public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Socks; @@ -597,7 +602,10 @@ namespace v2rayN.Handler } } - ToJsonFile(config); + if (toFile) + { + ToJsonFile(config); + } return 0; } @@ -610,7 +618,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index) + public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Trojan; @@ -644,7 +652,10 @@ namespace v2rayN.Handler } } - ToJsonFile(config); + if (toFile) + { + ToJsonFile(config); + } return 0; } @@ -754,40 +765,41 @@ namespace v2rayN.Handler vmessItem.subid = subid; if (vmessItem.configType == (int)EConfigType.Vmess) { - if (AddServer(ref config, vmessItem, -1) == 0) + if (AddServer(ref config, vmessItem, -1, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Shadowsocks) { - if (AddShadowsocksServer(ref config, vmessItem, -1) == 0) + if (AddShadowsocksServer(ref config, vmessItem, -1, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Socks) { - if (AddSocksServer(ref config, vmessItem, -1) == 0) + if (AddSocksServer(ref config, vmessItem, -1, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Trojan) { - if (AddTrojanServer(ref config, vmessItem, -1) == 0) + if (AddTrojanServer(ref config, vmessItem, -1, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.VLESS) { - if (AddVlessServer(ref config, vmessItem, -1) == 0) + if (AddVlessServer(ref config, vmessItem, -1, false) == 0) { countServers++; } } } + ToJsonFile(config); return countServers; } @@ -915,7 +927,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index) + public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.VLESS; @@ -953,7 +965,10 @@ namespace v2rayN.Handler } } - ToJsonFile(config); + if (toFile) + { + ToJsonFile(config); + } return 0; } From d613fe79af1e4e0975c9ac705623e2d3084461f4 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:39:57 +0800 Subject: [PATCH 046/252] Upgrade .net framework version from 4.6 to 4.8 --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 196 +- v2rayN/v2rayN/Forms/MainForm.resx | 2818 ++++++++--------- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Properties/Settings.Designer.cs | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 7 +- v2rayN/v2rayN/app.config | 2 +- v2rayN/v2rayN/v2rayN.csproj | 2 +- 7 files changed, 1502 insertions(+), 1527 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 108fd727..6876d61e 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -83,7 +83,6 @@ this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); @@ -159,19 +158,17 @@ // // scMain.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); this.scMain.Panel2.Controls.Add(this.qrCodeControl); this.scMain.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -190,7 +187,6 @@ // // 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, @@ -225,195 +221,195 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // // tsbServer // - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // // qrCodeControl @@ -428,35 +424,33 @@ // // splitContainer1.Panel1 // - resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // // splitContainer1.Panel2 // - resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.scMain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // gbMsgTitle // - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Controls.Add(this.txtMsgBox); this.gbMsgTitle.Controls.Add(this.ssMain); + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Name = "gbMsgTitle"; this.gbMsgTitle.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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + 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; @@ -464,7 +458,6 @@ // // cmsMsgBox // - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, @@ -472,40 +465,40 @@ this.menuMsgBoxAddRoutingRule, this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxAddRoutingRule // - resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // menuMsgBoxFilter // - resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); // // ssMain // - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, @@ -514,9 +507,9 @@ this.toolSslHttpPortLab, this.toolSslHttpPort, this.toolSslBlank2, - 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); // @@ -527,8 +520,8 @@ // // toolSslSocksPort // - resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); this.toolSslSocksPort.Name = "toolSslSocksPort"; + resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); // // toolSslBlank1 // @@ -543,8 +536,8 @@ // // toolSslHttpPort // - resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); this.toolSslHttpPort.Name = "toolSslHttpPort"; + resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); // // toolSslBlank2 // @@ -552,12 +545,6 @@ this.toolSslBlank2.Name = "toolSslBlank2"; this.toolSslBlank2.Spring = true; // - // toolSslBlank3 - // - resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); - this.toolSslBlank3.Name = "toolSslBlank3"; - this.toolSslBlank3.Spring = true; - // // toolSslServerSpeed // resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); @@ -566,19 +553,19 @@ // // toolSslBlank4 // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuRoutings, @@ -596,73 +583,73 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - resources.ApplyResources(this.menuRoutings, "menuRoutings"); this.menuRoutings.Name = "menuRoutings"; + resources.ApplyResources(this.menuRoutings, "menuRoutings"); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); // // toolStripSeparator13 // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); this.toolStripSeparator13.Name = "toolStripSeparator13"; + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -678,7 +665,6 @@ // // 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, @@ -696,87 +682,88 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "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 // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "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; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); // // tsbSetting // - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator14 // - resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); this.toolStripSeparator14.Name = "toolStripSeparator14"; + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); // // tsbBackupGuiNConfig // - resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // @@ -786,12 +773,11 @@ // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, @@ -800,51 +786,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator15 // - resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); this.toolStripSeparator15.Name = "toolStripSeparator15"; + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); // // tsbCheckUpdateGeoSite // - resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; + resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); // // tsbCheckUpdateGeoIP // - resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; + resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -852,49 +838,50 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "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 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // @@ -1011,7 +998,6 @@ private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank3; private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index c110104b..a0f751f7 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,776 +117,203 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - + + 3, 17 + + + 327, 17 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VMess] server - - 355, 22 - - - 97, 53 - - + 355, 22 Add [VLESS] server - - 0 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [Shadowsocks] server - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Restart service - - - tsbSubSetting - - - 264, 22 - - - gbMsgTitle - - - menuMoveUp + + 355, 22 Add [Socks] server - - 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 - - - - ImageAboveText - - - 227, 22 - - - 语言-[中文简体] - - - NoControl - - - Settings - - - tsbHelp - - - System.Windows.Forms.ToolStripMenuItem, 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 - - - toolStripSeparator6 - 355, 22 - - menuMoveDown - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 99, 53 - - - Update subscriptions - - - $this - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - gbMsgTitle - - - tsbSetting - - - toolSslBlank2 - - - 355, 22 - - - 355, 22 - - - tsbCheckUpdateN - - - 45, 53 - - - Do not change system proxy - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - Update v2flyCore - - - Update GeoSite - - - Magenta - - - menuMsgBoxAddRoutingRule - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - 52, 21 - - - Share - - - 227, 22 - - - tsbQRCodeSwitch - - - Add Routing Rule (Ctrl+V) - - - 355, 22 - - - Horizontal - - - Export selected server for client configuration - - - tsbRoutingSetting - - - 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 - - - 227, 22 - - - Export selected server for server configuration - - - splitContainer1 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 128, 53 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Test servers real delay (Ctrl+R) - - - menuTcpingServer - - - ImageAboveText - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 356, 622 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - 355, 22 - - - toolStripSeparator1 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - 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 - - - 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 - - - - Servers - - - Export subscription (base64) share to clipboard - - - 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, 21 - - - menuAddCustomServer - - - txtMsgBox - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Import bulk URL from clipboard - - - 0 - - - Move to bottom (B) - - - toolSslBlank3 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6, 12 - - - 48, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copy All - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 206, 21 - - - Fill - - - 0 - - - 686, 280 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 176, 22 - - - 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 - - - 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, 21 - - - menuAddServers2 - - - Fill - - - - 3 - - - Add [VMess] server - - - $this - - - 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 - - - 206, 21 - - - 0 - - - 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 - - - tsbPromotion - - - 256, 280 - - - 355, 22 - - - 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 - - - 352, 6 - - - groupBox1 - - - 206, 21 - - - 2 - - - 125, 22 - - - Clear all service statistics - - - scMain.Panel2 - - - 176, 22 - - - 3 - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - ssMain - - - 686 - - - splitContainer1 - - - 265, 170 - - - 243, 22 - - - splitContainer1.Panel1 - - - menuUpdateSubscriptions - - - scMain - - - Check for updates - - - tsbCheckUpdateXrayCore - - - 0, 21 - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 125, 22 - - - scMain - - - 203, 22 - - - HTTP: - - - 952, 56 - - - tsbReload - - - menuCopyServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Help - - - menuMsgBoxSelectAll - - - menuSelectAll - - - Move to top (T) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - 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 - - - Promotion - - - menuAddServers - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - menuExport2ShareUrl - - - 3 - - - splitContainer1.Panel1 - - - SOCKS5: - - - v2rayN (this software) - - - tsbOptionSetting - - - 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, 0 - - - 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 - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - toolSslBlank4 - - - menuAddTrojanServer - - - 261, 6 - - - v2rayN - - - Language-[English] - - - 264, 22 - - - menuScanScreen2 - - - 0 - - - Fill - - - Routing - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Add [Trojan] server - - 176, 22 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - toolStripSeparator11 + + 355, 22 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Import bulk URL from clipboard (Ctrl+V) - - Set message filters + + 355, 22 + + + Scan QR code on the screen (Ctrl+S) 352, 6 - + + 355, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + Remove duplicate servers + + + 355, 22 + + + Clone selected server + + + 355, 22 + + + Set as active server (Enter) + + + 352, 6 + + + 355, 22 + + + Move to top (T) + + + 355, 22 + + + Up (U) + + + 355, 22 + + + Down (D) + + + 355, 22 + + + Move to bottom (B) + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Test current service status + + + 355, 22 + + + Clear all service statistics + + + 352, 6 + + + 355, 22 + + + Export selected server for client configuration + + + 355, 22 + + + Export selected server for server configuration + + + 355, 22 + + + Export share URLs to clipboard (Ctrl+C) + + + 355, 22 + + + Export subscription (base64) share to clipboard + + + 356, 622 + + + cmsLv + + System.Windows.Forms.ContextMenuStrip, 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 - - - V2Ray Website - - + Fill - - No - - - 1 - - - tsbV2rayWebsite - - - cmsMsgBox - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OptionSetting - - - menuMoveTop - - - Copy (Ctrl+C) - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -904,755 +331,1316 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 300 + + 0, 0 - - tsbCheckUpdateGeoIP + + 686, 280 - - menuScanScreen - - - ImageAboveText - - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - Fill - - - toolSslBlank1 - - - tsbSubUpdate - - - tsMain - - - 5 - - - SPEED Disabled - - - 355, 22 - - - 67, 53 - - - menuSysAgentMode - - - menuKeepNothing - - - 952, 527 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - 187, 22 - - - 227, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - cmsMain - - - 264, 22 - - - menuServers - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - menuMsgBoxFilter - - - 203, 22 - - - RoutingSetting - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Update GeoIP - - - 3, 194 - - - True - - - 355, 22 - - - Subscriptions - - - 952, 10 - - - Updates - - - 264, 22 - - - toolStripSeparator14 - - + + 0 - - toolStripSeparator8 - - - menuMsgBoxCopyAll - - - menuExport2ServerConfig - - - 89, 53 - - - 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.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 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - Settings - - - 0, 21 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Http proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - groupBox1 - - - MainForm - - - 微软雅黑, 8pt - - - menuExit - - - 227, 22 - - - False - - - 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 - - - 300 - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - 4, 4, 4, 4 - - - Magenta - - - 355, 22 - - - v2rayN Project - - - 0 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslHttpPort - - - Select All (Ctrl+A) - - - menuRoutings - - - gbMsgTitle - - - 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 - - - tsbCheckUpdateCore - - - menuSpeedServer - - - 355, 22 - - - menuRemoveServer - - - tsbBackupGuiNConfig - - - tsbServer - - - tsbTestMe - - - 355, 22 - - - 946, 177 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddVmessServer - - - scMain - - - Down (D) - - - 352, 6 - - - Magenta - - - 243, 22 - - - Remove selected servers (Delete) - - - 355, 22 - - - tsbSub - - - Magenta - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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) - - - 243, 22 - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ClientConfig - - - $this - - - 0, 0 - - - qrCodeControl - - - 228, 114 - - - Clear system proxy - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - 184, 6 - - - splitContainer1.Panel2 - - - 0, 0 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null scMain.Panel1 - - Up (U) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - Set system proxy - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MiddleRight - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - 0, 66 - - - 100 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer + + 0 scMain.Panel1 - - 微软雅黑, 8pt + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 64, 53 + + scMain - - Magenta + + 0 - - 946, 26 + + Fill - - 5 + + 0, 0 - - 355, 22 + + 4, 4, 4, 4 - - Set as active server (Enter) + + 256, 280 - - menuAddVlessServer + + 2 + + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scMain.Panel2 + + + 0 + + + scMain.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 1 + + + 100 946, 280 - - 6, 56 + + 686 - - Add [Shadowsocks] server + + 0 - - 261, 6 + + scMain - - 微软雅黑, 8pt + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - splitContainer1 + + groupBox1 - - 952, 593 - - - Test current service status - - - toolSslSocksPort - - - toolStripSeparator10 - - - toolSslHttpPortLab - - - menuMoveBottom - - - 355, 22 - - - 1 + + 0 Magenta + + 64, 53 + + + Servers + + + ImageAboveText + + + Fill + + + 0, 66 + + + Horizontal + + + Fill + + + 0, 0 + + + 952, 300 + 0 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Servers list - - 187, 22 + + groupBox1 - - Informations + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + 603, 17 + + + 227, 22 + + + Select All (Ctrl+A) + + + 227, 22 + + + Copy (Ctrl+C) + + + 227, 22 + + + Copy All + + + 227, 22 + + + Add Routing Rule (Ctrl+V) + + + 227, 22 + + + Set message filters + + + 228, 114 + + + cmsMsgBox + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - 264, 22 + + Vertical - - 6, 56 + + 946, 177 - - toolStripSeparator9 + + 3 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 0 + + + 228, 18 + + + 微软雅黑, 8pt + + + 52, 21 + + + SOCKS5: + + + 0, 21 + + + 微软雅黑, 8pt + + + 279, 21 + + + 微软雅黑, 8pt + + + 39, 21 + + + HTTP: + + + 0, 21 + + + 微软雅黑, 8pt + + + 279, 21 + + + False + + + 微软雅黑, 8pt + + + No + + + 250, 21 + + + SPEED Disabled + + + MiddleRight + + + 0, 21 + + + 3, 194 + + + 946, 26 + + + 0 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 1 + + + Fill + + + 0, 0 + + + 952, 223 + + + 3 + + + Informations + + + gbMsgTitle + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 splitContainer1.Panel2 - - System.Windows.Forms.ToolStripMenuItem, 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 + + + splitContainer1 + + + 1 + + + 952, 527 + + + 300 + + + 5 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 243, 22 + + + Clear system proxy + + + 243, 22 + + + Set system proxy + + + 243, 22 + + + Do not change system proxy + + + 264, 22 + + + Http proxy + + + 264, 22 + + + Routing + + + 264, 22 + + + Server + + + 261, 6 + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Update subscriptions + + + 261, 6 + + + 264, 22 + + + Exit + + + 265, 170 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 498, 17 + + + Top + + + 0, 56 + + + 952, 10 + + + 2 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 409, 17 + + + 6, 56 + + + 180, 22 + + + Settings + + + 180, 22 + + + Updates + + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + + + Magenta + + + 45, 53 + + + Share + + + BottomCenter + + + ImageAboveText + + + 6, 56 + + + 176, 22 + + + OptionSetting + + + 176, 22 + + + RoutingSetting + + + 173, 6 + + + 176, 22 + + + BackupGuiConfig + + + Magenta + + + 67, 53 + + + Settings + + + 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 + + + 203, 22 + + + v2rayN (this software) + + + 203, 22 + + + Update v2flyCore + + + 203, 22 + + + Update XrayCore + + + 200, 6 + + + 203, 22 + + + Update GeoSite + + + 203, 22 + + + Update GeoIP + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + + + 6, 56 + + + 187, 22 + + + v2rayN Project + + + 187, 22 + + + V2Ray Website + + + 184, 6 + + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] Magenta + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + + + 6, 56 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + Magenta + 52, 53 - - ImageAboveText - - - System.Windows.Forms.NotifyIcon, 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 - - - Exit - - - menuClearServerStatistics - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scan QR code on the screen - - - 0, 56 - Close - - 264, 22 - - - 0, 21 - - - 0 - - - Import bulk URL from clipboard (Ctrl+V) - - - 952, 223 - - - Update XrayCore - - - toolStripSeparator2 - - - toolSslSocksPortLab - - - Add a custom configuration server - - - 173, 6 - - - 1 - - - bgwScan - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - statusStrip1 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0 - - - Fill - - - 3, 17 - - - toolStripSeparator3 - - - BackupGuiConfig - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - - - - 355, 22 - - - 355, 22 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepClear - - + ImageAboveText - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 0 - - 200, 6 + + 952, 56 - - toolStripSeparator15 + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 - - 228, 18 - - - 603, 17 - True 65 - - 137, 17 - - - 498, 17 - - - 17, 17 - - - 409, 17 - - - 327, 17 - + + 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 + + + menuAddVlessServer + + + 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 + + + menuAddTrojanServer + + + 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 + + + tsbTestMe + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuClearServerStatistics + + + 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 + + + menuMsgBoxSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopyAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxAddRoutingRule + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxFilter + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, 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 + + + 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 + + + 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 + + + menuKeepClear + + + 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 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRoutings + + + 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 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, 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 + + + menuUpdateSubscriptions + + + 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 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator14 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbBackupGuiNConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator15 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoIP + + + 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 + + + tsbV2rayWebsite + + + 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 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 82c50b3f..b270cd10 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.20")] +[assembly: AssemblyFileVersion("4.21")] diff --git a/v2rayN/v2rayN/Properties/Settings.Designer.cs b/v2rayN/v2rayN/Properties/Settings.Designer.cs index 62dd9b42..dea73b7b 100644 --- a/v2rayN/v2rayN/Properties/Settings.Designer.cs +++ b/v2rayN/v2rayN/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace v2rayN.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 79a42f70..928ebd87 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -536,7 +536,7 @@ namespace v2rayN try { string exePath = GetExePath(); - RegWriteValue(autoRunRegPath, autoRunName, run ? ("\"" + exePath + "\"") : ""); + RegWriteValue(autoRunRegPath, autoRunName, run ? $"\"{exePath}\"" : ""); } catch { @@ -553,7 +553,7 @@ namespace v2rayN { string value = RegReadValue(autoRunRegPath, autoRunName, ""); string exePath = GetExePath(); - if (value?.Equals(exePath) == true || value?.Equals("\"" + exePath + "\"") == true) + if (value?.Equals(exePath) == true || value?.Equals($"\"{exePath}\"") == true) { return true; } @@ -708,7 +708,8 @@ namespace v2rayN ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 - | SecurityProtocolType.Tls12; + | SecurityProtocolType.Tls12 + | SecurityProtocolType.Tls13; ServicePointManager.DefaultConnectionLimit = 256; } #endregion diff --git a/v2rayN/v2rayN/app.config b/v2rayN/v2rayN/app.config index 620ddb42..df5f1904 100644 --- a/v2rayN/v2rayN/app.config +++ b/v2rayN/v2rayN/app.config @@ -1,7 +1,7 @@ - + diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 3d925fa0..ef32ec53 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -9,7 +9,7 @@ Properties v2rayN v2rayN - v4.6 + v4.8 512 false From 64e6d6d0389d27ba9851ffa8491351924e6930b6 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:41:07 +0800 Subject: [PATCH 047/252] Upgrade .net framework version from 4.6 to 4.8 --- v2rayN/v2rayUpgrade/App.config | 2 +- v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs | 2 +- v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs | 2 +- v2rayN/v2rayUpgrade/v2rayUpgrade.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayUpgrade/App.config b/v2rayN/v2rayUpgrade/App.config index 2d2a12d8..4bfa0056 100644 --- a/v2rayN/v2rayUpgrade/App.config +++ b/v2rayN/v2rayUpgrade/App.config @@ -1,6 +1,6 @@ - + diff --git a/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs b/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs index 5ad1ac66..f766ed10 100644 --- a/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayUpgrade.Properties { // 类通过类似于 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 Resources { diff --git a/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs b/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs index 5656cdc6..ecf1927f 100644 --- a/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs +++ b/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace v2rayUpgrade.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj index 43372325..a619ae5e 100644 --- a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj @@ -8,7 +8,7 @@ WinExe v2rayUpgrade v2rayUpgrade - v4.6 + v4.8 512 true true From eac7361a0ba789d5183515d763ac2b915198354b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Oct 2021 20:19:54 +0800 Subject: [PATCH 048/252] rule add enabled --- .../RoutingRuleSettingDetailsForm.Designer.cs | 29 +- .../Forms/RoutingRuleSettingDetailsForm.cs | 3 + .../Forms/RoutingRuleSettingDetailsForm.resx | 978 +++++++++--------- ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 3 + v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 10 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 6 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 5 +- v2rayN/v2rayN/Mode/RulesItem.cs | 4 +- v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user | 2 +- 9 files changed, 547 insertions(+), 493 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs index 504b60ea..3f0f1e40 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -31,6 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingDetailsForm)); this.panel1 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); + this.chkEnabled = new System.Windows.Forms.CheckBox(); this.clbInboundTag = new System.Windows.Forms.CheckedListBox(); this.label2 = new System.Windows.Forms.Label(); this.clbProtocol = new System.Windows.Forms.CheckedListBox(); @@ -62,6 +63,8 @@ // // panel3 // + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.chkEnabled); this.panel3.Controls.Add(this.clbInboundTag); this.panel3.Controls.Add(this.label2); this.panel3.Controls.Add(this.clbProtocol); @@ -71,13 +74,18 @@ this.panel3.Controls.Add(this.labRoutingTips); this.panel3.Controls.Add(this.label4); this.panel3.Controls.Add(this.cmbOutboundTag); - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // + // chkEnabled + // + resources.ApplyResources(this.chkEnabled, "chkEnabled"); + this.chkEnabled.Name = "chkEnabled"; + this.chkEnabled.UseVisualStyleBackColor = true; + // // clbInboundTag // - this.clbInboundTag.CheckOnClick = true; resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); + this.clbInboundTag.CheckOnClick = true; this.clbInboundTag.FormattingEnabled = true; this.clbInboundTag.Items.AddRange(new object[] { resources.GetString("clbInboundTag.Items"), @@ -92,8 +100,8 @@ // // clbProtocol // - this.clbProtocol.CheckOnClick = true; resources.ApplyResources(this.clbProtocol, "clbProtocol"); + this.clbProtocol.CheckOnClick = true; this.clbProtocol.FormattingEnabled = true; this.clbProtocol.Items.AddRange(new object[] { resources.GetString("clbProtocol.Items"), @@ -119,8 +127,8 @@ // // labRoutingTips // - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; this.labRoutingTips.Name = "labRoutingTips"; // // label4 @@ -130,26 +138,26 @@ // // cmbOutboundTag // + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbOutboundTag.FormattingEnabled = true; this.cmbOutboundTag.Items.AddRange(new object[] { resources.GetString("cmbOutboundTag.Items"), resources.GetString("cmbOutboundTag.Items1"), resources.GetString("cmbOutboundTag.Items2")}); - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.Name = "cmbOutboundTag"; // // panel4 // + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.btnClose); this.panel4.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // 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); @@ -163,15 +171,15 @@ // // panel2 // + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.groupBox2); this.panel2.Controls.Add(this.groupBox1); - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // groupBox2 // - this.groupBox2.Controls.Add(this.txtIP); resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtIP); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -182,8 +190,8 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.txtDomain); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtDomain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -236,5 +244,6 @@ private System.Windows.Forms.CheckedListBox clbProtocol; private System.Windows.Forms.CheckedListBox clbInboundTag; private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox chkEnabled; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index 8b861f08..a08e872b 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -59,6 +59,7 @@ namespace v2rayN.Forms } } rulesItem.protocol = protocol; + rulesItem.enabled = chkEnabled.Checked; } } private void BindingData() @@ -91,6 +92,7 @@ namespace v2rayN.Forms } } } + chkEnabled.Checked = rulesItem.enabled; } } private void ClearBind() @@ -99,6 +101,7 @@ namespace v2rayN.Forms cmbOutboundTag.Text = Global.agentTag; txtDomain.Text = string.Empty; txtIP.Text = string.Empty; + chkEnabled.Checked = true; } private void btnOK_Click(object sender, EventArgs e) { diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index 23589990..fe5c1095 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -117,547 +117,577 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - 0, 0 - - - 742, 10 - - - - 7 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 80 - - - socks - - - http - - - 347, 16 - - - 245, 20 - - - 41 - - - clbInboundTag + + 53, 12 System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel3 - - - 0 - - - True - - - NoControl - - - 274, 20 - - - 65, 12 - - - 40 - - - inboundTag - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 1 - - - 80 - - - http - - - tls - - - bittorrent - - - 347, 43 + + + 32 245, 20 - - 39 - - - clbProtocol - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 2 - - - True - - - NoControl - - - 274, 47 - - - 53, 12 - - - 36 - - - Protocol - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 3 - - - 107, 43 - - - 119, 21 - - - 35 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 4 - - - True - - - NoControl - - - 19, 47 - - - 29, 12 - - - 34 - - - Port - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 5 - - - NoControl - - - 19, 82 - - - 598, 16 - - - 33 - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - labRoutingTips - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 6 - - - True - - - NoControl - - - 19, 20 - - - 71, 12 - - - 32 - - - outboundTag - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 7 - - - proxy - - - direct - - - block - - - 107, 16 - - - 119, 20 + + 80 31 - - cmbOutboundTag + + proxy - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 4, 4, 4 - - panel3 + + Fill - - 8 + + panel1 - - Top + + 3 - - 0, 10 + + clbProtocol - - 742, 111 + + Protocol - - 8 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel3 + + 7 - + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 3 + + + Left + + + 80 + + + NoControl + + + 0 + + + 29, 12 + + + 1 + + + http + + + panel2 + + + tls + + + RoutingSettingDetailsForm + + + NoControl + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + Fill + + + 411, 15 + + + 119, 20 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 36 + + + Bottom + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 344, 375 + $this - + + 598, 16 + + + groupBox1 + + + NoControl + + 2 + + 5 + + + label1 + + + 742, 395 + + + 0, 0 + + + 9 + + + True + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + True + + + 3 + + + panel4 + + + 5 + + + bittorrent + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + socks + + + panel3 + + + 19, 82 + + + 25 + + + 347, 16 + + + 3, 17 + + + panel3 + + + 19, 20 + + + labRoutingTips + + + 19, 47 + + + 39 + + + groupBox1 + + + 1 + + + RoutingRuleSettingDetailsForm + + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 107, 43 + + + groupBox2 + + + 8 + + + 1 + + + 386, 375 + + + panel3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + Fill + + + panel4 + NoControl - - 504, 15 + + Top + + + $this + + + 42 + + + groupBox2 + + + panel3 + + + panel3 + + + System.Windows.Forms.Panel, 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 + + + http + + + txtPort + + + 3, 17 + + + 1 + + + 742, 10 + + + 0, 0 + + + 24 + + + Port + + + Enable + + + label4 + + + &OK + + + 75, 23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 34 + + + 274, 47 + + + 40 + + + block + + + 33 + + + 347, 43 + + + 0 + + + panel3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + 2 + + + 119, 21 + + + 4 + + + 7 + + + 0 + + + 11 + + + 0 + + + panel3 + + + 8 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + label3 + + + inboundTag + + + Top + + + 742, 60 + + + 0, 121 + + + $this + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + 245, 20 + + + 65, 12 + + + btnClose + + + 392, 0 + + + 742, 111 + + + True + + + 6, 12 + + + 0 + + + 617, 19 + + + 0, 10 + + + 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 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtIP + + + direct + + + label2 + + + 60, 16 + + + cmbOutboundTag + + + chkEnabled + + + True + + + 274, 20 + + + NoControl + + + 742, 576 + + + 10 + + + $this + + + 392, 395 75, 23 - + + clbInboundTag + + 4 &Cancel - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 0 - - + NoControl - - 411, 15 + + NoControl - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 1 - - - Bottom - - - 0, 516 - - - 742, 60 - - - 10 - - - panel4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Fill - - - 3, 17 - - + True - - 344, 375 - - - 25 - - - txtIP - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - Fill - - - 392, 0 - - - 350, 395 - - + 4 - - IP - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - Fill - - - 3, 17 - - - True - - - 386, 375 - - - 24 - txtDomain - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 41 - - groupBox1 + + IP - - 0 + + panel3 - - Left + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 392, 395 + + 0, 516 - - 3 + + 71, 12 + + + 350, 395 + + + panel3 Domain - - groupBox1 + + Fill + + + 504, 15 + + + 107, 16 + + + outboundTag System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel2 - - - 1 - - - Fill - - - 0, 121 - - - 742, 395 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 + + 35 True - - 6, 12 - - - 742, 576 - - - 4, 4, 4, 4 - - - RoutingSettingDetailsForm - - - RoutingRuleSettingDetailsForm - - - 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/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index 15246bd3..f050d4f5 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 670, 18 + 372, 16 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index 6376feb8..f7957ca2 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -55,12 +55,13 @@ namespace v2rayN.Forms lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; lvRoutings.Columns.Add("", 30); - lvRoutings.Columns.Add("outboundTag", 100); + lvRoutings.Columns.Add("outboundTag", 80); lvRoutings.Columns.Add("port", 80); - lvRoutings.Columns.Add("protocol", 100); - lvRoutings.Columns.Add("inboundTag", 100); + lvRoutings.Columns.Add("protocol", 80); + lvRoutings.Columns.Add("inboundTag", 80); lvRoutings.Columns.Add("domain", 160); - lvRoutings.Columns.Add("ip", 160); + lvRoutings.Columns.Add("ip", 160); + lvRoutings.Columns.Add("enable", 60); lvRoutings.EndUpdate(); } @@ -81,6 +82,7 @@ namespace v2rayN.Forms Utils.AddSubItem(lvItem, "inboundTag", Utils.List2String(item.inboundTag)); Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); + Utils.AddSubItem(lvItem, "enable", item.enabled.ToString()); if (lvItem != null) lvRoutings.Items.Add(lvItem); } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2381a77a..2e11d90f 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -51,7 +51,9 @@ namespace v2rayN.Handler enableStatistics = false, // 默认中等刷新率 - statisticsFreshRate = (int)Global.StatisticsFreshRate.medium + statisticsFreshRate = (int)Global.StatisticsFreshRate.medium, + + enableRoutingAdvanced = true }; } @@ -559,7 +561,7 @@ namespace v2rayN.Handler Global.reloadV2ray = true; } } - + if (toFile) { ToJsonFile(config); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 3712c228..61df26d0 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -197,7 +197,10 @@ namespace v2rayN.Handler { foreach (var item in config.routings[config.routingIndex].rules) { - routingUserRule(item, ref v2rayConfig); + if (item.enabled) + { + routingUserRule(item, ref v2rayConfig); + } } } } diff --git a/v2rayN/v2rayN/Mode/RulesItem.cs b/v2rayN/v2rayN/Mode/RulesItem.cs index 738a889f..823e970b 100644 --- a/v2rayN/v2rayN/Mode/RulesItem.cs +++ b/v2rayN/v2rayN/Mode/RulesItem.cs @@ -19,7 +19,9 @@ namespace v2rayN.Mode public List domain { get; set; } public List protocol { get; set; } - + + public bool enabled { get; set; } = true; + } } diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user index 91242901..4890b148 100644 --- a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user @@ -1,6 +1,6 @@  - C:\Githubb\v2rayN\v2rayN\新建ee 文件夹\bin\Debug\v2ray-windows.zip + C:\Githubb\v2rayN\v2rayN\v2rayUpgrade\bin\Debug\v2ray-windows.zip \ No newline at end of file From 058e1aafd10d9c41c6a4f6d7d5d1fcf38a9d4924 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Oct 2021 20:14:18 +0800 Subject: [PATCH 049/252] Automatically backup configuration files at startup --- v2rayN/v2rayN/Forms/MainForm.cs | 3 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 47 +++++++++++++++--------- v2rayN/v2rayN/Program.cs | 4 +- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 56c63c23..05a3f2fa 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -43,6 +43,7 @@ namespace v2rayN.Forms { ConfigHandler.LoadConfig(ref config); ConfigHandler.InitBuiltinRouting(ref config); + MainFormHandler.Instance.BackupGuiNConfig(config, true); v2rayHandler = new V2rayHandler(); v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; @@ -929,7 +930,7 @@ namespace v2rayN.Forms { if (!Utils.IsNullOrEmpty(MsgFilter)) { - if (!Regex.IsMatch(text,MsgFilter)) + if (!Regex.IsMatch(text, MsgFilter)) { return; } diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 6b74923f..054cf476 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -236,31 +236,44 @@ namespace v2rayN.Handler } } - - public void BackupGuiNConfig(Config config) + + public void BackupGuiNConfig(Config config, bool auto = false) { - SaveFileDialog fileDialog = new SaveFileDialog + string fileName = string.Empty; + if (auto) { - Filter = "guiNConfig|*.json", - FilterIndex = 2, - RestoreDirectory = true - }; - if (fileDialog.ShowDialog() != DialogResult.OK) - { - return; + fileName = Utils.GetTempPath($"guiNConfig{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.json"); + } + else + { + SaveFileDialog fileDialog = new SaveFileDialog + { + Filter = "guiNConfig|*.json", + FilterIndex = 2, + RestoreDirectory = true + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + fileName = fileDialog.FileName; } - string fileName = fileDialog.FileName; if (Utils.IsNullOrEmpty(fileName)) { return; } - if (Utils.ToJsonFile(config, fileName) == 0) + var ret = Utils.ToJsonFile(config, fileName); + if (!auto) { - UI.Show(UIRes.I18N("OperationSuccess")); - } - else - { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + if (ret == 0) + { + + UI.Show(UIRes.I18N("OperationSuccess")); + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } } } diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index cd3e1559..4d37d44f 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -34,7 +34,7 @@ namespace v2rayN if (!IsDuplicateInstance()) { - Utils.SaveLog("v2rayN start up " + Utils.GetVersion()); + Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); //设置语言环境 string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); @@ -81,7 +81,7 @@ namespace 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; } From 6d0b4e8c7506fdaf96b395ca0a3d8e1a2f797a41 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 10 Oct 2021 07:40:48 +0800 Subject: [PATCH 050/252] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1197a8b..31e8f4ce 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,5 @@ - Run v2rayN.exe ### Requirements -- Microsoft [.NET Framework 4.6](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) or higher +- Microsoft [.NET Framework 4.8](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) - Project V core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) From c4070b26ff54fc897b962ad495090c51165b2e90 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 10 Oct 2021 11:04:50 +0800 Subject: [PATCH 051/252] add Blacklist rules --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 51 ++++++++++++++--------- v2rayN/v2rayN/Handler/UpdateHandle.cs | 6 +++ v2rayN/v2rayN/Sample/custom_routing_black | 29 +++++++++++++ v2rayN/v2rayN/v2rayN.csproj | 1 + 4 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 v2rayN/v2rayN/Sample/custom_routing_black diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2e11d90f..cf53c3e0 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1078,6 +1078,10 @@ namespace v2rayN.Handler { return -1; } + if (routingItem.rules == null) + { + routingItem.rules = new List(); + } if (blReplace) { routingItem.rules.Clear(); @@ -1189,35 +1193,44 @@ namespace v2rayN.Handler if (config.routings.Count(it => it.locked != true) <= 0) { //Global - var item1 = new RoutingItem(); - item1.remarks = "全局(Global)"; - item1.url = string.Empty; - item1.rules = new List(); - string result1 = Utils.GetEmbedText(Global.CustomRoutingFileName + "global"); - AddBatchRoutingRules(ref item1, result1); + var item1 = new RoutingItem() + { + remarks = "全局(Global)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); config.routings.Add(item1); //Bypass the mainland - var item2 = new RoutingItem(); - item2.remarks = "绕过大陆(Whitelist)"; - item2.url = string.Empty; - item2.rules = new List(); - string result2 = Utils.GetEmbedText(Global.CustomRoutingFileName + "white"); - AddBatchRoutingRules(ref item2, result2); + var item2 = new RoutingItem() + { + remarks = "绕过大陆(Whitelist)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white")); config.routings.Add(item2); + //Blacklist + var item3 = new RoutingItem() + { + remarks = "黑名单(Blacklist)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black")); + config.routings.Add(item3); + config.routingIndex = 0; } if (GetLockedRoutingItem(ref config) == null) { - var item1 = new RoutingItem(); - item1.remarks = "locked"; - item1.url = string.Empty; - item1.rules = new List(); - item1.locked = true; - string result1 = Utils.GetEmbedText(Global.CustomRoutingFileName + "locked"); - AddBatchRoutingRules(ref item1, result1); + var item1 = new RoutingItem() + { + remarks = "locked", + url = string.Empty, + locked = true, + }; + AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "locked")); config.routings.Add(item1); } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index fcfcea40..e0e54269 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -293,6 +293,12 @@ namespace v2rayN.Handler { AllowAutoRedirect = false }; + if (httpProxyTest() > 0) + { + int httpPort = _config.GetLocalPort(Global.InboundHttp); + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); + webRequestHandler.Proxy = webProxy; + } HttpClient httpClient = new HttpClient(webRequestHandler); string url; diff --git a/v2rayN/v2rayN/Sample/custom_routing_black b/v2rayN/v2rayN/Sample/custom_routing_black new file mode 100644 index 00000000..9005c944 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_black @@ -0,0 +1,29 @@ +[ + { + "outboundTag": "direct", + "protocol": [ + "bittorrent" + ] + }, + { + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "outboundTag": "proxy", + "ip": [ + "geoip:telegram" + ], + "domain": [ + "geosite:gfw", + "geosite:greatfire", + "geosite:tld-!cn" + ] + }, + { + "port": "0-65535", + "outboundTag": "direct" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index ef32ec53..98fc93a2 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -402,6 +402,7 @@ + From 933d3c267896461cad523185890849378b74457a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 10 Oct 2021 20:16:30 +0800 Subject: [PATCH 052/252] add auto update geo task --- v2rayN/v2rayN/Forms/MainForm.cs | 18 +- .../Forms/OptionSettingForm.Designer.cs | 16 + v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 627 ++++++++++-------- .../Forms/OptionSettingForm.zh-Hans.resx | 117 ++-- v2rayN/v2rayN/Global.cs | 2 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 2 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 114 ++-- v2rayN/v2rayN/Handler/UpdateHandle.cs | 38 +- v2rayN/v2rayN/Mode/Config.cs | 5 + v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 8 + 12 files changed, 518 insertions(+), 433 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 05a3f2fa..f275a8bd 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -51,6 +51,7 @@ namespace v2rayN.Forms { statistics = new StatisticsHandler(config, UpdateStatisticsHandler); } + MainFormHandler.Instance.UpdateTask(config, UpdateTaskHandler); } private void MainForm_VisibleChanged(object sender, EventArgs e) @@ -962,7 +963,10 @@ namespace v2rayN.Forms /// private void ClearMsg() { - this.txtMsgBox.Clear(); + txtMsgBox.Invoke((Action)delegate + { + txtMsgBox.Clear(); + }); } /// @@ -1085,6 +1089,15 @@ namespace v2rayN.Forms } } + private void UpdateTaskHandler(bool success, string msg) + { + AppendText(false, msg); + if (success) + { + Global.reloadV2ray = true; + LoadV2ray(); + } + } #endregion #region 移动服务器 @@ -1213,8 +1226,7 @@ namespace v2rayN.Forms { CloseV2ray(); - string fileName = Global.DownloadFileName; - fileName = Utils.GetPath(fileName); + string fileName = Utils.GetPath(Utils.GetDownloadFileName(msg)); FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : ""); AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 2d895f88..65e88bcf 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -69,6 +69,8 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.txtautoUpdateInterval = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox(); this.cmbCoreType = new System.Windows.Forms.ComboBox(); this.label4 = new System.Windows.Forms.Label(); @@ -372,6 +374,8 @@ // tabPage7 // resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.txtautoUpdateInterval); + this.tabPage7.Controls.Add(this.label15); this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); this.tabPage7.Controls.Add(this.cmbCoreType); this.tabPage7.Controls.Add(this.label4); @@ -384,6 +388,16 @@ this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // txtautoUpdateInterval + // + resources.ApplyResources(this.txtautoUpdateInterval, "txtautoUpdateInterval"); + this.txtautoUpdateInterval.Name = "txtautoUpdateInterval"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // // chkIgnoreGeoUpdateCore // resources.ApplyResources(this.chkIgnoreGeoUpdateCore, "chkIgnoreGeoUpdateCore"); @@ -579,5 +593,7 @@ private System.Windows.Forms.Label label12; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txtautoUpdateInterval; + private System.Windows.Forms.Label label15; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index e6acb0d8..d104d927 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -123,6 +123,7 @@ namespace v2rayN.Forms chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; cmbCoreType.SelectedIndex = (int)config.coreType; + txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); } private void btnOK_Click(object sender, EventArgs e) { @@ -290,6 +291,7 @@ namespace v2rayN.Forms config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; config.coreType = (ECoreType)cmbCoreType.SelectedIndex; + config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 1cec3650..8015fffe 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -127,16 +127,16 @@ 11 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 107, 12 Keep older when deduplication - 2 + 4 - 6, 283 @@ -159,7 +159,7 @@ groupBox1 - 5 + 7 tti @@ -185,15 +185,18 @@ groupBox1 - - 662, 523 + + label15 + + + txtautoUpdateInterval + + + 2 35 - - 111, 24 - 468, 60 @@ -204,9 +207,6 @@ 102, 16 - - cmbprotocol - 6 @@ -216,6 +216,9 @@ tabPage3 + + 2 + 5 @@ -240,6 +243,9 @@ 40 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + True @@ -249,17 +255,14 @@ True - - tabPage6 - - - tabPage6 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 36 - - 75, 23 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 7 @@ -291,18 +294,15 @@ tabPage6 + + tabPage6 + 317, 12 15, 63 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - 2 @@ -324,8 +324,14 @@ 654, 427 - - 654, 427 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + NoControl System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -333,14 +339,14 @@ Settings - - True + + txtKcpreadBufferSize System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - label4 + + tabPage2 42 @@ -366,8 +372,8 @@ True - - Turn on Sniffing + + tabPage6 0, 10 @@ -390,20 +396,14 @@ 3 - - none - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 NoControl - - 6 - - - tabPage7 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 0 @@ -414,9 +414,6 @@ Fill - - 576, 16 - 18 @@ -432,12 +429,12 @@ NoControl + + 15, 16 + 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 - 89, 12 @@ -456,21 +453,18 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - 12 - - NoControl - 10 32 + + label6 + 6, 12 @@ -501,11 +495,8 @@ txtKcptti - - Vertical - - - 15, 160 + + Turn on Sniffing 281, 12 @@ -513,12 +504,15 @@ Ignore Geo files when updating core - - 2 + + 355, 16 3, 3, 3, 3 + + 97, 20 + 3 @@ -534,23 +528,20 @@ 325, 130 - - 124, 60 - 78, 21 - - Log level - tabControl1 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 59, 12 - - cmbCoreType + + 654, 427 v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -564,24 +555,15 @@ 4 - - True - Statistics freshrate - - 107, 12 - 120, 16 89, 12 - - btnOK - 18, 66 @@ -606,20 +588,29 @@ Turn on Sniffing + + cmbloglevel + groupBox1 + + 345, 100 + 18, 28 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 + 20 - - 29 + + 10 System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -658,7 +649,7 @@ groupBox1 - 0 + 2 18, 104 @@ -666,8 +657,8 @@ tabPage2 - - mtu + + 97, 20 socks @@ -675,27 +666,30 @@ tabPage1 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 576, 16 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - True panel1 + + readBufferSize + 30 53, 12 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 13 @@ -717,17 +711,14 @@ 345, 62 - - 15, 16 - - - 3, 3, 3, 3 + + 11 chkudpEnabled - 1 + 3 True @@ -762,20 +753,26 @@ False - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + label7 + + + allowInsecure txtlocalPort - - 236, 28 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage7 - - 19 + + tabPage7 + + + True 4, 22 @@ -795,29 +792,41 @@ protocol - - 84, 16 + + Turn on Mux Multiplexing 23, 12 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 638, 356 True + + 5 + 3, 3 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 + chkAllowLANConn - - True + + 84, 16 + + + tabControl1 True @@ -831,6 +840,9 @@ 1 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + tabPage6 @@ -846,17 +858,23 @@ NoControl + + 654, 427 + chkEnableStatistics - - socks + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 4 - - 355, 16 + + 7 + + + 1 53, 12 @@ -867,8 +885,8 @@ True - - 369, 27 + + 124, 60 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -885,11 +903,14 @@ False + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 9 - - 8 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 0 @@ -898,7 +919,7 @@ 101, 12 - 6 + 8 12 @@ -906,8 +927,8 @@ 20 - - allowInsecure + + cmbprotocol groupBox2 @@ -915,44 +936,38 @@ Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - 107, 12 - - - 204, 16 + + cmbCoreType 662, 453 - - $this - 4 Listening port - - protocol - Fill 41 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 257, 60 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 tabControl1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True 34 @@ -960,6 +975,9 @@ cmbprotocol2 + + NoControl + chkKeepOlderDedupl @@ -970,7 +988,7 @@ 16 - 7 + 9 True @@ -993,9 +1011,6 @@ tabPage2 - - tabControl1 - listening port 2 @@ -1005,12 +1020,15 @@ chkAllowIn2 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tabPage3 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + panel2 @@ -1026,8 +1044,8 @@ 4, 22 - - 9 + + v2fly_core label1 @@ -1038,17 +1056,26 @@ 10 + + 29 + error + + 15, 160 + + + groupBox1 + 59, 12 NoControl - - txtKcpdownlinkCapacity + + 38 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1059,8 +1086,8 @@ downlinkCapacity - - tabControl1 + + 120, 16 662, 10 @@ -1071,9 +1098,6 @@ True - - 246, 16 - True @@ -1092,6 +1116,9 @@ False + + Custom DNS (multiple, separated by commas (,)) + 206, 29 @@ -1131,29 +1158,29 @@ 8 + + 35 + linkDnsObjectDoc System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Bottom + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - txtKcpreadBufferSize + + tabPage7 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + Log level - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + tabControl1 638, 219 @@ -1164,11 +1191,14 @@ 2 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 251, 12 + + + 15, 64 - 8 + 10 groupBox2 @@ -1191,15 +1221,15 @@ 8, 52 - - 9 - - - True - 78, 21 + + 9 + + + True + tabPage7 @@ -1209,23 +1239,23 @@ True - - v2fly_core + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 1 - - 6 + + 40 23, 12 - - 11 + + 8 8 @@ -1233,17 +1263,20 @@ Exception - - Use semicolon (;) + + NoControl - - 345, 100 + + 37 + + + groupBox1 94, 21 - - NoControl + + 0 654, 427 @@ -1257,15 +1290,9 @@ 17 - - 23 - 94, 21 - - debug - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1275,32 +1302,35 @@ 0, 463 - - 0 - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage1 - - 3 + + 6 - - http + + 125, 12 0 - - 97, 20 + + Use semicolon (;) - - label7 + + mtu - - 7 + + 32 + + + tabPage6 + + + 6 False @@ -1326,8 +1356,8 @@ txtKcpuplinkCapacity - - tabPage2 + + 23 chklogEnabled @@ -1344,23 +1374,32 @@ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 325, 156 + groupBox2 4, 22 - - 40 + + True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 + + + Automatic update interval of Geo(minutes) + + + groupBox1 4, 22 - - groupBox1 + + socks NoControl @@ -1368,8 +1407,8 @@ 6 - - Custom DNS (multiple, separated by commas (,)) + + protocol tabPage7 @@ -1380,11 +1419,11 @@ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 132 + + True - - 3 + + $this 8 @@ -1395,8 +1434,8 @@ 0, 0 - - True + + 19 True @@ -1404,14 +1443,14 @@ 3 - - 1 + + writeBufferSize 11 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True 89, 12 @@ -1425,11 +1464,14 @@ 31 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 369, 27 - - groupBox1 + + http + + + Fill groupBox1 @@ -1437,11 +1479,11 @@ groupBox1 - - 32 + + groupBox1 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 132 True @@ -1449,9 +1491,6 @@ 345, 24 - - tabPage7 - Core: DNS settings @@ -1461,11 +1500,11 @@ label3 - - 125, 12 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl + + 204, 16 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1473,11 +1512,8 @@ 94, 21 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - writeBufferSize + + 75, 23 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1485,32 +1521,35 @@ 8, 41 - - 0, 0, 0, 0 - uplinkCapacity - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 0, 0, 0 - - 35 + + 662, 523 - - 5 + + label4 - - 4 + + Vertical + + + 6 + + + 236, 66 3, 3, 3, 3 - - 10 + + 97, 21 - - cmbloglevel + + 107, 12 label5 @@ -1518,26 +1557,29 @@ 15, 192 - - tabPage6 + + btnOK False - - tabPage6 + + debug System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + chkmuxEnabled - - True + + none - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage6 False @@ -1545,17 +1587,20 @@ 253, 134 + + 342, 17 + 0, 0 Enable UDP - - 15, 64 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 3, 3, 3, 3 groupBox1 @@ -1578,38 +1623,44 @@ groupBox1 - - 120, 16 + + NoControl - - readBufferSize + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 2 + + 9 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 + + + txtKcpdownlinkCapacity groupBox1 - - 342, 17 + + 0 94, 21 - - 97, 20 + + 3 3 - - groupBox1 + + 30, 162 - - 654, 427 + + 236, 28 + + + Bottom 11 @@ -1638,17 +1689,17 @@ cbFreshrate - - Turn on Mux Multiplexing + + 246, 16 tabPage6 - - label6 + + tabPage7 - - 236, 66 + + 111, 24 NoControl diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 1740c11e..673c26af 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -139,30 +139,63 @@ Core:KCP设置 + + 255, 156 + + + 191, 12 + + + 自动更新Geo文件的间隔(单位分钟) + + + 150, 16 + + + 更新Core时忽略Geo文件 + + + 53, 12 + + + Core类型 + + + 156, 16 + + + 去重时保留序号较小的项 + + + 77, 12 + + + 统计刷新频率 + + + 372, 16 + + + 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) + + + 144, 16 + + + 允许来自局域网的连接 + + + 180, 16 + + + 开机自动启动(可能会不成功) + 654, 443 v2rayN设置 - - 95, 12 - - - 使用分号(;)分隔 - - - 239, 12 - - - 对于下列字符开头的地址不使用代理服务器: - - - 654, 443 - - - 例外 - 654, 443 @@ -259,47 +292,23 @@ 自定义DNS(可多个,用逗号(,)隔开) - - 150, 16 + + 654, 443 - - 更新Core时忽略Geo文件 + + 例外 - - 53, 12 + + 95, 12 - - Core类型 + + 使用分号(;)分隔 - - 156, 16 + + 239, 12 - - 去重时保留序号较小的项 - - - 77, 12 - - - 统计刷新频率 - - - 372, 16 - - - 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) - - - 144, 16 - - - 允许来自局域网的连接 - - - 180, 16 - - - 开机自动启动(可能会不成功) + + 对于下列字符开头的地址不使用代理服务器: 0, 479 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index a44cc1ee..0a37c2c6 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -7,7 +7,7 @@ namespace v2rayN { #region 常量 - public const string DownloadFileName = "v2ray-windows.zip"; + //public const string DownloadFileName = "v2ray-windows.zip"; public const string v2rayWebsiteUrl = @"https://www.v2fly.org/"; public const string AboutUrl = @"https://github.com/2dust/v2rayN"; public const string UpdateUrl = AboutUrl + @"/releases"; diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 0bdde6c2..e2970659 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -52,7 +52,7 @@ namespace v2rayN.Handler ws.DownloadFileCompleted += ws_DownloadFileCompleted; ws.DownloadProgressChanged += ws_DownloadProgressChanged; - ws.DownloadFileAsync(new Uri(url), Utils.GetPath(Global.DownloadFileName)); + ws.DownloadFileAsync(new Uri(url), Utils.GetPath(Utils.GetDownloadFileName(url))); } catch (Exception ex) { diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 054cf476..6052e79d 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,5 +1,7 @@ using System; using System.Drawing; +using System.Threading; +using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Base; using v2rayN.Mode; @@ -9,7 +11,7 @@ namespace v2rayN.Handler class MainFormHandler { private static MainFormHandler instance; - Action updateUI; + Action _updateUI; //private DownloadHandle downloadHandle2; //private Config _config; @@ -166,77 +168,6 @@ namespace v2rayN.Handler return counter; } - - public void UpdateSubscriptionProcess(Config config, Action update) - { - updateUI = update; - - updateUI(false, UIRes.I18N("MsgUpdateSubscriptionStart")); - - if (config.subItem == null || config.subItem.Count <= 0) - { - updateUI(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)) - { - updateUI(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); - continue; - } - - DownloadHandle downloadHandle3 = new DownloadHandle(); - downloadHandle3.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - updateUI(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); - string result = Utils.Base64Decode(args.Msg); - if (Utils.IsNullOrEmpty(result)) - { - updateUI(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); - return; - } - - ConfigHandler.RemoveServerViaSubid(ref config, id); - updateUI(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); - // RefreshServers(); - int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); - if (ret > 0) - { - // RefreshServers(); - } - else - { - updateUI(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); - } - updateUI(true, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); - } - else - { - updateUI(false, args.Msg); - } - }; - downloadHandle3.Error += (sender2, args) => - { - updateUI(false, args.GetException().Message); - }; - - downloadHandle3.WebDownloadString(url); - updateUI(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); - } - - } - public void BackupGuiNConfig(Config config, bool auto = false) { string fileName = string.Empty; @@ -277,5 +208,42 @@ namespace v2rayN.Handler } } + public void UpdateTask(Config config, Action update) + { + _updateUI = update; + Task.Run(() => UpdateTaskRun(config)); + } + + private void UpdateTaskRun(Config config) + { + var updateHandle = new UpdateHandle(); + while (true) + { + Utils.SaveLog("UpdateTaskRun"); + Thread.Sleep(60000); + if (config.autoUpdateInterval <= 0) + { + continue; + } + + updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => + { + _updateUI(false, msg); + if (success) + Utils.SaveLog("geosite" + msg); + }); + + Thread.Sleep(60000); + + updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) => + { + _updateUI(false, msg); + if (success) + Utils.SaveLog("geoip" + msg); + }); + + Thread.Sleep(60000 * config.autoUpdateInterval); + } + } } -} +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index e0e54269..ee7e09a0 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -41,8 +41,9 @@ namespace v2rayN.Handler { _config = config; _updateFunc = update; + var url = string.Empty; - DownloadHandle downloadHandle = null; + DownloadHandle downloadHandle = null; if (downloadHandle == null) { downloadHandle = new DownloadHandle(); @@ -55,7 +56,7 @@ namespace v2rayN.Handler try { - string fileName = Utils.GetPath(Global.DownloadFileName); + string fileName = Utils.GetPath(Utils.GetDownloadFileName(url)); fileName = Utils.UrlEncode(fileName); Process process = new Process { @@ -93,8 +94,8 @@ namespace v2rayN.Handler { _updateFunc(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayN")); - string url = args.Msg; - askToDownload(downloadHandle, url); + url = args.Msg; + askToDownload(downloadHandle, url, true); } else { @@ -110,6 +111,7 @@ namespace v2rayN.Handler { _config = config; _updateFunc = update; + var url = string.Empty; DownloadHandle downloadHandle = null; if (downloadHandle == null) @@ -124,7 +126,7 @@ namespace v2rayN.Handler try { - _updateFunc(true, ""); + _updateFunc(true, url); } catch (Exception ex) { @@ -147,8 +149,8 @@ namespace v2rayN.Handler if (args.Success) { _updateFunc(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "Core")); - string url = args.Msg; - askToDownload(downloadHandle, url); + url = args.Msg; + askToDownload(downloadHandle, url, true); } else { @@ -236,6 +238,7 @@ namespace v2rayN.Handler { _config = config; _updateFunc = update; + var url = string.Format(geoUrl, geoName); DownloadHandle downloadHandle = null; if (downloadHandle == null) @@ -250,7 +253,7 @@ namespace v2rayN.Handler try { - string fileName = Utils.GetPath(Global.DownloadFileName); + string fileName = Utils.GetPath(Utils.GetDownloadFileName(url)); if (File.Exists(fileName)) { string targetPath = Utils.GetPath($"{geoName}.dat"); @@ -278,8 +281,7 @@ namespace v2rayN.Handler }; } - var url = string.Format(geoUrl, geoName); - askToDownload(downloadHandle, url); + askToDownload(downloadHandle, url, false); } #region private @@ -433,9 +435,21 @@ namespace v2rayN.Handler } } - private void askToDownload(DownloadHandle downloadHandle, string url) + private void askToDownload(DownloadHandle downloadHandle, string url, bool blAsk) { - if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) + bool blDownload = false; + if (blAsk) + { + if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) + { + blDownload = true; + } + } + else + { + blDownload = true; + } + if (blDownload) { if (httpProxyTest() > 0) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 67bafaea..a8a54cb2 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -195,6 +195,11 @@ namespace v2rayN.Mode get; set; } + public int autoUpdateInterval + { + get; set; + } = 0; + #region 函数 public string address() diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index b270cd10..4a4693f9 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.21")] +[assembly: AssemblyFileVersion("4.22")] diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 928ebd87..5eed9f09 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -833,6 +833,14 @@ namespace v2rayN { i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); } + + public static string GetDownloadFileName(string url) + { + var fileName = System.IO.Path.GetFileName(url); + fileName += "_temp"; + + return fileName; + } #endregion #region TempPath From 839d07870cec408b6f0bb4d2d02f73fc79d1173f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 16 Oct 2021 20:16:50 +0800 Subject: [PATCH 053/252] Loading GUI configuration file is abnormal --- v2rayN/v2rayN/Forms/MainForm.cs | 7 ++- v2rayN/v2rayN/Handler/ConfigHandler.cs | 9 ++++ v2rayN/v2rayN/Tool/Utils.cs | 66 ++++++++++++++++++-------- 3 files changed, 60 insertions(+), 22 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index f275a8bd..7b75f1d3 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -41,7 +41,12 @@ namespace v2rayN.Forms private void MainForm_Load(object sender, EventArgs e) { - ConfigHandler.LoadConfig(ref config); + if (ConfigHandler.LoadConfig(ref config) != 0) + { + UI.ShowWarning($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用"); + Environment.Exit(0); + return; + } ConfigHandler.InitBuiltinRouting(ref config); MainFormHandler.Instance.BackupGuiNConfig(config, true); v2rayHandler = new V2rayHandler(); diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index cf53c3e0..a447754a 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -32,6 +32,15 @@ namespace v2rayN.Handler //转成Json config = Utils.FromJson(result); } + else + { + if (File.Exists(Utils.GetPath(configRes))) + { + Utils.SaveLog("LoadConfig Exception"); + return -1; + } + } + if (config == null) { config = new Config diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 5eed9f09..23a1b805 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -47,8 +47,9 @@ namespace v2rayN result = reader.ReadToEnd(); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return result; } @@ -69,8 +70,9 @@ namespace v2rayN result = reader.ReadToEnd(); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return result; } @@ -108,8 +110,9 @@ namespace v2rayN Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return result; } @@ -141,8 +144,9 @@ namespace v2rayN } result = 0; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); result = -1; } return result; @@ -155,8 +159,10 @@ namespace v2rayN JObject obj = JObject.Parse(strJson); return obj; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); + return null; } } @@ -182,8 +188,9 @@ namespace v2rayN return string.Join(",", lst.ToArray()); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return string.Empty; } } @@ -199,8 +206,9 @@ namespace v2rayN str = str.Replace(Environment.NewLine, ""); return new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return new List(); } } @@ -265,8 +273,9 @@ namespace v2rayN { return Convert.ToInt32(obj); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return 0; } } @@ -277,8 +286,9 @@ namespace v2rayN { return (obj == null ? string.Empty : obj.ToString()); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return string.Empty; } } @@ -395,8 +405,9 @@ namespace v2rayN int var1 = ToInt(oText); return true; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return false; } } @@ -538,8 +549,9 @@ namespace v2rayN string exePath = GetExePath(); RegWriteValue(autoRunRegPath, autoRunName, run ? $"\"{exePath}\"" : ""); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } } @@ -558,8 +570,9 @@ namespace v2rayN return true; } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return false; } @@ -608,8 +621,9 @@ namespace v2rayN return value; } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } finally { @@ -633,8 +647,9 @@ namespace v2rayN regKey?.SetValue(name, value); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } finally { @@ -674,8 +689,9 @@ namespace v2rayN } } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return -1; } return roundtripTime; @@ -697,8 +713,9 @@ namespace v2rayN lstIPAddress.Add(ipa.ToString()); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return lstIPAddress; } @@ -729,8 +746,9 @@ namespace v2rayN FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return string.Empty; } } @@ -773,8 +791,9 @@ namespace v2rayN } return strData; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return strData; } @@ -804,8 +823,9 @@ namespace v2rayN { return Guid.NewGuid().ToString("D"); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return string.Empty; } @@ -823,8 +843,9 @@ namespace v2rayN //WindowsBuiltInRole可以枚举出很多权限,例如系统用户、User、Guest等等 return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return false; } } @@ -963,7 +984,10 @@ namespace v2rayN } } } - catch { } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + } return string.Empty; } From 16cd9706f932d7b10d197e82a40af47e4d1ad682 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 16 Oct 2021 20:49:28 +0800 Subject: [PATCH 054/252] Automatically update the geo file time from minutes to hours --- .../Forms/OptionSettingForm.Designer.cs | 30 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 2925 ++++++++--------- .../Forms/OptionSettingForm.zh-Hans.resx | 156 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 2 +- 4 files changed, 1555 insertions(+), 1558 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 65e88bcf..ada27d1b 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -101,33 +101,32 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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); this.tabControl1.Controls.Add(this.tabPage3); + resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); 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.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); @@ -145,6 +144,7 @@ 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; // @@ -187,12 +187,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 @@ -207,8 +207,8 @@ // // cmbprotocol // - resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -234,7 +234,6 @@ // // cmbloglevel // - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -243,6 +242,7 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -262,10 +262,10 @@ // // tabPage2 // - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -288,7 +288,6 @@ // // tabPage6 // - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -302,6 +301,7 @@ 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; // @@ -373,7 +373,6 @@ // // tabPage7 // - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Controls.Add(this.txtautoUpdateInterval); this.tabPage7.Controls.Add(this.label15); this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); @@ -385,6 +384,7 @@ this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // @@ -406,12 +406,12 @@ // // cmbCoreType // - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType.FormattingEnabled = true; this.cmbCoreType.Items.AddRange(new object[] { resources.GetString("cmbCoreType.Items"), resources.GetString("cmbCoreType.Items1")}); + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.Name = "cmbCoreType"; // // label4 @@ -427,9 +427,9 @@ // // 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 @@ -457,17 +457,17 @@ // // tabPage3 // - resources.ApplyResources(this.tabPage3, "tabPage3"); this.tabPage3.Controls.Add(this.groupBox2); + resources.ApplyResources(this.tabPage3, "tabPage3"); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -488,9 +488,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 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 8015fffe..e4be1098 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,34 +117,995 @@ 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 + + + 15, 192 + + + 102, 16 + + + 35 + + + allowInsecure + + + chkdefAllowInsecure + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 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 + + + 1 + + + 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 + + + 2 + + + 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 + + + 3 + True - - Xray_core + + 15, 63 - - 11 + + 120, 16 - - - 107, 12 + + 19 - - Keep older when deduplication + + listening port 2 - + + False + + + chkAllowIn2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + 4 - - 6, 283 + + 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 + + + 5 + + + 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 + + + 6 + + + 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 + + + 7 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 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 + + + 9 + + + 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 + + + 10 + + + 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 + + + 11 + + + True + + + 15, 160 + + + 126, 16 + + + 9 Record local logs - - tabPage7 + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 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 + + + 13 + + + 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 + + + 14 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + 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 + + + 16 + + + Fill + + + 3, 3 + + + 648, 421 + + + 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, 427 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + True + + + NoControl + + + 342, 17 + + + 0, 0, 0, 0 + + + 107, 12 + + + 40 + + + Support DnsObject + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 8, 41 + + + True + + + Vertical + + + 638, 356 + + + 39 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + True + + + NoControl + + + 8, 17 + + + 281, 12 + + + 38 + + + Custom DNS (multiple, separated by commas (,)) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 654, 427 + + + 4 + + + Core: DNS 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 + + + 1 + + + True + + + 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 + + + 94, 21 + + + 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 12 @@ -152,1577 +1113,613 @@ 4, 22 - - txtKcpwriteBufferSize + + 3, 3, 3, 3 - - groupBox1 + + 654, 427 - - 7 - - - tti - - - 14 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - label10 - - - groupBox1 - - - 9 - - - groupBox1 - - - label15 - - - txtautoUpdateInterval - - + 2 - - 35 - - - 468, 60 - - - - Top - - - 102, 16 - - - 6 - - - 14 - - - tabPage3 - - - 2 - - - 5 - - - 30, 88 - - - 111, 100 - - - True - - - System.Windows.Forms.Label, 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 - - - 84, 16 - - - 40 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 120, 16 - - - True - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 36 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 7 - - - tabPage7 - - - 12 - - - http - - - 7 - - - chkdefAllowInsecure - - - 648, 421 - - - 206, 64 - - - 95, 12 - - - tabPage6 + + Core: KCP settings tabPage6 - - 317, 12 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 63 + + tabControl1 2 - - Enable UDP + + 325, 156 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 97, 21 - - 2 + + 38 - - &Cancel - - - 111, 62 - - - 654, 427 + + txtautoUpdateInterval System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - - NoControl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - txtKcpreadBufferSize - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 42 - - - txtKcpmtu - - - lbFreshrate - - - 4 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label11 - - - 29 - - - True - - - tabPage6 - - - 0, 10 - - - Support DnsObject - - - tabPage6 - - - False - - - tabControl1 - - - $this - - - 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - tabPage6 - - - Fill - - - 18 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - congestion - - - NoControl - - - 15, 16 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 89, 12 - - - info - - - 0 - - + tabPage7 - - v2rayN settings + + 0 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 12 - - - 10 - - - 32 - - - label6 - - - 6, 12 - - - groupBox1 - - - 1 - - + True - - 8 + + NoControl - - True + + 30, 162 - - 198, 16 + + 239, 12 - - Automatically start at system startup + + 37 - - 1 + + Automatic update interval of Geo(hours) - - txtKcptti + + label15 - - Turn on Sniffing - - - 281, 12 - - - Ignore Geo files when updating core - - - 355, 16 - - - 3, 3, 3, 3 - - - 97, 20 - - - 3 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 33, 29 - - - 325, 130 - - - 78, 21 - - - tabControl1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 59, 12 - - - 654, 427 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - warning - - - tabPage2 - - - 4 - - - Statistics freshrate - - - 120, 16 - - - 89, 12 - - - 18, 66 - - - 20, 143 - - - 11 - - - True - - - 4, 4, 4, 4 - - - tabPage6 - - - 5 - - - Turn on Sniffing - - - cmbloglevel - - - groupBox1 - - - 345, 100 - - - 18, 28 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage7 - - 20 - - - 10 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - - - 5 - - - label12 - - - Core Type - - - True - - - 8, 28 - - - chksniffingEnabled - - - 2 - - - 174, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - 18, 104 - - - tabPage2 - - - 97, 20 - - - socks - - - tabPage1 - - - 576, 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - panel1 - - - readBufferSize - - - 30 - - - 53, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 13 - - - label8 - - - 468, 27 - - - label13 - - - chkAutoRun - - - 94, 21 - - - 345, 62 - - - 11 - - - chkudpEnabled - - - 3 - - - True - - - 8, 17 - - - label9 - - - tabPage6 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 84, 16 - - - 15 - - - 6 - - - False - - - label7 - - - allowInsecure - - - txtlocalPort - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - tabPage7 - - - True - - - 4, 22 - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnClose - - - 124, 25 - - - protocol - - - Turn on Mux Multiplexing - - - 23, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 638, 356 - - - True - - - 5 - - - 3, 3 - - - 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 - - - chkAllowLANConn - - - 84, 16 - - - tabControl1 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 40 - - - 1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 369, 62 - - - 9 - - - System proxy settings - - - NoControl - - - 654, 427 - - - chkEnableStatistics - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 7 - 1 - - 53, 12 - - - 193, 162 - - + True - - 124, 60 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - label2 - - - 234, 16 - - - False - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 101, 12 - - - 8 - - - 12 - - - 20 - - - cmbprotocol - - - groupBox2 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - cmbCoreType - - - 662, 453 - - - 4 - - - Listening port - - - Fill - - - 41 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 257, 60 - - - groupBox1 - - - tabControl1 - - - True - - - 34 - - - cmbprotocol2 - - - NoControl - - - chkKeepOlderDedupl - - - 15, 129 - - - 16 - - - 9 - - - True - - - True - - - chkKcpcongestion - - - Core: basic settings - - - 0 - - - 257, 25 - - - tabPage2 - - - listening port 2 - - - 97, 20 - - - chkAllowIn2 - - - tabPage3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - panel2 - - - Vertical - - - 38 - - - 33 - - - 4, 22 - - - v2fly_core - - - label1 - - - Core: KCP settings - - - 10 - - - 29 - - - error - - - 15, 160 - - - groupBox1 - - - 59, 12 - NoControl - - 38 + + 15, 132 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 234, 16 - - 654, 427 + + 36 - - downlinkCapacity - - - 120, 16 - - - 662, 10 - - - txtlocalPort2 - - - True - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 654, 427 - - - 42 - - - 15, 108 - - - False - - - Custom DNS (multiple, separated by commas (,)) - - - 206, 29 - - - 2 - - - chkudpEnabled2 + + Ignore Geo files when updating core chkIgnoreGeoUpdateCore - - Allow connections from the LAN + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + v2fly_core + + + Xray_core + + + 325, 130 + + + 97, 20 + + + 34 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + True + + + NoControl + + + 253, 134 + + + 59, 12 + + + 35 + + + Core Type + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + NoControl + + + 15, 108 + + + 198, 16 + + + 33 + + + Keep older when deduplication + + + chkKeepOlderDedupl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 5 161, 84 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 58, 20 - - tabPage6 + + 32 - - 2 + + cbFreshrate - - groupBox2 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - panel2 + + tabPage7 - - 39 + + 6 - - 8 + + True - - 35 + + NoControl - - linkDnsObjectDoc + + 30, 88 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 125, 12 - + + 30 + + + Statistics freshrate + + + lbFreshrate + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage7 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 7 - - Log level + + True - - tabControl1 - - - 638, 219 - - - OptionSettingForm - - - 2 - - - 251, 12 + + NoControl 15, 64 - - 10 + + 576, 16 - - groupBox2 + + 29 - - 58, 20 + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - 1 + + chkEnableStatistics - - 13 - - - 97, 20 - - - 0 - - - 8, 52 - - - 78, 21 - - - 9 - - - True - - - tabPage7 - - - tabPage7 - - - True - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 1 - - - 40 - - - 23, 12 - - - 8 - - - 8 - - - Exception - - - NoControl - - - 37 - - - groupBox1 - - - 94, 21 - - - 0 - - - 654, 427 - - - 10 - - - NoControl - - - 17 - - - 94, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 0, 463 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 6 - - - 125, 12 - - - 0 - - - Use semicolon (;) - - - mtu - - - 32 - - - tabPage6 - - - 6 - - - False - - - 257, 158 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &OK - - - 10 - - - 1 - - - 94, 21 - - - txtKcpuplinkCapacity - - - 23 - - - chklogEnabled - - - chksniffingEnabled2 - - - tabPage7 - - - txtsystemProxyExceptions - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 325, 156 - - - groupBox2 - - - 4, 22 - - - True - - - 5 - - - Automatic update interval of Geo(minutes) - - - groupBox1 - - - 4, 22 - - - socks - - - NoControl - - - 6 - - - protocol - - - tabPage7 - - - $this - - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + tabPage7 - - $this - - + 8 - - txtremoteDNS - - - 0, 0 - - - 19 - - + True - - 3 - - - writeBufferSize - - - 11 - - - True - - - 89, 12 - - - 16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 31 - - - 369, 27 - - - http - - - Fill - - - groupBox1 - - - groupBox1 - - - groupBox1 - - - 15, 132 - - - True - - - 345, 24 - - - Core: DNS settings - - - 236, 104 - - - label3 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 40 204, 16 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 29 - - 94, 21 + + Allow connections from the LAN - - 75, 23 + + chkAllowLANConn - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8, 41 + + tabPage7 - - uplinkCapacity - - - 0, 0, 0, 0 - - - 662, 523 - - - label4 - - - Vertical - - - 6 - - - 236, 66 - - - 3, 3, 3, 3 - - - 97, 21 - - - 107, 12 - - - label5 - - - 15, 192 - - - btnOK - - - False - - - debug - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - chkmuxEnabled - - - none - - - tabPage6 - - - False - - - 253, 134 - - - 342, 17 - - - 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 - - - 15 - - - 126, 16 - - - 267, 16 - - - 75, 23 - - - Do not use proxy server for addresses beginning with - - - groupBox1 - - - NoControl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 9 - - 0 + + True - - txtKcpdownlinkCapacity - - - groupBox1 - - - 0 - - - 94, 21 - - - 3 - - - 3 - - - 30, 162 - - - 236, 28 - - - Bottom - - - 11 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - groupBox1 - - - NoControl - - - panel2 - - - 7 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cbFreshrate + + 15, 16 246, 16 - - tabPage6 + + 23 - + + Automatically start at system startup + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 - - 111, 24 + + 10 - - NoControl + + 4, 22 - - 4 + + 3, 3, 3, 3 + + + 654, 427 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + True NoControl + + 6, 283 + + + 107, 12 + + + 42 + + + Use semicolon (;) + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + True + + NoControl + + + 8, 28 + + + 317, 12 + + + 40 + + + Do not use proxy server for addresses beginning with + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + 8, 52 + + + True + + + Vertical + + + 638, 219 + + + 41 + + + txtsystemProxyExceptions + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + Fill + + + 0, 0 + + + 654, 427 + + + 42 + + + Exception + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + 4, 22 + + + 654, 427 + + + 5 + + + System proxy settings + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 4 + + + Fill + + + 0, 10 + + + 662, 453 + + + 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, 463 + 662, 60 - - label14 + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 0 + + + 662, 10 + + + 9 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 True - - zh-Hans - + + 6, 12 + + + 662, 523 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + 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/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 673c26af..7f62c293 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,90 +121,15 @@ 取消(&C) + + 662, 469 + 654, 443 Core:基础设置 - - 654, 443 - - - Core:DNS设置 - - - 654, 443 - - - Core:KCP设置 - - - 255, 156 - - - 191, 12 - - - 自动更新Geo文件的间隔(单位分钟) - - - 150, 16 - - - 更新Core时忽略Geo文件 - - - 53, 12 - - - Core类型 - - - 156, 16 - - - 去重时保留序号较小的项 - - - 77, 12 - - - 统计刷新频率 - - - 372, 16 - - - 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) - - - 144, 16 - - - 允许来自局域网的连接 - - - 180, 16 - - - 开机自动启动(可能会不成功) - - - 654, 443 - - - v2rayN设置 - - - 654, 443 - - - 系统代理设置 - - - 662, 469 - 648, 437 @@ -280,6 +205,12 @@ 本地监听端口 + + 654, 443 + + + Core:DNS设置 + 161, 12 @@ -292,6 +223,75 @@ 自定义DNS(可多个,用逗号(,)隔开) + + 654, 443 + + + Core:KCP设置 + + + 654, 443 + + + v2rayN设置 + + + 255, 156 + + + 191, 12 + + + 自动更新Geo文件的间隔(单位小时) + + + 150, 16 + + + 更新Core时忽略Geo文件 + + + 53, 12 + + + Core类型 + + + 156, 16 + + + 去重时保留序号较小的项 + + + 77, 12 + + + 统计刷新频率 + + + 372, 16 + + + 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) + + + 144, 16 + + + 允许来自局域网的连接 + + + 180, 16 + + + 开机自动启动(可能会不成功) + + + 654, 443 + + + 系统代理设置 + 654, 443 diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 6052e79d..c44f8a1b 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -242,7 +242,7 @@ namespace v2rayN.Handler Utils.SaveLog("geoip" + msg); }); - Thread.Sleep(60000 * config.autoUpdateInterval); + Thread.Sleep(1000 * 3600 * config.autoUpdateInterval); } } } From 3bc7812e1a15657ffc9cb25d91be3af5055b554a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 16 Oct 2021 20:50:27 +0800 Subject: [PATCH 055/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 4a4693f9..56427d88 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.22")] +[assembly: AssemblyFileVersion("4.23")] From 54adaffb925af78b07165cd443d0a2dee165754e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 17 Nov 2021 20:52:45 +0800 Subject: [PATCH 056/252] Optimize performance --- v2rayN/v2rayN/Forms/MainForm.cs | 8 +++---- v2rayN/v2rayN/Handler/ConfigHandler.cs | 33 ++++++++++++++------------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 7b75f1d3..d2920ae1 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -578,13 +578,11 @@ namespace v2rayN.Forms { return; } - for (int k = lvSelecteds.Count - 1; k >= 0; k--) - { - ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); - } + + ConfigHandler.RemoveServer(ref config, lvSelecteds); + RefreshServers(); LoadV2ray(); - } private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index a447754a..0b83a515 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -236,19 +236,27 @@ namespace v2rayN.Handler /// /// /// - public static int RemoveServer(ref Config config, int index) + public static int RemoveServer(ref Config config, List indexs) { - if (index < 0 || index > config.vmess.Count - 1) + var itemId = config.getItemId(); + + for (int k = indexs.Count - 1; k >= 0; k--) { - return -1; + var index = indexs[k]; + if (index < 0 || index > config.vmess.Count - 1) + { + continue; + } + + config.vmess.RemoveAt(index); } - //删除 - config.vmess.RemoveAt(index); - - - //移除的是活动的 - if (config.index.Equals(index)) + var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); + if (index_ >= 0) + { + config.index = index_; + } + else { if (config.vmess.Count > 0) { @@ -258,13 +266,8 @@ namespace v2rayN.Handler { config.index = -1; } - Global.reloadV2ray = true; - } - else if (index < config.index)//移除活动之前的 - { - config.index--; - Global.reloadV2ray = true; } + Global.reloadV2ray = true; ToJsonFile(config); From 5907bf388c0c3511461296e0a5e66b9fe9258862 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 17 Nov 2021 20:54:19 +0800 Subject: [PATCH 057/252] Speed test via memory storage --- v2rayN/v2rayN/Handler/DownloadHandle.cs | 33 +++++++++++++++++++++-- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 3 ++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index e2970659..04d777b4 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -62,7 +62,7 @@ namespace v2rayN.Handler } return ws; } - + void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { if (UpdateCompleted != null) @@ -108,7 +108,7 @@ namespace v2rayN.Handler if (e.Error == null || Utils.IsNullOrEmpty(e.Error.ToString())) { - + ((WebClientEx)sender).Dispose(); TimeSpan ts = (DateTime.Now - totalDatetime); string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.0")); UpdateCompleted(this, new ResultEventArgs(true, speed.PadLeft(8, ' '))); @@ -189,5 +189,34 @@ namespace v2rayN.Handler } } + public WebClientEx DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout) + { + WebClientEx ws = new WebClientEx(); + try + { + Utils.SetSecurityProtocol(); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); + + progressPercentage = -1; + totalBytesToReceive = 0; + + DownloadTimeout = downloadTimeout; + if (webProxy != null) + { + ws.Proxy = webProxy; + } + + ws.DownloadProgressChanged += ws_DownloadProgressChanged; + ws.DownloadDataCompleted += ws_DownloadFileCompleted; + ws.DownloadDataAsync(new Uri(url)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + Error?.Invoke(this, new ErrorEventArgs(ex)); + } + return ws; + } } } diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 09fc71e7..084e09c0 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -220,11 +220,12 @@ namespace v2rayN.Handler int httpPort = _config.GetLocalPort("speedtest"); WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); - var ws = downloadHandle2.DownloadFileAsync(url, webProxy, timeout - 2); + var ws = downloadHandle2.DownloadDataAsync(url, webProxy, timeout - 2); Thread.Sleep(1000 * timeout); ws.CancelAsync(); + ws.Dispose(); Thread.Sleep(1000 * 2); } From c29ccf76d5864ba5c0f92ed695df58f8ecae2624 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 17 Nov 2021 20:54:40 +0800 Subject: [PATCH 058/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 56427d88..25b4b40a 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.23")] +[assembly: AssemblyFileVersion("4.24")] From 1138d660b24767f4b05889bfa86f5dd1b24dbfaa Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 2 Dec 2021 16:05:54 +0800 Subject: [PATCH 059/252] Routing rule add custom icon --- .../Forms/RoutingRuleSettingForm.Designer.cs | 78 +- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 15 +- .../v2rayN/Forms/RoutingRuleSettingForm.resx | 1069 +++++++++-------- .../Forms/RoutingRuleSettingForm.zh-Hans.resx | 58 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 21 +- v2rayN/v2rayN/Mode/RoutingItem.cs | 5 +- 6 files changed, 716 insertions(+), 530 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs index 6a5f5c23..5f76c47d 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs @@ -34,6 +34,10 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.label5 = new System.Windows.Forms.Label(); + this.btnBrowse = new System.Windows.Forms.Button(); + this.txtCustomIcon = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.txtUrl = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); @@ -68,17 +72,17 @@ // // 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); // // 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 @@ -90,14 +94,40 @@ // // panel1 // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Controls.Add(this.label5); + this.panel1.Controls.Add(this.btnBrowse); + this.panel1.Controls.Add(this.txtCustomIcon); + this.panel1.Controls.Add(this.label4); this.panel1.Controls.Add(this.label1); this.panel1.Controls.Add(this.txtUrl); this.panel1.Controls.Add(this.label3); this.panel1.Controls.Add(this.txtRemarks); this.panel1.Controls.Add(this.label2); - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // btnBrowse + // + resources.ApplyResources(this.btnBrowse, "btnBrowse"); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.UseVisualStyleBackColor = true; + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + // + // txtCustomIcon + // + resources.ApplyResources(this.txtCustomIcon, "txtCustomIcon"); + this.txtCustomIcon.Name = "txtCustomIcon"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // // label1 // resources.ApplyResources(this.label1, "label1"); @@ -125,8 +155,8 @@ // // lvRoutings // - this.lvRoutings.ContextMenuStrip = this.cmsLv; resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.ContextMenuStrip = this.cmsLv; this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -142,6 +172,7 @@ // // 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.menuAdd, @@ -155,114 +186,113 @@ this.menuMoveBottom}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.MenuItem1; - resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - this.menuAdd.Name = "menuAdd"; resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Name = "menuAdd"; this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - this.menuRemove.Name = "menuRemove"; resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Name = "menuRemove"; this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - this.menuSelectAll.Name = "menuSelectAll"; resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuExportSelectedRules // - this.menuExportSelectedRules.Name = "menuExportSelectedRules"; resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); + this.menuExportSelectedRules.Name = "menuExportSelectedRules"; this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_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); // // MenuItem1 // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); this.MenuItem1.DropDown = this.cmsLv; this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // tabControl2 // - this.tabControl2.Controls.Add(this.tabPage2); resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Controls.Add(this.tabPage2); this.tabControl2.Name = "tabControl2"; this.tabControl2.SelectedIndex = 0; // // tabPage2 // - this.tabPage2.Controls.Add(this.lvRoutings); resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Controls.Add(this.lvRoutings); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // // menuServer // + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItem1, this.toolStripMenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // toolStripMenuItem1 // + resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuImportRulesFromFile, this.menuImportRulesFromClipboard, this.menuImportRulesFromUrl}); this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); // // menuImportRulesFromFile // - this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); + this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); // // menuImportRulesFromClipboard // - this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); + this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); // // menuImportRulesFromUrl // - this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); + this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click); // // RoutingRuleSettingForm @@ -319,5 +349,9 @@ private System.Windows.Forms.TextBox txtUrl; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtCustomIcon; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button btnBrowse; + private System.Windows.Forms.Label label5; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index f7957ca2..87fe775c 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -38,6 +38,7 @@ namespace v2rayN.Forms txtRemarks.Text = routingItem.remarks ?? string.Empty; txtUrl.Text = routingItem.url ?? string.Empty; + txtCustomIcon.Text = routingItem.customIcon ?? string.Empty; InitRoutingsView(); RefreshRoutingsView(); @@ -93,6 +94,7 @@ namespace v2rayN.Forms { routingItem.remarks = txtRemarks.Text.Trim(); routingItem.url = txtUrl.Text.Trim(); + routingItem.customIcon = txtCustomIcon.Text.Trim(); if (ConfigHandler.AddRoutingItem(ref config, routingItem, EditIndex) == 0) { @@ -108,6 +110,14 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } + private void btnBrowse_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog1 = new OpenFileDialog(); + openFileDialog1.Filter = "PNG|*.png"; + openFileDialog1.ShowDialog(); + txtCustomIcon.Text = openFileDialog1.FileName; + + } private void lvRoutings_DoubleClick(object sender, EventArgs e) { @@ -340,8 +350,9 @@ namespace v2rayN.Forms return ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData, blReplace); } + + #endregion - - + } } diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx index 426ce16c..caef34ad 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -117,320 +117,368 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - - 568, 17 - - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - NoControl - - - 475, 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, 515 - - - 762, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - NoControl - - - 18, 63 - - - 53, 12 - - - 35 - - - Optional - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 0 - - - 91, 45 - - - True - - - Vertical - - - 644, 48 - - - 34 - - - txtUrl + + System.Windows.Forms.TabControl, 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 - - panel1 - - - 1 - - - True - - - NoControl - - - 18, 45 - - - 47, 12 - - - 33 - - - Sub Url - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 2 - - - 91, 13 - - - 166, 21 - - - 32 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 3 - - - True - - - NoControl - - - 18, 13 - - - 47, 12 - - - 31 - - - Remarks - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 4 - - - Top - - - 0, 25 - - - 762, 102 - - - 11 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - 17, 17 - - - 202, 22 - - - Add - - - 202, 22 - - - Remove selected - - - 202, 22 - - - Select All (Ctrl+A) - - - 202, 22 - - - Export Selected Rules - + 199, 6 - - 202, 22 + + + Fill - - Move to top (T) + + menuImportRulesFromUrl - - 202, 22 - - - Up (U) - - - 202, 22 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Down (D) - - 202, 22 + + 762, 25 + + + + 32 + + + 5 + + + 47, 12 Move to bottom (B) - - 120, 21 + + panel1 + + + 40 + + + Bottom Edit and Function - - 203, 186 + + panel1 + + + $this + + + 75, 23 + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + True + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 15 + + + 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 + + + 4, 22 + + + $this + + + panel1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Rule Settings + + + Remove selected + + + NoControl + + + tabPage2 + + + 4 + + + 202, 22 + + + 475, 17 + + + 75, 23 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItem1 + + + 0 + + + 754, 231 + + + 1 + + + 568, 17 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 47, 12 + + + txtCustomIcon + + + NoControl + + + 0, 0 + + + label1 + + + 762, 60 + + + Sub Url + + + 95, 21 + + + 128*128 + + + panel1 + + + True + + + 120, 21 + + + True + + + Import Rules From Sub Url + + + 2 + + + menuSelectAll + + + menuMoveTop + + + 202, 22 cmsLv - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 8 - - Fill + + Add + + + 12 + + + toolStripSeparator3 + + + label5 + + + tabPage2 + + + toolStripMenuItem1 + + + menuMoveBottom + + + 0, 25 + + + 18, 105 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 18, 63 + + + Import Rules From File + + + 202, 22 + + + 762, 257 + + + 1 + + + RoutingRuleSettingForm + + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 202, 22 + + + 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 + + + 3 + + + System.Windows.Forms.MenuStrip, 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 + + + Up (U) + + + 203, 186 + + + btnOK + + + 53, 12 + + + 47, 12 + + + 14 + + + Import Rules + + + NoControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + panel2 + + + 3, 3 + + + 18, 117 + + + menuImportRulesFromClipboard + + + Import Rules From Clipboard + + + panel1 + + + menuAdd + + + 0, 167 + + + 247, 22 + + + 4 + + + Move to top (T) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 762, 142 + + + txtUrl + + + 748, 225 + + + 660, 104 @@ -449,226 +497,289 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 3, 3 + + 34 - - 748, 356 + + 36 - - 12 - - - lvRoutings - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabPage2 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 754, 362 - - - 0 - - - RuleList - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 0 - - - Fill - - - 0, 127 - - - 762, 388 - - - 14 - - - tabControl2 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - 139, 17 - - - 247, 22 - - - Import Rules From File - - - 247, 22 - - - Import Rules From Clipboard + + 2 247, 22 - - Import Rules From Sub Url + + label4 - - 95, 21 + + &OK - - Import Rules + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 - - - 762, 25 - - - 15 - - - menuServer - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - + True - - - 6, 12 - - - 762, 575 - - - Rule Settings - - - menuAdd - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemove - - - 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 - - - menuExportSelectedRules System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator3 + + panel2 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 35 - - menuMoveTop + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 71, 12 - - menuMoveUp + + 18, 45 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 31 - - menuMoveDown + + 91, 45 - - 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 - - - MenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuImportRulesFromFile - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuImportRulesFromClipboard + + 166, 21 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuImportRulesFromUrl + + 644, 48 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuMoveDown - - RoutingRuleSettingForm + + 202, 22 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromFile + + + label3 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11 + + + 3 + + + 7 + + + Vertical + + + &Browse + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + panel1 v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + tabControl2 + + + Remarks + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + 0, 424 + + + menuMoveUp + + + RuleList + + + 563, 21 + + + 0 + + + Select All (Ctrl+A) + + + btnClose + + + Fill + + + 18, 13 + + + 6, 12 + + + 37 + + + menuExportSelectedRules + + + Optional + + + Export Selected Rules + + + menuServer + + + 91, 13 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 247, 22 + + + 202, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + lvRoutings + + + 202, 22 + + + 91, 105 + + + label2 + + + menuRemove + + + True + + + NoControl + + + NoControl + + + 762, 484 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnBrowse + + + $this + + + NoControl + + + 39 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 202, 22 + + + 6 + + + &Cancel + + + NoControl + + + 0 + + + 7 + + + panel1 + + + 75, 23 + + + tabControl2 + + + panel1 + + + 0 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtRemarks + + + 1 + + + True + + + Custom icon + + + 0 + + + Top + + + True + + + 25 + + + 139, 17 + + + 17, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx index 06ade53a..d6544331 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx @@ -120,16 +120,31 @@ 取消(&C) - - 确定(&O) - - 0, 613 + 0, 501 785, 60 + + 确定(&O) + + + 785, 147 + + + 670, 104 + + + 101, 105 + + + 65, 12 + + + 自定义图标 + 29, 12 @@ -154,9 +169,6 @@ 别名 - - 785, 109 - 196, 22 @@ -235,19 +247,28 @@ - 771, 447 + 771, 297 + + + 0, 172 + + + 785, 329 - 777, 453 + 777, 303 规则列表 - - 0, 134 + + 785, 25 - - 785, 479 + + 68, 21 + + + 导入规则 189, 22 @@ -267,17 +288,8 @@ 从订阅Url中导入规则 - - 68, 21 - - - 导入规则 - - - 785, 25 - - 785, 673 + 785, 561 规则集设置 diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index c44f8a1b..56858b92 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,5 +1,6 @@ using System; using System.Drawing; +using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -50,9 +51,23 @@ namespace v2rayN.Handler Graphics graphics = Graphics.FromImage(bitmap); SolidBrush drawBrush = new SolidBrush(color); - graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); - int zoom = 16; - graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); + var customIcon = false; + if (config.enableRoutingAdvanced) + { + var item = config.routings[config.routingIndex]; + if (!Utils.IsNullOrEmpty(item.customIcon) && File.Exists(item.customIcon)) + { + graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); + graphics.DrawImage(new Bitmap(item.customIcon), 0, 0); + customIcon = true; + } + } + if (!customIcon) + { + graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); + int zoom = 16; + graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); + } Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); diff --git a/v2rayN/v2rayN/Mode/RoutingItem.cs b/v2rayN/v2rayN/Mode/RoutingItem.cs index 2344e227..02a93edf 100644 --- a/v2rayN/v2rayN/Mode/RoutingItem.cs +++ b/v2rayN/v2rayN/Mode/RoutingItem.cs @@ -27,6 +27,9 @@ namespace v2rayN.Mode { get; set; } - + public string customIcon + { + get; set; + } } } From cb018090932585c1cd9612cea4a3a2e4f5ec644a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 2 Dec 2021 16:47:35 +0800 Subject: [PATCH 060/252] Optimize Duplicate Server --- v2rayN/v2rayN/Forms/MainForm.cs | 8 +--- v2rayN/v2rayN/Handler/ConfigHandler.cs | 57 ++++++++++++++++++++++++++ v2rayN/v2rayN/Tool/Utils.cs | 32 +-------------- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index d2920ae1..320fd707 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -587,13 +587,9 @@ namespace v2rayN.Forms 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; - } + ConfigHandler.DedupServerList(ref config); + int newCount = config.vmess.Count; RefreshServers(); LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 0b83a515..739d8d3b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -987,6 +987,63 @@ namespace v2rayN.Handler return 0; } + public static int DedupServerList(ref Config config) + { + var itemId = config.getItemId(); + + List source = config.vmess; + bool keepOlder = config.keepOlderDedupl; + + List list = new List(); + if (!keepOlder) source.Reverse(); // Remove the early items first + + bool _isAdded(Mode.VmessItem o, Mode.VmessItem n) + { + 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(); + config.vmess = list; + + var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); + if (index_ >= 0) + { + config.index = index_; + } + else + { + if (config.vmess.Count > 0) + { + config.index = 0; + } + else + { + config.index = -1; + } + } + Global.reloadV2ray = true; + + return 0; + } + #endregion #region UI diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 23a1b805..b6aed414 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -348,37 +348,7 @@ namespace v2rayN return $"{string.Format("{0:f1}", result)} {unit}"; } - public static void DedupServerList(List source, out List result, bool keepOlder) - { - List list = new List(); - if (!keepOlder) source.Reverse(); // Remove the early items first - - bool _isAdded(Mode.VmessItem o, Mode.VmessItem n) - { - 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; - } + public static string UrlEncode(string url) { From 19be43d2d97fb16b8cdd9c043fcf88da9f3a1243 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 2 Dec 2021 16:48:15 +0800 Subject: [PATCH 061/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 25b4b40a..5c44b6a1 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.24")] +[assembly: AssemblyFileVersion("4.25")] From fe2977187049d71b3c1b4a3d1bdd8a5bdc6c6bd6 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 2 Dec 2021 18:04:22 +0800 Subject: [PATCH 062/252] Routing rule add custom icon --- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 2 ++ v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 +++++++++ v2rayN/v2rayN/Resx/ResUI.resx | 3 +++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 +++ 4 files changed, 17 insertions(+) diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 732671c2..4628d16e 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -147,6 +147,7 @@ namespace v2rayN.Forms lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 200); lvRoutings.Columns.Add(UIRes.I18N("LvCount"), 60); lvRoutings.Columns.Add(UIRes.I18N("LvUrl"), 240); + lvRoutings.Columns.Add(UIRes.I18N("LvCustomIcon"), 240); lvRoutings.EndUpdate(); } @@ -174,6 +175,7 @@ namespace v2rayN.Forms Utils.AddSubItem(lvItem, "remarks", item.remarks); Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString()); Utils.AddSubItem(lvItem, "url", item.url); + Utils.AddSubItem(lvItem, "customIcon", item.customIcon); if (lvItem != null) lvRoutings.Items.Add(lvItem); } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 1ad602d9..2145ed2a 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -330,6 +330,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Custom Icon 的本地化字符串。 + /// + internal static string LvCustomIcon { + get { + return ResourceManager.GetString("LvCustomIcon", resourceCulture); + } + } + /// /// 查找类似 Security 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 2dc0c89b..b58ee145 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -394,4 +394,7 @@ Informations (Filter : {0}) + + Custom Icon + \ 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 ab3d7bb2..64ca6267 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -394,4 +394,7 @@ 信息 (过滤器 : {0}) + + 自定义图标 + \ No newline at end of file From 4fc0738dad2ba30cfbc123bc7670246a5286d444 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 2 Dec 2021 19:39:02 +0800 Subject: [PATCH 063/252] Routing rule display --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 61 +++++--------- v2rayN/v2rayN/Forms/MainForm.cs | 6 +- v2rayN/v2rayN/Forms/MainForm.resx | 102 ++++++++--------------- 3 files changed, 63 insertions(+), 106 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 6876d61e..e0d61ca8 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -77,12 +77,8 @@ this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem(); this.ssMain = new System.Windows.Forms.StatusStrip(); - this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslInboundInfo = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); @@ -133,6 +129,8 @@ this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.tsbClose = new System.Windows.Forms.ToolStripButton(); + this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); this.scMain.Panel1.SuspendLayout(); this.scMain.Panel2.SuspendLayout(); @@ -221,6 +219,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -501,11 +500,9 @@ // this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolSslSocksPortLab, - this.toolSslSocksPort, + this.toolSslInboundInfo, this.toolSslBlank1, - this.toolSslHttpPortLab, - this.toolSslHttpPort, + this.toolSslRoutingRule, this.toolSslBlank2, this.toolSslServerSpeed, this.toolSslBlank4}); @@ -513,15 +510,10 @@ this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // - // toolSslSocksPortLab + // toolSslInboundInfo // - resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab"); - this.toolSslSocksPortLab.Name = "toolSslSocksPortLab"; - // - // toolSslSocksPort - // - this.toolSslSocksPort.Name = "toolSslSocksPort"; - resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); + this.toolSslInboundInfo.Name = "toolSslInboundInfo"; + resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); // // toolSslBlank1 // @@ -529,22 +521,6 @@ this.toolSslBlank1.Name = "toolSslBlank1"; this.toolSslBlank1.Spring = true; // - // toolSslHttpPortLab - // - resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab"); - this.toolSslHttpPortLab.Name = "toolSslHttpPortLab"; - // - // toolSslHttpPort - // - this.toolSslHttpPort.Name = "toolSslHttpPort"; - resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); - // - // toolSslBlank2 - // - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); - this.toolSslBlank2.Name = "toolSslBlank2"; - this.toolSslBlank2.Spring = true; - // // toolSslServerSpeed // resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); @@ -889,6 +865,17 @@ this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); // + // toolSslRoutingRule + // + this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); + // + // toolSslBlank2 + // + this.toolSslBlank2.Name = "toolSslBlank2"; + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Spring = true; + // // MainForm // resources.ApplyResources(this, "$this"); @@ -994,12 +981,7 @@ private System.Windows.Forms.ToolStripButton tsbPromotion; private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer; private System.Windows.Forms.StatusStrip ssMain; - private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPort; - private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; - private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab; - private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer; @@ -1032,6 +1014,9 @@ private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoIP; private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter; + private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; + private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 320fd707..525620d5 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -352,8 +352,8 @@ namespace v2rayN.Forms private void DisplayToolStatus() { - toolSslSocksPort.Text = $"{Global.Loopback}:{config.inbound[0].localPort}"; - toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; + toolSslInboundInfo.Text = $"{Global.InboundSocks} {Global.Loopback}:{config.inbound[0].localPort} | " + + $"{ Global.InboundHttp} { Global.Loopback}:{Global.httpPort}"; notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } @@ -1389,6 +1389,7 @@ namespace v2rayN.Forms menuRoutings.Visible = config.enableRoutingAdvanced; if (!config.enableRoutingAdvanced) { + toolSslRoutingRule.Text = string.Empty; return; } @@ -1411,6 +1412,7 @@ namespace v2rayN.Forms if (config.routingIndex.Equals(k)) { ts.Checked = true; + toolSslRoutingRule.Text = item.remarks; } ts.Click += new EventHandler(ts_Routing_Click); lst.Add(ts); diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index a0f751f7..0387e8be 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -302,6 +302,18 @@ Export subscription (base64) share to clipboard + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + 356, 622 @@ -428,18 +440,6 @@ 0 - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - Fill @@ -566,41 +566,23 @@ 228, 18 - - 微软雅黑, 8pt + + 80, 21 - - 52, 21 - - - SOCKS5: - - - 0, 21 + + InboundInfo 微软雅黑, 8pt - 279, 21 + 285, 21 - - 微软雅黑, 8pt - - - 39, 21 - - - HTTP: - - + 0, 21 - - 微软雅黑, 8pt - - 279, 21 + 285, 21 False @@ -831,13 +813,13 @@ 6, 56 - 180, 22 + 125, 22 Settings - 180, 22 + 125, 22 Updates @@ -1319,16 +1301,10 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolSslSocksPortLab + + toolSslInboundInfo - - 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 @@ -1337,24 +1313,6 @@ 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 - toolSslServerSpeed @@ -1637,6 +1595,18 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolSslRoutingRule + + + 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 + MainForm From 610a610ee0ce0f473e5ff6e4828f597ab4ee9b26 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 19 Dec 2021 20:46:54 +0800 Subject: [PATCH 064/252] Enhanced trojan settings --- v2rayN/v2rayN/Forms/AddServer3Form.resx | 14 +- v2rayN/v2rayN/Forms/AddServer4Form.resx | 14 +- .../v2rayN/Forms/AddServer5Form.Designer.cs | 267 +----- v2rayN/v2rayN/Forms/AddServer5Form.cs | 96 +- v2rayN/v2rayN/Forms/AddServer5Form.resx | 824 ++--------------- .../v2rayN/Forms/AddServer5Form.zh-Hans.resx | 151 ---- .../v2rayN/Forms/AddServer6Form.Designer.cs | 81 +- v2rayN/v2rayN/Forms/AddServer6Form.cs | 26 +- v2rayN/v2rayN/Forms/AddServer6Form.resx | 454 ++++++---- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 266 +----- v2rayN/v2rayN/Forms/AddServerForm.cs | 123 +-- v2rayN/v2rayN/Forms/AddServerForm.resx | 826 ++---------------- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 39 - .../v2rayN/Forms/RoutingRuleSettingForm.resx | 84 +- .../Forms/RoutingRuleSettingForm.zh-Hans.resx | 3 + .../Forms/ServerTransportControl.Designer.cs | 243 ++++++ v2rayN/v2rayN/Forms/ServerTransportControl.cs | 179 ++++ .../v2rayN/Forms/ServerTransportControl.resx | 717 +++++++++++++++ .../Forms/ServerTransportControl.zh-Hans.resx | 184 ++++ v2rayN/v2rayN/Handler/ConfigHandler.cs | 6 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 816 +++++++++-------- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 17 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 17 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 117 +++ v2rayN/v2rayN/Resx/ResUI.resx | 39 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 39 + v2rayN/v2rayN/v2rayN.csproj | 16 + 27 files changed, 2608 insertions(+), 3050 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/ServerTransportControl.cs create mode 100644 v2rayN/v2rayN/Forms/ServerTransportControl.resx create mode 100644 v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index 11e4d167..0f5bdcb4 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -126,7 +126,7 @@ - 4 + 1 &Cancel @@ -199,7 +199,7 @@ 278, 20 - 6 + 3 cmbSecurity @@ -220,7 +220,7 @@ 278, 21 - 11 + 4 txtRemarks @@ -295,7 +295,7 @@ 278, 21 - 5 + 2 txtId @@ -343,7 +343,7 @@ 194, 21 - 3 + 1 txtPort @@ -391,7 +391,7 @@ 359, 21 - 1 + 0 txtAddress @@ -466,7 +466,7 @@ 75, 23 - 5 + 0 &OK diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx index e70189c3..45725ec7 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -126,7 +126,7 @@ - 4 + 1 &Cancel @@ -150,7 +150,7 @@ 278, 21 - 26 + 2 txtSecurity @@ -202,7 +202,7 @@ 278, 21 - 24 + 3 txtId @@ -280,7 +280,7 @@ 278, 21 - 11 + 4 txtRemarks @@ -328,7 +328,7 @@ 194, 21 - 3 + 1 txtPort @@ -376,7 +376,7 @@ 359, 21 - 1 + 0 txtAddress @@ -451,7 +451,7 @@ 75, 23 - 5 + 0 &OK diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs index bd68c62f..44915372 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -35,32 +35,6 @@ 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.label25 = new System.Windows.Forms.Label(); - this.label24 = new System.Windows.Forms.Label(); - this.label23 = new System.Windows.Forms.Label(); - this.panTlsMore = new System.Windows.Forms.Panel(); - this.txtSNI = new System.Windows.Forms.TextBox(); - 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(); - 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(); @@ -75,10 +49,11 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.panTlsMore.SuspendLayout(); this.panel2.SuspendLayout(); + this.panel3.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -95,7 +70,6 @@ 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); @@ -140,195 +114,6 @@ resources.ApplyResources(this.label13, "label13"); this.label13.Name = "label13"; // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label25); - 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; - // - // label25 - // - resources.ApplyResources(this.label25, "label25"); - this.label25.Name = "label25"; - // - // 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.txtSNI); - 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"; - // - // txtSNI - // - resources.ApplyResources(this.txtSNI, "txtSNI"); - this.txtSNI.Name = "txtSNI"; - // - // label22 - // - resources.ApplyResources(this.label22, "label22"); - this.label22.Name = "label22"; - // - // 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.GetString("cmbNetwork.Items5")}); - 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"); @@ -407,12 +192,25 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // panel3 + // + this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // transportControl + // + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; + // // 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.panel3); this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; @@ -420,11 +218,8 @@ 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.panel3.ResumeLayout(false); this.ResumeLayout(false); } @@ -444,38 +239,14 @@ 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.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; 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; - private System.Windows.Forms.TextBox txtSNI; - private System.Windows.Forms.Label label22; - private System.Windows.Forms.Label label25; + private System.Windows.Forms.Panel panel3; + private ServerTransportControl transportControl; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 9c2f350a..43d52751 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -15,6 +15,7 @@ namespace v2rayN.Forms private void AddServer5Form_Load(object sender, EventArgs e) { + transportControl.AllowXtls = true; if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; @@ -37,15 +38,9 @@ namespace v2rayN.Forms 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; - txtSNI.Text = vmessItem.sni; + transportControl.BindingServer(vmessItem); } @@ -59,62 +54,9 @@ namespace v2rayN.Forms 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 = ""; - txtSNI.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; - } - - if (network.Equals(Global.DefaultNetwork)) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network.Equals("kcp") || network.Equals("quic")) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); - } - else if (network.Equals("grpc")) - { - cmbHeaderType.Items.Add(Global.GrpcgunMode); - cmbHeaderType.Items.Add(Global.GrpcmultiMode); - } - else - { - cmbHeaderType.Items.Add(Global.None); - } - cmbHeaderType.SelectedIndex = 0; + transportControl.ClearServer(vmessItem); } private void btnOK_Click(object sender, EventArgs e) @@ -124,16 +66,8 @@ namespace v2rayN.Forms 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; - string sni = txtSNI.Text; - if (Utils.IsNullOrEmpty(address)) { UI.Show(UIRes.I18N("FillServerAddress")); @@ -150,22 +84,15 @@ namespace v2rayN.Forms return; } + transportControl.EndBindingServer(); 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; - vmessItem.sni = sni; - if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) { this.DialogResult = DialogResult.OK; @@ -185,18 +112,5 @@ 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(); - } - } } -} +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index b86110a6..d8a0fd00 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -165,7 +165,7 @@ 211, 20 - 24 + 3 cmbFlow @@ -261,738 +261,6 @@ 3 - - True - - - NoControl - - - 529, 210 - - - 113, 12 - - - 37 - - - 4)grpc serviceName - - - label25 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 529, 197 - - - 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 - - - 1 - - - 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 - - - 2 - - - 297, 7 - - - 200, 21 - - - 35 - - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - True - - - NoControl - - - 267, 11 - - - 23, 12 - - - 34 - - - SNI - - - label22 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 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 - - - 2 - - - - - - true - - - false - - - 100, 7 - - - 80, 20 - - - 30 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 3 - - - 200, 232 - - - 500, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - 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 - - - 4 - - - 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 - - - 5 - - - 127, 169 - - - True - - - 396, 54 - - - 28 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - grpc - - - 192, 28 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - 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 - - - 8 - - - 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 - - - 9 - - - True - - - 529, 183 - - - 59, 12 - - - 26 - - - 2)h2 path - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 10 - - - 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 - - - 11 - - - True - - - 529, 169 - - - 59, 12 - - - 24 - - - 1)ws path - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 12 - - - 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 - - - 13 - - - 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 - - - 14 - - - - - - tls - - - xtls - - - 127, 239 - - - 60, 20 - - - 21 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 15 - - - True - - - 282, 68 - - - 293, 12 - - - 20 - - - *tcp or kcp or QUIC camouflage type or grpc mode - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 16 - - - 158, 100 - - - True - - - 300, 53 - - - 16 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 17 - - - 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 - - - 18 - - - 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 - - - 19 - - - 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 - - - 20 - - - Bottom - - - 3, 240 - - - 723, 281 - - - 21 - - - Transport - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - True @@ -1021,7 +289,7 @@ groupBox1 - 5 + 4 none @@ -1033,7 +301,7 @@ 211, 20 - 6 + 4 cmbSecurity @@ -1045,7 +313,7 @@ groupBox1 - 6 + 5 127, 185 @@ -1054,7 +322,7 @@ 211, 21 - 11 + 5 txtRemarks @@ -1066,7 +334,7 @@ groupBox1 - 7 + 6 True @@ -1093,7 +361,7 @@ groupBox1 - 8 + 7 True @@ -1120,7 +388,7 @@ groupBox1 - 9 + 8 127, 91 @@ -1129,7 +397,7 @@ 278, 21 - 5 + 2 txtId @@ -1141,7 +409,7 @@ groupBox1 - 10 + 9 True @@ -1168,7 +436,7 @@ groupBox1 - 11 + 10 127, 59 @@ -1177,7 +445,7 @@ 143, 21 - 3 + 1 txtPort @@ -1189,7 +457,7 @@ groupBox1 - 12 + 11 True @@ -1216,7 +484,7 @@ groupBox1 - 13 + 12 127, 27 @@ -1225,7 +493,7 @@ 359, 21 - 1 + 0 txtAddress @@ -1237,7 +505,7 @@ groupBox1 - 14 + 13 True @@ -1264,7 +532,7 @@ groupBox1 - 15 + 14 Fill @@ -1273,7 +541,7 @@ 0, 10 - 729, 524 + 729, 226 3 @@ -1321,7 +589,7 @@ Bottom - 0, 534 + 0, 456 729, 60 @@ -1339,7 +607,7 @@ $this - 1 + 2 Top @@ -1363,7 +631,55 @@ $this - 2 + 3 + + + Fill + + + 0, 0 + + + 729, 220 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 236 + + + 729, 220 + + + 9 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 True @@ -1375,7 +691,7 @@ 6, 12 - 729, 594 + 729, 516 Edit or add a [VLESS] server diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx index bd048332..3d03d416 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx @@ -136,126 +136,6 @@ *手填,方便识别管理 - - 149, 12 - - - 3)QUIC 加密密钥/Kcp seed - - - 95, 12 - - - 4)QUIC 加密方式 - - - 167, 12 - - - 跳过证书验证(allowInsecure) - - - 181, 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伪装类型或grpc模式 - - - 127, 102 - - - 334, 51 - - - 9, 71 - - - 89, 12 - - - 伪装类型(type) - - - 9, 102 - - - 89, 12 - - - 伪装域名(host) - - - 127, 67 - - - 底层传输方式(transport) - 353, 158 @@ -307,37 +187,6 @@ 确定(&O) - - 171, 22 - - - 导入客户端配置 - - - 171, 22 - - - 导入服务端配置 - - - 168, 6 - - - 171, 22 - - - 从剪贴板导入URL - - - - False - - - 92, 21 - - - 导入配置文件 - 编辑或添加[VLESS]服务器 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index a50084f4..6ad64150 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -31,12 +31,8 @@ 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.label21 = new System.Windows.Forms.Label(); - this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); - this.label15 = new System.Windows.Forms.Label(); - this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.cmbFlow = new System.Windows.Forms.ComboBox(); this.label4 = new System.Windows.Forms.Label(); - this.txtSNI = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); @@ -46,10 +42,13 @@ this.label2 = new System.Windows.Forms.Label(); this.txtAddress = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); 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.panel3.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // @@ -63,12 +62,8 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.label21); - this.groupBox1.Controls.Add(this.cmbAllowInsecure); - this.groupBox1.Controls.Add(this.label15); - this.groupBox1.Controls.Add(this.cmbStreamSecurity); + this.groupBox1.Controls.Add(this.cmbFlow); this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtSNI); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); @@ -82,47 +77,23 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // - // label21 + // cmbFlow // - 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"; - // - // 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.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); - this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + 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"; // - // txtSNI - // - resources.ApplyResources(this.txtSNI, "txtSNI"); - this.txtSNI.Name = "txtSNI"; - // // label13 // resources.ApplyResources(this.label13, "label13"); @@ -168,6 +139,18 @@ resources.ApplyResources(this.label1, "label1"); this.label1.Name = "label1"; // + // panel3 + // + this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // transportControl + // + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; + // // panel2 // this.panel2.Controls.Add(this.btnClose); @@ -193,6 +176,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel3); this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; @@ -201,6 +185,7 @@ this.Load += new System.EventHandler(this.AddServer6Form_Load); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); + this.panel3.ResumeLayout(false); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -222,11 +207,9 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; + private System.Windows.Forms.Panel panel3; + private ServerTransportControl transportControl; + private System.Windows.Forms.ComboBox cmbFlow; private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtSNI; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.ComboBox cmbAllowInsecure; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs index e7d35165..beab1dc7 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -14,6 +14,7 @@ namespace v2rayN.Forms private void AddServer6Form_Load(object sender, EventArgs e) { + transportControl.AllowXtls = true; if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; @@ -31,14 +32,13 @@ namespace v2rayN.Forms /// private void BindingServer() { - txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; - txtSNI.Text = vmessItem.sni; + cmbFlow.Text = vmessItem.flow; txtRemarks.Text = vmessItem.remarks; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - cmbAllowInsecure.Text = vmessItem.allowInsecure; + + transportControl.BindingServer(vmessItem); } @@ -50,10 +50,10 @@ namespace v2rayN.Forms txtAddress.Text = ""; txtPort.Text = ""; txtId.Text = ""; - txtSNI.Text = ""; + cmbFlow.Text = ""; txtRemarks.Text = ""; - cmbStreamSecurity.Text = "tls"; - cmbAllowInsecure.Text = ""; + + transportControl.ClearServer(vmessItem); } private void btnOK_Click(object sender, EventArgs e) @@ -61,10 +61,8 @@ namespace v2rayN.Forms string address = txtAddress.Text; string port = txtPort.Text; string id = txtId.Text; - string sni = txtSNI.Text; + string flow = cmbFlow.Text; string remarks = txtRemarks.Text; - string streamSecurity = cmbStreamSecurity.Text; - string allowInsecure = cmbAllowInsecure.Text; if (Utils.IsNullOrEmpty(address)) { @@ -80,15 +78,15 @@ namespace v2rayN.Forms { UI.Show(UIRes.I18N("FillPassword")); return; - } + } + + transportControl.EndBindingServer(); vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; - vmessItem.sni = sni.Replace(" ", ""); + vmessItem.flow = flow; vmessItem.remarks = remarks; - vmessItem.streamSecurity = streamSecurity; - vmessItem.allowInsecure = allowInsecure; if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 37224494..245e7469 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -117,6 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + 396, 17 @@ -143,124 +147,42 @@ 0 - - True - - - - NoControl - - - 224, 189 - - - 83, 12 - - - 33 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - + - - true + + xtls-rprx-origin - - false + + xtls-rprx-origin-udp443 - - 312, 185 + + xtls-rprx-direct - - 80, 20 + + xtls-rprx-direct-udp443 - - 32 + + 127, 123 - - cmbAllowInsecure + + 211, 20 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - True - - - NoControl - - - 12, 189 - - - 23, 12 - - - 26 - - - TLS - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - tls - - - xtls - - - 127, 185 - - - 60, 20 - - - 25 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - + 3 + + cmbFlow + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + True @@ -268,16 +190,16 @@ NoControl - 12, 156 + 12, 127 - 23, 12 + 29, 12 - 24 + 27 - SNI + Flow label4 @@ -289,34 +211,16 @@ groupBox1 - 4 - - - 127, 152 - - - 359, 21 - - - 23 - - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 + 1 True + + NoControl + - 428, 124 + 428, 158 113, 12 @@ -337,16 +241,16 @@ groupBox1 - 6 + 2 - 127, 121 + 127, 155 265, 21 - 11 + 4 txtRemarks @@ -358,13 +262,16 @@ groupBox1 - 7 + 3 True + + NoControl + - 12, 125 + 12, 159 95, 12 @@ -385,7 +292,7 @@ groupBox1 - 8 + 4 127, 91 @@ -394,7 +301,7 @@ 265, 21 - 5 + 2 txtId @@ -406,11 +313,14 @@ groupBox1 - 9 + 5 True + + NoControl + 12, 93 @@ -433,7 +343,7 @@ groupBox1 - 10 + 6 127, 59 @@ -442,7 +352,7 @@ 194, 21 - 3 + 1 txtPort @@ -454,11 +364,14 @@ groupBox1 - 11 + 7 True + + NoControl + 12, 62 @@ -481,7 +394,7 @@ groupBox1 - 12 + 8 127, 27 @@ -490,7 +403,7 @@ 359, 21 - 1 + 0 txtAddress @@ -502,11 +415,14 @@ groupBox1 - 13 + 9 True + + NoControl + 12, 31 @@ -529,7 +445,7 @@ groupBox1 - 14 + 10 Fill @@ -538,7 +454,7 @@ 0, 10 - 547, 221 + 707, 195 3 @@ -558,6 +474,57 @@ 0 + + Fill + + + 0, 0 + + + 707, 220 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 205 + + + 707, 220 + + + 8 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + 303, 17 @@ -586,10 +553,10 @@ Bottom - 0, 231 + 0, 425 - 547, 60 + 707, 60 7 @@ -604,7 +571,7 @@ $this - 1 + 2 Top @@ -613,7 +580,7 @@ 0, 0 - 547, 10 + 707, 10 6 @@ -628,7 +595,7 @@ $this - 2 + 3 True @@ -637,7 +604,180 @@ 6, 12 - 547, 291 + 707, 485 + + + + AAABAAYAICAQAAAAAADoAgAAZgAAABAQEAAAAAAAKAEAAE4DAAAgIAAAAQAIAKgIAAB2BAAAEBAAAAEA + CABoBQAAHg0AACAgAAABACAAqBAAAIYSAAAQEAAAAQAgAGgEAAAuIwAAKAAAACAAAABAAAAAAQAEAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA + /wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIoiI + iIiIiIiIiIiIiIiIiIiCIigiIiIozMzMzMzMyCIogiIoIiIiKM7m5ubm5sgiKIIiKCIiIijObm5ubm7I + IiiCIigiIiIozubm5ubmyCIogiIoIiIiKM5ubm5ubsgiKIIiKCIiIijO5ubm5ubIIiiIiIiIiIiIzm5u + bm5uyCIogRERERERGM7u7u7u7sgiKIHZWVlZWRjMzMzMzMzIIiiB1ZWVlZUYiIiIiIiIiIiIgdlZWVlZ + GDMzMzMzMzMzOIHVlZWVlRg/uLi4uLi4uDiB2VlZWVkYP7uLi4uLi4s4gdWVlZWVGD+4uLi4uLi4OIHZ + WVlZWRg/u4uLi4uLiziB1ZWVlZUYP7i4uLi4uLg4gdlZWVlZGD+7i4uLi4uLOIHVlZWVlRg/uLi4uLi4 + uDiB3d3d3d0YP7uLi4uLi4s4gRERERERGD+4uLi4uLi4OIiIiIiIiIg/u4uLi4uLiziCIiIiIiIoP7i4 + uLi4uLg4giIiIiIiKD+7i4uLi4uLOIIiIiIiIig/uLi4uLi4uDiCIiIiIiIoP7u7u7u7u7s4giIiIiIi + KD//////////OIIiIiIiIigzMzMzMzMzMziIiIiIiIiIiIiIiIiIiIiIIiIiIiIiIiIiIiIiIiIiIv// + ////////AAAAAHv4AA57+AAOe/gADnv4AA57+AAOe/gADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAB/+AAAf/gAAH/4AAB/+AAAf/gAAAAA + AAD/////KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACA + gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIoiI + iIiIiIiIgigijMzMyCiCKCKM5mbIKIiIiIzu7sgogRERjMzMyCiB2ZGIiIiIiIHZkYMzMzM4gdmRg/u7 + uziB3dGD+7u7OIEREYP7u7s4iIiIg/u7uziCIiKD+7u7OIIiIoP///84giIigzMzMziIiIiIiIiIiP// + KCIAACjObALm5mwCIigAAoiIAAKIzgAAbm4AACIoAAAREQAAGM4AAO7uAAAiKHwAWVl8ABjMfADMzAAA + IigoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/ + KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/ + KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVf + VQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADf + VQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8f + fwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqf + fwD/n38AAL9/AFW/fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUA + qgCqAKoA/wCqAAAfqgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/ + qgBVf6oAqn+qAP9/qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/f + qgAA/6oAVf+qAKr/qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/ + 1AD/P9QAAF/UAFVf1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/ + 1ACqv9QA/7/UAADf1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof + /wD/H/8AAD//AFU//wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf + /wCqn/8A/5//AAC//wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP// + MwD//2YA//+ZAP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/ + AAAA3wAAVd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/ + KgBVPyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39qoYIqoYIhqoIqgiqCaoIqgiqhqqGhoYIhoYIqv39/f0I/f39 + /ar9/f39/YY2Ng4yDg4ODgoOCgoKCgqG/f39/Yb9/f39CP39/f39qjY7Ozs3Nzc3NjMSMjIOCqr9/f39 + qv39/f2G/f39/f0IN19fOzs3Nzc3NjcODg4KCP39/f0I/f39/ar9/f39/ao6X19fXzs7Ozc3NzY3NgqG + /f39/Yb9/f39CP39/f39hl9jY19jX187Ozs7Nzc3Dqr9/f39qv39/f2G/f39/f0IOodjh19jX19fXztf + OzcOCP39/f0ICAmqCAiqCKoICapfCYdjh2ODY19fXzs7Ow6q/f39/QhITEwoSCUoKSQoqmMJCYcJCWNj + Y2NfY19fNgj9/f39qkyZmZmYmJRwlCmqX19fXl9fX186WzY3Njc2gv39/f0JcJ2dmZmZlJmUJAmqCaoJ + hggIqggICKoIqggI/f39/YZwnp2dnZmZmJVMqnx8fHx8fFR8VHhUVFRUVKr9/f39CHChoZ2dnZ2ZmUwJ + fKSkxqSkxqSkpKSkpKBUCP39/f2qcKLDoqGdnZ2ZTKp8ysakxqSkxqSkxqSkpFSq/f39/QiUpqbDoqHE + nZ1Mq3ykqMakyqSkxqSkpKSkVAj9/f39hpTIyKbHoqGhoXAIfMrLpMqkxqSkxqTGpKRUqv39/f0IlMym + yKbIpcShcAh8y6jKpMqkxsqkpKSkxlQI/f39/aqUzMzMyKbIpqJwqnzLy8qpxsqkpMakxqSkeAj9/f39 + CJSUlJSUlJSUlJQJgMupy8qpysqkyqSkxqRUqv39/f2GCKoIqgiqCKoIhgigrcvPqcuoy8qkxsqkxnyG + /f39/ar9/f39/f39/f39qnzPz6nLy8uoyqnKpKTKVAj9/f39CP39/f39/f39/f0IfNDPz8+py8upyqjG + yqR8hv39/f2G/f39/f39/f39/Qik0K7P0M+ty8vLy6jKpXyq/f39/ar9/f39/f39/f39CHzQ09Ctz8/P + qcupy6jKeAj9/f39CP39/f39/f39/f2qoNPQ0NPQ0M/Qz8vLy6l8CP39/f2G/f39/f39/f39/QmkfKR8 + oHx8fHx8fHx8fHyG/f39/aoIqgiqCKoIqgiqCKoIqgiqCKoIqgiqCKoIqgj9/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3///////////// + ///AAAAD3vgAA974AAPe+AAD3vgAA974AAPe+AADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA + AAPAAAADwAAAA8AAAAPAAAADwAAAA9/4AAPf+AAD3/gAA9/4AAPf+AAD3/gAA8AAAAP//////////ygA + AAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAA + gACAgAAAgICAAMDcwADwyqYAqj8qAP8/KgAAXyoAVV8qAKpfKgD/XyoAAH8qAFV/KgCqfyoA/38qAACf + KgBVnyoAqp8qAP+fKgAAvyoAVb8qAKq/KgD/vyoAAN8qAFXfKgCq3yoA/98qAAD/KgBV/yoAqv8qAP// + KgAAAFUAVQBVAKoAVQD/AFUAAB9VAFUfVQCqH1UA/x9VAAA/VQBVP1UAqj9VAP8/VQAAX1UAVV9VAKpf + VQD/X1UAAH9VAFV/VQCqf1UA/39VAACfVQBVn1UAqp9VAP+fVQAAv1UAVb9VAKq/VQD/v1UAAN9VAFXf + VQCq31UA/99VAAD/VQBV/1UAqv9VAP//VQAAAH8AVQB/AKoAfwD/AH8AAB9/AFUffwCqH38A/x9/AAA/ + fwBVP38Aqj9/AP8/fwAAX38AVV9/AKpffwD/X38AAH9/AFV/fwCqf38A/39/AACffwBVn38Aqp9/AP+f + fwAAv38AVb9/AKq/fwD/v38AAN9/AFXffwCq338A/99/AAD/fwBV/38Aqv9/AP//fwAAAKoAVQCqAKoA + qgD/AKoAAB+qAFUfqgCqH6oA/x+qAAA/qgBVP6oAqj+qAP8/qgAAX6oAVV+qAKpfqgD/X6oAAH+qAFV/ + qgCqf6oA/3+qAACfqgBVn6oAqp+qAP+fqgAAv6oAVb+qAKq/qgD/v6oAAN+qAFXfqgCq36oA/9+qAAD/ + qgBV/6oAqv+qAP//qgAAANQAVQDUAKoA1AD/ANQAAB/UAFUf1ACqH9QA/x/UAAA/1ABVP9QAqj/UAP8/ + 1AAAX9QAVV/UAKpf1AD/X9QAAH/UAFV/1ACqf9QA/3/UAACf1ABVn9QAqp/UAP+f1AAAv9QAVb/UAKq/ + 1AD/v9QAAN/UAFXf1ACq39QA/9/UAAD/1ABV/9QAqv/UAP//1ABVAP8AqgD/AAAf/wBVH/8Aqh//AP8f + /wAAP/8AVT//AKo//wD/P/8AAF//AFVf/wCqX/8A/1//AAB//wBVf/8Aqn//AP9//wAAn/8AVZ//AKqf + /wD/n/8AAL//AFW//wCqv/8A/7//AADf/wBV3/8Aqt//AP/f/wBV//8Aqv//AP/MzAD/zP8A//8zAP// + ZgD//5kA///MAAB/AABVfwAAqn8AAP9/AAAAnwAAVZ8AAKqfAAD/nwAAAL8AAFW/AACqvwAA/78AAADf + AABV3wAAqt8AAP/fAABV/wAAqv8AAAAAKgBVACoAqgAqAP8AKgAAHyoAVR8qAKofKgD/HyoAAD8qAFU/ + KgDw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A/f39/f39/f39/f39/f39/f0I + hgiqCKoICKoICKaGCP39qv39hv2GNg4ODjII/ar9/Yb9/ar9qjdjXzsOCP2G/f0IhquGCAleCWNfNob9 + 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 + bv+3d0n/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/FRqE/0dN1v8/RNL/Nz3Q/y40zv8nLcz/ISfK/xwh + yf8WHMf/GxJh/8K/wf/gr3r/4K96/+Cvev/gr3r/3614/9yqdf/apnL/16Nw/9Sea//Rmmj/zZZk/8qR + X//GjFz/w4dW/7+CUv/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8SHZD/WF3a/05U1/9FS9X/PUPS/zU7 + 0P8uM83/JyzL/yAmyf8aFGn/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/ + wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/xAfnP9obt7/YGTc/1Zb + 2f9NU9f/RUrU/ztB0v80OdD/LDHO/xgWcv/Cv8H/Dn+n/w18pP8MeqH/DHie/wt1m/8Kc5j/CXGV/wlv + k/8JbJD/CGqN/wdpi/8HZ4j/BmWH/wZkhf8GYoP/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/DiKp/3l+ + 4/9vdeH/Zmze/11i2/9UWtn/S1HW/0NI1P86P9H/Fhh9/8K/wf8Ogar/Barp/wGo6P8Apef/AKPm/wCi + 5P8An+L/AJ7h/wCd3/8AnN7/AJnc/wCY2/8AmNn/AJbX/wZjhP/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/ + wf8MJbX/iI7n/4CF5v93fOP/bnPg/2Vr3f9bYdv/UljY/0lP1v8UGoj/wr/B/w+Erf8Lrur/Bqvq/wOo + 6f8Apuf/AKTm/wCi5f8AoOT/AJ/i/wCd4f8AnN//AJrd/wCZ2/8AmNr/BmWH/8K/wf8AAAAAAAAAAAAA + AAAAAAAAwr/B/wkowP+WnOz/jpTq/4aL6P9+hOX/dXri/2xx4P9jaN3/WV/b/xEek//Cv8H/EIaw/xay + 7P8Or+z/Cavr/wWq6v8Bp+j/AKbn/wCj5f8AoeT/AJ/j/wCe4f8AnOD/AJve/wCa3f8HZ4n/wr/B/wAA + AAAAAAAAAAAAAAAAAADCv8H/CCrK/6Ko7/+coe7/lZrr/42T6f+Fiub/fIHl/3N54v9rcN//ECGg/8K/ + wf8QiLP/I7nu/xq07f8Ssez/C63r/war6v8Cqen/AKbo/wCk5v8AouX/AKHk/wCf4f8AneH/AJzf/who + i//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8GLNP/q7Hy/6as8P+hpu//mp/u/5OY6/+LkOj/g4nm/3qA + 5P8NI6z/wr/B/xCKtv8xvvD/J7rv/x627f8Vsuz/Dq/s/wmr6/8Equn/Aafo/wCl5/8Ao+X/AKHk/wCf + 4v8AnuH/CGqO/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wUu2/+vtPP/r7Tz/6qv8v+mq/D/oKXv/5me + 7f+Sl+v/io/p/wsmt//Cv8H/Eo24/0HF8f82wfD/LLzv/yK47v8atO3/EbHs/wut6/8Gq+r/A6np/wCm + 6P8Apeb/AKLl/wCh5P8IbJD/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/BC/h/wQv3/8FL9z/BS3Z/wYt + 1v8GLNL/ByvP/wgqy/8IKcb/CSnC/8K/wf8Sjrv/Uszy/0fH8f87w/H/Mb7v/ye67/8et+7/FbPt/w6v + 6/8IrOv/BKnp/wGo6P8Apef/AKPl/wluk//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf/Cv8H/wr/B/8K/ + wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/xKRvf9j0/P/WM/z/0zK8f9BxfH/N8Hw/yy8 + 7/8iuO7/GbTt/xGx7P8Lruv/Bqrq/wOo6f8Apuf/CnGV/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCv8H/E5LA/3Ta8/9q1fP/XtHz/1LM + 8v9Hx/H/O8Pw/zG+7/8nu+//Hrbt/xay7f8Or+v/CKzq/wSq6f8Kc5j/wr/B/wAAAAAAAAAAAAAAAAAA + AADCv8H/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK/wf8UlMH/hOD1/3rc + 9f9v2PP/ZNTy/1jO8v9NyvH/Qsbx/zbB8P8svO//I7ju/xm07f8SsOz/C67r/wt2m//Cv8H/AAAAAAAA + AAAAAAAAAAAAAMK/wf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwr/B/xSW + w/+T5vb/iuL1/3/e9P912vT/adbz/13R8/9SzPL/R8jx/zzD8P8xvvD/J7rv/x627v8Vsuz/C3ie/8K/ + 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 + Edit or add a [Trojan] server diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index 3f862d35..d6393c60 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -33,32 +33,6 @@ this.groupBox1 = new System.Windows.Forms.GroupBox(); this.btnGUID = new System.Windows.Forms.Button(); this.label13 = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label25 = new System.Windows.Forms.Label(); - this.label24 = new System.Windows.Forms.Label(); - this.label23 = new System.Windows.Forms.Label(); - this.panTlsMore = new System.Windows.Forms.Panel(); - this.txtSNI = new System.Windows.Forms.TextBox(); - 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(); - 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(); @@ -81,11 +55,12 @@ this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.panel3 = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.panTlsMore.SuspendLayout(); this.panel2.SuspendLayout(); this.menuServer.SuspendLayout(); + this.panel3.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -100,7 +75,6 @@ // 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); @@ -130,194 +104,6 @@ resources.ApplyResources(this.label13, "label13"); this.label13.Name = "label13"; // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label25); - 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; - // - // label25 - // - resources.ApplyResources(this.label25, "label25"); - this.label25.Name = "label25"; - // - // 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.txtSNI); - 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"; - // - // txtSNI - // - resources.ApplyResources(this.txtSNI, "txtSNI"); - this.txtSNI.Name = "txtSNI"; - // - // label22 - // - resources.ApplyResources(this.label22, "label22"); - this.label22.Name = "label22"; - // - // 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.GetString("cmbNetwork.Items5")}); - 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.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"); @@ -450,12 +236,25 @@ resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); // + // panel3 + // + this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // transportControl + // + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; + // // AddServerForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel3); this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); this.Controls.Add(this.menuServer); @@ -464,13 +263,10 @@ this.Load += new System.EventHandler(this.AddServerForm_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.panel3.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -493,42 +289,18 @@ 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.Label label22; - private System.Windows.Forms.TextBox txtSNI; - private System.Windows.Forms.Label label25; + private System.Windows.Forms.Panel panel3; + private ServerTransportControl transportControl; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index a7de10ad..fe344d8e 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -37,15 +37,9 @@ namespace v2rayN.Forms txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); 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; - txtSNI.Text = vmessItem.sni; + transportControl.BindingServer(vmessItem); } @@ -59,63 +53,11 @@ namespace v2rayN.Forms txtId.Text = ""; txtAlterId.Text = "0"; cmbSecurity.Text = Global.DefaultSecurity; - cmbNetwork.Text = Global.DefaultNetwork; txtRemarks.Text = ""; - cmbHeaderType.Text = Global.None; - txtRequestHost.Text = ""; - cmbStreamSecurity.Text = ""; - cmbAllowInsecure.Text = ""; - txtPath.Text = ""; - txtSNI.Text = ""; + transportControl.ClearServer(vmessItem); } - - - 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; - } - - if (network.Equals(Global.DefaultNetwork)) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network.Equals("kcp") || network.Equals("quic")) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); - } - else if (network.Equals("grpc")) - { - cmbHeaderType.Items.Add(Global.GrpcgunMode); - cmbHeaderType.Items.Add(Global.GrpcmultiMode); - } - else - { - cmbHeaderType.Items.Add(Global.None); - } - cmbHeaderType.SelectedIndex = 0; - } - + private void btnOK_Click(object sender, EventArgs e) { string address = txtAddress.Text; @@ -123,16 +65,8 @@ namespace v2rayN.Forms string id = txtId.Text; string alterId = txtAlterId.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; - string sni = txtSNI.Text; - if (Utils.IsNullOrEmpty(address)) { UI.Show(UIRes.I18N("FillServerAddress")); @@ -154,21 +88,15 @@ namespace v2rayN.Forms return; } + transportControl.EndBindingServer(); + vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; vmessItem.alterId = Utils.ToInt(alterId); 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; - vmessItem.sni = sni; - if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) { this.DialogResult = DialogResult.OK; @@ -189,19 +117,6 @@ 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 导入客户端/服务端配置 /// @@ -243,31 +158,29 @@ namespace v2rayN.Forms return; } string msg; - VmessItem vmessItem; + VmessItem vmessItemTemp; if (type.Equals(1)) { - vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); + vmessItemTemp = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); } else { - vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); + vmessItemTemp = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); } - if (vmessItem == null) + if (vmessItemTemp == null) { UI.ShowWarning(msg); return; } + vmessItem = vmessItemTemp; txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; + + transportControl.BindingServer(vmessItem); } /// @@ -279,23 +192,21 @@ namespace v2rayN.Forms { ClearServer(); - VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) + VmessItem vmessItemTemp = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + if (vmessItemTemp == null) { UI.ShowWarning(msg); return; } + vmessItem = vmessItemTemp; txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; + + transportControl.BindingServer(vmessItem); } #endregion diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index a13e5ab4..82469f68 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -194,733 +194,6 @@ 1 - - True - - - - NoControl - - - 529, 211 - - - 113, 12 - - - 36 - - - 4)grpc serviceName - - - label25 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 529, 197 - - - 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 - - - 1 - - - True - - - NoControl - - - 465, 146 - - - 89, 12 - - - 34 - - - 4)QUIC securty - - - label23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - 300, 7 - - - 197, 21 - - - 33 - - - txtSNI - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - True - - - NoControl - - - 270, 11 - - - 23, 12 - - - 32 - - - SNI - - - label22 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 1 - - - True - - - 12, 11 - - - 83, 12 - - - 31 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 2 - - - - - - true - - - false - - - 100, 7 - - - 80, 20 - - - 30 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 3 - - - 200, 234 - - - 500, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - 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 - - - 4 - - - True - - - 464, 130 - - - 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 - - - 5 - - - 127, 169 - - - True - - - 396, 54 - - - 28 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - grpc - - - 192, 28 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - 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 - - - 8 - - - 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 - - - 9 - - - True - - - 529, 183 - - - 59, 12 - - - 26 - - - 2)h2 path - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 10 - - - True - - - 464, 115 - - - 59, 12 - - - 25 - - - 2)ws host - - - label17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 11 - - - True - - - 529, 169 - - - 59, 12 - - - 24 - - - 1)ws path - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 12 - - - True - - - 464, 100 - - - 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 - - - 13 - - - 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 - - - 14 - - - - - - tls - - - 127, 239 - - - 60, 20 - - - 21 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 15 - - - True - - - 282, 66 - - - 293, 12 - - - 20 - - - *tcp or kcp or QUIC camouflage type or grpc mode - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 16 - - - 158, 100 - - - True - - - 300, 53 - - - 16 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 17 - - - True - - - 9, 66 - - - 95, 12 - - - 19 - - - Camouflage type - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 18 - - - 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 - - - 19 - - - 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 - - - 20 - - - 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 - - - 2 - True @@ -946,7 +219,7 @@ groupBox1 - 3 + 2 aes-128-gcm @@ -970,7 +243,7 @@ 210, 20 - 6 + 4 cmbSecurity @@ -982,7 +255,7 @@ groupBox1 - 4 + 3 127, 171 @@ -991,7 +264,7 @@ 278, 21 - 11 + 5 txtRemarks @@ -1003,7 +276,7 @@ groupBox1 - 5 + 4 True @@ -1030,7 +303,7 @@ groupBox1 - 6 + 5 True @@ -1057,7 +330,7 @@ groupBox1 - 7 + 6 127, 114 @@ -1066,7 +339,7 @@ 143, 21 - 7 + 3 txtAlterId @@ -1078,7 +351,7 @@ groupBox1 - 8 + 7 True @@ -1105,7 +378,7 @@ groupBox1 - 9 + 8 127, 85 @@ -1114,7 +387,7 @@ 278, 21 - 5 + 2 txtId @@ -1126,7 +399,7 @@ groupBox1 - 10 + 9 True @@ -1153,7 +426,7 @@ groupBox1 - 11 + 10 127, 56 @@ -1162,7 +435,7 @@ 143, 21 - 3 + 1 txtPort @@ -1174,7 +447,7 @@ groupBox1 - 12 + 11 True @@ -1201,7 +474,7 @@ groupBox1 - 13 + 12 127, 27 @@ -1210,7 +483,7 @@ 359, 21 - 1 + 0 txtAddress @@ -1222,7 +495,7 @@ groupBox1 - 14 + 13 True @@ -1249,8 +522,9 @@ groupBox1 - 15 + 14 + Fill @@ -1258,7 +532,7 @@ 0, 35 - 729, 499 + 729, 219 3 @@ -1306,7 +580,7 @@ Bottom - 0, 534 + 0, 474 729, 60 @@ -1324,7 +598,7 @@ $this - 1 + 2 Top @@ -1348,7 +622,7 @@ $this - 2 + 3 17, 17 @@ -1399,7 +673,55 @@ $this - 3 + 4 + + + Fill + + + 0, 0 + + + 729, 220 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 254 + + + 729, 220 + + + 9 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 True @@ -1411,7 +733,7 @@ 6, 12 - 729, 594 + 729, 534 Edit or add a [VMess] server diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index a8f9b0ae..47b4d4cd 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -130,21 +130,12 @@ 149, 12 - - 3)QUIC 加密密钥/Kcp seed - 95, 12 - - 4)QUIC 加密方式 - 167, 12 - - 跳过证书验证(allowInsecure) - 180, 7 @@ -154,15 +145,9 @@ 143, 12 - - *默认tcp,选错会无法连接 - 149, 12 - - 3)h2 host中间逗号(,)隔开 - 127, 168 @@ -178,33 +163,21 @@ 107, 12 - - 传输协议(network) - 9, 168 65, 12 - - 路径(path) - 161, 12 - - 1)http host中间逗号(,)隔开 - 9, 237 107, 12 - - 底层传输安全(tls) - 127, 237 @@ -214,9 +187,6 @@ 197, 12 - - *tcp或kcp或QUIC伪装类型或grpc模式 - 127, 102 @@ -229,24 +199,15 @@ 89, 12 - - 伪装类型(type) - 9, 102 89, 12 - - 伪装域名(host) - 127, 67 - - 底层传输方式(transport) - 113, 12 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx index caef34ad..481e5f26 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -171,8 +171,8 @@ panel1 - - $this + + 3 75, 23 @@ -267,8 +267,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 47, 12 + + 8 txtCustomIcon @@ -292,7 +292,7 @@ 95, 21 - 128*128 + PNG(128*128) panel1 @@ -324,8 +324,8 @@ cmsLv - - 8 + + 5 Add @@ -342,8 +342,8 @@ tabPage2 - - toolStripMenuItem1 + + 644, 48 menuMoveBottom @@ -375,8 +375,8 @@ RoutingRuleSettingForm - - panel2 + + 166, 21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -390,6 +390,9 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuServer + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -402,6 +405,9 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + btnClose + Up (U) @@ -411,9 +417,6 @@ btnOK - - 53, 12 - 47, 12 @@ -432,14 +435,11 @@ $this - - panel2 - 3, 3 - 18, 117 + 10, 117 menuImportRulesFromClipboard @@ -480,6 +480,9 @@ 660, 104 + + $this + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -500,14 +503,11 @@ 34 - - 36 - 2 - - 247, 22 + + 1 label4 @@ -521,8 +521,8 @@ True - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 247, 22 panel2 @@ -545,18 +545,15 @@ 91, 45 - - 166, 21 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 644, 48 - menuMoveDown + + panel2 + 202, 22 @@ -575,8 +572,8 @@ 11 - - 3 + + panel2 7 @@ -590,9 +587,6 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 5 - panel1 @@ -620,6 +614,9 @@ RuleList + + toolStripMenuItem1 + 563, 21 @@ -629,8 +626,8 @@ Select All (Ctrl+A) - - btnClose + + 53, 12 Fill @@ -653,8 +650,8 @@ Export Selected Rules - - menuServer + + 36 91, 13 @@ -728,6 +725,9 @@ NoControl + + 77, 12 + 0 @@ -755,8 +755,8 @@ txtRemarks - - 1 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx index d6544331..6c7dcd5f 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx @@ -136,6 +136,9 @@ 670, 104 + + 浏览(&B) + 101, 105 diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs new file mode 100644 index 00000000..db395e1e --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs @@ -0,0 +1,243 @@ +namespace v2rayN.Forms +{ + partial class ServerTransportControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerTransportControl)); + this.gbTransport = new System.Windows.Forms.GroupBox(); + this.panTlsMore = new System.Windows.Forms.Panel(); + this.txtSNI = new System.Windows.Forms.TextBox(); + this.labSNI = new System.Windows.Forms.Label(); + this.labAllowInsecure = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.tipNetwork = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.labNetwork = new System.Windows.Forms.Label(); + this.labPath = new System.Windows.Forms.Label(); + this.tipPath = new System.Windows.Forms.Label(); + this.tipRequestHost = new System.Windows.Forms.Label(); + this.labStreamSecurity = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.tipHeaderType = new System.Windows.Forms.Label(); + this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.labHeaderType = new System.Windows.Forms.Label(); + this.labRequestHost = new System.Windows.Forms.Label(); + this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.gbTransport.SuspendLayout(); + this.panTlsMore.SuspendLayout(); + this.SuspendLayout(); + // + // gbTransport + // + this.gbTransport.Controls.Add(this.panTlsMore); + this.gbTransport.Controls.Add(this.tipNetwork); + this.gbTransport.Controls.Add(this.txtPath); + this.gbTransport.Controls.Add(this.cmbNetwork); + this.gbTransport.Controls.Add(this.labNetwork); + this.gbTransport.Controls.Add(this.labPath); + this.gbTransport.Controls.Add(this.tipPath); + this.gbTransport.Controls.Add(this.tipRequestHost); + this.gbTransport.Controls.Add(this.labStreamSecurity); + this.gbTransport.Controls.Add(this.cmbStreamSecurity); + this.gbTransport.Controls.Add(this.tipHeaderType); + this.gbTransport.Controls.Add(this.txtRequestHost); + this.gbTransport.Controls.Add(this.labHeaderType); + this.gbTransport.Controls.Add(this.labRequestHost); + this.gbTransport.Controls.Add(this.cmbHeaderType); + resources.ApplyResources(this.gbTransport, "gbTransport"); + this.gbTransport.Name = "gbTransport"; + this.gbTransport.TabStop = false; + // + // panTlsMore + // + this.panTlsMore.Controls.Add(this.txtSNI); + this.panTlsMore.Controls.Add(this.labSNI); + this.panTlsMore.Controls.Add(this.labAllowInsecure); + this.panTlsMore.Controls.Add(this.cmbAllowInsecure); + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Name = "panTlsMore"; + // + // txtSNI + // + resources.ApplyResources(this.txtSNI, "txtSNI"); + this.txtSNI.Name = "txtSNI"; + // + // labSNI + // + resources.ApplyResources(this.labSNI, "labSNI"); + this.labSNI.Name = "labSNI"; + // + // labAllowInsecure + // + resources.ApplyResources(this.labAllowInsecure, "labAllowInsecure"); + this.labAllowInsecure.Name = "labAllowInsecure"; + // + // 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"; + // + // tipNetwork + // + resources.ApplyResources(this.tipNetwork, "tipNetwork"); + this.tipNetwork.Name = "tipNetwork"; + // + // 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.GetString("cmbNetwork.Items5")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // labNetwork + // + resources.ApplyResources(this.labNetwork, "labNetwork"); + this.labNetwork.Name = "labNetwork"; + // + // labPath + // + resources.ApplyResources(this.labPath, "labPath"); + this.labPath.Name = "labPath"; + // + // tipPath + // + resources.ApplyResources(this.tipPath, "tipPath"); + this.tipPath.Name = "tipPath"; + // + // tipRequestHost + // + resources.ApplyResources(this.tipRequestHost, "tipRequestHost"); + this.tipRequestHost.Name = "tipRequestHost"; + // + // labStreamSecurity + // + resources.ApplyResources(this.labStreamSecurity, "labStreamSecurity"); + this.labStreamSecurity.Name = "labStreamSecurity"; + // + // cmbStreamSecurity + // + this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbStreamSecurity.FormattingEnabled = true; + resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); + // + // tipHeaderType + // + resources.ApplyResources(this.tipHeaderType, "tipHeaderType"); + this.tipHeaderType.Name = "tipHeaderType"; + // + // txtRequestHost + // + resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); + this.txtRequestHost.Name = "txtRequestHost"; + // + // labHeaderType + // + resources.ApplyResources(this.labHeaderType, "labHeaderType"); + this.labHeaderType.Name = "labHeaderType"; + // + // labRequestHost + // + resources.ApplyResources(this.labRequestHost, "labRequestHost"); + this.labRequestHost.Name = "labRequestHost"; + // + // 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"; + // + // ServerTransportControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.gbTransport); + this.Name = "ServerTransportControl"; + this.Load += new System.EventHandler(this.ServerTransportControl_Load); + this.gbTransport.ResumeLayout(false); + this.gbTransport.PerformLayout(); + this.panTlsMore.ResumeLayout(false); + this.panTlsMore.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox gbTransport; + private System.Windows.Forms.Panel panTlsMore; + private System.Windows.Forms.TextBox txtSNI; + private System.Windows.Forms.Label labSNI; + private System.Windows.Forms.Label labAllowInsecure; + private System.Windows.Forms.ComboBox cmbAllowInsecure; + private System.Windows.Forms.Label tipNetwork; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.ComboBox cmbNetwork; + private System.Windows.Forms.Label labNetwork; + private System.Windows.Forms.Label labPath; + private System.Windows.Forms.Label tipPath; + private System.Windows.Forms.Label tipRequestHost; + private System.Windows.Forms.Label labStreamSecurity; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.Label tipHeaderType; + private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.Label labHeaderType; + private System.Windows.Forms.Label labRequestHost; + private System.Windows.Forms.ComboBox cmbHeaderType; + } +} diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs new file mode 100644 index 00000000..40c6a9c5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -0,0 +1,179 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class ServerTransportControl : UserControl + { + public bool AllowXtls { get; set; } + private VmessItem vmessItem = null; + + public ServerTransportControl() + { + InitializeComponent(); + } + private void ServerTransportControl_Load(object sender, EventArgs e) + { + } + + private void Init(VmessItem item) + { + vmessItem = item; + + cmbStreamSecurity.Items.Clear(); + cmbStreamSecurity.Items.Add(string.Empty); + cmbStreamSecurity.Items.Add(Global.StreamSecurity); + if (AllowXtls) + { + cmbStreamSecurity.Items.Add(Global.StreamSecurityX); + } + } + + public void BindingServer(VmessItem item) + { + Init(item); + + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; + txtSNI.Text = vmessItem.sni; + } + + public void ClearServer(VmessItem item) + { + Init(item); + + cmbNetwork.Text = Global.DefaultNetwork; + cmbHeaderType.Text = Global.None; + txtRequestHost.Text = ""; + cmbStreamSecurity.Text = ""; + cmbAllowInsecure.Text = ""; + txtPath.Text = ""; + txtSNI.Text = ""; + } + + public void EndBindingServer() + { + string network = cmbNetwork.Text; + string headerType = cmbHeaderType.Text; + string requestHost = txtRequestHost.Text; + string path = txtPath.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; + string sni = txtSNI.Text; + + vmessItem.network = network; + vmessItem.headerType = headerType; + vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.path = path.Replace(" ", ""); + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; + vmessItem.sni = sni; + } + + private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) + { + SetHeaderType(); + SetTips(); + } + + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); + + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } + + if (network.Equals(Global.DefaultNetwork)) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network.Equals("kcp") || network.Equals("quic")) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.Add("srtp"); + cmbHeaderType.Items.Add("utp"); + cmbHeaderType.Items.Add("wechat-video"); + cmbHeaderType.Items.Add("dtls"); + cmbHeaderType.Items.Add("wireguard"); + } + else if (network.Equals("grpc")) + { + cmbHeaderType.Items.Add(Global.GrpcgunMode); + cmbHeaderType.Items.Add(Global.GrpcmultiMode); + } + else + { + cmbHeaderType.Items.Add(Global.None); + } + cmbHeaderType.SelectedIndex = 0; + } + + private void SetTips() + { + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + network = Global.DefaultNetwork; + } + labHeaderType.Visible = true; + tipRequestHost.Text = + tipPath.Text = + tipHeaderType.Text = string.Empty; + + if (network.Equals(Global.DefaultNetwork)) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip1"); + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip1"); + } + else if (network.Equals("kcp")) + { + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip2"); + } + else if (network.Equals("ws")) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip2"); + tipPath.Text = UIRes.I18N("TransportPathTip1"); + } + else if (network.Equals("h2")) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip3"); + tipPath.Text = UIRes.I18N("TransportPathTip2"); + } + else if (network.Equals("quic")) + { + tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip4"); + tipPath.Text = UIRes.I18N("TransportPathTip3"); + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip3"); + } + else if (network.Equals("grpc")) + { + tipPath.Text = UIRes.I18N("TransportPathTip4"); + tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip4"); + labHeaderType.Visible = false; + } + } + + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.resx new file mode 100644 index 00000000..32e2e234 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.resx @@ -0,0 +1,717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 300, 7 + + + 197, 21 + + + + 1 + + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + + NoControl + + + 270, 11 + + + 23, 12 + + + 32 + + + SNI + + + labSNI + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + True + + + NoControl + + + 12, 11 + + + 83, 12 + + + 31 + + + allowInsecure + + + labAllowInsecure + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 2 + + + + + + true + + + false + + + 100, 7 + + + 80, 20 + + + 0 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 3 + + + 200, 171 + + + 500, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 0 + + + True + + + NoControl + + + 350, 32 + + + 113, 12 + + + 15 + + + *Default value tcp + + + tipNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 1 + + + 127, 136 + + + True + + + 396, 20 + + + 4 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 2 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + grpc + + + 192, 28 + + + 143, 20 + + + 1 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 3 + + + True + + + NoControl + + + 9, 32 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + labNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 4 + + + True + + + NoControl + + + 9, 140 + + + 29, 12 + + + 27 + + + Path + + + labPath + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 5 + + + True + + + NoControl + + + 529, 140 + + + 11, 12 + + + 24 + + + * + + + tipPath + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 6 + + + True + + + NoControl + + + 464, 104 + + + 11, 12 + + + 23 + + + * + + + tipRequestHost + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 7 + + + True + + + NoControl + + + 9, 182 + + + 23, 12 + + + 22 + + + TLS + + + labStreamSecurity + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 8 + + + 127, 178 + + + 60, 20 + + + 5 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 9 + + + True + + + NoControl + + + 282, 66 + + + 11, 12 + + + 20 + + + * + + + tipHeaderType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 10 + + + 158, 100 + + + True + + + 300, 20 + + + 3 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 11 + + + True + + + NoControl + + + 9, 66 + + + 95, 12 + + + 19 + + + Camouflage type + + + labHeaderType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 12 + + + True + + + NoControl + + + 9, 104 + + + 143, 12 + + + 17 + + + Camouflage domain(host) + + + labRequestHost + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 13 + + + none + + + http + + + srtp + + + utp + + + wechat-video + + + dtls + + + wireguard + + + 127, 64 + + + 143, 20 + + + 2 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 14 + + + Fill + + + 0, 0 + + + 723, 220 + + + 22 + + + Transport + + + gbTransport + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 12 + + + 723, 220 + + + ServerTransportControl + + + 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/ServerTransportControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx new file mode 100644 index 00000000..a70f28e7 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 167, 12 + + + 跳过证书验证(allowInsecure) + + + 183, 7 + + + 143, 12 + + + *默认tcp,选错会无法连接 + + + 127, 28 + + + 208, 20 + + + 107, 12 + + + 传输协议(network) + + + 65, 12 + + + 路径(path) + + + 107, 12 + + + 底层传输安全(tls) + + + 203, 12 + + + 127, 100 + + + 331, 20 + + + 89, 12 + + + 伪装类型(type) + + + 89, 12 + + + 伪装域名(host) + + + 底层传输方式(transport) + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 739d8d3b..a9f2eb65 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -639,8 +639,10 @@ namespace v2rayN.Handler vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); - - vmessItem.streamSecurity = Global.StreamSecurity; + if (Utils.IsNullOrEmpty(vmessItem.streamSecurity)) + { + vmessItem.streamSecurity = Global.StreamSecurity; + } if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { vmessItem.allowInsecure = config.defAllowInsecure.ToString(); diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 325b6654..65756763 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -30,207 +30,25 @@ namespace v2rayN.Handler string url = string.Empty; VmessItem item = config.vmess[index]; - if (item.configType == (int)EConfigType.Vmess) - { - VmessQRCode vmessQRCode = new VmessQRCode - { - v = item.configVersion.ToString(), - ps = item.remarks.TrimEx(), //备注也许很长 ; - add = item.address, - port = item.port.ToString(), - id = item.id, - aid = item.alterId.ToString(), - scy = item.security, - net = item.network, - type = item.headerType, - host = item.requestHost, - path = item.path, - tls = item.streamSecurity, - sni = item.sni - }; - - url = Utils.ToJson(vmessQRCode); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}", Global.vmessProtocol, url); - - } - else if (item.configType == (int)EConfigType.Shadowsocks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - item.security, - item.id, - item.address, - item.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); - } - else if (item.configType == (int)EConfigType.Socks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - item.security, - item.id, - item.address, - item.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); - } - else if (item.configType == (int)EConfigType.Trojan) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - string query = string.Empty; - if (!Utils.IsNullOrEmpty(item.sni)) - { - query = string.Format("?sni={0}", Utils.UrlEncode(item.sni)); - } - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); - } - else if (item.configType == (int)EConfigType.VLESS) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(item.remarks)) - { - remark = "#" + Utils.UrlEncode(item.remarks); - } - var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.flow)) - { - dicQuery.Add("flow", item.flow); - } - if (!Utils.IsNullOrEmpty(item.security)) - { - dicQuery.Add("encryption", item.security); - } - else - { - dicQuery.Add("encryption", "none"); - } - if (!Utils.IsNullOrEmpty(item.streamSecurity)) - { - dicQuery.Add("security", item.streamSecurity); - } - else - { - dicQuery.Add("security", "none"); - } - if (!Utils.IsNullOrEmpty(item.sni)) - { - dicQuery.Add("sni", item.sni); - } - if (!Utils.IsNullOrEmpty(item.network)) - { - dicQuery.Add("type", item.network); - } - else - { - dicQuery.Add("type", "tcp"); - } - - switch (item.network) - { - case "tcp": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - break; - case "kcp": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("seed", Utils.UrlEncode(item.path)); - } - break; - - case "ws": - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.path)); - } - break; - - case "http": - case "h2": - dicQuery["type"] = "http"; - if (!Utils.IsNullOrEmpty(item.requestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); - } - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.path)); - } - break; - - case "quic": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } - dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); - dicQuery.Add("key", Utils.UrlEncode(item.path)); - break; - case "grpc": - if (!Utils.IsNullOrEmpty(item.path)) - { - dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); - if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode) - { - dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); - } - } - break; - } - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); - } - else + switch (item.configType) { + case (int)EConfigType.Vmess: + url = ShareVmess(item); + break; + case (int)EConfigType.Shadowsocks: + url = ShareShadowsocks(item); + break; + case (int)EConfigType.Socks: + url = ShareSocks(item); + break; + case (int)EConfigType.Trojan: + url = ShareTrojan(item); + break; + case (int)EConfigType.VLESS: + url = ShareVLESS(item); + break; + default: + break; } return url; } @@ -240,6 +58,224 @@ namespace v2rayN.Handler } } + private static string ShareVmess(VmessItem item) + { + string url = string.Empty; + + VmessQRCode vmessQRCode = new VmessQRCode + { + v = item.configVersion.ToString(), + ps = item.remarks.TrimEx(), //备注也许很长 ; + add = item.address, + port = item.port.ToString(), + id = item.id, + aid = item.alterId.ToString(), + scy = item.security, + net = item.network, + type = item.headerType, + host = item.requestHost, + path = item.path, + tls = item.streamSecurity, + sni = item.sni + }; + + url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + + return url; + } + + private static string ShareShadowsocks(VmessItem item) + { + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + item.security, + item.id, + item.address, + item.port); + url = Utils.Base64Encode(url); + //new + //var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + //url = $"{pw}@{item.address}:{ item.port}"; + url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); + return url; + } + + private static string ShareSocks(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + item.security, + item.id, + item.address, + item.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); + return url; + } + + private static string ShareTrojan(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + string query = string.Empty; + if (!Utils.IsNullOrEmpty(item.sni)) + { + query = string.Format("?sni={0}", Utils.UrlEncode(item.sni)); + } + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); + return url; + } + + private static string ShareVLESS(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.flow)) + { + dicQuery.Add("flow", item.flow); + } + if (!Utils.IsNullOrEmpty(item.security)) + { + dicQuery.Add("encryption", item.security); + } + else + { + dicQuery.Add("encryption", "none"); + } + if (!Utils.IsNullOrEmpty(item.streamSecurity)) + { + dicQuery.Add("security", item.streamSecurity); + } + else + { + dicQuery.Add("security", "none"); + } + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } + if (!Utils.IsNullOrEmpty(item.network)) + { + dicQuery.Add("type", item.network); + } + else + { + dicQuery.Add("type", "tcp"); + } + + switch (item.network) + { + case "tcp": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + break; + case "kcp": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("seed", Utils.UrlEncode(item.path)); + } + break; + + case "ws": + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case "http": + case "h2": + dicQuery["type"] = "http"; + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case "quic": + if (!Utils.IsNullOrEmpty(item.headerType)) + { + dicQuery.Add("headerType", item.headerType); + } + else + { + dicQuery.Add("headerType", "none"); + } + dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); + dicQuery.Add("key", Utils.UrlEncode(item.path)); + break; + case "grpc": + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); + if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode) + { + dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); + } + } + break; + } + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); + return url; + } private static string GetIpv6(string address) { return Utils.IsIpv6(address) ? $"[{address}]" : address; @@ -279,50 +315,7 @@ namespace v2rayN.Handler } else { - vmessItem.configType = (int)EConfigType.Vmess; - result = result.Substring(Global.vmessProtocol.Length); - result = Utils.Base64Decode(result); - - //转成Json - VmessQRCode vmessQRCode = Utils.FromJson(result); - if (vmessQRCode == null) - { - msg = UIRes.I18N("FailedConversionConfiguration"); - return null; - } - - vmessItem.network = Global.DefaultNetwork; - vmessItem.headerType = Global.None; - - vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); - vmessItem.remarks = Utils.ToString(vmessQRCode.ps); - vmessItem.address = Utils.ToString(vmessQRCode.add); - vmessItem.port = Utils.ToInt(vmessQRCode.port); - vmessItem.id = Utils.ToString(vmessQRCode.id); - vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); - vmessItem.security = Utils.ToString(vmessQRCode.scy); - - if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) - { - vmessItem.security = vmessQRCode.scy; - } - else - { - vmessItem.security = Global.DefaultSecurity; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.net)) - { - vmessItem.network = vmessQRCode.net; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.type)) - { - vmessItem.headerType = vmessQRCode.type; - } - - vmessItem.requestHost = Utils.ToString(vmessQRCode.host); - vmessItem.path = Utils.ToString(vmessQRCode.path); - vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); - vmessItem.sni = Utils.ToString(vmessQRCode.sni); + vmessItem = ResolveVmess(result, out msg); } ConfigHandler.UpgradeServerVersion(ref vmessItem); @@ -351,69 +344,13 @@ namespace v2rayN.Handler { msg = UIRes.I18N("ConfigurationFormatIncorrect"); - vmessItem.configType = (int)EConfigType.Socks; - result = result.Substring(Global.socksProtocol.Length); - //remark - int indexRemark = result.IndexOf("#"); - if (indexRemark > 0) - { - try - { - vmessItem.remarks = Utils.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; - } - 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 = ResolveSocks(result); } else if (result.StartsWith(Global.trojanProtocol)) { msg = UIRes.I18N("ConfigurationFormatIncorrect"); - vmessItem.configType = (int)EConfigType.Trojan; - - Uri uri = new Uri(result); - vmessItem.address = uri.IdnHost; - vmessItem.port = uri.Port; - vmessItem.id = uri.UserInfo; - - var qurery = HttpUtility.ParseQueryString(uri.Query); - vmessItem.sni = qurery["sni"] ?? ""; - - var remarks = uri.Fragment.Replace("#", ""); - if (Utils.IsNullOrEmpty(remarks)) - { - vmessItem.remarks = "NONE"; - } - else - { - vmessItem.remarks = Utils.UrlDecode(remarks); - } + vmessItem = ResolveTrojan(result); } else if (result.StartsWith(Global.vlessProtocol)) { @@ -436,6 +373,58 @@ namespace v2rayN.Handler return vmessItem; } + private static VmessItem ResolveVmess(string result, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode vmessQRCode = Utils.FromJson(result); + if (vmessQRCode == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + + vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); + vmessItem.remarks = Utils.ToString(vmessQRCode.ps); + vmessItem.address = Utils.ToString(vmessQRCode.add); + vmessItem.port = Utils.ToInt(vmessQRCode.port); + vmessItem.id = Utils.ToString(vmessQRCode.id); + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + vmessItem.security = Utils.ToString(vmessQRCode.scy); + + if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) + { + vmessItem.security = vmessQRCode.scy; + } + else + { + vmessItem.security = Global.DefaultSecurity; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.net)) + { + vmessItem.network = vmessQRCode.net; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.type)) + { + vmessItem.headerType = vmessQRCode.type; + } + + vmessItem.requestHost = Utils.ToString(vmessQRCode.host); + vmessItem.path = Utils.ToString(vmessQRCode.path); + vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); + vmessItem.sni = Utils.ToString(vmessQRCode.sni); + + return vmessItem; + } private static VmessItem ResolveVmess4Kitsunebi(string result) { @@ -476,6 +465,92 @@ namespace v2rayN.Handler return vmessItem; } + 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 = Utils.UrlDecode(h1); + i.path = p1; + break; + + case "http": + case "h2": + i.network = "h2"; + string p2 = q["path"] ?? "/"; + string h2 = q["host"] ?? ""; + i.requestHost = Utils.UrlDecode(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 = Utils.UrlDecode(s); + i.path = k; + break; + + default: + return null; + } + + return i; + } + private static VmessItem ResolveSip002(string result) { Uri parsedUrl; @@ -563,92 +638,77 @@ namespace v2rayN.Handler 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) + private static VmessItem ResolveSocks(string result) { - VmessItem i = new VmessItem + VmessItem vmessItem = new VmessItem(); + vmessItem.configType = (int)EConfigType.Socks; + result = result.Substring(Global.socksProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) { - configType = (int)EConfigType.Vmess, - security = "auto" - }; + try + { + vmessItem.remarks = Utils.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); + } - 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)) + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) { return null; } - i.alterId = aid; - - if (m.Groups["streamSecurity"].Success) + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) { - i.streamSecurity = m.Groups["streamSecurity"].Value; - } - switch (i.streamSecurity) - { - case "tls": - // TODO tls config - break; - default: - if (!string.IsNullOrWhiteSpace(i.streamSecurity)) - return null; - break; + 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]; - 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 = Utils.UrlDecode(h1); - i.path = p1; - break; - - case "http": - case "h2": - i.network = "h2"; - string p2 = q["path"] ?? "/"; - string h2 = q["host"] ?? ""; - i.requestHost = Utils.UrlDecode(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 = Utils.UrlDecode(s); - i.path = k; - break; - - default: - return null; - } - - return i; + return vmessItem; } + private static VmessItem ResolveTrojan(string result) + { + VmessItem vmessItem = new VmessItem(); + + vmessItem.configType = (int)EConfigType.Trojan; + + Uri uri = new Uri(result); + vmessItem.address = uri.IdnHost; + vmessItem.port = uri.Port; + vmessItem.id = uri.UserInfo; + + var qurery = HttpUtility.ParseQueryString(uri.Query); + vmessItem.sni = qurery["sni"] ?? ""; + + var remarks = uri.Fragment.Replace("#", ""); + if (Utils.IsNullOrEmpty(remarks)) + { + vmessItem.remarks = "NONE"; + } + else + { + vmessItem.remarks = Utils.UrlDecode(remarks); + } + return vmessItem; + } private static VmessItem ResolveStdVLESS(string result) { VmessItem item = new VmessItem @@ -702,7 +762,7 @@ namespace v2rayN.Handler break; case "grpc": item.path = Utils.UrlDecode(query["serviceName"] ?? ""); - item.headerType= Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); + item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); break; default: return null; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 61df26d0..972c8309 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -525,9 +525,26 @@ namespace v2rayN.Handler serversItem.address = config.address(); serversItem.port = config.port(); serversItem.password = config.id(); + serversItem.flow = string.Empty; serversItem.ota = false; serversItem.level = 1; + + //if xtls + if (config.streamSecurity() == Global.StreamSecurityX) + { + if (Utils.IsNullOrEmpty(config.flow())) + { + serversItem.flow = "xtls-rprx-origin"; + } + else + { + serversItem.flow = config.flow().Replace("splice", "direct"); + } + + outbound.mux.enabled = false; + outbound.mux.concurrency = -1; + } outbound.mux.enabled = false; outbound.mux.concurrency = -1; diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 3cbd5c9a..b2680243 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -25,7 +25,7 @@ namespace v2rayN.Mode /// 统计需要, 空对象 /// public Stats stats { get; set; } - + /// public API api { get; set; } @@ -133,14 +133,14 @@ namespace v2rayN.Mode /// public List clients { get; set; } - + /// /// VLESS /// public string decryption { get; set; } public bool allowTransparent { get; set; } - + } public class UsersItem @@ -170,7 +170,7 @@ namespace v2rayN.Mode /// /// VLESS /// - public string flow { get; set; } + public string flow { get; set; } } public class Sniffing { @@ -271,6 +271,11 @@ namespace v2rayN.Mode /// public int level { get; set; } + /// + /// trojan + /// + public string flow { get; set; } + /// /// /// @@ -402,7 +407,7 @@ namespace v2rayN.Mode } public class TcpSettings - { + { /// /// 数据包头部伪装设置 /// @@ -466,7 +471,7 @@ namespace v2rayN.Mode } public class WsSettings - { + { /// /// /// diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 2145ed2a..e46c2dff 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -195,6 +195,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 + /// + internal static string FillCorrectDNSText { + get { + return ResourceManager.GetString("FillCorrectDNSText", resourceCulture); + } + } + /// /// 查找类似 Please fill in the correct format server port 的本地化字符串。 /// @@ -897,5 +906,113 @@ namespace v2rayN.Resx { return ResourceManager.GetString("TestMeOutput", resourceCulture); } } + + /// + /// 查找类似 1)tcp camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip1 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip1", resourceCulture); + } + } + + /// + /// 查找类似 2)kcp camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip2 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip2", resourceCulture); + } + } + + /// + /// 查找类似 3)QUIC camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip3 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip3", resourceCulture); + } + } + + /// + /// 查找类似 4)grpc mode 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip4 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip4", resourceCulture); + } + } + + /// + /// 查找类似 1)ws path 的本地化字符串。 + /// + internal static string TransportPathTip1 { + get { + return ResourceManager.GetString("TransportPathTip1", resourceCulture); + } + } + + /// + /// 查找类似 2)h2 path 的本地化字符串。 + /// + internal static string TransportPathTip2 { + get { + return ResourceManager.GetString("TransportPathTip2", resourceCulture); + } + } + + /// + /// 查找类似 3)QUIC key/Kcp seed 的本地化字符串。 + /// + internal static string TransportPathTip3 { + get { + return ResourceManager.GetString("TransportPathTip3", resourceCulture); + } + } + + /// + /// 查找类似 4)grpc serviceName 的本地化字符串。 + /// + internal static string TransportPathTip4 { + get { + return ResourceManager.GetString("TransportPathTip4", resourceCulture); + } + } + + /// + /// 查找类似 1)http host Separated by commas (,) 的本地化字符串。 + /// + internal static string TransportRequestHostTip1 { + get { + return ResourceManager.GetString("TransportRequestHostTip1", resourceCulture); + } + } + + /// + /// 查找类似 2)ws host 的本地化字符串。 + /// + internal static string TransportRequestHostTip2 { + get { + return ResourceManager.GetString("TransportRequestHostTip2", resourceCulture); + } + } + + /// + /// 查找类似 3)h2 host Separated by commas (,) 的本地化字符串。 + /// + internal static string TransportRequestHostTip3 { + get { + return ResourceManager.GetString("TransportRequestHostTip3", resourceCulture); + } + } + + /// + /// 查找类似 4)QUIC securty 的本地化字符串。 + /// + internal static string TransportRequestHostTip4 { + get { + return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); + } + } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index b58ee145..1bf358cb 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -397,4 +397,43 @@ Custom Icon + + Please fill in the correct custom DNS + + + 1)ws path + + + 2)h2 path + + + 3)QUIC key/Kcp seed + + + 4)grpc serviceName + + + 1)http host Separated by commas (,) + + + 2)ws host + + + 3)h2 host Separated by commas (,) + + + 4)QUIC securty + + + 1)tcp camouflage type + + + 2)kcp camouflage type + + + 3)QUIC camouflage type + + + 4)grpc mode + \ 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 64ca6267..2bf6f56e 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -397,4 +397,43 @@ 自定义图标 + + 请填写正确的自定义DNS + + + 1)ws path + + + 2)h2 path + + + 3)QUIC 加密密钥/Kcp seed + + + 4)grpc serviceName + + + 1)http host中间逗号(,)隔开 + + + 2)ws host + + + 3)h2 host中间逗号(,)隔开 + + + 4)QUIC 加密方式 + + + 1)tcp伪装类型 + + + 2)kcp伪装类型 + + + 3)QUIC伪装类型 + + + 4)grpc 模式 + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 98fc93a2..b2601936 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -143,6 +143,12 @@ RoutingRuleSettingForm.cs + + UserControl + + + ServerTransportControl.cs + @@ -256,6 +262,7 @@ + @@ -336,6 +343,12 @@ RoutingRuleSettingForm.cs + + ServerTransportControl.cs + + + ServerTransportControl.cs + SubSettingControl.cs Designer @@ -484,6 +497,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + + 2.0.13 + 12.0.3 From 716029def89a45b123d7435e183eebfcc7256e78 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 19 Dec 2021 20:47:19 +0800 Subject: [PATCH 065/252] DNS settings check --- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index d104d927..e7748b02 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -181,6 +181,21 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("PleaseSelectProtocol")); return -1; } + + var remoteDNS = txtremoteDNS.Text.TrimEx(); + var obj = Utils.ParseJson(remoteDNS); + if (obj != null && obj.ContainsKey("servers")) + { + } + else + { + if (remoteDNS.Contains("{") || remoteDNS.Contains("}")) + { + UI.Show(UIRes.I18N("FillCorrectDNSText")); + return -1; + } + } + config.inbound[0].localPort = Utils.ToInt(localPort); config.inbound[0].protocol = protocol; config.inbound[0].udpEnabled = udpEnabled; @@ -227,7 +242,7 @@ namespace v2rayN.Forms //Mux config.muxEnabled = muxEnabled; - //remoteDNS + //remoteDNS config.remoteDNS = txtremoteDNS.Text.TrimEx(); config.defAllowInsecure = chkdefAllowInsecure.Checked; From 6a427a2158d4ce90542b62ff606a1bf45e17b8cc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 19 Dec 2021 20:47:58 +0800 Subject: [PATCH 066/252] Join log4net --- v2rayN/v2rayN/Program.cs | 2 +- v2rayN/v2rayN/Tool/Logging.cs | 37 +++++++++++++++++++++++++++++++++++ v2rayN/v2rayN/Tool/Utils.cs | 34 ++++++-------------------------- 3 files changed, 44 insertions(+), 29 deletions(-) create mode 100644 v2rayN/v2rayN/Tool/Logging.cs diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index 4d37d44f..a6dc5246 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -33,7 +33,7 @@ namespace v2rayN if (!IsDuplicateInstance()) { - + Logging.Setup(); Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); //设置语言环境 diff --git a/v2rayN/v2rayN/Tool/Logging.cs b/v2rayN/v2rayN/Tool/Logging.cs new file mode 100644 index 00000000..39b6dd02 --- /dev/null +++ b/v2rayN/v2rayN/Tool/Logging.cs @@ -0,0 +1,37 @@ +using log4net; +using log4net.Appender; +using log4net.Core; +using log4net.Layout; +using log4net.Repository.Hierarchy; + +namespace v2rayN.Tool +{ + public class Logging + { + public static void Setup() + { + Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); + + PatternLayout patternLayout = new PatternLayout(); + patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; + patternLayout.ActivateOptions(); + + RollingFileAppender roller = new RollingFileAppender(); + roller.AppendToFile = true; + roller.RollingStyle = RollingFileAppender.RollingMode.Date; + roller.DatePattern = "yyyy-MM-dd'.txt'"; + roller.File = Utils.GetPath(@"guiLogs\"); + roller.Layout = patternLayout; + roller.StaticLogFileName = false; + roller.ActivateOptions(); + hierarchy.Root.AddAppender(roller); + + MemoryAppender memory = new MemoryAppender(); + memory.ActivateOptions(); + hierarchy.Root.AddAppender(memory); + + hierarchy.Root.Level = Level.Info; + hierarchy.Configured = true; + } + } +} diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index b6aed414..6196ce69 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -21,6 +21,7 @@ using System.Security.Principal; using v2rayN.Base; using Newtonsoft.Json.Linq; using System.Web; +using log4net; namespace v2rayN { @@ -870,37 +871,14 @@ namespace v2rayN public static void SaveLog(string strContent) { - SaveLog("info", new Exception(strContent)); + var logger = LogManager.GetLogger("Log1"); + logger.Info(strContent); } public static void SaveLog(string strTitle, Exception ex) { - try - { - string path = Path.Combine(StartupPath(), "guiLogs"); - string FilePath = Path.Combine(path, DateTime.Now.ToString("yyyyMMdd") + ".txt"); - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - if (!File.Exists(FilePath)) - { - FileStream FsCreate = new FileStream(FilePath, FileMode.Create); - FsCreate.Close(); - FsCreate.Dispose(); - } - FileStream FsWrite = new FileStream(FilePath, FileMode.Append, FileAccess.Write); - StreamWriter SwWrite = new StreamWriter(FsWrite); - - string strContent = ex.ToString(); - - SwWrite.WriteLine(string.Format("{0}{1}[{2}]{3}", "--------------------------------", strTitle, DateTime.Now.ToString("HH:mm:ss"), "--------------------------------")); - SwWrite.Write(strContent); - SwWrite.WriteLine(Environment.NewLine); - SwWrite.WriteLine(" "); - SwWrite.Flush(); - SwWrite.Close(); - } - catch { } + var logger = LogManager.GetLogger("Log2"); + logger.Debug(strTitle); + logger.Debug(ex); } #endregion From dd2bed49f13c62eb6572446fab415ef373781d95 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 19 Dec 2021 20:48:20 +0800 Subject: [PATCH 067/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 5c44b6a1..3b23f4b7 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.25")] +[assembly: AssemblyFileVersion("4.26")] From 32100db3fcebed20088d792f69b84eca7acb480e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 26 Dec 2021 17:44:36 +0800 Subject: [PATCH 068/252] Some improvements --- .../v2rayN/Forms/AddServer6Form.Designer.cs | 12 +- v2rayN/v2rayN/Forms/AddServer6Form.resx | 910 +++--- .../v2rayN/Forms/AddServer6Form.zh-Hans.resx | 194 +- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 221 +- v2rayN/v2rayN/Forms/MainForm.cs | 59 +- v2rayN/v2rayN/Forms/MainForm.resx | 2700 +++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 155 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 27 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 6 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 24 +- v2rayN/v2rayN/Resx/ResUI.resx | 24 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 24 +- 12 files changed, 2294 insertions(+), 2062 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index 6ad64150..df133c13 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -54,14 +54,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.cmbFlow); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.label13); @@ -73,12 +74,12 @@ 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 // + resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.FormattingEnabled = true; this.cmbFlow.Items.AddRange(new object[] { resources.GetString("cmbFlow.Items"), @@ -86,7 +87,6 @@ resources.GetString("cmbFlow.Items2"), resources.GetString("cmbFlow.Items3"), resources.GetString("cmbFlow.Items4")}); - resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.Name = "cmbFlow"; // // label4 @@ -141,21 +141,21 @@ // // panel3 // - this.panel3.Controls.Add(this.transportControl); resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.transportControl); this.panel3.Name = "panel3"; // // transportControl // - this.transportControl.AllowXtls = false; resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.AllowXtls = false; this.transportControl.Name = "transportControl"; // // 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 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 245e7469..62b47572 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -117,494 +117,137 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - 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 - - - 3 - - - 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 - - - 27 - - - Flow - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - True - - - NoControl - - - 428, 158 - 113, 12 - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - 127, 155 - - - 265, 21 - - - 4 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - NoControl - - - 12, 159 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 127, 91 - - - 265, 21 - - - 2 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - NoControl - - - 12, 93 - 53, 12 - - 4 + + cmbFlow - - Password + + label6 - - label3 + + xtls-rprx-origin - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 59 - - - 194, 21 - - - 1 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - + + True - - NoControl - - - 12, 62 - - - 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 - - - 0 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - - - NoControl - - - 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 - - - Fill - - - 0, 10 - - - 707, 195 - - - 3 - - - Server - - - groupBox1 - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + 27 - - 0 + + 4 - - Fill - - - 0, 0 - - - 707, 220 - - - 0 - - - transportControl - - - v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + NoControl panel3 - - 0 - - - Bottom - - - 0, 205 - - - 707, 220 - - - 8 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - NoControl - - - 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, 425 + + - - 707, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - Top - - - 0, 0 - - - 707, 10 - - - 6 + + xtls-rprx-origin-udp443 panel1 + + 3 + + + Password + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0 + + + groupBox1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 0 + + + Fill + + + groupBox1 + + + NoControl + + + 89, 12 + + + xtls-rprx-direct + + + 127, 27 + + + 2 + + + Edit or add a [Trojan] server + + + NoControl + + + 10 + + + 2 + + + xtls-rprx-direct-udp443 + + + 303, 17 + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 4 + + + 0 + + + 359, 21 + + $this - - 3 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - 6, 12 - - - 707, 485 + + 396, 17 @@ -779,13 +422,370 @@ wf+0BQAAgAUAAIAFAACAAQAAgAHB/4ABAACAAQAAgAEAALwBAAC8AQAAvAHB/4ABbP///5H/ - - Edit or add a [Trojan] server + + 8 + + + label1 + + + 707, 60 + + + 0, 0 + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + True + + + 22 + + + panel3 + + + True + + + 127, 91 + + + panel2 + + + 0 + + + 5 + + + 3 + + + Alias (remarks) + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 707, 220 + + + groupBox1 + + + groupBox1 + + + txtId + + + 12, 127 + + + 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 AddServer6Form + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + 127, 59 + + + 1 + + + 0 + + + System.Windows.Forms.Button, 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 + + + $this + + + 71, 12 + + + NoControl + + + Bottom + + + $this + + + groupBox1 + + + 127, 123 + + + txtPort + + + 707, 10 + + + 0, 10 + + + 5 + + + label4 + + + &OK + + + btnClose + + + panel2 + + + 0 + + + 0 + + + 12, 93 + + + 2 + + + groupBox1 + + + 10 + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 194, 21 + + + 0 + + + 1 + + + 6 + + + 2 + + + 7 + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + v2rayN.Forms.BaseServerForm, 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, 425 + + + 9 + + + &Cancel + + + 707, 220 + + + True + + + 6, 12 + + + Server address + + + 0, 205 + + + txtAddress + + + 127, 155 + + + NoControl + + + 95, 12 + + + 428, 158 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + * Fill in manually + + + 7 + + + label2 + + + 12, 62 + + + NoControl + + + 707, 485 + + + 265, 21 + + + btnOK + + + $this + + + 707, 195 + + + 4 + + + 75, 23 + + + 6 + + + transportControl + + + NoControl + + + 4 + + + 3 + + + 211, 20 + + + 75, 23 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 29, 12 + + + groupBox1 + + + groupBox1 + + + Server + + + txtRemarks + + + 12, 159 + + + True + + + Flow + + + 265, 21 + + + Top + + + 1 + + + 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 index dd715fc9..8add206e 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx @@ -121,24 +121,11 @@ 取消(&C) - - 167, 12 + + 65, 12 - - 跳过证书验证(allowInsecure) - - - 406, 185 - - - 107, 12 - - - 底层传输安全(tls) - - - - False + + 流控(flow) *手填,方便识别管理 @@ -173,6 +160,179 @@ 确定(&O) + + + AAABAAYAICAQAAAAAADoAgAAZgAAABAQEAAAAAAAKAEAAE4DAAAgIAAAAQAIAKgIAAB2BAAAEBAAAAEA + CABoBQAAHg0AACAgAAABACAAqBAAAIYSAAAQEAAAAQAgAGgEAAAuIwAAKAAAACAAAABAAAAAAQAEAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA + /wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIoiI + iIiIiIiIiIiIiIiIiIiCIigiIiIozMzMzMzMyCIogiIoIiIiKM7m5ubm5sgiKIIiKCIiIijObm5ubm7I + IiiCIigiIiIozubm5ubmyCIogiIoIiIiKM5ubm5ubsgiKIIiKCIiIijO5ubm5ubIIiiIiIiIiIiIzm5u + bm5uyCIogRERERERGM7u7u7u7sgiKIHZWVlZWRjMzMzMzMzIIiiB1ZWVlZUYiIiIiIiIiIiIgdlZWVlZ + GDMzMzMzMzMzOIHVlZWVlRg/uLi4uLi4uDiB2VlZWVkYP7uLi4uLi4s4gdWVlZWVGD+4uLi4uLi4OIHZ + WVlZWRg/u4uLi4uLiziB1ZWVlZUYP7i4uLi4uLg4gdlZWVlZGD+7i4uLi4uLOIHVlZWVlRg/uLi4uLi4 + uDiB3d3d3d0YP7uLi4uLi4s4gRERERERGD+4uLi4uLi4OIiIiIiIiIg/u4uLi4uLiziCIiIiIiIoP7i4 + uLi4uLg4giIiIiIiKD+7i4uLi4uLOIIiIiIiIig/uLi4uLi4uDiCIiIiIiIoP7u7u7u7u7s4giIiIiIi + KD//////////OIIiIiIiIigzMzMzMzMzMziIiIiIiIiIiIiIiIiIiIiIIiIiIiIiIiIiIiIiIiIiIv// + ////////AAAAAHv4AA57+AAOe/gADnv4AA57+AAOe/gADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAB/+AAAf/gAAH/4AAB/+AAAf/gAAAAA + AAD/////KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACA + gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIoiI + iIiIiIiIgigijMzMyCiCKCKM5mbIKIiIiIzu7sgogRERjMzMyCiB2ZGIiIiIiIHZkYMzMzM4gdmRg/u7 + uziB3dGD+7u7OIEREYP7u7s4iIiIg/u7uziCIiKD+7u7OIIiIoP///84giIigzMzMziIiIiIiIiIiP// + KCIAACjObALm5mwCIigAAoiIAAKIzgAAbm4AACIoAAAREQAAGM4AAO7uAAAiKHwAWVl8ABjMfADMzAAA + IigoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/ + KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/ + KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVf + VQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADf + VQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8f + fwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqf + fwD/n38AAL9/AFW/fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUA + qgCqAKoA/wCqAAAfqgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/ + qgBVf6oAqn+qAP9/qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/f + qgAA/6oAVf+qAKr/qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/ + 1AD/P9QAAF/UAFVf1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/ + 1ACqv9QA/7/UAADf1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof + /wD/H/8AAD//AFU//wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf + /wCqn/8A/5//AAC//wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP// + MwD//2YA//+ZAP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/ + AAAA3wAAVd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/ + KgBVPyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39qoYIqoYIhqoIqgiqCaoIqgiqhqqGhoYIhoYIqv39/f0I/f39 + /ar9/f39/YY2Ng4yDg4ODgoOCgoKCgqG/f39/Yb9/f39CP39/f39qjY7Ozs3Nzc3NjMSMjIOCqr9/f39 + qv39/f2G/f39/f0IN19fOzs3Nzc3NjcODg4KCP39/f0I/f39/ar9/f39/ao6X19fXzs7Ozc3NzY3NgqG + /f39/Yb9/f39CP39/f39hl9jY19jX187Ozs7Nzc3Dqr9/f39qv39/f2G/f39/f0IOodjh19jX19fXztf + OzcOCP39/f0ICAmqCAiqCKoICapfCYdjh2ODY19fXzs7Ow6q/f39/QhITEwoSCUoKSQoqmMJCYcJCWNj + Y2NfY19fNgj9/f39qkyZmZmYmJRwlCmqX19fXl9fX186WzY3Njc2gv39/f0JcJ2dmZmZlJmUJAmqCaoJ + hggIqggICKoIqggI/f39/YZwnp2dnZmZmJVMqnx8fHx8fFR8VHhUVFRUVKr9/f39CHChoZ2dnZ2ZmUwJ + fKSkxqSkxqSkpKSkpKBUCP39/f2qcKLDoqGdnZ2ZTKp8ysakxqSkxqSkxqSkpFSq/f39/QiUpqbDoqHE + nZ1Mq3ykqMakyqSkxqSkpKSkVAj9/f39hpTIyKbHoqGhoXAIfMrLpMqkxqSkxqTGpKRUqv39/f0IlMym + yKbIpcShcAh8y6jKpMqkxsqkpKSkxlQI/f39/aqUzMzMyKbIpqJwqnzLy8qpxsqkpMakxqSkeAj9/f39 + CJSUlJSUlJSUlJQJgMupy8qpysqkyqSkxqRUqv39/f2GCKoIqgiqCKoIhgigrcvPqcuoy8qkxsqkxnyG + /f39/ar9/f39/f39/f39qnzPz6nLy8uoyqnKpKTKVAj9/f39CP39/f39/f39/f0IfNDPz8+py8upyqjG + yqR8hv39/f2G/f39/f39/f39/Qik0K7P0M+ty8vLy6jKpXyq/f39/ar9/f39/f39/f39CHzQ09Ctz8/P + qcupy6jKeAj9/f39CP39/f39/f39/f2qoNPQ0NPQ0M/Qz8vLy6l8CP39/f2G/f39/f39/f39/QmkfKR8 + oHx8fHx8fHx8fHyG/f39/aoIqgiqCKoIqgiqCKoIqgiqCKoIqgiqCKoIqgj9/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3///////////// + ///AAAAD3vgAA974AAPe+AAD3vgAA974AAPe+AADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA + AAPAAAADwAAAA8AAAAPAAAADwAAAA9/4AAPf+AAD3/gAA9/4AAPf+AAD3/gAA8AAAAP//////////ygA + AAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAA + gACAgAAAgICAAMDcwADwyqYAqj8qAP8/KgAAXyoAVV8qAKpfKgD/XyoAAH8qAFV/KgCqfyoA/38qAACf + KgBVnyoAqp8qAP+fKgAAvyoAVb8qAKq/KgD/vyoAAN8qAFXfKgCq3yoA/98qAAD/KgBV/yoAqv8qAP// + KgAAAFUAVQBVAKoAVQD/AFUAAB9VAFUfVQCqH1UA/x9VAAA/VQBVP1UAqj9VAP8/VQAAX1UAVV9VAKpf + VQD/X1UAAH9VAFV/VQCqf1UA/39VAACfVQBVn1UAqp9VAP+fVQAAv1UAVb9VAKq/VQD/v1UAAN9VAFXf + VQCq31UA/99VAAD/VQBV/1UAqv9VAP//VQAAAH8AVQB/AKoAfwD/AH8AAB9/AFUffwCqH38A/x9/AAA/ + fwBVP38Aqj9/AP8/fwAAX38AVV9/AKpffwD/X38AAH9/AFV/fwCqf38A/39/AACffwBVn38Aqp9/AP+f + fwAAv38AVb9/AKq/fwD/v38AAN9/AFXffwCq338A/99/AAD/fwBV/38Aqv9/AP//fwAAAKoAVQCqAKoA + qgD/AKoAAB+qAFUfqgCqH6oA/x+qAAA/qgBVP6oAqj+qAP8/qgAAX6oAVV+qAKpfqgD/X6oAAH+qAFV/ + qgCqf6oA/3+qAACfqgBVn6oAqp+qAP+fqgAAv6oAVb+qAKq/qgD/v6oAAN+qAFXfqgCq36oA/9+qAAD/ + qgBV/6oAqv+qAP//qgAAANQAVQDUAKoA1AD/ANQAAB/UAFUf1ACqH9QA/x/UAAA/1ABVP9QAqj/UAP8/ + 1AAAX9QAVV/UAKpf1AD/X9QAAH/UAFV/1ACqf9QA/3/UAACf1ABVn9QAqp/UAP+f1AAAv9QAVb/UAKq/ + 1AD/v9QAAN/UAFXf1ACq39QA/9/UAAD/1ABV/9QAqv/UAP//1ABVAP8AqgD/AAAf/wBVH/8Aqh//AP8f + /wAAP/8AVT//AKo//wD/P/8AAF//AFVf/wCqX/8A/1//AAB//wBVf/8Aqn//AP9//wAAn/8AVZ//AKqf + /wD/n/8AAL//AFW//wCqv/8A/7//AADf/wBV3/8Aqt//AP/f/wBV//8Aqv//AP/MzAD/zP8A//8zAP// + ZgD//5kA///MAAB/AABVfwAAqn8AAP9/AAAAnwAAVZ8AAKqfAAD/nwAAAL8AAFW/AACqvwAA/78AAADf + AABV3wAAqt8AAP/fAABV/wAAqv8AAAAAKgBVACoAqgAqAP8AKgAAHyoAVR8qAKofKgD/HyoAAD8qAFU/ + KgDw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A/f39/f39/f39/f39/f39/f0I + hgiqCKoICKoICKaGCP39qv39hv2GNg4ODjII/ar9/Yb9/ar9qjdjXzsOCP2G/f0IhquGCAleCWNfNob9 + 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 + bv+3d0n/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/FRqE/0dN1v8/RNL/Nz3Q/y40zv8nLcz/ISfK/xwh + yf8WHMf/GxJh/8K/wf/gr3r/4K96/+Cvev/gr3r/3614/9yqdf/apnL/16Nw/9Sea//Rmmj/zZZk/8qR + X//GjFz/w4dW/7+CUv/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8SHZD/WF3a/05U1/9FS9X/PUPS/zU7 + 0P8uM83/JyzL/yAmyf8aFGn/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/ + wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/xAfnP9obt7/YGTc/1Zb + 2f9NU9f/RUrU/ztB0v80OdD/LDHO/xgWcv/Cv8H/Dn+n/w18pP8MeqH/DHie/wt1m/8Kc5j/CXGV/wlv + k/8JbJD/CGqN/wdpi/8HZ4j/BmWH/wZkhf8GYoP/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/DiKp/3l+ + 4/9vdeH/Zmze/11i2/9UWtn/S1HW/0NI1P86P9H/Fhh9/8K/wf8Ogar/Barp/wGo6P8Apef/AKPm/wCi + 5P8An+L/AJ7h/wCd3/8AnN7/AJnc/wCY2/8AmNn/AJbX/wZjhP/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/ + wf8MJbX/iI7n/4CF5v93fOP/bnPg/2Vr3f9bYdv/UljY/0lP1v8UGoj/wr/B/w+Erf8Lrur/Bqvq/wOo + 6f8Apuf/AKTm/wCi5f8AoOT/AJ/i/wCd4f8AnN//AJrd/wCZ2/8AmNr/BmWH/8K/wf8AAAAAAAAAAAAA + AAAAAAAAwr/B/wkowP+WnOz/jpTq/4aL6P9+hOX/dXri/2xx4P9jaN3/WV/b/xEek//Cv8H/EIaw/xay + 7P8Or+z/Cavr/wWq6v8Bp+j/AKbn/wCj5f8AoeT/AJ/j/wCe4f8AnOD/AJve/wCa3f8HZ4n/wr/B/wAA + AAAAAAAAAAAAAAAAAADCv8H/CCrK/6Ko7/+coe7/lZrr/42T6f+Fiub/fIHl/3N54v9rcN//ECGg/8K/ + wf8QiLP/I7nu/xq07f8Ssez/C63r/war6v8Cqen/AKbo/wCk5v8AouX/AKHk/wCf4f8AneH/AJzf/who + i//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8GLNP/q7Hy/6as8P+hpu//mp/u/5OY6/+LkOj/g4nm/3qA + 5P8NI6z/wr/B/xCKtv8xvvD/J7rv/x627f8Vsuz/Dq/s/wmr6/8Equn/Aafo/wCl5/8Ao+X/AKHk/wCf + 4v8AnuH/CGqO/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wUu2/+vtPP/r7Tz/6qv8v+mq/D/oKXv/5me + 7f+Sl+v/io/p/wsmt//Cv8H/Eo24/0HF8f82wfD/LLzv/yK47v8atO3/EbHs/wut6/8Gq+r/A6np/wCm + 6P8Apeb/AKLl/wCh5P8IbJD/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/BC/h/wQv3/8FL9z/BS3Z/wYt + 1v8GLNL/ByvP/wgqy/8IKcb/CSnC/8K/wf8Sjrv/Uszy/0fH8f87w/H/Mb7v/ye67/8et+7/FbPt/w6v + 6/8IrOv/BKnp/wGo6P8Apef/AKPl/wluk//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf/Cv8H/wr/B/8K/ + wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/xKRvf9j0/P/WM/z/0zK8f9BxfH/N8Hw/yy8 + 7/8iuO7/GbTt/xGx7P8Lruv/Bqrq/wOo6f8Apuf/CnGV/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCv8H/E5LA/3Ta8/9q1fP/XtHz/1LM + 8v9Hx/H/O8Pw/zG+7/8nu+//Hrbt/xay7f8Or+v/CKzq/wSq6f8Kc5j/wr/B/wAAAAAAAAAAAAAAAAAA + AADCv8H/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK/wf8UlMH/hOD1/3rc + 9f9v2PP/ZNTy/1jO8v9NyvH/Qsbx/zbB8P8svO//I7ju/xm07f8SsOz/C67r/wt2m//Cv8H/AAAAAAAA + AAAAAAAAAAAAAMK/wf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwr/B/xSW + w/+T5vb/iuL1/3/e9P912vT/adbz/13R8/9SzPL/R8jx/zzD8P8xvvD/J7rv/x627v8Vsuz/C3ie/8K/ + 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 + + 编辑或添加[Trojan]服务器 diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index e0d61ca8..00d0d5b0 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -79,6 +79,8 @@ this.ssMain = new System.Windows.Forms.StatusStrip(); this.toolSslInboundInfo = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); @@ -89,6 +91,7 @@ this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); this.menuRoutings = new System.Windows.Forms.ToolStripMenuItem(); this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); + this.menuServers2 = new System.Windows.Forms.ToolStripComboBox(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); @@ -129,8 +132,6 @@ this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.tsbClose = new System.Windows.Forms.ToolStripButton(); - this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); this.scMain.Panel1.SuspendLayout(); this.scMain.Panel2.SuspendLayout(); @@ -156,17 +157,19 @@ // // scMain.Panel1 // + resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // + 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; @@ -185,6 +188,7 @@ // // 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, @@ -220,195 +224,194 @@ 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 // - this.menuAddVlessServer.Name = "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 // - this.menuAddTrojanServer.Name = "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 // - this.tsbTestMe.Name = "tsbTestMe"; resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); + this.tsbTestMe.Name = "tsbTestMe"; this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - this.menuClearServerStatistics.Name = "menuClearServerStatistics"; resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); + this.menuClearServerStatistics.Name = "menuClearServerStatistics"; this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_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 // + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // // qrCodeControl @@ -423,33 +426,35 @@ // // splitContainer1.Panel1 // + resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // // splitContainer1.Panel2 // + resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - this.groupBox1.Controls.Add(this.scMain); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.scMain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // gbMsgTitle // + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Controls.Add(this.txtMsgBox); this.gbMsgTitle.Controls.Add(this.ssMain); - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Name = "gbMsgTitle"; this.gbMsgTitle.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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; - 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; @@ -457,6 +462,7 @@ // // cmsMsgBox // + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, @@ -464,40 +470,40 @@ this.menuMsgBoxAddRoutingRule, this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); + this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); + this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); + this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxAddRoutingRule // - this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); + this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // menuMsgBoxFilter // - this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); + this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); // // ssMain // + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslInboundInfo, @@ -506,14 +512,13 @@ this.toolSslBlank2, this.toolSslServerSpeed, this.toolSslBlank4}); - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslInboundInfo // - this.toolSslInboundInfo.Name = "toolSslInboundInfo"; resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); + this.toolSslInboundInfo.Name = "toolSslInboundInfo"; // // toolSslBlank1 // @@ -521,6 +526,17 @@ this.toolSslBlank1.Name = "toolSslBlank1"; this.toolSslBlank1.Spring = true; // + // toolSslRoutingRule + // + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); + this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + // + // toolSslBlank2 + // + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Name = "toolSslBlank2"; + this.toolSslBlank2.Spring = true; + // // toolSslServerSpeed // resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); @@ -529,23 +545,24 @@ // // toolSslBlank4 // - this.toolSslBlank4.Name = "toolSslBlank4"; resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; // // 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.menuRoutings, this.menuServers, + this.menuServers2, this.toolStripSeparator13, this.menuAddServers2, this.menuScanScreen2, @@ -559,73 +576,81 @@ // // menuSysAgentMode // + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - this.menuKeepClear.Name = "menuKeepClear"; resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - this.menuGlobal.Name = "menuGlobal"; resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - this.menuKeepNothing.Name = "menuKeepNothing"; resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); + this.menuKeepNothing.Name = "menuKeepNothing"; this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - this.menuRoutings.Name = "menuRoutings"; resources.ApplyResources(this.menuRoutings, "menuRoutings"); + this.menuRoutings.Name = "menuRoutings"; // // menuServers // - this.menuServers.Name = "menuServers"; resources.ApplyResources(this.menuServers, "menuServers"); + this.menuServers.Name = "menuServers"; + // + // menuServers2 + // + resources.ApplyResources(this.menuServers2, "menuServers2"); + this.menuServers2.BackColor = System.Drawing.SystemColors.Window; + this.menuServers2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.menuServers2.DropDownWidth = 500; + this.menuServers2.Name = "menuServers2"; // // toolStripSeparator13 // - this.toolStripSeparator13.Name = "toolStripSeparator13"; resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); + this.toolStripSeparator13.Name = "toolStripSeparator13"; // // 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); // // menuUpdateSubscriptions // - this.menuUpdateSubscriptions.Name = "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 @@ -641,6 +666,7 @@ // // 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, @@ -658,88 +684,87 @@ 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; - resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); 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"; // // tsbSetting // + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - this.tsbOptionSetting.Name = "tsbOptionSetting"; resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Name = "tsbOptionSetting"; this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - this.tsbRoutingSetting.Name = "tsbRoutingSetting"; resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator14 // - this.toolStripSeparator14.Name = "toolStripSeparator14"; resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); + this.toolStripSeparator14.Name = "toolStripSeparator14"; // // tsbBackupGuiNConfig // - this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); + this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - this.toolStripSeparator5.Name = "toolStripSeparator5"; resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + this.toolStripSeparator5.Name = "toolStripSeparator5"; // // tsbReload // @@ -749,11 +774,12 @@ // // 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, @@ -762,51 +788,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); 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); // // tsbCheckUpdateXrayCore // - this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator15 // - this.toolStripSeparator15.Name = "toolStripSeparator15"; resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); + this.toolStripSeparator15.Name = "toolStripSeparator15"; // // tsbCheckUpdateGeoSite // - this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); + this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); // // tsbCheckUpdateGeoIP // - this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); + this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_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, @@ -814,50 +840,49 @@ 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 // - this.tsbV2rayWebsite.Name = "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 // @@ -865,17 +890,6 @@ this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); // - // toolSslRoutingRule - // - this.toolSslRoutingRule.Name = "toolSslRoutingRule"; - resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); - // - // toolSslBlank2 - // - this.toolSslBlank2.Name = "toolSslBlank2"; - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); - this.toolSslBlank2.Spring = true; - // // MainForm // resources.ApplyResources(this, "$this"); @@ -1017,6 +1031,7 @@ private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; + private System.Windows.Forms.ToolStripComboBox menuServers2; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 525620d5..18467531 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -296,25 +296,56 @@ namespace v2rayN.Forms private void RefreshServersMenu() { menuServers.DropDownItems.Clear(); + menuServers2.SelectedIndexChanged -= MenuServers2_SelectedIndexChanged; + menuServers2.Items.Clear(); + menuServers.Visible = false; + menuServers2.Visible = false; - List lst = new List(); - for (int k = 0; k < config.vmess.Count; k++) + if (config.vmess.Count > 20) { - VmessItem item = config.vmess[k]; - string name = item.getSummary(); + for (int k = 0; k < config.vmess.Count; k++) + { + VmessItem item = config.vmess[k]; + string name = item.getSummary(); + + if (config.index.Equals(k)) + { + name = $"√ {name}"; + } + menuServers2.Items.Add(name); - ToolStripMenuItem ts = new ToolStripMenuItem(name) - { - Tag = k - }; - if (config.index.Equals(k)) - { - ts.Checked = true; } - ts.Click += new EventHandler(ts_Click); - lst.Add(ts); + menuServers2.SelectedIndex = config.index; + menuServers2.SelectedIndexChanged += MenuServers2_SelectedIndexChanged; + menuServers2.Visible = true; } - menuServers.DropDownItems.AddRange(lst.ToArray()); + else + { + 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()); + menuServers.Visible = true; + } + } + + private void MenuServers2_SelectedIndexChanged(object sender, EventArgs e) + { + SetDefaultServer(((ToolStripComboBox)sender).SelectedIndex); } private void ts_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 0387e8be..e1276743 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,215 +117,780 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + Remove duplicate servers - - 3, 17 - - - 327, 17 - - + 355, 22 - - Add [VMess] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + tsbCheckUpdateXrayCore + + + 97, 53 + + 355, 22 Add [VLESS] server - - 355, 22 + + 0 - - Add [Shadowsocks] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + Restart service + + + 200, 25 + + + tsbSubSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslInboundInfo + + + gbMsgTitle + + + menuMoveUp Add [Socks] server - - 355, 22 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Add [Trojan] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + 952, 593 - - Add a custom configuration server + + + ImageAboveText - - 355, 22 + + 227, 22 - - Import bulk URL from clipboard (Ctrl+V) + + 语言-[中文简体] - - 355, 22 + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Scan QR code on the screen (Ctrl+S) + + Settings - - 352, 6 + + tsbHelp - - 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove selected servers (Delete) + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 - - - Remove duplicate servers - - - 355, 22 - - - Clone selected server - - - 355, 22 + + toolStripSeparator6 Set as active server (Enter) - - 352, 6 + + 99, 53 - + + Update subscriptions + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 187, 22 + + + 67, 53 + + + tsbSetting + + + toolSslBlank2 + + 355, 22 - - Move to top (T) - - - 355, 22 - - - Up (U) - - - 355, 22 - - - Down (D) - - - 355, 22 - - - Move to bottom (B) - - - 355, 22 - - - Select All (Ctrl+A) - - - 352, 6 - - - 355, 22 - - - Test servers ping (Ctrl+P) - - - 355, 22 - - - Test servers with tcping (Ctrl+O) - - - 355, 22 - - - Test servers real delay (Ctrl+R) - - - 355, 22 - - - Test servers download speed (Ctrl+T) - - - 355, 22 - - - Test current service status - - - 355, 22 - - - Clear all service statistics - - - 352, 6 - - - 355, 22 - - - Export selected server for client configuration - - - 355, 22 - - - Export selected server for server configuration - 355, 22 - - Export share URLs to clipboard (Ctrl+C) + + tsbCheckUpdateN - - 355, 22 + + Do not change system proxy - - Export subscription (base64) share to clipboard + + tsbCheckUpdateGeoSite - + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + Update v2flyCore + + + Update GeoSite + + Magenta - - 64, 53 + + menuMsgBoxAddRoutingRule - - Servers + + 355, 22 - + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + Share + + + 227, 22 + + + tsbQRCodeSwitch + + + Add Routing Rule (Ctrl+V) + + + 355, 22 + + + Horizontal + + + toolStripSeparator2 + + + Export selected server for client configuration + + + 0, 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExit + + + Copy All + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 227, 22 + + + Export selected server for server configuration + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 128, 53 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + menuRealPingServer + + + Test servers real delay (Ctrl+R) + + + menuTcpingServer + + + + 0 + + ImageAboveText - - 356, 622 + + toolSslRoutingRule - - cmsLv + + 6, 56 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + 355, 22 + + + toolStripSeparator1 + + + 264, 22 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + 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.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 + + + 200, 6 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageDef + + + Import bulk URL from clipboard (Ctrl+V) + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM + mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY + FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr + flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh + VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh + 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC + + + + System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 17 + + + 355, 22 + + + 355, 22 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 6, 56 + + + 946, 280 + + + 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 + + + 184, 6 + + + 250, 21 + + + menuAddCustomServer + + + statusStrip1 + + + menuMoveDown + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + + + + Import bulk URL from clipboard + + + gbMsgTitle + + + Move to bottom (B) + + + Move to top (T) + + + 6, 12 + + + 48, 53 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + Fill + + + 0 + + + 686, 280 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 176, 22 + + + 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 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain.Panel2 + + + menuAddServers2 + + + Fill + + + 3 + + + Add [VMess] server + + + $this + + + 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 + + + 300, 21 + + + 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 + + + 355, 22 + + + 352, 6 + + + 355, 22 + + + 0, 0 + + + 256, 280 + + + 355, 22 + + + 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 + + + 352, 6 + + + groupBox1 + + + 300, 21 + + + 2 + + + 125, 22 + + + Clear all service statistics + + + scMain.Panel2 + + + 176, 22 + + + 3 + + + 187, 22 + + + 6, 56 + + + Test servers download speed (Ctrl+T) + + + 686 + + + splitContainer1 + + + 50 + + + lvServers + + + 265, 199 + + + 243, 22 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + Check for updates + + + Copy (Ctrl+C) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 125, 22 + + + scMain + + + 203, 22 + + + Magenta + + + 952, 56 + + + tsbReload + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + Help + + + menuMsgBoxSelectAll + + + menuSelectAll + + + splitContainer1.Panel1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 56 + + + 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 + + + 264, 22 + + + menuAddServers + + + 355, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + BottomCenter + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN (this software) + + + Magenta + + + gbMsgTitle + + + splitContainer1.Panel1 + + + 0, 0 + + + 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 + + + Server + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + menuAddShadowsocksServer + + + txtMsgBox + + + toolSslBlank4 + + + menuAddTrojanServer + + + 80, 21 + + + v2rayN + + + Language-[English] + + + 264, 22 + + + menuScanScreen2 + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Routing + + + Add [Trojan] server + + + 176, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ImageAboveText System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + Set message filters + + + splitContainer1.Panel2 + + + 352, 6 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ClientConfig + + + V2Ray Website + + Fill + + No + + + 1 + + + cmsMsgBox + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + OptionSetting + + + menuMoveTop + + + tsbCheckUpdateCore + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -343,1274 +908,727 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 0, 0 + + 952, 300 - - 686, 280 + + tsbCheckUpdateGeoIP - - - 0 + + menuScanScreen - - lvServers + + ImageAboveText - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + cmsLv - - scMain.Panel1 + + toolStripSeparator12 - - 0 - - - scMain.Panel1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 0 - - - Fill - - - 0, 0 - - - 4, 4, 4, 4 - - - 256, 280 - - - 2 - - - qrCodeControl - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel2 - - - 0 - - - scMain.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 1 - - - 100 - - - 946, 280 - - - 686 - - - 0 - - - scMain - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - Fill - - - 0, 66 - - - Horizontal + + 6, 56 Fill - - 0, 0 + + toolSslBlank1 - - 952, 300 + + v2rayN Project - - 0 + + tsbSubUpdate - - Servers list - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1.Panel1 - - - 0 - - - splitContainer1.Panel1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1 - - - 0 - - - 603, 17 - - - 227, 22 - - - Select All (Ctrl+A) - - - 227, 22 - - - Copy (Ctrl+C) - - - 227, 22 - - - Copy All - - - 227, 22 - - - Add Routing Rule (Ctrl+V) - - - 227, 22 - - - Set message filters - - - 228, 114 - - - cmsMsgBox - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 3, 17 - - - 0 - - - True - - - Vertical - - - 946, 177 - - - 3 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 0 - - - 228, 18 - - - 80, 21 - - - InboundInfo - - - 微软雅黑, 8pt - - - 285, 21 - - - 0, 21 - - - 285, 21 - - - False - - - 微软雅黑, 8pt - - - No - - - 250, 21 - - - SPEED Disabled - - - MiddleRight - - - 0, 21 - - - 3, 194 - - - 946, 26 - - - 0 - - - statusStrip1 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 1 - - - Fill - - - 0, 0 - - - 952, 223 - - - 3 - - - Informations - - - gbMsgTitle - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1.Panel2 - - - 0 - - - splitContainer1.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1 - - - 1 - - - 952, 527 - - - 300 + + tsMain 5 - - splitContainer1 + + SPEED Disabled - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 355, 22 - - $this + + Promotion - - 3 + + menuSysAgentMode - - 17, 17 - - - 137, 17 - - - NoControl + + 952, 527 - - 243, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Clear system proxy + + ImageAboveText - - 243, 22 + + 227, 22 - - Set system proxy + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 243, 22 - - - Do not change system proxy - - - 264, 22 - - - Http proxy - - - 264, 22 - - - Routing - - - 264, 22 - - - Server - - - 261, 6 - - - 264, 22 - - - Import bulk URL from clipboard - - - 264, 22 - - - Scan QR code on the screen - - - 264, 22 - - - Update subscriptions - - - 261, 6 - - - 264, 22 - - - Exit - - - 265, 170 + + 1 cmsMain - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 264, 22 - - v2rayN + + menuServers + + + menuUpdateSubscriptions + + + 228, 114 + + + 3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxFilter + + + 203, 22 + + + RoutingSetting + + + Standard + + + 3, 194 True - - 498, 17 - - - Top - - - 0, 56 - - - 952, 10 - - - 2 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - 409, 17 - - - 6, 56 - - - 125, 22 - - - Settings - - - 125, 22 - - - Updates - - - Magenta - - - 99, 53 + + 355, 22 Subscriptions - - ImageAboveText + + 952, 10 + + + Updates + + + 264, 22 + + + Add [Shadowsocks] server + + + toolStripSeparator14 + + + 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + menuMsgBoxCopyAll + + + 89, 53 + + + 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.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 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + Settings + + + menuCopyServer + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Http proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + groupBox1 + + + MainForm + + + toolStripSeparator9 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 227, 22 + + + False + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Servers list + + + Servers + + + scMain.Panel1 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + Magenta + + + MiddleRight + + + 4, 4, 4, 4 + + + Magenta + + + 355, 22 + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + $this + + + 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 + + + 355, 22 + + + toolSslServerSpeed + + + menuRemoveServer + + + 355, 22 + + + Informations + + + tsbTestMe + + + 0 + + + 946, 177 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddVmessServer + + + scMain + + + Down (D) + + + 352, 6 Magenta + + 243, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + tsbSub + + + Magenta + + + ImageAboveText + + + Clone selected server + + + 0, 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripDropDownButton, 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 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 + + + Export share URLs to clipboard (Ctrl+C) + + + 243, 22 + + + 355, 22 + + + Server + + + System.Windows.Forms.ToolStrip, 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 + + + $this + + + Fill + + + qrCodeControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Clear system proxy + + + tsbServer + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepNothing + + + tsbPromotion + + + ImageAboveText + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 21 + + + 203, 22 + + + 356, 622 + + + 355, 22 + + + 0, 0 + + + Up (U) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + Set system proxy + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServers2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + tsbOptionSetting + + + 100 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + scMain.Panel1 + + + 微软雅黑, 8pt + + + 64, 53 + + + 1 + + + 5 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Magenta + 45, 53 - - Share - - - BottomCenter - - - ImageAboveText - - - 6, 56 - - - 176, 22 - - - OptionSetting - - - 176, 22 - - - RoutingSetting - - - 173, 6 - - - 176, 22 - - - BackupGuiConfig - - - Magenta - - - 67, 53 - - - Settings - - - 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 - - - 203, 22 - - - v2rayN (this software) - - - 203, 22 - - - Update v2flyCore - - - 203, 22 - - - Update XrayCore - - - 200, 6 - - - 203, 22 - - - Update GeoSite - - - 203, 22 - - - Update GeoIP - - - Magenta - - - 128, 53 - - - Check for updates - - - ImageAboveText - - - 6, 56 - - - 187, 22 - - - v2rayN Project - - - 187, 22 - - - V2Ray Website - - - 184, 6 - - - 187, 22 - - - Language-[English] - - - 187, 22 - - - 语言-[中文简体] - - - Magenta - - - 48, 53 - - - Help - - - ImageAboveText - - - Magenta - - - 89, 53 - - - Promotion - - - ImageAboveText - - - 6, 56 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - - - - Magenta - - - 52, 53 - - - Close - - - ImageAboveText - - - 0, 0 - - - 952, 56 - - - 1 - - - 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 - menuAddVlessServer - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 300 - - 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 - - - menuAddTrojanServer - - - 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 - - - tsbTestMe - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuClearServerStatistics - - - 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 - - - menuMsgBoxSelectAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopyAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxAddRoutingRule - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxFilter - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslInboundInfo - - - 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 - - - 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 - - - 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 - - - menuKeepClear - - - 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 - - - menuKeepNothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null menuRoutings - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 261, 6 - - menuServers + + 微软雅黑, 8pt - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + splitContainer1 - - toolStripSeparator13 + + 0 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 261, 6 - - menuAddServers2 + + Test current service status - - 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 - - - menuUpdateSubscriptions - - - 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 - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbQRCodeSwitch - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator8 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSetting - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbOptionSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbRoutingSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator14 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbBackupGuiNConfig - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator5 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbReload - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdate - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateN - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateXrayCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator15 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateGeoIP - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl toolStripSeparator10 - + + menuMoveBottom + + + 0, 66 + + + 1 + + + Magenta + + + InboundInfo + + + 355, 22 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbHelp + + 187, 22 - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuExport2ServerConfig - - tsbAbout + + 0 - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbV2rayWebsite - - - 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 - + + 6, 56 + + System.Windows.Forms.ToolStripSeparator, 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 - + + Export subscription (base64) share to clipboard + + + 52, 53 + + + System.Windows.Forms.NotifyIcon, 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 + + + Exit + + + 355, 22 + + + menuClearServerStatistics + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Scan QR code on the screen + + + 946, 26 + + + Close + + + 264, 22 + + + 0, 21 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ssMain + + + 952, 223 + + + Update XrayCore + + + tsbBackupGuiNConfig + + + Add a custom configuration server + + + 173, 6 + + + bgwScan + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolSslRoutingRule + + 3, 17 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuSpeedServer - - toolSslBlank2 + + System.Windows.Forms.ToolStripDropDownButton, 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 - - MainForm + + Fill - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + tsbV2rayWebsite + + toolStripSeparator3 + + + BackupGuiConfig + + + Vertical + + + tsbRoutingSetting + + + 355, 22 + + + ImageAboveText + + + Update GeoIP + + + menuKeepClear + + + toolStripSeparator15 + + + 228, 18 + + + 603, 17 + + + True + + + 17, 17 + + + 65 + + + 137, 17 + + + 498, 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 96153b28..731e577e 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -321,6 +321,12 @@ 服务器列表 + + 信息 + + + 222, 114 + 221, 22 @@ -351,14 +357,62 @@ 设置信息过滤器 - - 222, 114 - 网速显示未启用 - - 信息 + + 260, 22 + + + 系统代理 + + + 260, 22 + + + 路由 + + + 260, 22 + + + 服务器 + + + 服务器 + + + 257, 6 + + + 260, 22 + + + 从剪贴板导入批量URL + + + 260, 22 + + + 扫描屏幕上的二维码 + + + 260, 22 + + + 更新订阅 + + + 257, 6 + + + 260, 22 + + + 退出 + + + 261, 199 172, 22 @@ -378,56 +432,11 @@ 不改变系统代理 - - 195, 22 + + 61, 53 - - 系统代理 - - - 195, 22 - - - 路由 - - - 195, 22 - - - 服务器 - - - 192, 6 - - - 195, 22 - - - 从剪贴板导入批量URL - - - 195, 22 - - - 扫描屏幕上的二维码 - - - 195, 22 - - - 更新订阅 - - - 192, 6 - - - 195, 22 - - - 退出 - - - 196, 170 + + 订阅 124, 22 @@ -441,18 +450,18 @@ 更新订阅 - - 61, 53 - - - 订阅 - 52, 53 分享 + + 61, 53 + + + 设置 + 189, 22 @@ -474,12 +483,6 @@ 备份v2rayN配置文件 - - 61, 53 - - - 设置 - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -497,6 +500,12 @@ 重启服务 + + 85, 53 + + + 检查更新 + 168, 22 @@ -524,11 +533,11 @@ 168, 22 - - 85, 53 + + 69, 53 - - 检查更新 + + 帮助 v2rayN 项目 @@ -536,12 +545,6 @@ V2Ray 官网 - - 69, 53 - - - 帮助 - 68, 53 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index a9f2eb65..1c35c368 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -901,6 +901,7 @@ namespace v2rayN.Handler { return -1; } + var propertyName = string.Empty; switch (name) { case EServerColName.configType: @@ -910,6 +911,10 @@ namespace v2rayN.Handler case EServerColName.security: case EServerColName.network: case EServerColName.testResult: + propertyName = name.ToString(); + break; + case EServerColName.subRemarks: + propertyName = "subid"; break; default: return -1; @@ -919,11 +924,11 @@ namespace v2rayN.Handler if (asc) { - config.vmess = items.OrderBy(name.ToString()).ToList(); + config.vmess = items.OrderBy(propertyName).ToList(); } else { - config.vmess = items.OrderByDescending(name.ToString()).ToList(); + config.vmess = items.OrderByDescending(propertyName).ToList(); } var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); @@ -1263,15 +1268,6 @@ namespace v2rayN.Handler if (config.routings.Count(it => it.locked != true) <= 0) { - //Global - var item1 = new RoutingItem() - { - remarks = "全局(Global)", - url = string.Empty, - }; - AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); - config.routings.Add(item1); - //Bypass the mainland var item2 = new RoutingItem() { @@ -1290,6 +1286,15 @@ namespace v2rayN.Handler AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black")); config.routings.Add(item3); + //Global + var item1 = new RoutingItem() + { + remarks = "全局(Global)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); + config.routings.Add(item1); + config.routingIndex = 0; } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 65756763..b22fe83b 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -477,7 +477,7 @@ namespace v2rayN.Handler i.address = u.IdnHost; i.port = u.Port; - i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + i.remarks = Utils.UrlDecode(u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)); var q = HttpUtility.ParseQueryString(u.Query); var m = StdVmessUserInfo.Match(u.UserInfo); @@ -564,7 +564,7 @@ namespace v2rayN.Handler } VmessItem server = new VmessItem { - remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + remarks = Utils.UrlDecode(parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)), address = parsedUrl.IdnHost, port = parsedUrl.Port, }; @@ -721,7 +721,7 @@ namespace v2rayN.Handler item.address = url.IdnHost; item.port = url.Port; - item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.remarks = Utils.UrlDecode(url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)); item.id = url.UserInfo; var query = HttpUtility.ParseQueryString(url.Query); diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index e46c2dff..a6515acf 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -908,7 +908,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 1)tcp camouflage type 的本地化字符串。 + /// 查找类似 *tcp camouflage type 的本地化字符串。 /// internal static string TransportHeaderTypeTip1 { get { @@ -917,7 +917,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 2)kcp camouflage type 的本地化字符串。 + /// 查找类似 *kcp camouflage type 的本地化字符串。 /// internal static string TransportHeaderTypeTip2 { get { @@ -926,7 +926,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 3)QUIC camouflage type 的本地化字符串。 + /// 查找类似 *QUIC camouflage type 的本地化字符串。 /// internal static string TransportHeaderTypeTip3 { get { @@ -935,7 +935,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 4)grpc mode 的本地化字符串。 + /// 查找类似 *grpc mode 的本地化字符串。 /// internal static string TransportHeaderTypeTip4 { get { @@ -944,7 +944,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 1)ws path 的本地化字符串。 + /// 查找类似 *ws path 的本地化字符串。 /// internal static string TransportPathTip1 { get { @@ -953,7 +953,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 2)h2 path 的本地化字符串。 + /// 查找类似 *h2 path 的本地化字符串。 /// internal static string TransportPathTip2 { get { @@ -962,7 +962,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 3)QUIC key/Kcp seed 的本地化字符串。 + /// 查找类似 *QUIC key/Kcp seed 的本地化字符串。 /// internal static string TransportPathTip3 { get { @@ -971,7 +971,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 4)grpc serviceName 的本地化字符串。 + /// 查找类似 *grpc serviceName 的本地化字符串。 /// internal static string TransportPathTip4 { get { @@ -980,7 +980,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 1)http host Separated by commas (,) 的本地化字符串。 + /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 /// internal static string TransportRequestHostTip1 { get { @@ -989,7 +989,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 2)ws host 的本地化字符串。 + /// 查找类似 *ws host 的本地化字符串。 /// internal static string TransportRequestHostTip2 { get { @@ -998,7 +998,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 3)h2 host Separated by commas (,) 的本地化字符串。 + /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 /// internal static string TransportRequestHostTip3 { get { @@ -1007,7 +1007,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 4)QUIC securty 的本地化字符串。 + /// 查找类似 *QUIC securty 的本地化字符串。 /// internal static string TransportRequestHostTip4 { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 1bf358cb..e8a03fc9 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -401,39 +401,39 @@ Please fill in the correct custom DNS - 1)ws path + *ws path - 2)h2 path + *h2 path - 3)QUIC key/Kcp seed + *QUIC key/Kcp seed - 4)grpc serviceName + *grpc serviceName - 1)http host Separated by commas (,) + *http host Separated by commas (,) - 2)ws host + *ws host - 3)h2 host Separated by commas (,) + *h2 host Separated by commas (,) - 4)QUIC securty + *QUIC securty - 1)tcp camouflage type + *tcp camouflage type - 2)kcp camouflage type + *kcp camouflage type - 3)QUIC camouflage type + *QUIC camouflage type - 4)grpc mode + *grpc mode \ 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 2bf6f56e..6633c1a8 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -401,39 +401,39 @@ 请填写正确的自定义DNS - 1)ws path + *ws path - 2)h2 path + *h2 path - 3)QUIC 加密密钥/Kcp seed + *QUIC 加密密钥/Kcp seed - 4)grpc serviceName + *grpc serviceName - 1)http host中间逗号(,)隔开 + *http host中间逗号(,)隔开 - 2)ws host + *ws host - 3)h2 host中间逗号(,)隔开 + *h2 host中间逗号(,)隔开 - 4)QUIC 加密方式 + *QUIC 加密方式 - 1)tcp伪装类型 + *tcp伪装类型 - 2)kcp伪装类型 + *kcp伪装类型 - 3)QUIC伪装类型 + *QUIC伪装类型 - 4)grpc 模式 + *grpc 模式 \ No newline at end of file From f7f23e79802e3d3ed87064ea6358c388777f3e44 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 26 Dec 2021 17:44:53 +0800 Subject: [PATCH 069/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 3b23f4b7..d9910968 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.26")] +[assembly: AssemblyFileVersion("4.27")] From fec47d4b728e29db9c3c19da5c4faff93da6aaf7 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 8 Jan 2022 20:27:36 +0800 Subject: [PATCH 070/252] add alpn/userAgent/ --- v2rayN/v2rayN/Forms/AddServer5Form.resx | 12 +- .../v2rayN/Forms/AddServer6Form.Designer.cs | 12 +- v2rayN/v2rayN/Forms/AddServer6Form.resx | 940 +++++++++--------- v2rayN/v2rayN/Forms/AddServerForm.resx | 12 +- .../Forms/ServerTransportControl.Designer.cs | 22 + v2rayN/v2rayN/Forms/ServerTransportControl.cs | 26 + .../v2rayN/Forms/ServerTransportControl.resx | 108 +- .../Forms/ServerTransportControl.zh-Hans.resx | 35 +- .../Forms/SubSettingControl.Designer.cs | 17 + v2rayN/v2rayN/Forms/SubSettingControl.cs | 2 + v2rayN/v2rayN/Forms/SubSettingControl.resx | 83 +- v2rayN/v2rayN/Global.cs | 1 - v2rayN/v2rayN/Handler/ConfigHandler.cs | 22 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 13 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 11 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 6 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 3 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 6 +- .../HttpProxyHandler/HttpProxyHandle.cs | 3 +- .../v2rayN/HttpProxyHandler/SysProxyHandle.cs | 9 - v2rayN/v2rayN/Mode/Config.cs | 72 +- v2rayN/v2rayN/Mode/V2rayConfig.cs | 7 + v2rayN/v2rayN/Mode/VmessQRCode.cs | 33 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 45 +- v2rayN/v2rayN/v2rayN.csproj | 12 +- 26 files changed, 901 insertions(+), 613 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index d8a0fd00..ab0fe1d5 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -541,7 +541,7 @@ 0, 10 - 729, 226 + 729, 221 3 @@ -589,7 +589,7 @@ Bottom - 0, 456 + 0, 461 729, 60 @@ -640,7 +640,7 @@ 0, 0 - 729, 220 + 729, 230 0 @@ -661,10 +661,10 @@ Bottom - 0, 236 + 0, 231 - 729, 220 + 729, 230 9 @@ -691,7 +691,7 @@ 6, 12 - 729, 516 + 729, 521 Edit or add a [VLESS] server diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index df133c13..6ad64150 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -54,15 +54,14 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.cmbFlow); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.label13); @@ -74,12 +73,12 @@ 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 // - resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.FormattingEnabled = true; this.cmbFlow.Items.AddRange(new object[] { resources.GetString("cmbFlow.Items"), @@ -87,6 +86,7 @@ resources.GetString("cmbFlow.Items2"), resources.GetString("cmbFlow.Items3"), resources.GetString("cmbFlow.Items4")}); + resources.ApplyResources(this.cmbFlow, "cmbFlow"); this.cmbFlow.Name = "cmbFlow"; // // label4 @@ -141,21 +141,21 @@ // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.transportControl); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // transportControl // - resources.ApplyResources(this.transportControl, "transportControl"); this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); this.transportControl.Name = "transportControl"; // // 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 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index 62b47572..f95db419 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -117,137 +117,494 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + - - 113, 12 + + 396, 17 - - 53, 12 - - - cmbFlow - - - label6 - - - xtls-rprx-origin + + 75, 23 - - True - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 27 - - + 4 - - - NoControl + + &Cancel - - panel3 + + btnClose - - Bottom + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - xtls-rprx-origin-udp443 - - - panel1 - - - 3 - - - Password - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0 - - - groupBox1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 0 - - - Fill - - - groupBox1 - - - NoControl - - - 89, 12 - - - xtls-rprx-direct - - - 127, 27 - - - 2 - - - Edit or add a [Trojan] server - - - NoControl - - - 10 - - - 2 - - - xtls-rprx-direct-udp443 - - - 303, 17 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 + + panel2 0 + + + + + xtls-rprx-origin + + + xtls-rprx-origin-udp443 + + + xtls-rprx-direct + + + xtls-rprx-direct-udp443 + + + 127, 123 + + + 211, 20 + + + 3 + + + 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 + + + 27 + + + Flow + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + NoControl + + + 428, 158 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + 127, 155 + + + 265, 21 + + + 4 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + NoControl + + + 12, 159 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 91 + + + 265, 21 + + + 2 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + NoControl + + + 12, 93 + + + 53, 12 + + + 4 + + + Password + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + 127, 59 + + + 194, 21 + + + 1 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + NoControl + + + 12, 62 + + + 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 - - $this + + 0 + + + txtAddress System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 396, 17 + + groupBox1 + + + 9 + + + True + + + NoControl + + + 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 + + + Fill + + + 0, 10 + + + 707, 191 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + Fill + + + 0, 0 + + + 707, 230 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panel3 + + + 0 + + + Bottom + + + 0, 201 + + + 707, 230 + + + 8 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + NoControl + + + 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, 431 + + + 707, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top + + + 0, 0 + + + 707, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 6, 12 + + + 707, 491 @@ -422,370 +779,13 @@ wf+0BQAAgAUAAIAFAACAAQAAgAHB/4ABAACAAQAAgAEAALwBAAC8AQAAvAHB/4ABbP///5H/ - - 8 - - - label1 - - - 707, 60 - - - 0, 0 - - - v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - True - - - 22 - - - panel3 - - - True - - - 127, 91 - - - panel2 - - - 0 - - - 5 - - - 3 - - - Alias (remarks) - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 707, 220 - - - groupBox1 - - - groupBox1 - - - txtId - - - 12, 127 - - - 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 + + Edit or add a [Trojan] server AddServer6Form - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - 127, 59 - - - 1 - - - 0 - - - System.Windows.Forms.Button, 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 - - - $this - - - 71, 12 - - - NoControl - - - Bottom - - - $this - - - groupBox1 - - - 127, 123 - - - txtPort - - - 707, 10 - - - 0, 10 - - - 5 - - - label4 - - - &OK - - - btnClose - - - panel2 - - - 0 - - - 0 - - - 12, 93 - - - 2 - - - groupBox1 - - - 10 - - - NoControl - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 194, 21 - - - 0 - - - 1 - - - 6 - - - 2 - - - 7 - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - v2rayN.Forms.BaseServerForm, 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, 425 - - - 9 - - - &Cancel - - - 707, 220 - - - True - - - 6, 12 - - - Server address - - - 0, 205 - - - txtAddress - - - 127, 155 - - - NoControl - - - 95, 12 - - - 428, 158 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - * Fill in manually - - - 7 - - - label2 - - - 12, 62 - - - NoControl - - - 707, 485 - - - 265, 21 - - - btnOK - - - $this - - - 707, 195 - - - 4 - - - 75, 23 - - - 6 - - - transportControl - - - NoControl - - - 4 - - - 3 - - - 211, 20 - - - 75, 23 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 29, 12 - - - groupBox1 - - - groupBox1 - - - Server - - - txtRemarks - - - 12, 159 - - - True - - - Flow - - - 265, 21 - - - Top - - - 1 - - - True - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 82469f68..665f5325 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -532,7 +532,7 @@ 0, 35 - 729, 219 + 729, 216 3 @@ -580,7 +580,7 @@ Bottom - 0, 474 + 0, 481 729, 60 @@ -682,7 +682,7 @@ 0, 0 - 729, 220 + 729, 230 0 @@ -703,10 +703,10 @@ Bottom - 0, 254 + 0, 251 - 729, 220 + 729, 230 9 @@ -733,7 +733,7 @@ 6, 12 - 729, 534 + 729, 541 Edit or add a [VMess] server diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs index db395e1e..04f0f374 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs @@ -31,6 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerTransportControl)); this.gbTransport = new System.Windows.Forms.GroupBox(); this.panTlsMore = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); this.txtSNI = new System.Windows.Forms.TextBox(); this.labSNI = new System.Windows.Forms.Label(); this.labAllowInsecure = new System.Windows.Forms.Label(); @@ -49,6 +50,7 @@ this.labHeaderType = new System.Windows.Forms.Label(); this.labRequestHost = new System.Windows.Forms.Label(); this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.clbAlpn = new System.Windows.Forms.CheckedListBox(); this.gbTransport.SuspendLayout(); this.panTlsMore.SuspendLayout(); this.SuspendLayout(); @@ -76,6 +78,8 @@ // // panTlsMore // + this.panTlsMore.Controls.Add(this.clbAlpn); + this.panTlsMore.Controls.Add(this.label1); this.panTlsMore.Controls.Add(this.txtSNI); this.panTlsMore.Controls.Add(this.labSNI); this.panTlsMore.Controls.Add(this.labAllowInsecure); @@ -83,6 +87,11 @@ resources.ApplyResources(this.panTlsMore, "panTlsMore"); this.panTlsMore.Name = "panTlsMore"; // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // // txtSNI // resources.ApplyResources(this.txtSNI, "txtSNI"); @@ -202,6 +211,17 @@ resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.Name = "cmbHeaderType"; // + // clbAlpn + // + this.clbAlpn.CheckOnClick = true; + resources.ApplyResources(this.clbAlpn, "clbAlpn"); + this.clbAlpn.FormattingEnabled = true; + this.clbAlpn.Items.AddRange(new object[] { + resources.GetString("clbAlpn.Items"), + resources.GetString("clbAlpn.Items1")}); + this.clbAlpn.MultiColumn = true; + this.clbAlpn.Name = "clbAlpn"; + // // ServerTransportControl // resources.ApplyResources(this, "$this"); @@ -239,5 +259,7 @@ private System.Windows.Forms.Label labHeaderType; private System.Windows.Forms.Label labRequestHost; private System.Windows.Forms.ComboBox cmbHeaderType; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckedListBox clbAlpn; } } diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs index 40c6a9c5..583d65cc 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Mode; @@ -41,6 +42,17 @@ namespace v2rayN.Forms cmbStreamSecurity.Text = vmessItem.streamSecurity; cmbAllowInsecure.Text = vmessItem.allowInsecure; txtSNI.Text = vmessItem.sni; + + if (vmessItem.alpn != null) + { + for (int i = 0; i < clbAlpn.Items.Count; i++) + { + if (vmessItem.alpn.Contains(clbAlpn.Items[i].ToString())) + { + clbAlpn.SetItemChecked(i, true); + } + } + } } public void ClearServer(VmessItem item) @@ -54,6 +66,10 @@ namespace v2rayN.Forms cmbAllowInsecure.Text = ""; txtPath.Text = ""; txtSNI.Text = ""; + for (int i = 0; i < clbAlpn.Items.Count; i++) + { + clbAlpn.SetItemChecked(i, false); + } } public void EndBindingServer() @@ -73,6 +89,16 @@ namespace v2rayN.Forms vmessItem.streamSecurity = streamSecurity; vmessItem.allowInsecure = allowInsecure; vmessItem.sni = sni; + + var alpn = new List(); + for (int i = 0; i < clbAlpn.Items.Count; i++) + { + if (clbAlpn.GetItemChecked(i)) + { + alpn.Add(clbAlpn.Items[i].ToString()); + } + } + vmessItem.alpn = alpn; } private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.resx index 32e2e234..f7f94e4a 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.resx +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.resx @@ -117,14 +117,75 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 70 + + + h2 + + + http/1.1 + + + 313, 7 + + + 172, 20 + + + 44 + + + clbAlpn + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + + NoControl + + + 241, 11 + + + 29, 12 + + + 43 + + + alpn + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + - 300, 7 + 100, 39 - 197, 21 + 385, 21 - 1 @@ -138,17 +199,16 @@ panTlsMore - 0 + 2 True - NoControl - 270, 11 + 12, 43 23, 12 @@ -169,7 +229,7 @@ panTlsMore - 1 + 3 True @@ -199,7 +259,7 @@ panTlsMore - 2 + 4 @@ -229,13 +289,13 @@ panTlsMore - 3 + 5 - 200, 171 + 200, 149 - 500, 35 + 500, 71 33 @@ -283,7 +343,7 @@ 1 - 127, 136 + 127, 124 True @@ -382,7 +442,7 @@ NoControl - 9, 140 + 9, 128 29, 12 @@ -412,7 +472,7 @@ NoControl - 529, 140 + 529, 128 11, 12 @@ -442,7 +502,7 @@ NoControl - 464, 104 + 464, 96 11, 12 @@ -472,7 +532,7 @@ NoControl - 9, 182 + 9, 160 23, 12 @@ -496,7 +556,7 @@ 8 - 127, 178 + 127, 156 60, 20 @@ -523,7 +583,7 @@ NoControl - 282, 66 + 282, 64 11, 12 @@ -547,7 +607,7 @@ 10 - 158, 100 + 158, 92 True @@ -577,7 +637,7 @@ NoControl - 9, 66 + 9, 64 95, 12 @@ -607,7 +667,7 @@ NoControl - 9, 104 + 9, 96 143, 12 @@ -652,7 +712,7 @@ wireguard - 127, 64 + 127, 60 143, 20 @@ -679,7 +739,7 @@ 0, 0 - 723, 220 + 723, 223 22 @@ -706,7 +766,7 @@ 6, 12 - 723, 220 + 723, 223 ServerTransportControl diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx index a70f28e7..34a92e99 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx @@ -118,15 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 167, 12 - - - 跳过证书验证(allowInsecure) - - - 183, 7 - 143, 12 @@ -157,11 +148,8 @@ 底层传输安全(tls) - - 203, 12 - - 127, 100 + 127, 92 331, 20 @@ -181,4 +169,25 @@ 底层传输方式(transport) + + 282, 11 + + + 331, 7 + + + 160, 20 + + + 391, 21 + + + 167, 12 + + + 跳过证书验证(allowInsecure) + + + 183, 7 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index 8ffe9ca4..09080977 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -30,6 +30,8 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); this.grbMain = new System.Windows.Forms.GroupBox(); + this.txtUserAgent = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); this.btnShare = new System.Windows.Forms.Button(); this.chkEnabled = new System.Windows.Forms.CheckBox(); this.btnRemove = new System.Windows.Forms.Button(); @@ -44,6 +46,8 @@ // // grbMain // + this.grbMain.Controls.Add(this.txtUserAgent); + this.grbMain.Controls.Add(this.label1); this.grbMain.Controls.Add(this.btnShare); this.grbMain.Controls.Add(this.chkEnabled); this.grbMain.Controls.Add(this.btnRemove); @@ -55,6 +59,17 @@ this.grbMain.Name = "grbMain"; this.grbMain.TabStop = false; // + // txtUserAgent + // + resources.ApplyResources(this.txtUserAgent, "txtUserAgent"); + this.txtUserAgent.Name = "txtUserAgent"; + this.txtUserAgent.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // // btnShare // resources.ApplyResources(this.btnShare, "btnShare"); @@ -130,5 +145,7 @@ private System.Windows.Forms.CheckBox chkEnabled; private System.Windows.Forms.Button btnShare; private System.Windows.Forms.PictureBox picQRCode; + private System.Windows.Forms.TextBox txtUserAgent; + private System.Windows.Forms.Label label1; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 652e389e..3d816c10 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -35,6 +35,7 @@ namespace v2rayN.Forms txtRemarks.Text = subItem.remarks.ToString(); txtUrl.Text = subItem.url.ToString(); chkEnabled.Checked = subItem.enabled; + txtUserAgent.Text = subItem.userAgent; } } private void EndBindingSub() @@ -44,6 +45,7 @@ namespace v2rayN.Forms subItem.remarks = txtRemarks.Text.TrimEx(); subItem.url = txtUrl.Text.TrimEx(); subItem.enabled = chkEnabled.Checked; + subItem.userAgent = txtUserAgent.Text.TrimEx(); } } private void txtRemarks_Leave(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index f06a5702..a9449a19 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -117,18 +117,69 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 111 + + + 473, 21 + + + + 3 + + + txtUserAgent + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 0 + + + True + + + NoControl + + + 12, 115 + + + 65, 12 + + + 27 + + + User Agent + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 1 + NoControl - 434, 21 75, 23 - 26 @@ -145,7 +196,7 @@ grbMain - 0 + 2 True @@ -175,7 +226,7 @@ grbMain - 1 + 3 NoControl @@ -202,10 +253,10 @@ grbMain - 2 + 4 - 127, 55 + 127, 53 True @@ -217,7 +268,7 @@ 473, 46 - 23 + 2 txtUrl @@ -229,7 +280,7 @@ grbMain - 3 + 5 127, 21 @@ -238,7 +289,7 @@ 232, 21 - 11 + 1 txtRemarks @@ -250,7 +301,7 @@ grbMain - 4 + 6 True @@ -280,7 +331,7 @@ grbMain - 5 + 7 True @@ -289,7 +340,7 @@ NoControl - 12, 55 + 12, 53 83, 12 @@ -310,7 +361,7 @@ grbMain - 6 + 8 Top @@ -319,7 +370,7 @@ 0, 0 - 619, 110 + 619, 148 10 @@ -346,10 +397,10 @@ NoControl - 0, 110 + 0, 148 - 619, 200 + 619, 162 Zoom diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 0a37c2c6..466119c2 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -21,7 +21,6 @@ namespace v2rayN /// 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 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 1c35c368..b1c16c6b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -128,18 +128,22 @@ namespace v2rayN.Handler config.uiItem.mainLvColWidth = new Dictionary(); } - //// 如果是用户升级,首次会有端口号为0的情况,不可用,这里处理 - //if (config.pacPort == 0) - //{ - // config.pacPort = 8888; - //} - if (Utils.IsNullOrEmpty(config.speedTestUrl)) + + if (config.constItem == null) { - config.speedTestUrl = Global.SpeedTestUrl; + config.constItem = new ConstItem(); } - if (Utils.IsNullOrEmpty(config.speedPingTestUrl)) + if (Utils.IsNullOrEmpty(config.constItem.speedTestUrl)) { - config.speedPingTestUrl = Global.SpeedPingTestUrl; + config.constItem.speedTestUrl = Global.SpeedTestUrl; + } + if (Utils.IsNullOrEmpty(config.constItem.speedPingTestUrl)) + { + config.constItem.speedPingTestUrl = Global.SpeedPingTestUrl; + } + if (Utils.IsNullOrEmpty(config.constItem.defIEProxyExceptions)) + { + config.constItem.defIEProxyExceptions = Global.IEProxyExceptions; } //if (Utils.IsNullOrEmpty(config.remoteDNS)) //{ diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 04d777b4..a3834fa6 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -13,7 +13,7 @@ namespace v2rayN.Handler public event EventHandler UpdateCompleted; public event ErrorEventHandler Error; - + public class ResultEventArgs : EventArgs { @@ -31,7 +31,7 @@ namespace v2rayN.Handler private long totalBytesToReceive = 0; private DateTime totalDatetime = new DateTime(); private int DownloadTimeout = -1; - + public WebClientEx DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout) { WebClientEx ws = new WebClientEx(); @@ -62,7 +62,7 @@ namespace v2rayN.Handler } return ws; } - + void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { if (UpdateCompleted != null) @@ -131,7 +131,7 @@ namespace v2rayN.Handler /// DownloadString /// /// - public void WebDownloadString(string url) + public void WebDownloadString(string url, string userAgent) { string source = string.Empty; try @@ -139,6 +139,11 @@ namespace v2rayN.Handler Utils.SetSecurityProtocol(); WebClientEx ws = new WebClientEx(); + if (!Utils.IsNullOrEmpty(userAgent)) + { + ws.Headers.Add("user-agent", userAgent); + } + ws.DownloadStringCompleted += Ws_DownloadStringCompleted; ws.DownloadStringAsync(new Uri(url)); } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index b22fe83b..4571ccf3 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -76,7 +76,8 @@ namespace v2rayN.Handler host = item.requestHost, path = item.path, tls = item.streamSecurity, - sni = item.sni + sni = item.sni, + alpn = Utils.List2String(item.alpn) }; url = Utils.ToJson(vmessQRCode); @@ -180,6 +181,10 @@ namespace v2rayN.Handler { dicQuery.Add("sni", item.sni); } + if (item.alpn != null && item.alpn.Count > 0) + { + dicQuery.Add("alpn", Utils.UrlEncode(Utils.List2String(item.alpn))); + } if (!Utils.IsNullOrEmpty(item.network)) { dicQuery.Add("type", item.network); @@ -422,8 +427,9 @@ namespace v2rayN.Handler vmessItem.path = Utils.ToString(vmessQRCode.path); vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); vmessItem.sni = Utils.ToString(vmessQRCode.sni); + vmessItem.alpn = Utils.String2List(vmessQRCode.alpn); - return vmessItem; + return vmessItem; } private static VmessItem ResolveVmess4Kitsunebi(string result) @@ -730,6 +736,7 @@ namespace v2rayN.Handler item.security = query["encryption"] ?? "none"; item.streamSecurity = query["security"] ?? ""; item.sni = query["sni"] ?? ""; + item.alpn = Utils.String2List(Utils.UrlDecode(query["alpn"] ?? "")); item.network = query["type"] ?? "tcp"; switch (item.network) { diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 084e09c0..d8eb1eee 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -122,7 +122,7 @@ namespace v2rayN.Handler { WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); int responseTime = -1; - string status = GetRealPingTime(_config.speedPingTestUrl, webProxy, out responseTime); + string status = GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : FormatOut(status, ""); _updateFunc(itemIndex, output); } @@ -157,7 +157,7 @@ namespace v2rayN.Handler { WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); int responseTime = -1; - string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime); + string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out responseTime); bool noError = Utils.IsNullOrEmpty(status); return noError ? responseTime : -1; } @@ -193,7 +193,7 @@ namespace v2rayN.Handler return; } - string url = _config.speedTestUrl; + string url = _config.constItem.speedTestUrl; DownloadHandle downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index ee7e09a0..09ebcbac 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -179,6 +179,7 @@ namespace v2rayN.Handler { string id = config.subItem[k - 1].id.Trim(); string url = config.subItem[k - 1].url.Trim(); + string userAgent = config.subItem[k - 1].userAgent.Trim(); string hashCode = $"{k}->"; if (config.subItem[k - 1].enabled == false) { @@ -227,7 +228,7 @@ namespace v2rayN.Handler _updateFunc(false, args.GetException().Message); }; - downloadHandle3.WebDownloadString(url); + downloadHandle3.WebDownloadString(url, userAgent); _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 972c8309..b95595cd 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -587,7 +587,8 @@ namespace v2rayN.Handler TlsSettings tlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure() + allowInsecure = config.allowInsecure(), + alpn = config.alpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -607,7 +608,8 @@ namespace v2rayN.Handler TlsSettings xtlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure() + allowInsecure = config.allowInsecure(), + alpn = config.alpn() }; if (!string.IsNullOrWhiteSpace(sni)) { diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index 5372fd79..d4f14af0 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -166,7 +166,8 @@ namespace v2rayN.HttpProxyHandler } if (type == ESysProxyType.ForcedChange) { - SysProxyHandle.SetIEProxy(true, $"{Global.Loopback}:{port}", config.systemProxyExceptions); + var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; + SysProxyHandle.SetIEProxy(true, $"{Global.Loopback}:{port}", strExceptions); } else if (type == ESysProxyType.ForcedClear) { diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs index 6fedd91b..2d6f96e0 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs @@ -85,15 +85,6 @@ namespace v2rayN.HttpProxyHandler public static void SetIEProxy(bool global, string strProxy, string strExceptions) { - if (Utils.IsNullOrEmpty(strExceptions)) - { - strExceptions = Global.IEProxyExceptions; - } - else - { - strExceptions = $"{Global.IEProxyExceptions};{strExceptions}"; - } - string arguments = global ? $"global {strProxy} {strExceptions}" : $"pac {strProxy}"; diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index a8a54cb2..b3dfa5c8 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -76,21 +76,6 @@ namespace v2rayN.Mode get; set; } - /// - /// 自定义服务器下载测速url - /// - public string speedTestUrl - { - get; set; - } - /// - /// 自定义“服务器真连接延迟”测试url - /// - public string speedPingTestUrl - { - get; set; - } - /// /// 允许来自局域网的连接 /// @@ -200,6 +185,10 @@ namespace v2rayN.Mode get; set; } = 0; + public ConstItem constItem + { + get; set; + } #region 函数 public string address() @@ -371,6 +360,21 @@ namespace v2rayN.Mode } return vmess[index].sni.TrimEx(); } + public List alpn() + { + if (index < 0) + { + return null; + } + if (vmess[index].alpn != null && vmess[index].alpn.Count > 0) + { + return vmess[index].alpn; + } + else + { + return null; + } + } #endregion } @@ -604,6 +608,13 @@ namespace v2rayN.Mode { get; set; } + /// + /// tls alpn + /// + public List alpn + { + get; set; + } } [Serializable] @@ -725,6 +736,14 @@ namespace v2rayN.Mode /// enable /// public bool enabled { get; set; } = true; + + /// + /// + /// + public string userAgent + { + get; set; + } = string.Empty; } [Serializable] @@ -742,4 +761,27 @@ namespace v2rayN.Mode get; set; } } + + [Serializable] + public class ConstItem + { + /// + /// 自定义服务器下载测速url + /// + public string speedTestUrl + { + get; set; + } + /// + /// 自定义“服务器真连接延迟”测试url + /// + public string speedPingTestUrl + { + get; set; + } + public string defIEProxyExceptions + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index b2680243..4703ec21 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -404,6 +404,13 @@ namespace v2rayN.Mode /// /// public string serverName { get; set; } + /// + /// + /// + public List alpn + { + get; set; + } } public class TcpSettings diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs index 34317b74..c4db42b4 100644 --- a/v2rayN/v2rayN/Mode/VmessQRCode.cs +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -2,61 +2,68 @@ namespace v2rayN.Mode { + /// + /// https://github.com/2dust/v2rayN/wiki/ + /// [Serializable] class VmessQRCode { /// - /// 版本 + /// /// public string v { get; set; } = string.Empty; /// - /// 备注 + /// /// public string ps { get; set; } = string.Empty; /// - /// VMess 远程服务器地址 + /// /// public string add { get; set; } = string.Empty; /// - /// VMess 远程服务器端口 + /// /// public string port { get; set; } = string.Empty; /// - /// VMess 远程服务器ID + /// /// public string id { get; set; } = string.Empty; /// - /// VMess 远程服务器额外ID + /// /// public string aid { get; set; } = string.Empty; /// - /// VMess Security + /// /// public string scy { get; set; } = string.Empty; /// - /// 传输协议tcp,kcp,ws + /// /// public string net { get; set; } = string.Empty; /// - /// 伪装类型 + /// /// public string type { get; set; } = string.Empty; /// - /// 伪装的域名 + /// /// public string host { get; set; } = string.Empty; /// - /// path + /// /// public string path { get; set; } = string.Empty; /// - /// 底层传输安全 + /// TLS /// public string tls { get; set; } = string.Empty; /// - /// SNI + /// TLS SNI /// public string sni { get; set; } = string.Empty; + /// + /// TLS alpn + /// + public string alpn { get; set; } = string.Empty; } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index d9910968..20c67a96 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.27")] +[assembly: AssemblyFileVersion("4.28")] diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 6196ce69..b0db10ed 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -180,6 +180,10 @@ namespace v2rayN { try { + if (lst == null) + { + return string.Empty; + } if (wrap) { return string.Join("," + Environment.NewLine, lst.ToArray()); @@ -627,6 +631,26 @@ namespace v2rayN regKey?.Close(); } } + + /// + /// 判断.Net Framework的Release是否符合 + /// (.Net Framework 版本在4.0及以上) + /// + /// 需要的版本4.6.2=394802;4.8=528040 + /// + public static bool GetDotNetRelease(int release) + { + const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"; + using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) + { + if (ndpKey != null && ndpKey.GetValue("Release") != null) + { + return (int)ndpKey.GetValue("Release") >= release ? true : false; + } + return false; + } + } + #endregion #region 测速 @@ -693,11 +717,22 @@ namespace v2rayN public static void SetSecurityProtocol() { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 - | SecurityProtocolType.Tls - | SecurityProtocolType.Tls11 - | SecurityProtocolType.Tls12 - | SecurityProtocolType.Tls13; + //.NET Framework 4.8 + if (GetDotNetRelease(528040)) + { + ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 + | SecurityProtocolType.Tls + | SecurityProtocolType.Tls11 + | SecurityProtocolType.Tls12 + | SecurityProtocolType.Tls13; + } + else + { + ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 + | SecurityProtocolType.Tls + | SecurityProtocolType.Tls11 + | SecurityProtocolType.Tls12; + } ServicePointManager.DefaultConnectionLimit = 256; } #endregion diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index b2601936..203b51d2 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -487,24 +487,24 @@ - 3.11.4 + 3.19.1 - 2.27.0 + 2.42.0 - 2.27.0 + 2.42.0 runtime; build; native; contentfiles; analyzers; buildtransitive all - 2.0.13 + 2.0.14 - 12.0.3 + 13.0.1 - 0.16.5 + 0.16.7 From 88e2288298d656cfa3a1b3880bb1139959f6bf12 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:04:10 +0800 Subject: [PATCH 071/252] Added tls display to the main form --- v2rayN/v2rayN/Forms/MainForm.cs | 2 ++ v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx | 2 +- .../Forms/ServerTransportControl.zh-Hans.resx | 2 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 1 + v2rayN/v2rayN/Mode/Config.cs | 2 +- v2rayN/v2rayN/Mode/EServerColName.cs | 1 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 13 +++++++++++-- v2rayN/v2rayN/Resx/ResUI.resx | 3 +++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 +++ 9 files changed, 24 insertions(+), 5 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 18467531..6bd0b4b6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -202,6 +202,7 @@ namespace v2rayN.Forms 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("LvTLS"), 70); lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50); lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Right); @@ -258,6 +259,7 @@ namespace v2rayN.Forms Utils.AddSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); Utils.AddSubItem(lvItem, EServerColName.security.ToString(), item.security); Utils.AddSubItem(lvItem, EServerColName.network.ToString(), item.network); + Utils.AddSubItem(lvItem, EServerColName.streamSecurity.ToString(), item.streamSecurity); Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); Utils.AddSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); if (stats) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 7f62c293..0707411b 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -137,7 +137,7 @@ 336, 16 - 底层传输安全选tls时,默认跳过证书验证(allowInsecure) + 传输层安全选tls时,默认跳过证书验证(allowInsecure) 96, 16 diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx index 34a92e99..4ca97072 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx @@ -146,7 +146,7 @@ 107, 12 - 底层传输安全(tls) + 传输层安全(tls) 127, 92 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index b1c16c6b..db9e81a8 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -914,6 +914,7 @@ namespace v2rayN.Handler case EServerColName.port: case EServerColName.security: case EServerColName.network: + case EServerColName.streamSecurity: case EServerColName.testResult: propertyName = name.ToString(); break; diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index b3dfa5c8..f3425e8c 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -554,7 +554,7 @@ namespace v2rayN.Mode } /// - /// 底层传输安全 + /// 传输层安全 /// public string streamSecurity { diff --git a/v2rayN/v2rayN/Mode/EServerColName.cs b/v2rayN/v2rayN/Mode/EServerColName.cs index 0704e47e..554a520e 100644 --- a/v2rayN/v2rayN/Mode/EServerColName.cs +++ b/v2rayN/v2rayN/Mode/EServerColName.cs @@ -10,6 +10,7 @@ namespace v2rayN.Mode port, security, network, + streamSecurity, subRemarks, testResult, diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index a6515acf..1842e7f0 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -47,8 +47,8 @@ namespace v2rayN.Resx { } /// - /// 重写当前线程的 CurrentUICulture 属性 - /// 重写当前线程的 CurrentUICulture 属性。 + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -402,6 +402,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 TLS 的本地化字符串。 + /// + internal static string LvTLS { + get { + return ResourceManager.GetString("LvTLS", resourceCulture); + } + } + /// /// 查找类似 Today download traffic 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index e8a03fc9..0c9a42b3 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -436,4 +436,7 @@ *grpc mode + + TLS + \ 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 6633c1a8..ce915bca 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -436,4 +436,7 @@ *grpc 模式 + + 传输层安全 + \ No newline at end of file From 0a1d4d5193ac12c1e5cbbba329ea930fc247c06c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:05:03 +0800 Subject: [PATCH 072/252] Add tls13 settings in the registry --- v2rayN/v2rayN/Global.cs | 4 ++++ v2rayN/v2rayN/Tool/Utils.cs | 29 +++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 466119c2..de142806 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -176,6 +176,10 @@ namespace v2rayN /// public const string MyRegKeyLanguage = "CurrentLanguage"; /// + /// + /// + public const string MyRegKeySecurityProtocolTls13 = "SecurityProtocolTls13"; + /// /// Icon /// public const string CustomIconName = "v2rayN.ico"; diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index b0db10ed..6fa98069 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -353,7 +353,7 @@ namespace v2rayN return $"{string.Format("{0:f1}", result)} {unit}"; } - + public static string UrlEncode(string url) { @@ -717,8 +717,9 @@ namespace v2rayN public static void SetSecurityProtocol() { - //.NET Framework 4.8 - if (GetDotNetRelease(528040)) + string securityProtocolTls13 = RegReadValue(Global.MyRegPath, Global.MyRegKeySecurityProtocolTls13, "0"); + + if (securityProtocolTls13.Equals("1")) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls @@ -735,6 +736,26 @@ namespace v2rayN } ServicePointManager.DefaultConnectionLimit = 256; } + + public static bool PortInUse(int port) + { + bool inUse = false; + + IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); + + var lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + + foreach (IPEndPoint endPoint in ipEndPoints) + { + if (endPoint.Port == port) + { + inUse = true; + break; + } + } + return inUse; + } #endregion #region 杂项 @@ -913,7 +934,7 @@ namespace v2rayN { var logger = LogManager.GetLogger("Log2"); logger.Debug(strTitle); - logger.Debug(ex); + logger.Debug(ex); } #endregion From f3a86a217382eb75f70e1a2493c1d48816b2c4db Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:06:22 +0800 Subject: [PATCH 073/252] Added port in used check at speedtest --- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index b95595cd..c30336ad 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; +using System.Net.NetworkInformation; using v2rayN.Mode; namespace v2rayN.Handler @@ -529,7 +531,7 @@ namespace v2rayN.Handler serversItem.ota = false; serversItem.level = 1; - + //if xtls if (config.streamSecurity() == Global.StreamSecurityX) { @@ -1418,6 +1420,12 @@ namespace v2rayN.Handler msg = UIRes.I18N("FailedGenDefaultConfiguration"); return ""; } + List lstIpEndPoints = null; + try + { + lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + } + catch { } log(configCopy, ref v2rayConfig, false); //routing(config, ref v2rayConfig); @@ -1426,6 +1434,7 @@ namespace v2rayN.Handler v2rayConfig.inbounds.Clear(); // Remove "proxy" service for speedtest, avoiding port conflicts. int httpPort = configCopy.GetLocalPort("speedtest"); + foreach (int index in selecteds) { if (configCopy.vmess[index].configType == (int)EConfigType.Custom) @@ -1434,11 +1443,18 @@ namespace v2rayN.Handler } configCopy.index = index; + var port = httpPort + index; + + //Port In Used + if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == port) >= 0) + { + continue; + } Inbounds inbound = new Inbounds { listen = Global.Loopback, - port = httpPort + index, + port = port, protocol = Global.InboundHttp }; inbound.tag = Global.InboundHttp + inbound.port.ToString(); From cf0bd7f1e6fa56a63aa501e89d0571776fa70641 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 12 Jan 2022 21:06:32 +0800 Subject: [PATCH 074/252] up 4.29 --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 20c67a96..dde0e7b1 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.28")] +[assembly: AssemblyFileVersion("4.29")] From 5b9cdec1562b09f00f20a81dfb7c0a765e31ff65 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 Jan 2022 19:16:14 +0800 Subject: [PATCH 075/252] remove alterId --- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 16 ---- v2rayN/v2rayN/Forms/AddServerForm.cs | 11 --- v2rayN/v2rayN/Forms/AddServerForm.resx | 80 ++++--------------- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 3 - v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 - v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 6 -- v2rayN/v2rayN/Mode/Config.cs | 19 +---- v2rayN/v2rayN/Mode/V2rayConfig.cs | 5 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 --- v2rayN/v2rayN/Resx/ResUI.resx | 3 - v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 - v2rayN/v2rayN/Sample/SampleClientConfig.txt | 1 - v2rayN/v2rayN/Sample/SampleServerConfig.txt | 1 - 13 files changed, 18 insertions(+), 141 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index d6393c60..2abd7e1a 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -38,8 +38,6 @@ this.txtRemarks = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); - this.txtAlterId = new System.Windows.Forms.TextBox(); - this.label4 = 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(); @@ -80,8 +78,6 @@ this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.label5); - this.groupBox1.Controls.Add(this.txtAlterId); - this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtId); this.groupBox1.Controls.Add(this.label3); this.groupBox1.Controls.Add(this.txtPort); @@ -137,16 +133,6 @@ resources.ApplyResources(this.label5, "label5"); this.label5.Name = "label5"; // - // txtAlterId - // - resources.ApplyResources(this.txtAlterId, "txtAlterId"); - this.txtAlterId.Name = "txtAlterId"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // // txtId // resources.ApplyResources(this.txtId, "txtId"); @@ -280,8 +266,6 @@ private System.Windows.Forms.TextBox txtRemarks; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label5; - private System.Windows.Forms.TextBox txtAlterId; - private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox txtId; private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txtPort; diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index fe344d8e..2c231ac8 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -35,7 +35,6 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); cmbSecurity.Text = vmessItem.security; txtRemarks.Text = vmessItem.remarks; @@ -51,7 +50,6 @@ namespace v2rayN.Forms txtAddress.Text = ""; txtPort.Text = ""; txtId.Text = ""; - txtAlterId.Text = "0"; cmbSecurity.Text = Global.DefaultSecurity; txtRemarks.Text = ""; @@ -63,7 +61,6 @@ namespace v2rayN.Forms string address = txtAddress.Text; string port = txtPort.Text; string id = txtId.Text; - string alterId = txtAlterId.Text; string security = cmbSecurity.Text; string remarks = txtRemarks.Text; @@ -82,18 +79,12 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("FillUUID")); return; } - if (Utils.IsNullOrEmpty(alterId) || !Utils.IsNumberic(alterId)) - { - UI.Show(UIRes.I18N("FillCorrectAlterId")); - return; - } transportControl.EndBindingServer(); vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; - vmessItem.alterId = Utils.ToInt(alterId); vmessItem.security = security; vmessItem.remarks = remarks; @@ -177,7 +168,6 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; transportControl.BindingServer(vmessItem); @@ -203,7 +193,6 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; transportControl.BindingServer(vmessItem); diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 665f5325..c8d1d996 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -171,7 +171,7 @@ True - 411, 175 + 411, 147 113, 12 @@ -198,7 +198,7 @@ True - 411, 147 + 411, 118 119, 12 @@ -237,7 +237,7 @@ zero - 195, 143 + 195, 114 210, 20 @@ -258,7 +258,7 @@ 3 - 127, 171 + 127, 143 278, 21 @@ -282,7 +282,7 @@ True - 12, 175 + 12, 147 95, 12 @@ -309,7 +309,7 @@ True - 12, 147 + 12, 118 173, 12 @@ -332,54 +332,6 @@ 6 - - 127, 114 - - - 143, 21 - - - 3 - - - txtAlterId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 12, 118 - - - 47, 12 - - - 6 - - - AlterId - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - 127, 85 @@ -399,7 +351,7 @@ groupBox1 - 9 + 7 True @@ -426,7 +378,7 @@ groupBox1 - 10 + 8 127, 56 @@ -447,7 +399,7 @@ groupBox1 - 11 + 9 True @@ -474,7 +426,7 @@ groupBox1 - 12 + 10 127, 27 @@ -495,7 +447,7 @@ groupBox1 - 13 + 11 True @@ -522,7 +474,7 @@ groupBox1 - 14 + 12 @@ -532,7 +484,7 @@ 0, 35 - 729, 216 + 729, 186 3 @@ -580,7 +532,7 @@ Bottom - 0, 481 + 0, 451 729, 60 @@ -703,7 +655,7 @@ Bottom - 0, 251 + 0, 221 729, 230 @@ -733,7 +685,7 @@ 6, 12 - 729, 541 + 729, 511 Edit or add a [VMess] server diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 47b4d4cd..5c854d9e 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -235,9 +235,6 @@ 95, 12 - - 额外ID(alterId) - 65, 12 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index db9e81a8..728ef5bb 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -297,7 +297,6 @@ namespace v2rayN.Handler 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), @@ -1016,7 +1015,6 @@ namespace v2rayN.Handler 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 && diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index c30336ad..f3504c03 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -363,7 +363,6 @@ namespace v2rayN.Handler } //远程服务器用户ID usersItem.id = config.id(); - usersItem.alterId = config.alterId(); usersItem.email = Global.userEMail; usersItem.security = config.security(); @@ -479,7 +478,6 @@ namespace v2rayN.Handler } //远程服务器用户ID usersItem.id = config.id(); - usersItem.alterId = 0; usersItem.flow = string.Empty; usersItem.email = Global.userEMail; usersItem.encryption = config.security(); @@ -1025,13 +1023,11 @@ namespace v2rayN.Handler 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(); } @@ -1126,7 +1122,6 @@ namespace v2rayN.Handler vmessItem.address = outbound.settings.vnext[0].address; vmessItem.port = outbound.settings.vnext[0].port; vmessItem.id = outbound.settings.vnext[0].users[0].id; - vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId; vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); //tcp or kcp @@ -1270,7 +1265,6 @@ namespace v2rayN.Handler vmessItem.address = string.Empty; vmessItem.port = inbound.port; vmessItem.id = inbound.settings.clients[0].id; - vmessItem.alterId = inbound.settings.clients[0].alterId; vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index f3425e8c..7945c0b3 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -218,15 +218,6 @@ namespace v2rayN.Mode return vmess[index].id.TrimEx(); } - public int alterId() - { - if (index < 0) - { - return 0; - } - return vmess[index].alterId; - } - public string security() { if (index < 0) @@ -388,7 +379,6 @@ namespace v2rayN.Mode address = string.Empty; port = 0; id = string.Empty; - alterId = 0; security = string.Empty; network = string.Empty; remarks = string.Empty; @@ -499,14 +489,7 @@ namespace v2rayN.Mode public string id { get; set; - } - /// - /// 远程服务器额外ID - /// - public int alterId - { - get; set; - } + } /// /// 本地安全策略 /// diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 4703ec21..b6d8ed55 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -149,10 +149,7 @@ namespace v2rayN.Mode /// /// public string id { get; set; } - /// - /// - /// - public int alterId { get; set; } + /// /// /// diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 1842e7f0..509139fb 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -186,15 +186,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Please fill in the correct format extra ID 的本地化字符串。 - /// - internal static string FillCorrectAlterId { - get { - return ResourceManager.GetString("FillCorrectAlterId", resourceCulture); - } - } - /// /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 0c9a42b3..fcc7d104 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -156,9 +156,6 @@ Failed to read configuration file - - Please fill in the correct format extra ID - Please fill in the correct format server port diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index ce915bca..28d06e11 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -156,9 +156,6 @@ 读取配置文件失败 - - 请填写正确格式额外ID - 请填写正确格式服务器端口 diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt index f2924c9a..0d2b2537 100644 --- a/v2rayN/v2rayN/Sample/SampleClientConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -47,7 +47,6 @@ "port": 10086, "users": [{ "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", - "alterId": 64, "security": "auto" }] }], diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig.txt index bd773f43..29186903 100644 --- a/v2rayN/v2rayN/Sample/SampleServerConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleServerConfig.txt @@ -11,7 +11,6 @@ "clients": [{ "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297", "level": 1, - "alterId": 64, "email": "t@t.tt" }] }, From f84e538b6a593e1408b9f210fe99755cd4fa4389 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 Jan 2022 19:16:24 +0800 Subject: [PATCH 076/252] Update MainFormHandler.cs --- v2rayN/v2rayN/Handler/MainFormHandler.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 56858b92..7e57c7cc 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -185,15 +185,16 @@ namespace v2rayN.Handler public void BackupGuiNConfig(Config config, bool auto = false) { - string fileName = string.Empty; + string fileName = $"guiNConfig_{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff")}.json"; if (auto) { - fileName = Utils.GetTempPath($"guiNConfig{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.json"); + fileName = Utils.GetTempPath(fileName); } else { SaveFileDialog fileDialog = new SaveFileDialog { + FileName = fileName, Filter = "guiNConfig|*.json", FilterIndex = 2, RestoreDirectory = true From b5b5eb25a13f49e2eae3ce6eedf8858e79711e09 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 23 Jan 2022 19:18:20 +0800 Subject: [PATCH 077/252] Enhanced share link --- v2rayN/v2rayN/Handler/ShareHandler.cs | 220 +++++++++++++++----------- 1 file changed, 130 insertions(+), 90 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 4571ccf3..cd19c0b1 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -69,7 +69,7 @@ namespace v2rayN.Handler add = item.address, port = item.port.ToString(), id = item.id, - aid = item.alterId.ToString(), + aid = "0", scy = item.security, net = item.network, type = item.headerType, @@ -96,15 +96,15 @@ namespace v2rayN.Handler { remark = "#" + Utils.UrlEncode(item.remarks); } - url = string.Format("{0}:{1}@{2}:{3}", - item.security, - item.id, - item.address, - item.port); - url = Utils.Base64Encode(url); - //new - //var pw = Utils.Base64Encode($"{item.security}:{item.id}"); - //url = $"{pw}@{item.address}:{ item.port}"; + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utils.Base64Encode(url); + //new Sip002 + var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + url = $"{pw}@{GetIpv6(item.address)}:{ item.port}"; url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); return url; } @@ -117,12 +117,15 @@ namespace v2rayN.Handler { remark = "#" + Utils.UrlEncode(item.remarks); } - url = string.Format("{0}:{1}@{2}:{3}", - item.security, - item.id, - item.address, - item.port); - url = Utils.Base64Encode(url); + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utils.Base64Encode(url); + //new + var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + url = $"{pw}@{GetIpv6(item.address)}:{ item.port}"; url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); return url; } @@ -135,15 +138,14 @@ namespace v2rayN.Handler { remark = "#" + Utils.UrlEncode(item.remarks); } - string query = string.Empty; - if (!Utils.IsNullOrEmpty(item.sni)) - { - query = string.Format("?sni={0}", Utils.UrlEncode(item.sni)); - } + var dicQuery = new Dictionary(); + GetStdTransport(item, null, ref dicQuery); + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); + item.id, + GetIpv6(item.address), + item.port); url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); return url; } @@ -157,10 +159,6 @@ namespace v2rayN.Handler remark = "#" + Utils.UrlEncode(item.remarks); } var dicQuery = new Dictionary(); - if (!Utils.IsNullOrEmpty(item.flow)) - { - dicQuery.Add("flow", item.flow); - } if (!Utils.IsNullOrEmpty(item.security)) { dicQuery.Add("encryption", item.security); @@ -169,13 +167,38 @@ namespace v2rayN.Handler { dicQuery.Add("encryption", "none"); } + GetStdTransport(item, "none", ref dicQuery); + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); + return url; + } + private static string GetIpv6(string address) + { + return Utils.IsIpv6(address) ? $"[{address}]" : address; + } + + private static int GetStdTransport(VmessItem item, string securityDef, ref Dictionary dicQuery) + { + if (!Utils.IsNullOrEmpty(item.flow)) + { + dicQuery.Add("flow", item.flow); + } + if (!Utils.IsNullOrEmpty(item.streamSecurity)) { dicQuery.Add("security", item.streamSecurity); } else { - dicQuery.Add("security", "none"); + if (securityDef != null) + { + dicQuery.Add("security", securityDef); + } } if (!Utils.IsNullOrEmpty(item.sni)) { @@ -272,19 +295,9 @@ namespace v2rayN.Handler } break; } - string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); - - url = string.Format("{0}@{1}:{2}", - item.id, - GetIpv6(item.address), - item.port); - url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); - return url; - } - private static string GetIpv6(string address) - { - return Utils.IsIpv6(address) ? $"[{address}]" : address; + return 0; } + #endregion #region ImportShareUrl @@ -349,7 +362,21 @@ namespace v2rayN.Handler { msg = UIRes.I18N("ConfigurationFormatIncorrect"); - vmessItem = ResolveSocks(result); + vmessItem = ResolveSocksNew(result); + if (vmessItem == null) + { + vmessItem = ResolveSocks(result); + } + if (vmessItem == null) + { + return null; + } + if (vmessItem.address.Length == 0 || vmessItem.port == 0) + { + return null; + } + + vmessItem.configType = (int)EConfigType.Socks; } else if (result.StartsWith(Global.trojanProtocol)) { @@ -403,7 +430,6 @@ namespace v2rayN.Handler vmessItem.address = Utils.ToString(vmessQRCode.add); vmessItem.port = Utils.ToInt(vmessQRCode.port); vmessItem.id = Utils.ToString(vmessQRCode.id); - vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); vmessItem.security = Utils.ToString(vmessQRCode.scy); if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) @@ -429,7 +455,7 @@ namespace v2rayN.Handler vmessItem.sni = Utils.ToString(vmessQRCode.sni); vmessItem.alpn = Utils.String2List(vmessQRCode.alpn); - return vmessItem; + return vmessItem; } private static VmessItem ResolveVmess4Kitsunebi(string result) @@ -466,7 +492,6 @@ namespace v2rayN.Handler vmessItem.network = Global.DefaultNetwork; vmessItem.headerType = Global.None; vmessItem.remarks = "Alien"; - vmessItem.alterId = 0; return vmessItem; } @@ -490,11 +515,6 @@ namespace v2rayN.Handler 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) { @@ -577,17 +597,7 @@ namespace v2rayN.Handler // 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 userInfo = Utils.Base64Decode(rawUserInfo); string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); if (userInfoParts.Length != 2) { @@ -624,8 +634,7 @@ namespace v2rayN.Handler Match details; try { - details = DetailsParser.Match(Encoding.UTF8.GetString(Convert.FromBase64String( - base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=')))); + details = DetailsParser.Match(Utils.Base64Decode(base64)); } catch (FormatException) { @@ -642,7 +651,7 @@ namespace v2rayN.Handler 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]+)$"); + @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$"); private static VmessItem ResolveSocks(string result) { @@ -690,30 +699,55 @@ namespace v2rayN.Handler return vmessItem; } + private static VmessItem ResolveSocksNew(string result) + { + Uri parsedUrl; + try + { + parsedUrl = new Uri(result); + } + catch (UriFormatException) + { + return null; + } + VmessItem server = new VmessItem + { + remarks = Utils.UrlDecode(parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)), + address = parsedUrl.IdnHost, + port = parsedUrl.Port, + }; + + // parse base64 UserInfo + string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); + if (userInfoParts.Length == 2) + { + server.security = userInfoParts[0]; + server.id = userInfoParts[1]; + } + + return server; + } + private static VmessItem ResolveTrojan(string result) { - VmessItem vmessItem = new VmessItem(); - - vmessItem.configType = (int)EConfigType.Trojan; - - Uri uri = new Uri(result); - vmessItem.address = uri.IdnHost; - vmessItem.port = uri.Port; - vmessItem.id = uri.UserInfo; - - var qurery = HttpUtility.ParseQueryString(uri.Query); - vmessItem.sni = qurery["sni"] ?? ""; - - var remarks = uri.Fragment.Replace("#", ""); - if (Utils.IsNullOrEmpty(remarks)) + VmessItem item = new VmessItem { - vmessItem.remarks = "NONE"; - } - else - { - vmessItem.remarks = Utils.UrlDecode(remarks); - } - return vmessItem; + configType = (int)EConfigType.Trojan + }; + + Uri url = new Uri(result); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = Utils.UrlDecode(url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)); + item.id = url.UserInfo; + + var query = HttpUtility.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + + return item; } private static VmessItem ResolveStdVLESS(string result) { @@ -731,10 +765,17 @@ namespace v2rayN.Handler item.id = url.UserInfo; var query = HttpUtility.ParseQueryString(url.Query); - - item.flow = query["flow"] ?? ""; item.security = query["encryption"] ?? "none"; item.streamSecurity = query["security"] ?? ""; + ResolveStdTransport(query, ref item); + + return item; + } + + private static int ResolveStdTransport(NameValueCollection query, ref VmessItem item) + { + item.flow = query["flow"] ?? ""; + item.streamSecurity = query["security"] ?? ""; item.sni = query["sni"] ?? ""; item.alpn = Utils.String2List(Utils.UrlDecode(query["alpn"] ?? "")); item.network = query["type"] ?? "tcp"; @@ -772,10 +813,9 @@ namespace v2rayN.Handler item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); break; default: - return null; + break; } - - return item; + return 0; } #endregion From 206b4409661db67d3731f3b40fd5b38c529d909b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 28 Jan 2022 20:58:28 +0800 Subject: [PATCH 078/252] add vmess Securitys --- .../v2rayN/Forms/AddServer3Form.Designer.cs | 7 -- v2rayN/v2rayN/Forms/AddServer3Form.cs | 1 + v2rayN/v2rayN/Forms/AddServer3Form.resx | 18 ---- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 6 -- v2rayN/v2rayN/Forms/AddServerForm.cs | 1 + v2rayN/v2rayN/Forms/AddServerForm.resx | 15 ---- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 86 +------------------ v2rayN/v2rayN/Global.cs | 3 +- 8 files changed, 5 insertions(+), 132 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs index f8e5a6cb..b3cf7d3e 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs @@ -83,13 +83,6 @@ // this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; - this.cmbSecurity.Items.AddRange(new object[] { - resources.GetString("cmbSecurity.Items"), - resources.GetString("cmbSecurity.Items1"), - resources.GetString("cmbSecurity.Items2"), - resources.GetString("cmbSecurity.Items3"), - resources.GetString("cmbSecurity.Items4"), - resources.GetString("cmbSecurity.Items5")}); resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index 6eda1582..bd076170 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -15,6 +15,7 @@ namespace v2rayN.Forms private void AddServer3Form_Load(object sender, EventArgs e) { + cmbSecurity.Items.AddRange(Global.ssSecuritys.ToArray()); if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index 0f5bdcb4..ce2ee4e9 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -174,24 +174,6 @@ 0 - - aes-256-gcm - - - aes-128-gcm - - - chacha20-poly1305 - - - chacha20-ietf-poly1305 - - - none - - - plain - 127, 123 diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index 2abd7e1a..f9ca539f 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -109,12 +109,6 @@ // this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; - this.cmbSecurity.Items.AddRange(new object[] { - resources.GetString("cmbSecurity.Items"), - resources.GetString("cmbSecurity.Items1"), - resources.GetString("cmbSecurity.Items2"), - resources.GetString("cmbSecurity.Items3"), - resources.GetString("cmbSecurity.Items4")}); resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 2c231ac8..4f643eca 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -15,6 +15,7 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { + cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index c8d1d996..826ea809 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -221,21 +221,6 @@ 2 - - aes-128-gcm - - - chacha20-poly1305 - - - auto - - - none - - - zero - 195, 114 diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 5c854d9e..018a8578 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -127,87 +127,6 @@ *手填,方便识别管理 - - 149, 12 - - - 95, 12 - - - 167, 12 - - - 180, 7 - - - 350, 36 - - - 143, 12 - - - 149, 12 - - - 127, 168 - - - 127, 32 - - - 211, 20 - - - 9, 36 - - - 107, 12 - - - 9, 168 - - - 65, 12 - - - 161, 12 - - - 9, 237 - - - 107, 12 - - - 127, 237 - - - 282, 71 - - - 197, 12 - - - 127, 102 - - - 334, 51 - - - 9, 71 - - - 89, 12 - - - 9, 102 - - - 89, 12 - - - 127, 67 - 113, 12 @@ -215,7 +134,7 @@ *随便选,建议(auto) - 127, 143 + 127, 114 211, 20 @@ -232,9 +151,6 @@ 加密方式(security) - - 95, 12 - 65, 12 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index de142806..10c892e4 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -196,7 +196,8 @@ namespace v2rayN public const string RoutingRuleComma = ""; - public static readonly IEnumerable ssSecuritys = new HashSet { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; + public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; + public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; public const string GrpcgunMode = "gun"; public const string GrpcmultiMode = "multi"; From 002283899f0bf975f20cb0734cae55278efb398c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 28 Jan 2022 21:02:25 +0800 Subject: [PATCH 079/252] add VmessItem indexId --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 91 ++++++++++++-------------- v2rayN/v2rayN/Mode/Config.cs | 14 ++++ v2rayN/v2rayN/Tool/Utils.cs | 11 +++- 3 files changed, 64 insertions(+), 52 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 728ef5bb..06daf839 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -172,6 +172,11 @@ namespace v2rayN.Handler { VmessItem vmessItem = config.vmess[i]; UpgradeServerVersion(ref vmessItem); + + if (string.IsNullOrEmpty(vmessItem.indexId)) + { + vmessItem.indexId = Utils.GetGUID(false); + } } } @@ -191,7 +196,6 @@ namespace v2rayN.Handler /// public static int AddServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { - vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Vmess; vmessItem.address = vmessItem.address.TrimEx(); @@ -203,6 +207,11 @@ namespace v2rayN.Handler vmessItem.path = vmessItem.path.TrimEx(); vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); + if (!Global.vmessSecuritys.Contains(vmessItem.security)) + { + return -1; + } + if (index >= 0) { //修改 @@ -214,17 +223,7 @@ namespace v2rayN.Handler } 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; - } + AddServerCommon(ref config, vmessItem); } if (toFile) @@ -545,7 +544,6 @@ namespace v2rayN.Handler /// public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { - vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Shadowsocks; vmessItem.address = vmessItem.address.TrimEx(); @@ -568,13 +566,7 @@ namespace v2rayN.Handler } else { - //添加 - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + AddServerCommon(ref config, vmessItem); } if (toFile) @@ -594,7 +586,6 @@ namespace v2rayN.Handler /// public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { - vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Socks; vmessItem.address = vmessItem.address.TrimEx(); @@ -610,13 +601,7 @@ namespace v2rayN.Handler } else { - //添加 - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + AddServerCommon(ref config, vmessItem); } if (toFile) @@ -637,7 +622,6 @@ namespace v2rayN.Handler /// public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { - vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.Trojan; vmessItem.address = vmessItem.address.TrimEx(); @@ -662,13 +646,7 @@ namespace v2rayN.Handler } else { - //添加 - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + AddServerCommon(ref config, vmessItem); } if (toFile) @@ -866,7 +844,7 @@ namespace v2rayN.Handler { if (Utils.IsNullOrEmpty(sub.id)) { - sub.id = Utils.GetGUID(); + sub.id = Utils.GetGUID(false); } } @@ -954,7 +932,6 @@ namespace v2rayN.Handler /// public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) { - vmessItem.configVersion = 2; vmessItem.configType = (int)EConfigType.VLESS; vmessItem.address = vmessItem.address.TrimEx(); @@ -976,18 +953,8 @@ namespace v2rayN.Handler } } 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; - } + { + AddServerCommon(ref config, vmessItem); } if (toFile) @@ -1054,6 +1021,23 @@ namespace v2rayN.Handler return 0; } + public static int AddServerCommon(ref Config config, VmessItem vmessItem) + { + vmessItem.indexId = Utils.GetGUID(false); + vmessItem.configVersion = 2; + 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; + } + return 0; + } #endregion #region UI @@ -1133,6 +1117,13 @@ namespace v2rayN.Handler else { config.routings.Add(item); + int indexLocked = config.routings.FindIndex(it => it.locked == true); + if (indexLocked != -1) + { + var itemLocked = Utils.DeepCopy(config.routings[indexLocked]); + config.routings.RemoveAt(indexLocked); + config.routings.Add(itemLocked); + } } ToJsonFile(config); diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 7945c0b3..7d3eb8bf 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -366,6 +366,15 @@ namespace v2rayN.Mode return null; } } + + public int FindIndexId(string indexId) + { + if (string.IsNullOrEmpty(indexId)) + { + return -1; + } + return vmess.FindIndex(it => it.indexId == indexId); + } #endregion } @@ -375,6 +384,7 @@ namespace v2rayN.Mode { public VmessItem() { + indexId = string.Empty; configVersion = 1; address = string.Empty; port = 0; @@ -460,6 +470,10 @@ namespace v2rayN.Mode itemId = Utils.Base64Encode(itemId); return itemId; } + public string indexId + { + get; set; + } /// /// 版本(现在=2) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 6fa98069..54c9638d 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -844,11 +844,18 @@ namespace v2rayN /// 取得GUID /// /// - public static string GetGUID() + public static string GetGUID(bool full = true) { try { - return Guid.NewGuid().ToString("D"); + if (full) + { + return Guid.NewGuid().ToString("D"); + } + else + { + return BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0).ToString(); + } } catch (Exception ex) { From 8d5bd5a80cc98bd51704e14d56b06ff8a12f05b8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 28 Jan 2022 21:05:41 +0800 Subject: [PATCH 080/252] Improve server test --- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 89 +++++++++++++-------- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 24 ++++-- v2rayN/v2rayN/Handler/V2rayHandler.cs | 2 +- v2rayN/v2rayN/Mode/ServerTestItem.cs | 29 +++++++ v2rayN/v2rayN/v2rayN.csproj | 1 + 5 files changed, 106 insertions(+), 39 deletions(-) create mode 100644 v2rayN/v2rayN/Mode/ServerTestItem.cs diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index d8eb1eee..57ca1456 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -13,7 +13,7 @@ namespace v2rayN.Handler { private Config _config; private V2rayHandler _v2rayHandler; - private List _selecteds; + private List _selecteds; Action _updateFunc; public SpeedtestHandler(ref Config config) @@ -25,9 +25,22 @@ namespace v2rayN.Handler { _config = config; _v2rayHandler = v2rayHandler; - _selecteds = Utils.DeepCopy(selecteds); + //_selecteds = Utils.DeepCopy(selecteds); _updateFunc = update; + _selecteds = new List(); + foreach (var it in selecteds) + { + _selecteds.Add(new ServerTestItem() + { + selected = it, + indexId = config.vmess[it].indexId, + address = config.vmess[it].address, + port = config.vmess[it].port, + configType = config.vmess[it].configType + }); + } + if (actionType == "ping") { Task.Run(() => RunPing()); @@ -46,19 +59,19 @@ namespace v2rayN.Handler } } - private void RunPingSub(Action updateFun) + private void RunPingSub(Action updateFun) { try { - foreach (int index in _selecteds) + foreach (var it in _selecteds) { - if (_config.vmess[index].configType == (int)EConfigType.Custom) + if (it.configType == (int)EConfigType.Custom) { continue; } try { - updateFun(index); + updateFun(it); } catch (Exception ex) { @@ -77,18 +90,22 @@ namespace v2rayN.Handler private void RunPing() { - RunPingSub((int index) => + RunPingSub((ServerTestItem it) => { - long time = Utils.Ping(_config.vmess[index].address); + long time = Utils.Ping(it.address); + var index = _config.FindIndexId(it.indexId); + if (index < 0) return; _updateFunc(index, FormatOut(time, "ms")); }); } private void RunTcping() { - RunPingSub((int index) => + RunPingSub((ServerTestItem it) => { - int time = GetTcpingTime(_config.vmess[index].address, _config.vmess[index].port); + int time = GetTcpingTime(it.address, it.port); + var index = _config.FindIndexId(it.indexId); + if (index < 0) return; _updateFunc(index, FormatOut(time, "ms")); }); } @@ -103,16 +120,19 @@ namespace v2rayN.Handler pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0], UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].selected, UIRes.I18N("OperationFailed")); return; } //Thread.Sleep(5000); - int httpPort = _config.GetLocalPort("speedtest"); List tasks = new List(); - foreach (int itemIndex in _selecteds) + foreach (var it in _selecteds) { - if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom) + if (it.configType == (int)EConfigType.Custom) + { + continue; + } + if (it.port <= 0) { continue; } @@ -120,11 +140,13 @@ namespace v2rayN.Handler { try { - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); + WebProxy webProxy = new WebProxy(Global.Loopback, it.port); int responseTime = -1; string status = GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); - string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : FormatOut(status, ""); - _updateFunc(itemIndex, output); + string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; + var index = _config.FindIndexId(it.indexId); + if (index < 0) return; + _updateFunc(index, output); } catch (Exception ex) { @@ -178,7 +200,7 @@ namespace v2rayN.Handler private void RunSpeedTest() { - int testCounter = 0; + string testIndexId = string.Empty; int pid = -1; if (_config.vmess.Count <= 0) @@ -189,7 +211,7 @@ namespace v2rayN.Handler pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0], UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].selected, UIRes.I18N("OperationFailed")); return; } @@ -197,29 +219,32 @@ namespace v2rayN.Handler DownloadHandle downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { - _updateFunc(testCounter, args.Msg); + var index = _config.FindIndexId(testIndexId); + if (index < 0) return; + _updateFunc(index, args.Msg); }; downloadHandle2.Error += (sender2, args) => { - _updateFunc(testCounter, args.GetException().Message); + var index = _config.FindIndexId(testIndexId); + if (index < 0) return; + _updateFunc(index, args.GetException().Message); }; var timeout = 10; - foreach (int itemIndex in _selecteds) + foreach (var it in _selecteds) { - if (itemIndex >= _config.vmess.Count) - { - break; - } - - if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom) + if (it.configType == (int)EConfigType.Custom) { continue; } - testCounter = itemIndex; - int httpPort = _config.GetLocalPort("speedtest"); - - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); + if (it.port <= 0) + { + continue; + } + testIndexId = it.indexId; + if (_config.FindIndexId(it.indexId) < 0) continue; + + WebProxy webProxy = new WebProxy(Global.Loopback, it.port); var ws = downloadHandle2.DownloadDataAsync(url, webProxy, timeout - 2); Thread.Sleep(1000 * timeout); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index f3504c03..909f5904 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -364,7 +364,14 @@ namespace v2rayN.Handler //远程服务器用户ID usersItem.id = config.id(); usersItem.email = Global.userEMail; - usersItem.security = config.security(); + if (Global.vmessSecuritys.Contains(config.security())) + { + usersItem.security = config.security(); + } + else + { + usersItem.security = Global.DefaultSecurity; + } //Mux outbound.mux.enabled = config.muxEnabled; @@ -1383,7 +1390,7 @@ namespace v2rayN.Handler #region Gen speedtest config - public static string GenerateClientSpeedtestConfigString(Config config, List selecteds, out string msg) + public static string GenerateClientSpeedtestConfigString(Config config, List selecteds, out string msg) { try { @@ -1429,21 +1436,26 @@ namespace v2rayN.Handler int httpPort = configCopy.GetLocalPort("speedtest"); - foreach (int index in selecteds) + foreach (var it in selecteds) { - if (configCopy.vmess[index].configType == (int)EConfigType.Custom) + if (it.configType == (int)EConfigType.Custom) + { + continue; + } + if (it.port <= 0) { continue; } - configCopy.index = index; - var port = httpPort + index; + configCopy.index = it.selected; + var port = httpPort + it.selected; //Port In Used if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == port) >= 0) { continue; } + it.port = port; Inbounds inbound = new Inbounds { diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 95951b5e..1b0b99b8 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -73,7 +73,7 @@ namespace v2rayN.Handler /// 新建进程,载入V2ray配置文件字符串 /// 返回新进程pid。 /// - public int LoadV2rayConfigString(Config config, List _selecteds) + public int LoadV2rayConfigString(Config config, List _selecteds) { int pid = -1; string configStr = V2rayConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg); diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs new file mode 100644 index 00000000..304a4c52 --- /dev/null +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -0,0 +1,29 @@ +using System; + +namespace v2rayN.Mode +{ + [Serializable] + class TestItem + { + public int selected + { + get; set; + } + public string indexId + { + get; set; + } + public string address + { + get; set; + } + public int port + { + get; set; + } + public int configType + { + get; set; + } + } +} diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 203b51d2..84689f59 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -214,6 +214,7 @@ + True True From d361afa3f365a51aca46dc0cac1d608ddacfc03c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 28 Jan 2022 21:07:07 +0800 Subject: [PATCH 081/252] Improve server test --- v2rayN/v2rayN/Mode/ServerTestItem.cs | 2 +- v2rayN/v2rayN/v2rayN.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs index 304a4c52..8c4651f3 100644 --- a/v2rayN/v2rayN/Mode/ServerTestItem.cs +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -3,7 +3,7 @@ namespace v2rayN.Mode { [Serializable] - class TestItem + class ServerTestItem { public int selected { diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 84689f59..f71b0ba6 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -214,7 +214,7 @@ - + True True From 2b00490dd65d784b45dd2f29c9a99cb8b1a1da44 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 3 Feb 2022 17:19:53 +0800 Subject: [PATCH 082/252] re-add alterId --- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 16 ++++ v2rayN/v2rayN/Forms/AddServerForm.cs | 6 ++ v2rayN/v2rayN/Forms/AddServerForm.resx | 80 +++++++++++++---- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 89 ++++++++++++++++++- v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 + v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 4 + v2rayN/v2rayN/Mode/Config.cs | 19 +++- v2rayN/v2rayN/Mode/V2rayConfig.cs | 5 +- 8 files changed, 202 insertions(+), 19 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index f9ca539f..c48ec522 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -38,6 +38,8 @@ this.txtRemarks = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); + this.txtAlterId = new System.Windows.Forms.TextBox(); + this.label4 = 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(); @@ -78,6 +80,8 @@ this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtAlterId); + this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtId); this.groupBox1.Controls.Add(this.label3); this.groupBox1.Controls.Add(this.txtPort); @@ -127,6 +131,16 @@ resources.ApplyResources(this.label5, "label5"); this.label5.Name = "label5"; // + // txtAlterId + // + resources.ApplyResources(this.txtAlterId, "txtAlterId"); + this.txtAlterId.Name = "txtAlterId"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // // txtId // resources.ApplyResources(this.txtId, "txtId"); @@ -260,6 +274,8 @@ private System.Windows.Forms.TextBox txtRemarks; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtAlterId; + private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox txtId; private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txtPort; diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 4f643eca..02223070 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -36,6 +36,7 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); cmbSecurity.Text = vmessItem.security; txtRemarks.Text = vmessItem.remarks; @@ -51,6 +52,7 @@ namespace v2rayN.Forms txtAddress.Text = ""; txtPort.Text = ""; txtId.Text = ""; + txtAlterId.Text = "0"; cmbSecurity.Text = Global.DefaultSecurity; txtRemarks.Text = ""; @@ -62,6 +64,7 @@ namespace v2rayN.Forms string address = txtAddress.Text; string port = txtPort.Text; string id = txtId.Text; + string alterId = txtAlterId.Text; string security = cmbSecurity.Text; string remarks = txtRemarks.Text; @@ -86,6 +89,7 @@ namespace v2rayN.Forms vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; + vmessItem.alterId = Utils.ToInt(alterId); vmessItem.security = security; vmessItem.remarks = remarks; @@ -169,6 +173,7 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; transportControl.BindingServer(vmessItem); @@ -194,6 +199,7 @@ namespace v2rayN.Forms txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); txtRemarks.Text = vmessItem.remarks; transportControl.BindingServer(vmessItem); diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 826ea809..1e251a8f 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -171,7 +171,7 @@ True - 411, 147 + 411, 175 113, 12 @@ -198,7 +198,7 @@ True - 411, 118 + 411, 147 119, 12 @@ -222,7 +222,7 @@ 2 - 195, 114 + 195, 143 210, 20 @@ -243,7 +243,7 @@ 3 - 127, 143 + 127, 171 278, 21 @@ -267,7 +267,7 @@ True - 12, 147 + 12, 175 95, 12 @@ -294,7 +294,7 @@ True - 12, 118 + 12, 147 173, 12 @@ -317,6 +317,54 @@ 6 + + 127, 114 + + + 143, 21 + + + 3 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 118 + + + 47, 12 + + + 6 + + + AlterId + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + 127, 85 @@ -336,7 +384,7 @@ groupBox1 - 7 + 9 True @@ -363,7 +411,7 @@ groupBox1 - 8 + 10 127, 56 @@ -384,7 +432,7 @@ groupBox1 - 9 + 11 True @@ -411,7 +459,7 @@ groupBox1 - 10 + 12 127, 27 @@ -432,7 +480,7 @@ groupBox1 - 11 + 13 True @@ -459,7 +507,7 @@ groupBox1 - 12 + 14 @@ -469,7 +517,7 @@ 0, 35 - 729, 186 + 729, 216 3 @@ -517,7 +565,7 @@ Bottom - 0, 451 + 0, 481 729, 60 @@ -640,7 +688,7 @@ Bottom - 0, 221 + 0, 251 729, 230 @@ -670,7 +718,7 @@ 6, 12 - 729, 511 + 729, 541 Edit or add a [VMess] server diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 018a8578..47b4d4cd 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -127,6 +127,87 @@ *手填,方便识别管理 + + 149, 12 + + + 95, 12 + + + 167, 12 + + + 180, 7 + + + 350, 36 + + + 143, 12 + + + 149, 12 + + + 127, 168 + + + 127, 32 + + + 211, 20 + + + 9, 36 + + + 107, 12 + + + 9, 168 + + + 65, 12 + + + 161, 12 + + + 9, 237 + + + 107, 12 + + + 127, 237 + + + 282, 71 + + + 197, 12 + + + 127, 102 + + + 334, 51 + + + 9, 71 + + + 89, 12 + + + 9, 102 + + + 89, 12 + + + 127, 67 + 113, 12 @@ -134,7 +215,7 @@ *随便选,建议(auto) - 127, 114 + 127, 143 211, 20 @@ -151,6 +232,12 @@ 加密方式(security) + + 95, 12 + + + 额外ID(alterId) + 65, 12 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 06daf839..b5efa483 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -296,6 +296,7 @@ namespace v2rayN.Handler 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), @@ -982,6 +983,7 @@ namespace v2rayN.Handler 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 && diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 909f5904..aea6eccd 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -363,6 +363,7 @@ namespace v2rayN.Handler } //远程服务器用户ID usersItem.id = config.id(); + usersItem.alterId = config.alterId(); usersItem.email = Global.userEMail; if (Global.vmessSecuritys.Contains(config.security())) { @@ -1030,6 +1031,7 @@ namespace v2rayN.Handler if (config.configType() == (int)EConfigType.Vmess) { inbound.protocol = Global.vmessProtocolLite; + usersItem.alterId = config.alterId(); } else if (config.configType() == (int)EConfigType.VLESS) @@ -1129,6 +1131,7 @@ namespace v2rayN.Handler vmessItem.address = outbound.settings.vnext[0].address; vmessItem.port = outbound.settings.vnext[0].port; vmessItem.id = outbound.settings.vnext[0].users[0].id; + vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId; vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); //tcp or kcp @@ -1272,6 +1275,7 @@ namespace v2rayN.Handler vmessItem.address = string.Empty; vmessItem.port = inbound.port; vmessItem.id = inbound.settings.clients[0].id; + vmessItem.alterId = inbound.settings.clients[0].alterId; vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 7d3eb8bf..e26174cc 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -218,6 +218,15 @@ namespace v2rayN.Mode return vmess[index].id.TrimEx(); } + public int alterId() + { + if (index < 0) + { + return 0; + } + return vmess[index].alterId; + } + public string security() { if (index < 0) @@ -389,6 +398,7 @@ namespace v2rayN.Mode address = string.Empty; port = 0; id = string.Empty; + alterId = 0; security = string.Empty; network = string.Empty; remarks = string.Empty; @@ -503,7 +513,14 @@ namespace v2rayN.Mode public string id { get; set; - } + } + /// + /// 远程服务器额外ID + /// + public int alterId + { + get; set; + } /// /// 本地安全策略 /// diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index b6d8ed55..4703ec21 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -149,7 +149,10 @@ namespace v2rayN.Mode /// /// public string id { get; set; } - + /// + /// + /// + public int alterId { get; set; } /// /// /// From f220825b809fb1b3b691a4a5519c4b0f0393d424 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 3 Feb 2022 17:45:09 +0800 Subject: [PATCH 083/252] add xtls Flows --- v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs | 6 ------ v2rayN/v2rayN/Forms/AddServer5Form.cs | 1 + v2rayN/v2rayN/Forms/AddServer5Form.resx | 15 --------------- v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs | 6 ------ v2rayN/v2rayN/Forms/AddServer6Form.cs | 1 + v2rayN/v2rayN/Forms/AddServer6Form.resx | 15 --------------- v2rayN/v2rayN/Global.cs | 1 + v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 4 ++-- 8 files changed, 5 insertions(+), 44 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs index 44915372..be02d20f 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -88,12 +88,6 @@ // 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"; // diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 43d52751..7635e839 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -15,6 +15,7 @@ namespace v2rayN.Forms private void AddServer5Form_Load(object sender, EventArgs e) { + cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); transportControl.AllowXtls = true; if (EditIndex >= 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx index ab0fe1d5..48f6a172 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -143,21 +143,6 @@ 0 - - - - - xtls-rprx-origin - - - xtls-rprx-origin-udp443 - - - xtls-rprx-direct - - - xtls-rprx-direct-udp443 - 127, 123 diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs index 6ad64150..998dc789 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -80,12 +80,6 @@ // 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"; // diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs index beab1dc7..70c60443 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -14,6 +14,7 @@ namespace v2rayN.Forms private void AddServer6Form_Load(object sender, EventArgs e) { + cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); transportControl.AllowXtls = true; if (EditIndex >= 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index f95db419..ffd92ee3 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -147,21 +147,6 @@ 0 - - - - - xtls-rprx-origin - - - xtls-rprx-origin-udp443 - - - xtls-rprx-direct - - - xtls-rprx-direct-udp443 - 127, 123 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 10c892e4..94a9d369 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -198,6 +198,7 @@ namespace v2rayN public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; + public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; public const string GrpcgunMode = "gun"; public const string GrpcmultiMode = "multi"; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index aea6eccd..c9931179 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -503,7 +503,7 @@ namespace v2rayN.Handler { if (Utils.IsNullOrEmpty(config.flow())) { - usersItem.flow = "xtls-rprx-origin"; + usersItem.flow = Global.xtlsFlows[1]; } else { @@ -543,7 +543,7 @@ namespace v2rayN.Handler { if (Utils.IsNullOrEmpty(config.flow())) { - serversItem.flow = "xtls-rprx-origin"; + serversItem.flow = Global.xtlsFlows[1]; } else { From 7cdead8cb1c7282ab3412f3cdcab5bc6182d7757 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 3 Feb 2022 20:57:02 +0800 Subject: [PATCH 084/252] Optimized config --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 86 ++++++++++++-------------- v2rayN/v2rayN/Mode/Config.cs | 9 ++- 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index b5efa483..5a097170 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -33,7 +33,7 @@ namespace v2rayN.Handler config = Utils.FromJson(result); } else - { + { if (File.Exists(Utils.GetPath(configRes))) { Utils.SaveLog("LoadConfig Exception"); @@ -241,7 +241,7 @@ namespace v2rayN.Handler /// public static int RemoveServer(ref Config config, List indexs) { - var itemId = config.getItemId(); + var indexId = config.indexId(); for (int k = indexs.Count - 1; k >= 0; k--) { @@ -254,23 +254,7 @@ namespace v2rayN.Handler config.vmess.RemoveAt(index); } - var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); - if (index_ >= 0) - { - config.index = index_; - } - else - { - if (config.vmess.Count > 0) - { - config.index = 0; - } - else - { - config.index = -1; - } - } - Global.reloadV2ray = true; + SetIndex(ref config, indexId); ToJsonFile(config); @@ -861,6 +845,7 @@ namespace v2rayN.Handler /// public static int RemoveServerViaSubid(ref Config config, string subid) { + var indexId = config.indexId(); if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) { return -1; @@ -873,6 +858,8 @@ namespace v2rayN.Handler } } + SetIndex(ref config, indexId); + ToJsonFile(config); return 0; } @@ -902,7 +889,8 @@ namespace v2rayN.Handler default: return -1; } - string itemId = config.getItemId(); + + var indexId = config.indexId(); var items = config.vmess.AsQueryable(); if (asc) @@ -914,11 +902,7 @@ namespace v2rayN.Handler config.vmess = items.OrderByDescending(propertyName).ToList(); } - var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); - if (index_ >= 0) - { - config.index = index_; - } + SetIndex(ref config, indexId); ToJsonFile(config); return 0; @@ -954,7 +938,7 @@ namespace v2rayN.Handler } } else - { + { AddServerCommon(ref config, vmessItem); } @@ -968,8 +952,8 @@ namespace v2rayN.Handler public static int DedupServerList(ref Config config) { - var itemId = config.getItemId(); - + var indexId = config.indexId(); + List source = config.vmess; bool keepOlder = config.keepOlderDedupl; @@ -1002,23 +986,7 @@ namespace v2rayN.Handler if (!keepOlder) list.Reverse(); config.vmess = list; - var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); - if (index_ >= 0) - { - config.index = index_; - } - else - { - if (config.vmess.Count > 0) - { - config.index = 0; - } - else - { - config.index = -1; - } - } - Global.reloadV2ray = true; + SetIndex(ref config, indexId); return 0; } @@ -1040,6 +1008,34 @@ namespace v2rayN.Handler } return 0; } + + public static int SetIndex(ref Config config, string indexId) + { + var index_ = config.FindIndexId(indexId); + + if (config.index == index_) + { + return 0; + } + else if (index_ >= 0) + { + config.index = index_; + } + else + { + if (config.vmess.Count > 0) + { + config.index = 0; + } + else + { + config.index = -1; + } + } + Global.reloadV2ray = true; + return 0; + } + #endregion #region UI diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index e26174cc..301ec1e7 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -375,7 +375,14 @@ namespace v2rayN.Mode return null; } } - + public string indexId() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].indexId.TrimEx(); + } public int FindIndexId(string indexId) { if (string.IsNullOrEmpty(indexId)) From 685baa576b08080a96ef7371808b41b208abea70 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 3 Feb 2022 20:57:29 +0800 Subject: [PATCH 085/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index dde0e7b1..cde110d2 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.29")] +[assembly: AssemblyFileVersion("4.30")] From 80b68dcf84af6a0bbf4739d9df350ed69e4c60b6 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 12 Feb 2022 19:53:26 +0800 Subject: [PATCH 086/252] fix some bugs --- v2rayN/v2rayN/Forms/AddServer6Form.resx | 173 --- .../v2rayN/Forms/AddServer6Form.zh-Hans.resx | 173 --- .../v2rayN/Forms/BaseServerForm.Designer.cs | 1 - v2rayN/v2rayN/Forms/BaseServerForm.resx | 1132 ----------------- v2rayN/v2rayN/Forms/ServerTransportControl.cs | 1 + v2rayN/v2rayN/Handler/ConfigHandler.cs | 9 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 16 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 + v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 5 +- v2rayN/v2rayN/v2rayN.csproj | 7 +- 11 files changed, 38 insertions(+), 1491 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx index ffd92ee3..0050f788 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -591,179 +591,6 @@ 707, 491 - - - AAABAAYAICAQAAAAAADoAgAAZgAAABAQEAAAAAAAKAEAAE4DAAAgIAAAAQAIAKgIAAB2BAAAEBAAAAEA - CABoBQAAHg0AACAgAAABACAAqBAAAIYSAAAQEAAAAQAgAGgEAAAuIwAAKAAAACAAAABAAAAAAQAEAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA - /wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIoiI - iIiIiIiIiIiIiIiIiIiCIigiIiIozMzMzMzMyCIogiIoIiIiKM7m5ubm5sgiKIIiKCIiIijObm5ubm7I - IiiCIigiIiIozubm5ubmyCIogiIoIiIiKM5ubm5ubsgiKIIiKCIiIijO5ubm5ubIIiiIiIiIiIiIzm5u - bm5uyCIogRERERERGM7u7u7u7sgiKIHZWVlZWRjMzMzMzMzIIiiB1ZWVlZUYiIiIiIiIiIiIgdlZWVlZ - GDMzMzMzMzMzOIHVlZWVlRg/uLi4uLi4uDiB2VlZWVkYP7uLi4uLi4s4gdWVlZWVGD+4uLi4uLi4OIHZ - WVlZWRg/u4uLi4uLiziB1ZWVlZUYP7i4uLi4uLg4gdlZWVlZGD+7i4uLi4uLOIHVlZWVlRg/uLi4uLi4 - uDiB3d3d3d0YP7uLi4uLi4s4gRERERERGD+4uLi4uLi4OIiIiIiIiIg/u4uLi4uLiziCIiIiIiIoP7i4 - uLi4uLg4giIiIiIiKD+7i4uLi4uLOIIiIiIiIig/uLi4uLi4uDiCIiIiIiIoP7u7u7u7u7s4giIiIiIi - KD//////////OIIiIiIiIigzMzMzMzMzMziIiIiIiIiIiIiIiIiIiIiIIiIiIiIiIiIiIiIiIiIiIv// - ////////AAAAAHv4AA57+AAOe/gADnv4AA57+AAOe/gADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAB/+AAAf/gAAH/4AAB/+AAAf/gAAAAA - AAD/////KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACA - gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIoiI - iIiIiIiIgigijMzMyCiCKCKM5mbIKIiIiIzu7sgogRERjMzMyCiB2ZGIiIiIiIHZkYMzMzM4gdmRg/u7 - uziB3dGD+7u7OIEREYP7u7s4iIiIg/u7uziCIiKD+7u7OIIiIoP///84giIigzMzMziIiIiIiIiIiP// - KCIAACjObALm5mwCIigAAoiIAAKIzgAAbm4AACIoAAAREQAAGM4AAO7uAAAiKHwAWVl8ABjMfADMzAAA - IigoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/ - KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/ - KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVf - VQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADf - VQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8f - fwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqf - fwD/n38AAL9/AFW/fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUA - qgCqAKoA/wCqAAAfqgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/ - qgBVf6oAqn+qAP9/qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/f - qgAA/6oAVf+qAKr/qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/ - 1AD/P9QAAF/UAFVf1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/ - 1ACqv9QA/7/UAADf1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof - /wD/H/8AAD//AFU//wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf - /wCqn/8A/5//AAC//wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP// - MwD//2YA//+ZAP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/ - AAAA3wAAVd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/ - KgBVPyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39 - /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 - /f39/f39/f39/f39/f39/f39/f39/f39qoYIqoYIhqoIqgiqCaoIqgiqhqqGhoYIhoYIqv39/f0I/f39 - /ar9/f39/YY2Ng4yDg4ODgoOCgoKCgqG/f39/Yb9/f39CP39/f39qjY7Ozs3Nzc3NjMSMjIOCqr9/f39 - qv39/f2G/f39/f0IN19fOzs3Nzc3NjcODg4KCP39/f0I/f39/ar9/f39/ao6X19fXzs7Ozc3NzY3NgqG - /f39/Yb9/f39CP39/f39hl9jY19jX187Ozs7Nzc3Dqr9/f39qv39/f2G/f39/f0IOodjh19jX19fXztf - OzcOCP39/f0ICAmqCAiqCKoICapfCYdjh2ODY19fXzs7Ow6q/f39/QhITEwoSCUoKSQoqmMJCYcJCWNj - Y2NfY19fNgj9/f39qkyZmZmYmJRwlCmqX19fXl9fX186WzY3Njc2gv39/f0JcJ2dmZmZlJmUJAmqCaoJ - hggIqggICKoIqggI/f39/YZwnp2dnZmZmJVMqnx8fHx8fFR8VHhUVFRUVKr9/f39CHChoZ2dnZ2ZmUwJ - fKSkxqSkxqSkpKSkpKBUCP39/f2qcKLDoqGdnZ2ZTKp8ysakxqSkxqSkxqSkpFSq/f39/QiUpqbDoqHE - nZ1Mq3ykqMakyqSkxqSkpKSkVAj9/f39hpTIyKbHoqGhoXAIfMrLpMqkxqSkxqTGpKRUqv39/f0IlMym - yKbIpcShcAh8y6jKpMqkxsqkpKSkxlQI/f39/aqUzMzMyKbIpqJwqnzLy8qpxsqkpMakxqSkeAj9/f39 - CJSUlJSUlJSUlJQJgMupy8qpysqkyqSkxqRUqv39/f2GCKoIqgiqCKoIhgigrcvPqcuoy8qkxsqkxnyG - /f39/ar9/f39/f39/f39qnzPz6nLy8uoyqnKpKTKVAj9/f39CP39/f39/f39/f0IfNDPz8+py8upyqjG - yqR8hv39/f2G/f39/f39/f39/Qik0K7P0M+ty8vLy6jKpXyq/f39/ar9/f39/f39/f39CHzQ09Ctz8/P - qcupy6jKeAj9/f39CP39/f39/f39/f2qoNPQ0NPQ0M/Qz8vLy6l8CP39/f2G/f39/f39/f39/QmkfKR8 - oHx8fHx8fHx8fHyG/f39/aoIqgiqCKoIqgiqCKoIqgiqCKoIqgiqCKoIqgj9/f39/f39/f39/f39/f39 - /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3///////////// - ///AAAAD3vgAA974AAPe+AAD3vgAA974AAPe+AADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA - AAPAAAADwAAAA8AAAAPAAAADwAAAA9/4AAPf+AAD3/gAA9/4AAPf+AAD3/gAA8AAAAP//////////ygA - AAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAA - gACAgAAAgICAAMDcwADwyqYAqj8qAP8/KgAAXyoAVV8qAKpfKgD/XyoAAH8qAFV/KgCqfyoA/38qAACf - KgBVnyoAqp8qAP+fKgAAvyoAVb8qAKq/KgD/vyoAAN8qAFXfKgCq3yoA/98qAAD/KgBV/yoAqv8qAP// - KgAAAFUAVQBVAKoAVQD/AFUAAB9VAFUfVQCqH1UA/x9VAAA/VQBVP1UAqj9VAP8/VQAAX1UAVV9VAKpf - VQD/X1UAAH9VAFV/VQCqf1UA/39VAACfVQBVn1UAqp9VAP+fVQAAv1UAVb9VAKq/VQD/v1UAAN9VAFXf - VQCq31UA/99VAAD/VQBV/1UAqv9VAP//VQAAAH8AVQB/AKoAfwD/AH8AAB9/AFUffwCqH38A/x9/AAA/ - fwBVP38Aqj9/AP8/fwAAX38AVV9/AKpffwD/X38AAH9/AFV/fwCqf38A/39/AACffwBVn38Aqp9/AP+f - fwAAv38AVb9/AKq/fwD/v38AAN9/AFXffwCq338A/99/AAD/fwBV/38Aqv9/AP//fwAAAKoAVQCqAKoA - qgD/AKoAAB+qAFUfqgCqH6oA/x+qAAA/qgBVP6oAqj+qAP8/qgAAX6oAVV+qAKpfqgD/X6oAAH+qAFV/ - qgCqf6oA/3+qAACfqgBVn6oAqp+qAP+fqgAAv6oAVb+qAKq/qgD/v6oAAN+qAFXfqgCq36oA/9+qAAD/ - qgBV/6oAqv+qAP//qgAAANQAVQDUAKoA1AD/ANQAAB/UAFUf1ACqH9QA/x/UAAA/1ABVP9QAqj/UAP8/ - 1AAAX9QAVV/UAKpf1AD/X9QAAH/UAFV/1ACqf9QA/3/UAACf1ABVn9QAqp/UAP+f1AAAv9QAVb/UAKq/ - 1AD/v9QAAN/UAFXf1ACq39QA/9/UAAD/1ABV/9QAqv/UAP//1ABVAP8AqgD/AAAf/wBVH/8Aqh//AP8f - /wAAP/8AVT//AKo//wD/P/8AAF//AFVf/wCqX/8A/1//AAB//wBVf/8Aqn//AP9//wAAn/8AVZ//AKqf - /wD/n/8AAL//AFW//wCqv/8A/7//AADf/wBV3/8Aqt//AP/f/wBV//8Aqv//AP/MzAD/zP8A//8zAP// - ZgD//5kA///MAAB/AABVfwAAqn8AAP9/AAAAnwAAVZ8AAKqfAAD/nwAAAL8AAFW/AACqvwAA/78AAADf - AABV3wAAqt8AAP/fAABV/wAAqv8AAAAAKgBVACoAqgAqAP8AKgAAHyoAVR8qAKofKgD/HyoAAD8qAFU/ - KgDw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A/f39/f39/f39/f39/f39/f0I - hgiqCKoICKoICKaGCP39qv39hv2GNg4ODjII/ar9/Yb9/ar9qjdjXzsOCP2G/f0IhquGCAleCWNfNob9 - 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 - bv+3d0n/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/FRqE/0dN1v8/RNL/Nz3Q/y40zv8nLcz/ISfK/xwh - yf8WHMf/GxJh/8K/wf/gr3r/4K96/+Cvev/gr3r/3614/9yqdf/apnL/16Nw/9Sea//Rmmj/zZZk/8qR - X//GjFz/w4dW/7+CUv/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8SHZD/WF3a/05U1/9FS9X/PUPS/zU7 - 0P8uM83/JyzL/yAmyf8aFGn/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/ - wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/xAfnP9obt7/YGTc/1Zb - 2f9NU9f/RUrU/ztB0v80OdD/LDHO/xgWcv/Cv8H/Dn+n/w18pP8MeqH/DHie/wt1m/8Kc5j/CXGV/wlv - k/8JbJD/CGqN/wdpi/8HZ4j/BmWH/wZkhf8GYoP/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/DiKp/3l+ - 4/9vdeH/Zmze/11i2/9UWtn/S1HW/0NI1P86P9H/Fhh9/8K/wf8Ogar/Barp/wGo6P8Apef/AKPm/wCi - 5P8An+L/AJ7h/wCd3/8AnN7/AJnc/wCY2/8AmNn/AJbX/wZjhP/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/ - wf8MJbX/iI7n/4CF5v93fOP/bnPg/2Vr3f9bYdv/UljY/0lP1v8UGoj/wr/B/w+Erf8Lrur/Bqvq/wOo - 6f8Apuf/AKTm/wCi5f8AoOT/AJ/i/wCd4f8AnN//AJrd/wCZ2/8AmNr/BmWH/8K/wf8AAAAAAAAAAAAA - AAAAAAAAwr/B/wkowP+WnOz/jpTq/4aL6P9+hOX/dXri/2xx4P9jaN3/WV/b/xEek//Cv8H/EIaw/xay - 7P8Or+z/Cavr/wWq6v8Bp+j/AKbn/wCj5f8AoeT/AJ/j/wCe4f8AnOD/AJve/wCa3f8HZ4n/wr/B/wAA - AAAAAAAAAAAAAAAAAADCv8H/CCrK/6Ko7/+coe7/lZrr/42T6f+Fiub/fIHl/3N54v9rcN//ECGg/8K/ - wf8QiLP/I7nu/xq07f8Ssez/C63r/war6v8Cqen/AKbo/wCk5v8AouX/AKHk/wCf4f8AneH/AJzf/who - i//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8GLNP/q7Hy/6as8P+hpu//mp/u/5OY6/+LkOj/g4nm/3qA - 5P8NI6z/wr/B/xCKtv8xvvD/J7rv/x627f8Vsuz/Dq/s/wmr6/8Equn/Aafo/wCl5/8Ao+X/AKHk/wCf - 4v8AnuH/CGqO/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wUu2/+vtPP/r7Tz/6qv8v+mq/D/oKXv/5me - 7f+Sl+v/io/p/wsmt//Cv8H/Eo24/0HF8f82wfD/LLzv/yK47v8atO3/EbHs/wut6/8Gq+r/A6np/wCm - 6P8Apeb/AKLl/wCh5P8IbJD/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/BC/h/wQv3/8FL9z/BS3Z/wYt - 1v8GLNL/ByvP/wgqy/8IKcb/CSnC/8K/wf8Sjrv/Uszy/0fH8f87w/H/Mb7v/ye67/8et+7/FbPt/w6v - 6/8IrOv/BKnp/wGo6P8Apef/AKPl/wluk//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf/Cv8H/wr/B/8K/ - wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/xKRvf9j0/P/WM/z/0zK8f9BxfH/N8Hw/yy8 - 7/8iuO7/GbTt/xGx7P8Lruv/Bqrq/wOo6f8Apuf/CnGV/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCv8H/E5LA/3Ta8/9q1fP/XtHz/1LM - 8v9Hx/H/O8Pw/zG+7/8nu+//Hrbt/xay7f8Or+v/CKzq/wSq6f8Kc5j/wr/B/wAAAAAAAAAAAAAAAAAA - AADCv8H/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK/wf8UlMH/hOD1/3rc - 9f9v2PP/ZNTy/1jO8v9NyvH/Qsbx/zbB8P8svO//I7ju/xm07f8SsOz/C67r/wt2m//Cv8H/AAAAAAAA - AAAAAAAAAAAAAMK/wf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwr/B/xSW - w/+T5vb/iuL1/3/e9P912vT/adbz/13R8/9SzPL/R8jx/zzD8P8xvvD/J7rv/x627v8Vsuz/C3ie/8K/ - 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 - - Edit or add a [Trojan] server diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx index 8add206e..928ced2b 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx @@ -160,179 +160,6 @@ 确定(&O) - - - AAABAAYAICAQAAAAAADoAgAAZgAAABAQEAAAAAAAKAEAAE4DAAAgIAAAAQAIAKgIAAB2BAAAEBAAAAEA - CABoBQAAHg0AACAgAAABACAAqBAAAIYSAAAQEAAAAQAgAGgEAAAuIwAAKAAAACAAAABAAAAAAQAEAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA - /wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIoiI - iIiIiIiIiIiIiIiIiIiCIigiIiIozMzMzMzMyCIogiIoIiIiKM7m5ubm5sgiKIIiKCIiIijObm5ubm7I - IiiCIigiIiIozubm5ubmyCIogiIoIiIiKM5ubm5ubsgiKIIiKCIiIijO5ubm5ubIIiiIiIiIiIiIzm5u - bm5uyCIogRERERERGM7u7u7u7sgiKIHZWVlZWRjMzMzMzMzIIiiB1ZWVlZUYiIiIiIiIiIiIgdlZWVlZ - GDMzMzMzMzMzOIHVlZWVlRg/uLi4uLi4uDiB2VlZWVkYP7uLi4uLi4s4gdWVlZWVGD+4uLi4uLi4OIHZ - WVlZWRg/u4uLi4uLiziB1ZWVlZUYP7i4uLi4uLg4gdlZWVlZGD+7i4uLi4uLOIHVlZWVlRg/uLi4uLi4 - uDiB3d3d3d0YP7uLi4uLi4s4gRERERERGD+4uLi4uLi4OIiIiIiIiIg/u4uLi4uLiziCIiIiIiIoP7i4 - uLi4uLg4giIiIiIiKD+7i4uLi4uLOIIiIiIiIig/uLi4uLi4uDiCIiIiIiIoP7u7u7u7u7s4giIiIiIi - KD//////////OIIiIiIiIigzMzMzMzMzMziIiIiIiIiIiIiIiIiIiIiIIiIiIiIiIiIiIiIiIiIiIv// - ////////AAAAAHv4AA57+AAOe/gADnv4AA57+AAOe/gADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAB/+AAAf/gAAH/4AAB/+AAAf/gAAAAA - AAD/////KAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACA - gACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAiIiIiIiIiIoiI - iIiIiIiIgigijMzMyCiCKCKM5mbIKIiIiIzu7sgogRERjMzMyCiB2ZGIiIiIiIHZkYMzMzM4gdmRg/u7 - uziB3dGD+7u7OIEREYP7u7s4iIiIg/u7uziCIiKD+7u7OIIiIoP///84giIigzMzMziIiIiIiIiIiP// - KCIAACjObALm5mwCIigAAoiIAAKIzgAAbm4AACIoAAAREQAAGM4AAO7uAAAiKHwAWVl8ABjMfADMzAAA - IigoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/ - KgAAnyoAVZ8qAKqfKgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/ - KgD//yoAAABVAFUAVQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVf - VQCqX1UA/19VAAB/VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADf - VQBV31UAqt9VAP/fVQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8f - fwAAP38AVT9/AKo/fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqf - fwD/n38AAL9/AFW/fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUA - qgCqAKoA/wCqAAAfqgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/ - qgBVf6oAqn+qAP9/qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/f - qgAA/6oAVf+qAKr/qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/ - 1AD/P9QAAF/UAFVf1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/ - 1ACqv9QA/7/UAADf1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof - /wD/H/8AAD//AFU//wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf - /wCqn/8A/5//AAC//wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP// - MwD//2YA//+ZAP//zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/ - AAAA3wAAVd8AAKrfAAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/ - KgBVPyoA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39 - /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 - /f39/f39/f39/f39/f39/f39/f39/f39qoYIqoYIhqoIqgiqCaoIqgiqhqqGhoYIhoYIqv39/f0I/f39 - /ar9/f39/YY2Ng4yDg4ODgoOCgoKCgqG/f39/Yb9/f39CP39/f39qjY7Ozs3Nzc3NjMSMjIOCqr9/f39 - qv39/f2G/f39/f0IN19fOzs3Nzc3NjcODg4KCP39/f0I/f39/ar9/f39/ao6X19fXzs7Ozc3NzY3NgqG - /f39/Yb9/f39CP39/f39hl9jY19jX187Ozs7Nzc3Dqr9/f39qv39/f2G/f39/f0IOodjh19jX19fXztf - OzcOCP39/f0ICAmqCAiqCKoICapfCYdjh2ODY19fXzs7Ow6q/f39/QhITEwoSCUoKSQoqmMJCYcJCWNj - Y2NfY19fNgj9/f39qkyZmZmYmJRwlCmqX19fXl9fX186WzY3Njc2gv39/f0JcJ2dmZmZlJmUJAmqCaoJ - hggIqggICKoIqggI/f39/YZwnp2dnZmZmJVMqnx8fHx8fFR8VHhUVFRUVKr9/f39CHChoZ2dnZ2ZmUwJ - fKSkxqSkxqSkpKSkpKBUCP39/f2qcKLDoqGdnZ2ZTKp8ysakxqSkxqSkxqSkpFSq/f39/QiUpqbDoqHE - nZ1Mq3ykqMakyqSkxqSkpKSkVAj9/f39hpTIyKbHoqGhoXAIfMrLpMqkxqSkxqTGpKRUqv39/f0IlMym - yKbIpcShcAh8y6jKpMqkxsqkpKSkxlQI/f39/aqUzMzMyKbIpqJwqnzLy8qpxsqkpMakxqSkeAj9/f39 - CJSUlJSUlJSUlJQJgMupy8qpysqkyqSkxqRUqv39/f2GCKoIqgiqCKoIhgigrcvPqcuoy8qkxsqkxnyG - /f39/ar9/f39/f39/f39qnzPz6nLy8uoyqnKpKTKVAj9/f39CP39/f39/f39/f0IfNDPz8+py8upyqjG - yqR8hv39/f2G/f39/f39/f39/Qik0K7P0M+ty8vLy6jKpXyq/f39/ar9/f39/f39/f39CHzQ09Ctz8/P - qcupy6jKeAj9/f39CP39/f39/f39/f2qoNPQ0NPQ0M/Qz8vLy6l8CP39/f2G/f39/f39/f39/QmkfKR8 - oHx8fHx8fHx8fHyG/f39/aoIqgiqCKoIqgiqCKoIqgiqCKoIqgiqCKoIqgj9/f39/f39/f39/f39/f39 - /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3///////////// - ///AAAAD3vgAA974AAPe+AAD3vgAA974AAPe+AADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA - AAPAAAADwAAAA8AAAAPAAAADwAAAA9/4AAPf+AAD3/gAA9/4AAPf+AAD3/gAA8AAAAP//////////ygA - AAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAA - gACAgAAAgICAAMDcwADwyqYAqj8qAP8/KgAAXyoAVV8qAKpfKgD/XyoAAH8qAFV/KgCqfyoA/38qAACf - KgBVnyoAqp8qAP+fKgAAvyoAVb8qAKq/KgD/vyoAAN8qAFXfKgCq3yoA/98qAAD/KgBV/yoAqv8qAP// - KgAAAFUAVQBVAKoAVQD/AFUAAB9VAFUfVQCqH1UA/x9VAAA/VQBVP1UAqj9VAP8/VQAAX1UAVV9VAKpf - VQD/X1UAAH9VAFV/VQCqf1UA/39VAACfVQBVn1UAqp9VAP+fVQAAv1UAVb9VAKq/VQD/v1UAAN9VAFXf - VQCq31UA/99VAAD/VQBV/1UAqv9VAP//VQAAAH8AVQB/AKoAfwD/AH8AAB9/AFUffwCqH38A/x9/AAA/ - fwBVP38Aqj9/AP8/fwAAX38AVV9/AKpffwD/X38AAH9/AFV/fwCqf38A/39/AACffwBVn38Aqp9/AP+f - fwAAv38AVb9/AKq/fwD/v38AAN9/AFXffwCq338A/99/AAD/fwBV/38Aqv9/AP//fwAAAKoAVQCqAKoA - qgD/AKoAAB+qAFUfqgCqH6oA/x+qAAA/qgBVP6oAqj+qAP8/qgAAX6oAVV+qAKpfqgD/X6oAAH+qAFV/ - qgCqf6oA/3+qAACfqgBVn6oAqp+qAP+fqgAAv6oAVb+qAKq/qgD/v6oAAN+qAFXfqgCq36oA/9+qAAD/ - qgBV/6oAqv+qAP//qgAAANQAVQDUAKoA1AD/ANQAAB/UAFUf1ACqH9QA/x/UAAA/1ABVP9QAqj/UAP8/ - 1AAAX9QAVV/UAKpf1AD/X9QAAH/UAFV/1ACqf9QA/3/UAACf1ABVn9QAqp/UAP+f1AAAv9QAVb/UAKq/ - 1AD/v9QAAN/UAFXf1ACq39QA/9/UAAD/1ABV/9QAqv/UAP//1ABVAP8AqgD/AAAf/wBVH/8Aqh//AP8f - /wAAP/8AVT//AKo//wD/P/8AAF//AFVf/wCqX/8A/1//AAB//wBVf/8Aqn//AP9//wAAn/8AVZ//AKqf - /wD/n/8AAL//AFW//wCqv/8A/7//AADf/wBV3/8Aqt//AP/f/wBV//8Aqv//AP/MzAD/zP8A//8zAP// - ZgD//5kA///MAAB/AABVfwAAqn8AAP9/AAAAnwAAVZ8AAKqfAAD/nwAAAL8AAFW/AACqvwAA/78AAADf - AABV3wAAqt8AAP/fAABV/wAAqv8AAAAAKgBVACoAqgAqAP8AKgAAHyoAVR8qAKofKgD/HyoAAD8qAFU/ - KgDw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAAAAAAAP//AAD///8A/f39/f39/f39/f39/f39/f0I - hgiqCKoICKoICKaGCP39qv39hv2GNg4ODjII/ar9/Yb9/ar9qjdjXzsOCP2G/f0IhquGCAleCWNfNob9 - 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 - bv+3d0n/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/FRqE/0dN1v8/RNL/Nz3Q/y40zv8nLcz/ISfK/xwh - yf8WHMf/GxJh/8K/wf/gr3r/4K96/+Cvev/gr3r/3614/9yqdf/apnL/16Nw/9Sea//Rmmj/zZZk/8qR - X//GjFz/w4dW/7+CUv/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8SHZD/WF3a/05U1/9FS9X/PUPS/zU7 - 0P8uM83/JyzL/yAmyf8aFGn/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/ - wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/xAfnP9obt7/YGTc/1Zb - 2f9NU9f/RUrU/ztB0v80OdD/LDHO/xgWcv/Cv8H/Dn+n/w18pP8MeqH/DHie/wt1m/8Kc5j/CXGV/wlv - k/8JbJD/CGqN/wdpi/8HZ4j/BmWH/wZkhf8GYoP/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/DiKp/3l+ - 4/9vdeH/Zmze/11i2/9UWtn/S1HW/0NI1P86P9H/Fhh9/8K/wf8Ogar/Barp/wGo6P8Apef/AKPm/wCi - 5P8An+L/AJ7h/wCd3/8AnN7/AJnc/wCY2/8AmNn/AJbX/wZjhP/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/ - wf8MJbX/iI7n/4CF5v93fOP/bnPg/2Vr3f9bYdv/UljY/0lP1v8UGoj/wr/B/w+Erf8Lrur/Bqvq/wOo - 6f8Apuf/AKTm/wCi5f8AoOT/AJ/i/wCd4f8AnN//AJrd/wCZ2/8AmNr/BmWH/8K/wf8AAAAAAAAAAAAA - AAAAAAAAwr/B/wkowP+WnOz/jpTq/4aL6P9+hOX/dXri/2xx4P9jaN3/WV/b/xEek//Cv8H/EIaw/xay - 7P8Or+z/Cavr/wWq6v8Bp+j/AKbn/wCj5f8AoeT/AJ/j/wCe4f8AnOD/AJve/wCa3f8HZ4n/wr/B/wAA - AAAAAAAAAAAAAAAAAADCv8H/CCrK/6Ko7/+coe7/lZrr/42T6f+Fiub/fIHl/3N54v9rcN//ECGg/8K/ - wf8QiLP/I7nu/xq07f8Ssez/C63r/war6v8Cqen/AKbo/wCk5v8AouX/AKHk/wCf4f8AneH/AJzf/who - i//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8GLNP/q7Hy/6as8P+hpu//mp/u/5OY6/+LkOj/g4nm/3qA - 5P8NI6z/wr/B/xCKtv8xvvD/J7rv/x627f8Vsuz/Dq/s/wmr6/8Equn/Aafo/wCl5/8Ao+X/AKHk/wCf - 4v8AnuH/CGqO/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wUu2/+vtPP/r7Tz/6qv8v+mq/D/oKXv/5me - 7f+Sl+v/io/p/wsmt//Cv8H/Eo24/0HF8f82wfD/LLzv/yK47v8atO3/EbHs/wut6/8Gq+r/A6np/wCm - 6P8Apeb/AKLl/wCh5P8IbJD/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/BC/h/wQv3/8FL9z/BS3Z/wYt - 1v8GLNL/ByvP/wgqy/8IKcb/CSnC/8K/wf8Sjrv/Uszy/0fH8f87w/H/Mb7v/ye67/8et+7/FbPt/w6v - 6/8IrOv/BKnp/wGo6P8Apef/AKPl/wluk//Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf/Cv8H/wr/B/8K/ - wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/xKRvf9j0/P/WM/z/0zK8f9BxfH/N8Hw/yy8 - 7/8iuO7/GbTt/xGx7P8Lruv/Bqrq/wOo6f8Apuf/CnGV/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCv8H/E5LA/3Ta8/9q1fP/XtHz/1LM - 8v9Hx/H/O8Pw/zG+7/8nu+//Hrbt/xay7f8Or+v/CKzq/wSq6f8Kc5j/wr/B/wAAAAAAAAAAAAAAAAAA - AADCv8H/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK/wf8UlMH/hOD1/3rc - 9f9v2PP/ZNTy/1jO8v9NyvH/Qsbx/zbB8P8svO//I7ju/xm07f8SsOz/C67r/wt2m//Cv8H/AAAAAAAA - AAAAAAAAAAAAAMK/wf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwr/B/xSW - w/+T5vb/iuL1/3/e9P912vT/adbz/13R8/9SzPL/R8jx/zzD8P8xvvD/J7rv/x627v8Vsuz/C3ie/8K/ - wf8AAAAAAAAAAAAAAAAAAAAAwr/B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADCv8H/FJbG/57r9/+X6Pb/juT1/4Th9f963fX/b9j0/2PT8/9Yz/L/TMrx/0HF8f83wO//LLzv/yK4 - 7v8MeqH/wr/B/wAAAAAAAAAAAAAAAAAAAADCv8H/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAMK/wf8VmMf/qO/3/6Lt9/+b6vb/kub2/4rj9f9/3vX/dNrz/2rV8/9d0fP/Uszy/0fI - 8f88w/D/Mr7v/w19pP/Cv8H/AAAAAAAAAAAAAAAAAAAAAMK/wf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAwr/B/xWZyP8UmMf/FZfF/xSVw/8TlML/E5K//xOQvf8Sjrv/EYy4/xGK - tv8QiLL/D4Ww/w+Erf8Pgar/Dn+n/8K/wf8AAAAAAAAAAAAAAAAAAAAAwr/B/8K/wf/Cv8H/wr/B/8K/ - wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/ - wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/8K/wf/Cv8H/wr/B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /////////////8AAAAPe+AAD3vgAA974AAPe+AAD3vgAA974AAPAAAADwAAAA8AAAAPAAAADwAAAA8AA - AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAAD3/gAA9/4AAPf+AAD3/gAA9/4AAPf+AADwAAAA/// - ////////KAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP8AAAAAAAAAAMDA - wP8AAAAAAAAAAMDAwP8AAAAAwMDA/8F2R/+9bj//umc6/7diNf+3YjX/wMDA/wAAAADAwMD/AAAAAAAA - AADAwMD/AAAAAAAAAADAwMD/AAAAAMDAwP/RkmD//7aP//+ldP/8kl3/vW0//8DAwP8AAAAAwMDA/wAA - AAAAAAAAwMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/3ap2///Cov//to7//6V0/8uJWP/AwMD/AAAAAMDA - wP8AAAAAAAAAAMDAwP8THI7/FBqF/xYYfP8XFnP/wMDA/+Cvev/gr3r/4K96/92qdv/ao3D/wMDA/wAA - AADAwMD/AAAAAAAAAADAwMD/ECCd/2Fn3P8zOc//FRmC/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/wAAAAAAAAAAwMDA/w0krP+Pler/YWbd/xIcj//AwMD/DHmf/wpzmP8Ib5L/B2uO/wdq - jf8Gao3/B2qN/8DAwP8AAAAAAAAAAMDAwP8KJrv/r7Tz/5CU6v8PIJ//wMDA/w+Dq/87y/z/Kcb8/xrD - /P8QwPv/EMD7/wdqjf/AwMD/AAAAAAAAAADAwMD/CCrI/woowP8LJrf/DSSu/8DAwP8Sjbj/Zdb9/0/Q - /P88y/v/Kcf7/xrC+/8IbZD/wMDA/wAAAAAAAAAAwMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/FpfG/43h - /f962/3/Zdb8/0/Q/P87zPz/CXSZ/8DAwP8AAAAAAAAAAMDAwP8AAAAAAAAAAAAAAAAAAAAAwMDA/xif - z/+u6f7/n+X9/47h/f953P3/ZNb9/w19pP/AwMD/AAAAAAAAAADAwMD/AAAAAAAAAAAAAAAAAAAAAMDA - wP8apNX/uez+/7ns/v+u6f7/oOX9/43h/f8Rh7H/wMDA/wAAAAAAAAAAwMDA/wAAAAAAAAAAAAAAAAAA - AADAwMD/GqTV/xqk1f8apNX/GaHR/xecy/8WmMb/FJK+/8DAwP8AAAAAAAAAAMDAwP/AwMD/wMDA/8DA - wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAALQF - wf+0BQAAgAUAAIAFAACAAQAAgAHB/4ABAACAAQAAgAEAALwBAAC8AQAAvAHB/4ABbP///5H/ - - 编辑或添加[Trojan]服务器 diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs index 7fe6a797..4a9b49d4 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs @@ -36,7 +36,6 @@ 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"; diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.resx b/v2rayN/v2rayN/Forms/BaseServerForm.resx index 61360d3d..c5e46818 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.resx +++ b/v2rayN/v2rayN/Forms/BaseServerForm.resx @@ -118,1136 +118,4 @@ 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/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs index 583d65cc..03b36a78 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -164,6 +164,7 @@ namespace v2rayN.Forms else if (network.Equals("kcp")) { tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip2"); + tipPath.Text = UIRes.I18N("TransportPathTip5"); } else if (network.Equals("ws")) { diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 5a097170..4af189b7 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -731,7 +731,7 @@ namespace v2rayN.Handler foreach (string str in arrData) { //maybe sub - if (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol)) + if (string.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) { if (AddSubItem(ref config, str) == 0) { @@ -794,12 +794,9 @@ namespace v2rayN.Handler public static int AddSubItem(ref Config config, string url) { //already exists - foreach (SubItem sub in config.subItem) + if (config.subItem.FindIndex(e => e.url == url) >= 0) { - if (url == sub.url) - { - return 0; - } + return 0; } SubItem subItem = new SubItem diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index c9931179..452aed06 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -1451,14 +1451,26 @@ namespace v2rayN.Handler continue; } - configCopy.index = it.selected; - var port = httpPort + it.selected; + //find unuse port + var port = httpPort; + for (int k = httpPort; k < 65536; k++) + { + if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == k) >= 0) + { + continue; + } + //found + port = k; + httpPort = port + 1; + break; + } //Port In Used if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == port) >= 0) { continue; } + configCopy.index = it.selected; it.port = port; Inbounds inbound = new Inbounds diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 509139fb..fa3511a5 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -979,6 +979,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 *Kcp seed 的本地化字符串。 + /// + internal static string TransportPathTip5 { + get { + return ResourceManager.GetString("TransportPathTip5", resourceCulture); + } + } + /// /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index fcc7d104..638172c8 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -436,4 +436,7 @@ TLS + + *Kcp seed + \ 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 28d06e11..b8466714 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -404,7 +404,7 @@ *h2 path - *QUIC 加密密钥/Kcp seed + *QUIC 加密密钥 *grpc serviceName @@ -436,4 +436,7 @@ 传输层安全 + + *Kcp seed + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index f71b0ba6..50820e86 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -307,6 +307,7 @@ BaseServerForm.cs + Designer MainForm.cs @@ -488,13 +489,13 @@ - 3.19.1 + 3.19.4 - 2.42.0 + 2.43.0 - 2.42.0 + 2.43.0 runtime; build; native; contentfiles; analyzers; buildtransitive all From 4eb1801f501087e178b9f19f21f968855a2eaa3b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 12 Feb 2022 19:53:41 +0800 Subject: [PATCH 087/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index cde110d2..2728cd03 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.30")] +[assembly: AssemblyFileVersion("4.31")] From 828246130ba872b5cd7e4ca01b58f1f5854da550 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 12 Feb 2022 19:54:48 +0800 Subject: [PATCH 088/252] Update v2rayN.csproj --- v2rayN/v2rayN/v2rayN.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 50820e86..d86e904a 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -506,7 +506,7 @@ 13.0.1 - 0.16.7 + 0.16.8 From 7778af65aa0fb7ebd2a25ffe151600ac94aa9a85 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 14 Feb 2022 08:58:43 +0800 Subject: [PATCH 089/252] re-add alterId --- v2rayN/v2rayN/Handler/ShareHandler.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index cd19c0b1..93cf78fe 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -69,7 +69,7 @@ namespace v2rayN.Handler add = item.address, port = item.port.ToString(), id = item.id, - aid = "0", + aid = item.alterId.ToString(), scy = item.security, net = item.network, type = item.headerType, @@ -430,6 +430,7 @@ namespace v2rayN.Handler vmessItem.address = Utils.ToString(vmessQRCode.add); vmessItem.port = Utils.ToInt(vmessQRCode.port); vmessItem.id = Utils.ToString(vmessQRCode.id); + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); vmessItem.security = Utils.ToString(vmessQRCode.scy); if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) From 0f6cd76f28c2aef20688e97e51110a25de127a26 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 14 Feb 2022 08:59:11 +0800 Subject: [PATCH 090/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 2728cd03..0af08449 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.31")] +[assembly: AssemblyFileVersion("4.32")] From ca883c164d547c40ac21b76aea59f4c31d029d1e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 20 Feb 2022 15:16:00 +0800 Subject: [PATCH 091/252] Update Subscription via proxy, add default user-agent --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 234 +- v2rayN/v2rayN/Forms/MainForm.cs | 52 +- v2rayN/v2rayN/Forms/MainForm.resx | 2862 ++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 106 +- .../Forms/OptionSettingForm.Designer.cs | 40 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 8 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3047 +++++++++-------- .../Forms/OptionSettingForm.zh-Hans.resx | 5 +- .../Forms/SubSettingControl.Designer.cs | 2 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 514 +-- .../Forms/SubSettingControl.zh-Hans.resx | 8 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 12 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 8 +- v2rayN/v2rayN/Tool/Utils.cs | 16 +- 14 files changed, 3533 insertions(+), 3381 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 00d0d5b0..cea1cf45 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -64,8 +64,8 @@ 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.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.gbMsgTitle = new System.Windows.Forms.GroupBox(); @@ -74,6 +74,7 @@ this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxClear = new System.Windows.Forms.ToolStripMenuItem(); this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem(); this.ssMain = new System.Windows.Forms.StatusStrip(); @@ -96,6 +97,7 @@ this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem(); + this.menuUpdateSubViaProxy = 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(); @@ -105,6 +107,7 @@ this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbSubUpdateViaProxy = new System.Windows.Forms.ToolStripMenuItem(); this.tsbQRCodeSwitch = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); this.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton(); @@ -157,19 +160,17 @@ // // scMain.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); this.scMain.Panel2.Controls.Add(this.qrCodeControl); this.scMain.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -188,7 +189,6 @@ // // 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, @@ -223,202 +223,202 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // - // tsbServer - // - resources.ApplyResources(this.tsbServer, "tsbServer"); - this.tsbServer.DropDown = this.cmsLv; - this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - this.tsbServer.Name = "tsbServer"; - // // qrCodeControl // resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // + // tsbServer + // + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.Name = "tsbServer"; + // // splitContainer1 // resources.ApplyResources(this.splitContainer1, "splitContainer1"); @@ -426,35 +426,33 @@ // // splitContainer1.Panel1 // - resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // // splitContainer1.Panel2 // - resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.scMain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // gbMsgTitle // - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Controls.Add(this.txtMsgBox); this.gbMsgTitle.Controls.Add(this.ssMain); + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Name = "gbMsgTitle"; this.gbMsgTitle.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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + 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; @@ -462,48 +460,54 @@ // // cmsMsgBox // - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, this.menuMsgBoxCopyAll, + this.menuMsgBoxClear, this.menuMsgBoxAddRoutingRule, this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // + // menuMsgBoxClear + // + this.menuMsgBoxClear.Name = "menuMsgBoxClear"; + resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); + this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); + // // menuMsgBoxAddRoutingRule // - resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // menuMsgBoxFilter // - resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); // // ssMain // - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslInboundInfo, @@ -512,13 +516,14 @@ this.toolSslBlank2, this.toolSslServerSpeed, this.toolSslBlank4}); + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslInboundInfo // - resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); this.toolSslInboundInfo.Name = "toolSslInboundInfo"; + resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); // // toolSslBlank1 // @@ -528,13 +533,13 @@ // // toolSslRoutingRule // - resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); // // toolSslBlank2 // - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.Name = "toolSslBlank2"; + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.Spring = true; // // toolSslServerSpeed @@ -545,19 +550,19 @@ // // toolSslBlank4 // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuRoutings, @@ -567,6 +572,7 @@ this.menuAddServers2, this.menuScanScreen2, this.menuUpdateSubscriptions, + this.menuUpdateSubViaProxy, this.toolStripSeparator2, this.menuExit}); this.cmsMain.Name = "contextMenuStrip1"; @@ -576,81 +582,87 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - resources.ApplyResources(this.menuRoutings, "menuRoutings"); this.menuRoutings.Name = "menuRoutings"; + resources.ApplyResources(this.menuRoutings, "menuRoutings"); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); // // menuServers2 // - resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.BackColor = System.Drawing.SystemColors.Window; this.menuServers2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.menuServers2.DropDownWidth = 500; + resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.Name = "menuServers2"; // // toolStripSeparator13 // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); this.toolStripSeparator13.Name = "toolStripSeparator13"; + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // + // menuUpdateSubViaProxy + // + this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy"; + resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); + this.menuUpdateSubViaProxy.Click += new System.EventHandler(this.menuUpdateSubViaProxy_Click); + // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -666,7 +678,6 @@ // // 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, @@ -684,87 +695,95 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); // // tsbSub // - resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbSubSetting, - this.tsbSubUpdate}); + this.tsbSubUpdate, + this.tsbSubUpdateViaProxy}); this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; + resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.Name = "tsbSub"; // // tsbSubSetting // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); // + // tsbSubUpdateViaProxy + // + this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy"; + resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); + this.tsbSubUpdateViaProxy.Click += new System.EventHandler(this.tsbSubUpdateViaProxy_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; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); // // tsbSetting // - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // toolStripSeparator14 // - resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); this.toolStripSeparator14.Name = "toolStripSeparator14"; + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); // // tsbBackupGuiNConfig // - resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // @@ -774,12 +793,11 @@ // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, @@ -788,51 +806,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator15 // - resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); this.toolStripSeparator15.Name = "toolStripSeparator15"; + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); // // tsbCheckUpdateGeoSite // - resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; + resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); // // tsbCheckUpdateGeoIP // - resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; + resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -840,49 +858,50 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "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 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // @@ -1032,6 +1051,9 @@ private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; private System.Windows.Forms.ToolStripComboBox menuServers2; + private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy; + private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 6bd0b4b6..2b3b7b31 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -199,12 +199,12 @@ namespace v2rayN.Forms 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("LvTLS"), 70); - lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50); - lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Right); + lvServers.Columns.Add(UIRes.I18N("LvPort"), 100); + lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 120); + lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 120); + lvServers.Columns.Add(UIRes.I18N("LvTLS"), 100); + lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 100); + lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 120, HorizontalAlignment.Right); if (statistics != null && statistics.Enable) { @@ -407,6 +407,15 @@ namespace v2rayN.Forms try { + if ((EServerColName)e.Column == EServerColName.def) + { + foreach (ColumnHeader it in lvServers.Columns) + { + it.Width = -2; + } + return; + } + 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) @@ -460,7 +469,7 @@ namespace v2rayN.Forms ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); - ChangePACButtonStatus(0); + ChangePACButtonStatus(ESysProxyType.ForcedClear); v2rayHandler.V2rayStop(); } @@ -915,7 +924,11 @@ namespace v2rayN.Forms private void menuUpdateSubscriptions_Click(object sender, EventArgs e) { - UpdateSubscriptionProcess(); + UpdateSubscriptionProcess(false); + } + private void menuUpdateSubViaProxy_Click(object sender, EventArgs e) + { + UpdateSubscriptionProcess(true); } private void tsbBackupGuiNConfig_Click(object sender, EventArgs e) @@ -1202,14 +1215,6 @@ namespace v2rayN.Forms private void ChangePACButtonStatus(ESysProxyType type) { HttpProxyHandle.UpdateSysProxy(config, false); - //if (type != ListenerType.noHttpProxy) - //{ - // HttpProxyHandle.RestartHttpAgent(config, false); - //} - //else - //{ - // HttpProxyHandle.CloseHttpAgent(config); - //} for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) { @@ -1361,13 +1366,18 @@ namespace v2rayN.Forms private void tsbSubUpdate_Click(object sender, EventArgs e) { - UpdateSubscriptionProcess(); + UpdateSubscriptionProcess(false); + } + + private void tsbSubUpdateViaProxy_Click(object sender, EventArgs e) + { + UpdateSubscriptionProcess(true); } /// /// the subscription update process /// - private void UpdateSubscriptionProcess() + private void UpdateSubscriptionProcess(bool blProxy) { void _updateUI(bool success, string msg) { @@ -1378,7 +1388,7 @@ namespace v2rayN.Forms } }; - (new UpdateHandle()).UpdateSubscriptionProcess(config, _updateUI); + (new UpdateHandle()).UpdateSubscriptionProcess(config, blProxy, _updateUI); } private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) @@ -1490,6 +1500,10 @@ namespace v2rayN.Forms var data = this.txtMsgBox.Text; Utils.SetClipboardData(data); } + private void menuMsgBoxClear_Click(object sender, EventArgs e) + { + this.txtMsgBox.Clear(); + } private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e) { menuMsgBoxCopy_Click(null, null); diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index e1276743..47687761 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,780 +117,203 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - + + 3, 17 + + + 327, 17 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VMess] server - - tsbCheckUpdateXrayCore - - - 97, 53 - - + 355, 22 Add [VLESS] server - - 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Restart service - - - 200, 25 - - - tsbSubSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslInboundInfo - - - gbMsgTitle - - - menuMoveUp - - - Add [Socks] server - - - 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 - - - 952, 593 - - - - ImageAboveText - - - 227, 22 - - - 语言-[中文简体] - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - tsbHelp - - - System.Windows.Forms.ToolStripMenuItem, 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 - - - toolStripSeparator6 - - - Set as active server (Enter) - - - 99, 53 - - - Update subscriptions - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - 67, 53 - - - tsbSetting - - - toolSslBlank2 - - + 355, 22 - - 355, 22 - - - tsbCheckUpdateN - - - Do not change system proxy - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - Update v2flyCore - - - Update GeoSite - - - Magenta - - - menuMsgBoxAddRoutingRule - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - Share - - - 227, 22 - - - tsbQRCodeSwitch - - - Add Routing Rule (Ctrl+V) - - - 355, 22 - - - Horizontal - - - toolStripSeparator2 - - - Export selected server for client configuration - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExit - - - Copy All - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 227, 22 - - - Export selected server for server configuration - - - splitContainer1 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 128, 53 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - menuRealPingServer - - - Test servers real delay (Ctrl+R) - - - menuTcpingServer - - - - 0 - - - ImageAboveText - - - toolSslRoutingRule - - - 6, 56 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - 355, 22 - - - toolStripSeparator1 - - - 264, 22 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - 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.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 - - - 200, 6 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageDef - - - Import bulk URL from clipboard (Ctrl+V) - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM - mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY - FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr - flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh - VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh - 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC - - - - System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 17 - - - 355, 22 - - - 355, 22 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 6, 56 - - - 946, 280 - - - 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 - - - 184, 6 - - - 250, 21 - - - menuAddCustomServer - - - statusStrip1 - - - menuMoveDown - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - - - - Import bulk URL from clipboard - - - gbMsgTitle - - - Move to bottom (B) - - - Move to top (T) - - - 6, 12 - - - 48, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - Fill - - - 0 - - - 686, 280 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 176, 22 - - - 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 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain.Panel2 - - - menuAddServers2 - - - Fill - - - 3 - - - Add [VMess] server - - - $this - - - 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 - - - 300, 21 - - - 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 + + Add [Shadowsocks] server 355, 22 - - 352, 6 + + Add [Socks] server - + 355, 22 - - 0, 0 - - - 256, 280 - - - 355, 22 - - - 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 - - - 352, 6 - - - groupBox1 - - - 300, 21 - - - 2 - - - 125, 22 - - - Clear all service statistics - - - scMain.Panel2 - - - 176, 22 - - - 3 - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - 686 - - - splitContainer1 - - - 50 - - - lvServers - - - 265, 199 - - - 243, 22 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - Check for updates - - - Copy (Ctrl+C) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 125, 22 - - - scMain - - - 203, 22 - - - Magenta - - - 952, 56 - - - tsbReload - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Help - - - menuMsgBoxSelectAll - - - menuSelectAll - - - splitContainer1.Panel1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 56 - - - 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 - - - 264, 22 - - - menuAddServers - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - menuExport2ShareUrl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN (this software) - - - Magenta - - - gbMsgTitle - - - splitContainer1.Panel1 - - - 0, 0 - - - 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 - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - txtMsgBox - - - toolSslBlank4 - - - menuAddTrojanServer - - - 80, 21 - - - v2rayN - - - Language-[English] - - - 264, 22 - - - menuScanScreen2 - - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Routing - Add [Trojan] server - - 176, 22 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - ImageAboveText + + 355, 22 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Import bulk URL from clipboard (Ctrl+V) - - Set message filters + + 355, 22 - - splitContainer1.Panel2 + + Scan QR code on the screen (Ctrl+S) 352, 6 - + + 355, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + Remove duplicate servers + + + 355, 22 + + + Clone selected server + + + 355, 22 + + + Set as active server (Enter) + + + 352, 6 + + + 355, 22 + + + Move to top (T) + + + 355, 22 + + + Up (U) + + + 355, 22 + + + Down (D) + + + 355, 22 + + + Move to bottom (B) + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Test current service status + + + 355, 22 + + + Clear all service statistics + + + 352, 6 + + + 355, 22 + + + Export selected server for client configuration + + + 355, 22 + + + Export selected server for server configuration + + + 355, 22 + + + Export share URLs to clipboard (Ctrl+C) + + + 355, 22 + + + Export subscription (base64) share to clipboard + + + 356, 622 + + + cmsLv + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuExport2ClientConfig - - - V2Ray Website - - + Fill - - No - - - 1 - - - cmsMsgBox - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OptionSetting - - - menuMoveTop - - - tsbCheckUpdateCore - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -908,727 +331,1340 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 300 + + 0, 0 - - tsbCheckUpdateGeoIP + + 686, 280 - - menuScanScreen - - - ImageAboveText - - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - Fill - - - toolSslBlank1 - - - v2rayN Project - - - tsbSubUpdate - - - tsMain - - - 5 - - - SPEED Disabled - - - 355, 22 - - - Promotion - - - menuSysAgentMode - - - 952, 527 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - 227, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - cmsMain - - - 264, 22 - - - menuServers - - - menuUpdateSubscriptions - - - 228, 114 - - - 3 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxFilter - - - 203, 22 - - - RoutingSetting - - - Standard - - - 3, 194 - - - True - - - 355, 22 - - - Subscriptions - - - 952, 10 - - - Updates - - - 264, 22 - - - Add [Shadowsocks] server - - - toolStripSeparator14 - - + + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + lvServers - - toolStripSeparator8 - - - menuMsgBoxCopyAll - - - 89, 53 - - - 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.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 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - Settings - - - menuCopyServer - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Http proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - groupBox1 - - - MainForm - - - toolStripSeparator9 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 227, 22 - - - False - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Servers list - - - Servers + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null scMain.Panel1 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - Magenta - - - MiddleRight - - - 4, 4, 4, 4 - - - Magenta - - - 355, 22 - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - $this - - - 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 - - - 355, 22 - - - toolSslServerSpeed - - - menuRemoveServer - - - 355, 22 - - - Informations - - - tsbTestMe - - - 0 - - - 946, 177 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddVmessServer - - - scMain - - - Down (D) - - - 352, 6 - - - Magenta - - - 243, 22 - - - Remove selected servers (Delete) - - - 355, 22 - - - tsbSub - - - Magenta - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripDropDownButton, 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1.Panel2 - - - 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 - - - Export share URLs to clipboard (Ctrl+C) - - - 243, 22 - - - 355, 22 - - - Server - - - System.Windows.Forms.ToolStrip, 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 - - - $this - - - Fill - - - qrCodeControl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Clear system proxy - - - tsbServer - - - 0 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepNothing - - - tsbPromotion - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 21 - - - 203, 22 - - - 356, 622 - - - 355, 22 - - - 0, 0 - - - Up (U) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - Set system proxy - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuServers2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - tsbOptionSetting - - - 100 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer - scMain.Panel1 - - 微软雅黑, 8pt + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 64, 53 + + scMain - - 1 - - - 5 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Magenta - - - 45, 53 - - - menuAddVlessServer - - - 300 - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuRoutings - - - 261, 6 - - - 微软雅黑, 8pt - - - splitContainer1 - - - 0 - - - 261, 6 - - - Test current service status - - - NoControl - - - toolStripSeparator10 - - - menuMoveBottom - - - 0, 66 - - - 1 - - - Magenta - - - InboundInfo - - - 355, 22 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - menuExport2ServerConfig - - - 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator11 - - - 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 - - - Export subscription (base64) share to clipboard - - - 52, 53 - - - System.Windows.Forms.NotifyIcon, 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 - - - Exit - - - 355, 22 - - - menuClearServerStatistics - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scan QR code on the screen - - - 946, 26 - - - Close - - - 264, 22 - - - 0, 21 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ssMain - - - 952, 223 - - - Update XrayCore - - - tsbBackupGuiNConfig - - - Add a custom configuration server - - - 173, 6 - - - bgwScan - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 17 - - - menuSpeedServer - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 Fill - - tsbV2rayWebsite + + 0, 0 - - toolStripSeparator3 + + 4, 4, 4, 4 - - BackupGuiConfig + + 256, 280 + + + 2 + + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scMain.Panel2 + + + 0 + + + scMain.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 1 + + + 100 + + + 946, 280 + + + 686 + + + 0 + + + scMain + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + + + Fill + + + 0, 66 + + + Horizontal + + + Fill + + + 0, 0 + + + 952, 300 + + + 0 + + + Servers list + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + 603, 17 + + + 227, 22 + + + Select All (Ctrl+A) + + + 227, 22 + + + Copy (Ctrl+C) + + + 227, 22 + + + Copy All + + + 227, 22 + + + Clear All + + + 227, 22 + + + Add Routing Rule (Ctrl+V) + + + 227, 22 + + + Set message filters + + + 228, 136 + + + cmsMsgBox + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 + + + 0 + + + True Vertical - - tsbRoutingSetting + + 946, 177 - - 355, 22 + + 3 - - ImageAboveText + + txtMsgBox - - Update GeoIP + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuKeepClear + + gbMsgTitle - - toolStripSeparator15 + + 0 228, 18 - - 603, 17 - - - True - + + 80, 21 + + + InboundInfo + + + 微软雅黑, 8pt + + + 300, 21 + + + 0, 21 + + + 300, 21 + + + False + + + 微软雅黑, 8pt + + + No + + + 250, 21 + + + SPEED Disabled + + + MiddleRight + + + 0, 21 + + + 3, 194 + + + 946, 26 + + + 0 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 1 + + + Fill + + + 0, 0 + + + 952, 223 + + + 3 + + + Informations + + + gbMsgTitle + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 952, 527 + + + 300 + + + 5 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + 17, 17 - - 65 - 137, 17 + + NoControl + + + 243, 22 + + + Clear system proxy + + + 243, 22 + + + Set system proxy + + + 243, 22 + + + Do not change system proxy + + + 264, 22 + + + Http proxy + + + 264, 22 + + + Routing + + + 264, 22 + + + Server + + + Standard + + + 50 + + + 200, 25 + + + Server + + + 261, 6 + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Update subscriptions + + + 264, 22 + + + Update subscriptions via proxy + + + 261, 6 + + + 264, 22 + + + Exit + + + 265, 243 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + 498, 17 + + Top + + + 0, 56 + + + 952, 10 + + + 2 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + 409, 17 - - 327, 17 + + 6, 56 + + + 182, 22 + + + Settings + + + 182, 22 + + + Updates + + + 182, 22 + + + Updates via proxy + + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + + + Magenta + + + 45, 53 + + + Share + + + BottomCenter + + + ImageAboveText + + + 6, 56 + + + 176, 22 + + + OptionSetting + + + 176, 22 + + + RoutingSetting + + + 173, 6 + + + 176, 22 + + + BackupGuiConfig + + + Magenta + + + 67, 53 + + + Settings + + + 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 + + + 203, 22 + + + v2rayN (this software) + + + 203, 22 + + + Update v2flyCore + + + 203, 22 + + + Update XrayCore + + + 200, 6 + + + 203, 22 + + + Update GeoSite + + + 203, 22 + + + Update GeoIP + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + + + 6, 56 + + + 187, 22 + + + v2rayN Project + + + 187, 22 + + + V2Ray Website + + + 184, 6 + + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] + + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + + + 6, 56 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + Magenta + + + 52, 53 + + + Close + + + ImageAboveText + + + 0, 0 + + + 952, 56 + + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + 88 + + + 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 + + + menuAddVlessServer + + + 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 + + + menuAddTrojanServer + + + 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 + + + tsbTestMe + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuClearServerStatistics + + + 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 + + + menuMsgBoxSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopyAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxClear + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxAddRoutingRule + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxFilter + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslInboundInfo + + + 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 + + + toolSslRoutingRule + + + 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 + + + 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 + + + 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 + + + menuKeepClear + + + 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 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRoutings + + + 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 + + + menuServers2 + + + System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, 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 + + + menuUpdateSubscriptions + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubViaProxy + + + 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 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdateViaProxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator14 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbBackupGuiNConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator15 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoIP + + + 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 + + + tsbV2rayWebsite + + + 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 + \ 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 731e577e..3a4674fe 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -321,12 +321,6 @@ 服务器列表 - - 信息 - - - 222, 114 - 221, 22 @@ -357,9 +351,33 @@ 设置信息过滤器 + + 222, 114 + 网速显示未启用 + + 信息 + + + 172, 22 + + + 清除系统代理 + + + 172, 22 + + + 自动配置系统代理 + + + 172, 22 + + + 不改变系统代理 + 260, 22 @@ -402,6 +420,12 @@ 更新订阅 + + 260, 22 + + + 更新订阅(通过代理) + 257, 6 @@ -412,25 +436,25 @@ 退出 - 261, 199 + 261, 227 - - 172, 22 + + 180, 22 - - 清除系统代理 + + 订阅设置 - - 172, 22 + + 180, 22 - - 自动配置系统代理 + + 更新订阅 - - 172, 22 + + 180, 22 - - 不改变系统代理 + + 更新订阅(通过代理) 61, 53 @@ -438,30 +462,12 @@ 订阅 - - 124, 22 - - - 订阅设置 - - - 124, 22 - - - 更新订阅 - 52, 53 分享 - - 61, 53 - - - 设置 - 189, 22 @@ -483,6 +489,12 @@ 备份v2rayN配置文件 + + 61, 53 + + + 设置 + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -500,12 +512,6 @@ 重启服务 - - 85, 53 - - - 检查更新 - 168, 22 @@ -533,11 +539,11 @@ 168, 22 - - 69, 53 + + 85, 53 - - 帮助 + + 检查更新 v2rayN 项目 @@ -545,6 +551,12 @@ V2Ray 官网 + + 69, 53 + + + 帮助 + 68, 53 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index ada27d1b..756d19fa 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -69,6 +69,7 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.btnSetLoopback = new System.Windows.Forms.Button(); this.txtautoUpdateInterval = new System.Windows.Forms.TextBox(); this.label15 = new System.Windows.Forms.Label(); this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox(); @@ -101,32 +102,33 @@ // // 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); this.tabControl1.Controls.Add(this.tabPage3); - resources.ApplyResources(this.tabControl1, "tabControl1"); 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.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); @@ -144,7 +146,6 @@ 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; // @@ -187,12 +188,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 @@ -207,8 +208,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"), @@ -234,6 +235,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[] { @@ -242,7 +244,6 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -262,10 +263,10 @@ // // tabPage2 // + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -288,6 +289,7 @@ // // tabPage6 // + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -301,7 +303,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; // @@ -373,6 +374,8 @@ // // tabPage7 // + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.btnSetLoopback); this.tabPage7.Controls.Add(this.txtautoUpdateInterval); this.tabPage7.Controls.Add(this.label15); this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); @@ -384,10 +387,16 @@ this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // btnSetLoopback + // + resources.ApplyResources(this.btnSetLoopback, "btnSetLoopback"); + this.btnSetLoopback.Name = "btnSetLoopback"; + this.btnSetLoopback.UseVisualStyleBackColor = true; + this.btnSetLoopback.Click += new System.EventHandler(this.btnSetLoopback_Click); + // // txtautoUpdateInterval // resources.ApplyResources(this.txtautoUpdateInterval, "txtautoUpdateInterval"); @@ -406,12 +415,12 @@ // // cmbCoreType // + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType.FormattingEnabled = true; this.cmbCoreType.Items.AddRange(new object[] { resources.GetString("cmbCoreType.Items"), resources.GetString("cmbCoreType.Items1")}); - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.Name = "cmbCoreType"; // // label4 @@ -427,9 +436,9 @@ // // 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 @@ -457,17 +466,17 @@ // // tabPage3 // - this.tabPage3.Controls.Add(this.groupBox2); resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Controls.Add(this.groupBox2); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -488,9 +497,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 @@ -595,5 +604,6 @@ private System.Windows.Forms.Label label13; private System.Windows.Forms.TextBox txtautoUpdateInterval; private System.Windows.Forms.Label label15; + private System.Windows.Forms.Button btnSetLoopback; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index e7748b02..2bb2bded 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -5,6 +5,7 @@ using v2rayN.Handler; using v2rayN.Base; using v2rayN.HttpProxyHandler; using v2rayN.Mode; +using System.Diagnostics; namespace v2rayN.Forms { @@ -330,7 +331,12 @@ namespace v2rayN.Forms private void linkDnsObjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - System.Diagnostics.Process.Start("https://www.v2fly.org/config/dns.html#dnsobject"); + Process.Start("https://www.v2fly.org/config/dns.html#dnsobject"); + } + + private void btnSetLoopback_Click(object sender, EventArgs e) + { + Process.Start(Utils.GetPath("EnableLoopback.exe")); } } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index e4be1098..8b025db3 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,995 +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 - - - 15, 192 - - - 102, 16 - - - 35 - - - allowInsecure - - - chkdefAllowInsecure - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 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 - - - 1 - - - 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 - - - 2 - - - 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 - - - 3 - True - - 15, 63 + + Xray_core - - 120, 16 + + 11 - - 19 + + + 107, 12 - - listening port 2 + + Keep older when deduplication - - False - - - chkAllowIn2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 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 - - + 5 - - 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 - - - 6 - - - 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 - - - 7 - - - 124, 60 - - - 78, 21 - - - 14 - - - False - - - txtlocalPort2 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - 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 - - - 9 - - - 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 - - - 10 - - - 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 - - - 11 - - - True - - - 15, 160 - - - 126, 16 - - - 9 + + 6, 283 Record local logs - - chklogEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - 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 - - - 13 - - - 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 - - - 14 - - - 124, 25 - - - 78, 21 - - - 3 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 15 - - - 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 - - - 16 - - - Fill - - - 3, 3 - - - 648, 421 - - - 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, 427 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 0 - - - True - - - NoControl - - - 342, 17 - - - 0, 0, 0, 0 - - - 107, 12 - - - 40 - - - Support DnsObject - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - 8, 41 - - - True - - - Vertical - - - 638, 356 - - - 39 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 1 - - - True - - - NoControl - - - 8, 17 - - - 281, 12 - - - 38 - - - Custom DNS (multiple, separated by commas (,)) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 2 - - - 4, 22 - - - 654, 427 - - - 4 - - - Core: DNS 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 - - - 1 - - - True - - - 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 - - - 94, 21 - - - 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 + + tabPage7 12 @@ -1113,613 +152,1601 @@ 4, 22 - - 3, 3, 3, 3 + + txtKcpwriteBufferSize - - 654, 427 + + groupBox1 - - 2 + + 8 - - Core: KCP settings + + False - - tabPage6 + + 14 - - System.Windows.Forms.TabPage, 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 tabControl1 - - 2 + + groupBox1 - - 325, 156 + + 5 - - 97, 21 + + 9 - - 38 - - - txtautoUpdateInterval - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - True - - - NoControl - - - 30, 162 - - - 239, 12 - - - 37 - - - Automatic update interval of Geo(hours) + + groupBox1 label15 - + + txtautoUpdateInterval + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 35 + + + 111, 24 + + + 468, 60 + + + + Top + + + 102, 16 + + + 6 + + + 14 + + + tabPage3 + + + 5 + + + 30, 88 + + + 111, 100 + + + True + + + System.Windows.Forms.Label, 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 + + + 84, 16 + + + 40 + + + cmbloglevel + + + True + + + 120, 16 + + + True + + + tti + + + tabPage6 + + + tabPage6 + + + groupBox1 + + + 7 + + + tabPage7 + + + 12 + + + label7 + + + http + + + 7 + + + chkdefAllowInsecure + + + 648, 421 + + + NoControl + + + 206, 64 + + + 95, 12 + + + tabPage6 + + + 39 + + + 317, 12 + + + 15, 63 + + + 2 + + + Enable UDP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + &Cancel + + + label10 + + + 654, 427 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 654, 427 + + + NoControl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Settings + + + 15, 132 + + + txtKcpreadBufferSize + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 42 + + + txtKcpmtu + + + lbFreshrate + + + 12 + + + $this + + + label11 + + + 29 + + + True + + + tabPage6 + + + 0, 10 + + + Support DnsObject + + + tabPage6 + + + False + + + tabControl1 + + + $this + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + tabPage6 + + + Fill + + + 18 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + congestion + + + NoControl + + + 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 + + + 89, 12 + + + NoControl + + + 0 + + + tabPage7 + + + v2rayN settings + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + 32 + + + label6 + + + 6, 12 + + + groupBox1 + + + 1 + + + True + + + 8 + + + txtKcpdownlinkCapacity + + + 198, 16 + + + Automatically start at system startup + + + label14 + + + 1 + + + txtKcptti + + + 2 + + + Turn on Sniffing + + + 281, 12 + + + Ignore Geo files when updating core + + + 2 + + + 3, 3, 3, 3 + + + 97, 20 + + + 3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 662, 453 + + + 33, 29 + + + 325, 130 + + + 468, 27 + + + 78, 21 + + + tabControl1 + + + 59, 12 + + + cmbCoreType + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + warning + + + tabPage2 + + + panel2 + + + Statistics freshrate + + + 120, 16 + + + 89, 12 + + + 18, 66 + + + 20, 143 + + + 11 + + + True + + + 4, 4, 4, 4 + + + tabPage6 + + + 37 + + + Turn on Sniffing + + + groupBox1 + + + 345, 100 + + + 18, 28 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage7 - - 1 + + 20 - - True + + 10 - - NoControl + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 132 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 234, 16 + + 14 - - 36 + + 5 - - Ignore Geo files when updating core - - - chkIgnoreGeoUpdateCore - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - v2fly_core - - - Xray_core - - - 325, 130 - - - 97, 20 - - - 34 - - - cmbCoreType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - True - - - NoControl - - - 253, 134 - - - 59, 12 - - - 35 + + label12 Core Type - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 4 - - + True - - NoControl + + 8, 28 - - 15, 108 + + chksniffingEnabled - - 198, 16 + + 2 - - 33 + + 174, 16 - - Keep older when deduplication - - - chkKeepOlderDedupl - - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage7 + + groupBox1 - - 5 + + 3 - - 161, 84 + + 18, 104 - - 58, 20 + + tabPage2 - - 32 + + 282, 23 - - cbFreshrate + + socks - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 36 - - tabPage7 + + 576, 16 - - 6 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + True - - NoControl - - - 30, 88 - - - 125, 12 + + panel1 30 - - Statistics freshrate + + 53, 12 - - lbFreshrate + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 13 + + + label8 + + + 0 + + + label13 + + + chkAutoRun + + + 94, 21 + + + 345, 62 + + + 15, 16 + + + chkudpEnabled + + + 4 + + + True + + + 8, 17 + + + tabPage1 + + + tabPage7 + + + tabPage6 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 84, 16 + + + 15 + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtlocalPort + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + tabPage7 + + + 19 + + + 4, 22 + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnClose + + + 124, 25 + + + protocol + + + 84, 16 + + + Turn on Mux Multiplexing + + + True + + + 23, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 638, 356 + + + True + + + 3, 3 + + + 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 + + + chkAllowLANConn + + + True + + + tabControl1 + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 40 + + + 1 + + + tabPage6 + + + 369, 62 + + + 9 + + + System proxy settings + + + NoControl + + + 654, 427 + + + chkEnableStatistics + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 2 + + + 4 + + + 193, 162 + + + btnSetLoopback + + + 124, 60 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + label2 + + + Set Windows10 UWP Loopback + + + False + + + System.Windows.Forms.ComboBox, 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 + + + 9 + + + 0 + + + 101, 12 + + + 9 + + + 12 + + + 20 + + + cmbprotocol + + + groupBox2 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + 4 + + + Listening port + + + Fill + + + 41 + + + 257, 60 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + True + + + 34 + + + cmbprotocol2 + + + NoControl + + + chkKeepOlderDedupl + + + 15, 129 + + + 16 + + + 10 + + + True + + + True + + + chkKcpcongestion + + + Core: basic settings + + + 0 + + + 257, 25 + + + tabPage2 + + + 30, 376 + + + listening port 2 + + + 97, 20 + + + chkAllowIn2 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Vertical + + + 38 + + + 33 + + + 4, 22 + + + v2fly_core + + + 9 + + + label1 + + + Core: KCP settings + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 29 + + + error + + + True + + + groupBox1 + + + 59, 12 + + + NoControl + + + groupBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 654, 427 + + + 8 + + + 120, 16 + + + 662, 10 + + + txtlocalPort2 + + + True + + + 246, 16 + + + True + + + tabPage2 + + + 654, 427 + + + 42 + + + 10 + + + False + + + Custom DNS (multiple, separated by commas (,)) + + + 206, 29 + + + 15, 160 + + + downlinkCapacity + + + chkudpEnabled2 + + + info + + + chkIgnoreGeoUpdateCore + + + Allow connections from the LAN + + + 161, 84 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + groupBox2 + + + panel2 + + + 39 + + + 8 + + + 35 + + + linkDnsObjectDoc + + + System.Windows.Forms.TabPage, 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 tabPage7 - - 7 + + 6 - - True + + none - - NoControl + + Log level - - 15, 64 - - - 576, 16 - - - 29 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - chkEnableStatistics - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 8 - - - True - - - 15, 40 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 9 - - - True - - - 15, 16 - - - 246, 16 - - - 23 - - - Automatically start at system startup - - - chkAutoRun - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 10 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 427 - - - 3 - - - v2rayN settings - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + tabControl1 - - 3 - - - True - - - NoControl - - - 6, 283 - - - 107, 12 - - - 42 - - - Use semicolon (;) - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 8, 28 - - - 317, 12 - - - 40 - - - Do not use proxy server for addresses beginning with - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - 8, 52 - - - True - - - Vertical - 638, 219 - - 41 - - - txtsystemProxyExceptions - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - Fill - - - 0, 0 - - - 654, 427 - - - 42 - - - Exception - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage3 - - - 0 - - - 4, 22 - - - 654, 427 - - - 5 - - - System proxy settings - - - tabPage3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 4 - - - Fill - - - 0, 10 - - - 662, 453 - - - 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, 463 - - - 662, 60 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Top - - - 0, 0 - - - 662, 10 - - - 9 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - True - - - 6, 12 - - - 662, 523 - - - 4, 4, 4, 4 - - - Settings + + 6 OptionSettingForm - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 2 + + 239, 12 + + + 15, 64 + + + 111, 62 + + + 11 + + + groupBox2 + + + 58, 20 + + + 1 + + + 13 + + + 97, 20 + + + 0 + + + 8, 52 + + + True + + + 78, 21 + + + tabPage7 + + + tabPage7 + + + True + + + allowInsecure + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 16 + + + 23, 12 + + + 11 + + + 4 + + + 8 + + + Exception + + + NoControl + + + Use semicolon (;) + + + groupBox1 + + + 94, 21 + + + 1 + + + True + + + 10 + + + 17 + + + 94, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 0, 463 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 97, 20 + + + http + + + 0 + + + mtu + + + tabPage6 + + + tabPage6 + + + 7 + + + False + + + 257, 158 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &OK + + + 10 + + + 1 + + + 94, 21 + + + txtKcpuplinkCapacity + + + 23 + + + chklogEnabled + + + chksniffingEnabled2 + + + tabPage7 + + + txtsystemProxyExceptions + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 325, 156 + + + groupBox2 + + + 4, 22 + + + 40 + + + Automatic update interval of Geo(hours) + + + groupBox1 + + + 4, 22 + + + socks + + + NoControl + + + 6 + + + protocol + + + tabPage7 + + + $this + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 6 + + + 8 + + + txtremoteDNS + + + 0, 0 + + + True + + + True + + + 3 + + + 1 + + + 11 + + + True + + + 89, 12 + + + 16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 31 + + + 369, 27 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + groupBox1 + + + groupBox1 + + + 32 + + + 38 + + + Core: DNS settings + + + 345, 24 + + + cbFreshrate + + + 236, 104 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 204, 16 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 234, 16 + + + 94, 21 + + + 75, 23 + + + writeBufferSize + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 8, 41 + + + uplinkCapacity + + + 0, 0, 0, 0 + + + 662, 523 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + Vertical + + + 6 + + + 7 + + + 3, 3, 3, 3 + + + 97, 21 + + + 107, 12 + + + label5 + + + label4 + + + 15, 192 + + + btnOK + + + debug + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkmuxEnabled + + + label3 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + 15, 108 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 253, 134 + + + 342, 17 + + + 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 + + + 15 + + + 126, 16 + + + 267, 16 + + + 75, 23 + + + Do not use proxy server for addresses beginning with + + + groupBox1 + + + NoControl + + + readBufferSize + + + 9 + + + 0 + + + groupBox1 + + + 0 + + + 94, 21 + + + 3 + + + 3 + + + 30, 162 + + + 236, 28 + + + Bottom + + + 11 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + groupBox1 + + + 125, 12 + + + panel2 + + + 7 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + True + + + 654, 427 + + + tabPage7 + + + 236, 66 + + + NoControl + + + 4 + + + NoControl + + + label9 + + + 5 + + + True + + + 662, 60 + + + 53, 12 + + + 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 0707411b..a8f26810 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -134,7 +134,7 @@ 648, 437 - 336, 16 + 324, 16 传输层安全选tls时,默认跳过证书验证(allowInsecure) @@ -235,6 +235,9 @@ v2rayN设置 + + 解除Windows10 UWP应用回环代理限制 + 255, 156 diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index 09080977..e1a31157 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -46,6 +46,7 @@ // // grbMain // + resources.ApplyResources(this.grbMain, "grbMain"); this.grbMain.Controls.Add(this.txtUserAgent); this.grbMain.Controls.Add(this.label1); this.grbMain.Controls.Add(this.btnShare); @@ -55,7 +56,6 @@ this.grbMain.Controls.Add(this.txtRemarks); this.grbMain.Controls.Add(this.label2); this.grbMain.Controls.Add(this.label3); - resources.ApplyResources(this.grbMain, "grbMain"); this.grbMain.Name = "grbMain"; this.grbMain.TabStop = false; // diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index a9449a19..71c5a7f5 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -117,266 +117,305 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 127, 111 + + User Agent(optional) - - 473, 21 + + + NoControl - - - 3 - - - txtUserAgent - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + grbMain + + + 619, 162 + 0 - - True + + 60, 16 - - - NoControl + + txtUrl - - 12, 115 + + 8 - - 65, 12 - - - 27 - - - User Agent - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - grbMain - - - 1 - - - NoControl - - - 434, 21 - - - 75, 23 - - - 26 - - - Share - - - btnShare + + picQRCode System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - grbMain + + Remove - - 2 + + 525, 21 - + + + 24 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 111 + + + SubSettingControl + + + label1 + + + Subscription details + + + 26 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - + + grbMain + + + 434, 21 + + + 83, 12 + + + 232, 21 + + + Top + + + 6, 12 + + + label3 + + + 127, 21 + + NoControl - - 368, 23 + + Share - - 60, 16 + + grbMain - + + 3 + + + 12, 53 + + + 1 + + + Fill + + + 27 + + + 10 + + + 125, 12 + + 25 + + 127, 53 + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + Zoom + + + 1 + + + 47, 12 + + + Vertical + + + btnRemove + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Enable chkEnabled - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - grbMain - - - 3 + + 6 NoControl - - 525, 21 + + txtRemarks - + + NoControl + + + 0, 148 + + 75, 23 - - 24 - - - Remove - - - btnRemove - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - grbMain - 4 - - 127, 53 - - - True - - - Vertical - - - 473, 46 - - - 2 - - - txtUrl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + grbMain - - 5 + + 25 - - 127, 21 - - - 232, 21 - - - 1 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + grbMain - - 6 - - - True - - - NoControl - - - 12, 25 - - - 47, 12 - - - 10 - - - Remarks - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - grbMain - - - 7 - - - True - - - NoControl - - - 12, 53 - - - 83, 12 - - - 0 - - - Address (url) - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - grbMain - - - 8 - - - Top - - - 0, 0 - - - 619, 148 - 10 - - Subscription details + + 2 + + + grbMain + + + 473, 21 + + + 368, 23 + + + True + + + True + + + 0, 0 + + + True + + + grbMain + + + True + + + 0 + + + NoControl + + + label2 + + + $this + + + grbMain + + + 619, 148 + + + btnShare + + + 2 + + + 7 + + + NoControl + + + 12, 115 + + + 619, 310 + + + txtUserAgent + + + Remarks + + + 0 + + + NoControl + + + 473, 46 + + + 12, 25 + + + 75, 23 + + + grbMain + + + 1 + + + Address (url) + + + $this + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.UserControl, 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 grbMain @@ -384,55 +423,16 @@ System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill - - - NoControl - - - 0, 148 - - - 619, 162 - - - Zoom - - - 25 - - - picQRCode - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - 6, 12 - - - 619, 310 - - - SubSettingControl - - - 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/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx index 6979e601..71226592 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -117,10 +117,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 101, 12 + + + User Agent(可选) + 分享 - 48, 16 diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index a3834fa6..24d8e140 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -131,7 +131,7 @@ namespace v2rayN.Handler /// DownloadString /// /// - public void WebDownloadString(string url, string userAgent) + public void WebDownloadString(string url, WebProxy webProxy, string userAgent) { string source = string.Empty; try @@ -139,11 +139,17 @@ namespace v2rayN.Handler Utils.SetSecurityProtocol(); WebClientEx ws = new WebClientEx(); - if (!Utils.IsNullOrEmpty(userAgent)) + if (webProxy != null) { - ws.Headers.Add("user-agent", userAgent); + ws.Proxy = webProxy; } + if (Utils.IsNullOrEmpty(userAgent)) + { + userAgent = $"{Utils.GetVersion(false)}"; + } + ws.Headers.Add("user-agent", userAgent); + ws.DownloadStringCompleted += Ws_DownloadStringCompleted; ws.DownloadStringAsync(new Uri(url)); } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 09ebcbac..6f503b89 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -43,7 +43,7 @@ namespace v2rayN.Handler _updateFunc = update; var url = string.Empty; - DownloadHandle downloadHandle = null; + DownloadHandle downloadHandle = null; if (downloadHandle == null) { downloadHandle = new DownloadHandle(); @@ -162,7 +162,7 @@ namespace v2rayN.Handler } - public void UpdateSubscriptionProcess(Config config, Action update) + public void UpdateSubscriptionProcess(Config config, bool blProxy, Action update) { _config = config; _updateFunc = update; @@ -228,7 +228,9 @@ namespace v2rayN.Handler _updateFunc(false, args.GetException().Message); }; - downloadHandle3.WebDownloadString(url, userAgent); + WebProxy webProxy = blProxy ? new WebProxy(Global.Loopback, _config.GetLocalPort(Global.InboundHttp)) : null; + downloadHandle3.WebDownloadString(url, webProxy, userAgent); + _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 54c9638d..c735f7ab 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -764,14 +764,22 @@ namespace v2rayN /// 取得版本 /// /// - public static string GetVersion() + public static string GetVersion(bool blFull = true) { try { string location = GetExePath(); - return string.Format("v2rayN - V{0} - {1}", - FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), - File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); + if (blFull) + { + return string.Format("v2rayN - V{0} - {1}", + FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), + File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); + } + else + { + return string.Format("v2rayN/{0}", + FileVersionInfo.GetVersionInfo(location).FileVersion.ToString()); + } } catch (Exception ex) { From d27566686c38819b7c215fecfce38fe16b8db660 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Feb 2022 10:01:35 +0800 Subject: [PATCH 092/252] add network data check --- .../Forms/ServerTransportControl.Designer.cs | 39 ++++++------------- v2rayN/v2rayN/Forms/ServerTransportControl.cs | 8 ++-- .../v2rayN/Forms/ServerTransportControl.resx | 39 ------------------- v2rayN/v2rayN/Global.cs | 4 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 4 ++ v2rayN/v2rayN/Mode/Config.cs | 2 +- 6 files changed, 23 insertions(+), 73 deletions(-) diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs index 04f0f374..ba748ccd 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs @@ -31,6 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerTransportControl)); this.gbTransport = new System.Windows.Forms.GroupBox(); this.panTlsMore = new System.Windows.Forms.Panel(); + this.clbAlpn = new System.Windows.Forms.CheckedListBox(); this.label1 = new System.Windows.Forms.Label(); this.txtSNI = new System.Windows.Forms.TextBox(); this.labSNI = new System.Windows.Forms.Label(); @@ -50,7 +51,6 @@ this.labHeaderType = new System.Windows.Forms.Label(); this.labRequestHost = new System.Windows.Forms.Label(); this.cmbHeaderType = new System.Windows.Forms.ComboBox(); - this.clbAlpn = new System.Windows.Forms.CheckedListBox(); this.gbTransport.SuspendLayout(); this.panTlsMore.SuspendLayout(); this.SuspendLayout(); @@ -87,6 +87,17 @@ resources.ApplyResources(this.panTlsMore, "panTlsMore"); this.panTlsMore.Name = "panTlsMore"; // + // clbAlpn + // + this.clbAlpn.CheckOnClick = true; + resources.ApplyResources(this.clbAlpn, "clbAlpn"); + this.clbAlpn.FormattingEnabled = true; + this.clbAlpn.Items.AddRange(new object[] { + resources.GetString("clbAlpn.Items"), + resources.GetString("clbAlpn.Items1")}); + this.clbAlpn.MultiColumn = true; + this.clbAlpn.Name = "clbAlpn"; + // // label1 // resources.ApplyResources(this.label1, "label1"); @@ -132,13 +143,6 @@ // 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.GetString("cmbNetwork.Items5")}); resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); this.cmbNetwork.Name = "cmbNetwork"; this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); @@ -200,28 +204,9 @@ // 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"; // - // clbAlpn - // - this.clbAlpn.CheckOnClick = true; - resources.ApplyResources(this.clbAlpn, "clbAlpn"); - this.clbAlpn.FormattingEnabled = true; - this.clbAlpn.Items.AddRange(new object[] { - resources.GetString("clbAlpn.Items"), - resources.GetString("clbAlpn.Items1")}); - this.clbAlpn.MultiColumn = true; - this.clbAlpn.Name = "clbAlpn"; - // // ServerTransportControl // resources.ApplyResources(this, "$this"); diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs index 03b36a78..dc4da30b 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -22,6 +22,8 @@ namespace v2rayN.Forms { vmessItem = item; + cmbNetwork.Items.AddRange(Global.networks.ToArray()); + cmbStreamSecurity.Items.Clear(); cmbStreamSecurity.Items.Add(string.Empty); cmbStreamSecurity.Items.Add(Global.StreamSecurity); @@ -126,11 +128,7 @@ namespace v2rayN.Forms else if (network.Equals("kcp") || network.Equals("quic")) { cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); + cmbHeaderType.Items.AddRange(Global.kcpHeaderTypes.ToArray()); } else if (network.Equals("grpc")) { diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.resx index f7f94e4a..61cd439f 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.resx +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.resx @@ -366,24 +366,6 @@ 2 - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - grpc - 192, 28 @@ -690,27 +672,6 @@ 13 - - none - - - http - - - srtp - - - utp - - - wechat-video - - - dtls - - - wireguard - 127, 60 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 94a9d369..76c64d66 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -199,10 +199,12 @@ namespace v2rayN public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; + public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; + public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; public const string GrpcgunMode = "gun"; public const string GrpcmultiMode = "multi"; - + #endregion #region 全局变量 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 4af189b7..440aec2e 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -996,6 +996,10 @@ namespace v2rayN.Handler { vmessItem.allowInsecure = config.defAllowInsecure.ToString(); } + if (!Utils.IsNullOrEmpty(vmessItem.network) && !Global.networks.Contains(vmessItem.network)) + { + vmessItem.network = Global.DefaultNetwork; + } config.vmess.Add(vmessItem); if (config.vmess.Count == 1) diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 301ec1e7..754e59dc 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -246,7 +246,7 @@ namespace v2rayN.Mode } public string network() { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network)) + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network) || !Global.networks.Contains(vmess[index].network)) { return Global.DefaultNetwork; } From b9435a4b01afb6c09db876911004614b6435ecc4 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Feb 2022 17:31:32 +0800 Subject: [PATCH 093/252] Automatically adjust column width after updating subscription --- v2rayN/v2rayN/Forms/MainForm.cs | 7 + .../Forms/OptionSettingForm.Designer.cs | 9 + v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 827 +++++++++--------- .../Forms/OptionSettingForm.zh-Hans.resx | 66 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 5 +- v2rayN/v2rayN/Mode/Config.cs | 5 +- 7 files changed, 492 insertions(+), 429 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 2b3b7b31..575f05f5 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1385,6 +1385,13 @@ namespace v2rayN.Forms if (success) { RefreshServers(); + if (config.uiItem.enableAutoAdjustMainLvColWidth) + { + foreach (ColumnHeader it in lvServers.Columns) + { + it.Width = -2; + } + } } }; diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 756d19fa..e5c94c06 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -69,6 +69,7 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.chkEnableAutoAdjustMainLvColWidth = new System.Windows.Forms.CheckBox(); this.btnSetLoopback = new System.Windows.Forms.Button(); this.txtautoUpdateInterval = new System.Windows.Forms.TextBox(); this.label15 = new System.Windows.Forms.Label(); @@ -375,6 +376,7 @@ // tabPage7 // resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth); this.tabPage7.Controls.Add(this.btnSetLoopback); this.tabPage7.Controls.Add(this.txtautoUpdateInterval); this.tabPage7.Controls.Add(this.label15); @@ -390,6 +392,12 @@ this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // chkEnableAutoAdjustMainLvColWidth + // + resources.ApplyResources(this.chkEnableAutoAdjustMainLvColWidth, "chkEnableAutoAdjustMainLvColWidth"); + this.chkEnableAutoAdjustMainLvColWidth.Name = "chkEnableAutoAdjustMainLvColWidth"; + this.chkEnableAutoAdjustMainLvColWidth.UseVisualStyleBackColor = true; + // // btnSetLoopback // resources.ApplyResources(this.btnSetLoopback, "btnSetLoopback"); @@ -605,5 +613,6 @@ private System.Windows.Forms.TextBox txtautoUpdateInterval; private System.Windows.Forms.Label label15; private System.Windows.Forms.Button btnSetLoopback; + private System.Windows.Forms.CheckBox chkEnableAutoAdjustMainLvColWidth; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 2bb2bded..97a3aa56 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -125,6 +125,7 @@ namespace v2rayN.Forms chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; cmbCoreType.SelectedIndex = (int)config.coreType; txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); + chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; } private void btnOK_Click(object sender, EventArgs e) { @@ -308,6 +309,7 @@ namespace v2rayN.Forms config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; config.coreType = (ECoreType)cmbCoreType.SelectedIndex; config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); + config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked; return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 8b025db3..f8510aaf 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -127,16 +127,16 @@ 11 - - - 107, 12 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Keep older when deduplication - - 5 + + 2 + 6, 283 @@ -146,11 +146,11 @@ tabPage7 - - 12 + + 4 - - 4, 22 + + 0 txtKcpwriteBufferSize @@ -159,10 +159,10 @@ groupBox1 - 8 + 9 - - False + + tti 14 @@ -173,12 +173,12 @@ tabControl1 + + label10 + groupBox1 - - 5 - 9 @@ -191,14 +191,14 @@ txtautoUpdateInterval - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 662, 523 35 - - 111, 24 + + 1 468, 60 @@ -216,8 +216,11 @@ 14 - - tabPage3 + + 40 + + + 12 5 @@ -243,39 +246,42 @@ 40 - - cmbloglevel - True 120, 16 + + label13 + True - - tti + + 234, 16 - - tabPage6 + + 4, 22 - - tabPage6 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + 1 7 - - tabPage7 + + 33 12 + + 662, 60 + label7 @@ -291,9 +297,6 @@ 648, 421 - - NoControl - 206, 64 @@ -303,6 +306,9 @@ tabPage6 + + 654, 427 + 39 @@ -327,8 +333,8 @@ &Cancel - - label10 + + 111, 62 654, 427 @@ -336,29 +342,29 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 654, 427 - - - NoControl + + groupBox1 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Settings + + 662, 10 + + + True + + + 15, 189 15, 132 - - txtKcpreadBufferSize - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + label4 42 @@ -372,8 +378,8 @@ 12 - - $this + + True label11 @@ -384,12 +390,12 @@ True - - tabPage6 - 0, 10 + + 58, 20 + Support DnsObject @@ -399,33 +405,39 @@ False - - tabControl1 + + groupBox1 - - $this + + NoControl 3 + + 11 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 NoControl - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 0 - - tabPage6 + + 19 Fill + + 576, 16 + 18 @@ -435,12 +447,18 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 40 + congestion NoControl + + panel2 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -450,8 +468,8 @@ 89, 12 - - NoControl + + info 0 @@ -462,8 +480,11 @@ v2rayN settings - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 16 + + + groupBox1 10 @@ -471,9 +492,6 @@ 32 - - label6 - 6, 12 @@ -489,8 +507,8 @@ 8 - - txtKcpdownlinkCapacity + + True 198, 16 @@ -498,17 +516,20 @@ Automatically start at system startup - - label14 + + 654, 427 1 + + 4, 4, 4, 4 + txtKcptti - - 2 + + Vertical Turn on Sniffing @@ -525,17 +546,14 @@ 3, 3, 3, 3 - - 97, 20 - 3 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 662, 453 + + True 33, 29 @@ -543,12 +561,15 @@ 325, 130 - - 468, 27 + + 124, 60 78, 21 + + Log level + tabControl1 @@ -567,8 +588,8 @@ tabPage2 - - panel2 + + 4 Statistics freshrate @@ -579,6 +600,9 @@ 89, 12 + + btnOK + 18, 66 @@ -591,14 +615,17 @@ True - - 4, 4, 4, 4 + + tabPage6 + + + tabPage6 tabPage6 - - 37 + + 5 Turn on Sniffing @@ -606,9 +633,6 @@ groupBox1 - - 345, 100 - 18, 28 @@ -621,8 +645,8 @@ 20 - - 10 + + 29 System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -639,6 +663,9 @@ label12 + + 4, 22 + Core Type @@ -664,7 +691,7 @@ groupBox1 - 3 + 4 18, 104 @@ -672,27 +699,24 @@ tabPage2 + + mtu + 282, 23 socks - - 36 + + tabPage1 - - 576, 16 + + System.Windows.Forms.GroupBox, 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 - - groupBox1 - - - True - panel1 @@ -702,20 +726,17 @@ 53, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 13 label8 - - 0 + + 468, 27 - - label13 + + 236, 28 chkAutoRun @@ -726,14 +747,20 @@ 345, 62 - - 15, 16 + + 11 + + + 15, 129 chkudpEnabled - 4 + 5 + + + Allow connections from the LAN True @@ -741,8 +768,8 @@ 8, 17 - - tabPage1 + + label9 tabPage7 @@ -765,17 +792,20 @@ 15 - - True + + 6 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + False + + + tabPage6 txtlocalPort - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl1 tabPage7 @@ -783,11 +813,11 @@ tabPage7 - - 19 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 4, 22 + + 125, 12 tabPage6 @@ -804,26 +834,17 @@ protocol - - 84, 16 - - - Turn on Mux Multiplexing - True 23, 12 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 638, 356 - - True + + socks 3, 3 @@ -831,16 +852,13 @@ 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 - chkAllowLANConn - - True + + 84, 16 - + tabControl1 @@ -849,44 +867,50 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 40 + + True 1 - - tabPage6 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 369, 62 + + 161, 84 + 9 System proxy settings - + + groupBox1 + + + 10 + + NoControl - - 654, 427 - - - chkEnableStatistics - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True 4 - - 2 + + 355, 16 - - 4 + + 53, 12 193, 162 @@ -894,8 +918,11 @@ btnSetLoopback - - 124, 60 + + 369, 27 + + + 1 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -915,12 +942,12 @@ System.Windows.Forms.ComboBox, 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 - 9 + + 8 + 0 @@ -928,7 +955,10 @@ 101, 12 - 9 + 10 + + + tabPage7 12 @@ -945,6 +975,21 @@ Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + NoControl + + + 107, 12 + + + 204, 16 + + + 662, 453 + + + $this + 4 @@ -954,17 +999,23 @@ Fill + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 41 + + tabPage3 + 257, 60 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - tabControl1 + + 94, 21 True @@ -981,14 +1032,14 @@ chkKeepOlderDedupl - - 15, 129 + + True 16 - - 10 + + True True @@ -1011,6 +1062,9 @@ tabPage2 + + tabControl1 + 30, 376 @@ -1032,8 +1086,11 @@ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False + + Automatically adjust column width after updating subscription + + + 15, 160 Vertical @@ -1041,8 +1098,8 @@ 38 - - 33 + + Automatic update interval of Geo(hours) 4, 22 @@ -1059,11 +1116,11 @@ Core: KCP settings - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 - - 29 + + tabPage6 error @@ -1071,38 +1128,32 @@ True - - groupBox1 - 59, 12 - - NoControl - - - groupBox1 + + 38 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 654, 427 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 + + downlinkCapacity 120, 16 - - 662, 10 + + 75, 23 txtlocalPort2 - - True + + 2 246, 16 @@ -1110,8 +1161,8 @@ True - - tabPage2 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 654, 427 @@ -1119,38 +1170,29 @@ 42 - - 10 + + 15, 108 False - - Custom DNS (multiple, separated by commas (,)) - 206, 29 - - 15, 160 - - - downlinkCapacity + + 2 chkudpEnabled2 - - info - chkIgnoreGeoUpdateCore - - Allow connections from the LAN + + chkEnableAutoAdjustMainLvColWidth - - 161, 84 + + tabPage1 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1158,6 +1200,9 @@ tabPage6 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 2 @@ -1173,9 +1218,6 @@ 8 - - 35 - linkDnsObjectDoc @@ -1185,53 +1227,50 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage7 - - - 6 + + txtKcpreadBufferSize none - - Log level + + groupBox1 - - tabControl1 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 638, 219 + + Fill - - 6 + + protocol - - OptionSettingForm + + 4, 22 - - 2 + + 15 - - 239, 12 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 15, 64 - - 111, 62 - - 11 + 12 groupBox2 - - 58, 20 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + 5 + + + $this 13 @@ -1242,6 +1281,12 @@ 0 + + 3 + + + chkEnableStatistics + 8, 52 @@ -1269,17 +1314,14 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 16 + + 638, 219 23, 12 - - 11 - - - 4 + + 654, 427 8 @@ -1287,35 +1329,38 @@ Exception + + 37 + + + tabControl1 + + + 345, 100 + NoControl - - Use semicolon (;) - - - groupBox1 - - - 94, 21 - - - 1 - True 10 + + NoControl + 17 + + 23 + 94, 21 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6 0 @@ -1323,14 +1368,20 @@ 0, 463 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 - - tabPage1 + + groupBox1 - - 97, 20 + + 3 + + + Do not use proxy server for addresses beginning with + + + 8 http @@ -1338,8 +1389,11 @@ 0 - - mtu + + Use semicolon (;) + + + 97, 20 tabPage6 @@ -1362,8 +1416,8 @@ &OK - - 10 + + 94, 21 1 @@ -1374,8 +1428,8 @@ txtKcpuplinkCapacity - - 23 + + tabPage2 chklogEnabled @@ -1392,44 +1446,41 @@ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 325, 156 - groupBox2 4, 22 + + $this + 40 - - Automatic update interval of Geo(hours) + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + True + + groupBox1 - - 4, 22 - - - socks - NoControl 6 - - protocol + + 236, 66 tabPage7 - - $this + + 15, 16 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1437,8 +1488,11 @@ True + + 36 + - 6 + 7 8 @@ -1458,110 +1512,104 @@ 3 - - 1 + + writeBufferSize 11 - - True + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 89, 12 - - 16 - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 31 - - 369, 27 - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill - - + groupBox1 + + Core: DNS settings + groupBox1 32 - - 38 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Core: DNS settings + + NoControl 345, 24 + + tabPage7 + cbFreshrate + + OptionSettingForm + 236, 104 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 204, 16 + + NoControl System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 234, 16 - 94, 21 - - 75, 23 - - - writeBufferSize - - - System.Windows.Forms.CheckBox, 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 8, 41 - - uplinkCapacity - 0, 0, 0, 0 - - 662, 523 + + uplinkCapacity - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtKcpdownlinkCapacity - - NoControl + + Bottom - - Vertical + + 35 6 - - 7 + + 0 + + + Settings + + + 6 3, 3, 3, 3 @@ -1575,14 +1623,14 @@ label5 - - label4 - 15, 192 - - btnOK + + tabPage6 + + + False debug @@ -1602,26 +1650,20 @@ False - - 15, 108 - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 253, 134 - - 342, 17 - 0, 0 Enable UDP - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 390, 16 3, 3, 3, 3 @@ -1629,20 +1671,20 @@ groupBox1 - - 15 - 126, 16 267, 16 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 75, 23 - - Do not use proxy server for addresses beginning with + + 239, 12 groupBox1 @@ -1656,20 +1698,17 @@ 9 - - 0 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 0 + + 342, 17 - - 94, 21 - - - 3 + + 97, 20 3 @@ -1677,11 +1716,11 @@ 30, 162 - - 236, 28 + + Custom DNS (multiple, separated by commas (,)) - - Bottom + + 654, 427 11 @@ -1692,11 +1731,8 @@ 0 - - groupBox1 - - - 125, 12 + + NoControl panel2 @@ -1710,17 +1746,17 @@ 2 - - True + + Turn on Mux Multiplexing - - 654, 427 + + cmbloglevel - - tabPage7 + + label6 - - 236, 66 + + 111, 24 NoControl @@ -1731,22 +1767,19 @@ NoControl - - label9 - - - 5 - True - - 662, 60 + + 325, 156 - - 53, 12 + + label14 True + + zh-Hans + \ 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 a8f26810..d4dc2f22 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,18 +121,6 @@ 取消(&C) - - 662, 469 - - - 654, 443 - - - Core:基础设置 - - - 648, 437 - 324, 16 @@ -205,11 +193,14 @@ 本地监听端口 - + + 648, 437 + + 654, 443 - - Core:DNS设置 + + Core:基础设置 161, 12 @@ -223,17 +214,23 @@ 自定义DNS(可多个,用逗号(,)隔开) + + 654, 443 + + + Core:DNS设置 + 654, 443 Core:KCP设置 - - 654, 443 + + 204, 16 - - v2rayN设置 + + 自动调整服务器列宽在更新订阅后 解除Windows10 UWP应用回环代理限制 @@ -289,17 +286,11 @@ 开机自动启动(可能会不成功) - + 654, 443 - - 系统代理设置 - - - 654, 443 - - - 例外 + + v2rayN设置 95, 12 @@ -313,12 +304,27 @@ 对于下列字符开头的地址不使用代理服务器: - - 0, 479 + + 654, 443 + + + 例外 + + + 654, 443 + + + 系统代理设置 + + + 662, 469 确定(&O) + + 0, 479 + 662, 539 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 440aec2e..0fd71c75 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -121,7 +121,10 @@ namespace v2rayN.Handler } if (config.uiItem == null) { - config.uiItem = new UIItem(); + config.uiItem = new UIItem() + { + enableAutoAdjustMainLvColWidth = true + }; } if (config.uiItem.mainLvColWidth == null) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 754e59dc..505a6101 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -770,7 +770,10 @@ namespace v2rayN.Mode [Serializable] public class UIItem { - + public bool enableAutoAdjustMainLvColWidth + { + get; set; + } public System.Drawing.Size mainSize { From b2d538d02a7e603763556ea572e812cb91099bba Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Feb 2022 18:59:11 +0800 Subject: [PATCH 094/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 0af08449..03a84235 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.32")] +[assembly: AssemblyFileVersion("4.33")] From 03ad07733f313a3d6cf15f0f0503af0cc9932a64 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 24 Feb 2022 20:45:24 +0800 Subject: [PATCH 095/252] Refactor some code --- v2rayN/v2rayN/Forms/MainForm.cs | 21 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 10 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 1 + v2rayN/v2rayN/Handler/LazyConfig.cs | 24 +++ .../ProxySetting.cs | 2 +- .../SysProxyHandle.cs | 52 ++++- .../HttpProxyHandler/HttpProxyHandle.cs | 199 ------------------ .../v2rayN/HttpProxyHandler/PrivoxyHandler.cs | 194 ----------------- v2rayN/v2rayN/Mode/Config.cs | 1 - .../v2rayN/Properties/Resources.Designer.cs | 14 +- v2rayN/v2rayN/Properties/Resources.resx | 3 - v2rayN/v2rayN/Resources/privoxy.exe.gz | Bin 191684 -> 0 bytes v2rayN/v2rayN/v2rayN.csproj | 8 +- 13 files changed, 95 insertions(+), 434 deletions(-) create mode 100644 v2rayN/v2rayN/Handler/LazyConfig.cs rename v2rayN/v2rayN/{HttpProxyHandler => Handler}/ProxySetting.cs (99%) rename v2rayN/v2rayN/{HttpProxyHandler => Handler}/SysProxyHandle.cs (81%) delete mode 100644 v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs delete mode 100644 v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs delete mode 100644 v2rayN/v2rayN/Resources/privoxy.exe.gz diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 575f05f5..a2fec808 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1,17 +1,14 @@ 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; +using System.Text; using System.Text.RegularExpressions; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Tool; namespace v2rayN.Forms { @@ -125,11 +122,11 @@ namespace v2rayN.Forms //HttpProxyHandle.CloseHttpAgent(config); if (blWindowsShutDown) { - HttpProxyHandle.ResetIEProxy4WindowsShutDown(); + SysProxyHandle.ResetIEProxy4WindowsShutDown(); } else { - HttpProxyHandle.UpdateSysProxy(config, true); + SysProxyHandle.UpdateSysProxy(config, true); } ConfigHandler.SaveConfig(ref config); @@ -1214,7 +1211,7 @@ namespace v2rayN.Forms private void ChangePACButtonStatus(ESysProxyType type) { - HttpProxyHandle.UpdateSysProxy(config, false); + SysProxyHandle.UpdateSysProxy(config, false); for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) { diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 97a3aa56..7a8c0525 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -1,11 +1,9 @@ using System; -using System.Collections.Generic; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Base; -using v2rayN.HttpProxyHandler; -using v2rayN.Mode; using System.Diagnostics; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; namespace v2rayN.Forms { diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 0fd71c75..ef587c0a 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -183,6 +183,7 @@ namespace v2rayN.Handler } } + LazyConfig.Instance.SetConfig(ref config); return 0; } diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs new file mode 100644 index 00000000..976c8970 --- /dev/null +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -0,0 +1,24 @@ +using System; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + public sealed class LazyConfig + { + private static readonly Lazy _instance = new Lazy(() => new LazyConfig()); + private Config _config; + + public static LazyConfig Instance + { + get { return _instance.Value; } + } + public void SetConfig(ref Config config) + { + _config = config; + } + public Config GetConfig() + { + return _config; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs similarity index 99% rename from v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs rename to v2rayN/v2rayN/Handler/ProxySetting.cs index 2ee71072..4e900eee 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs +++ b/v2rayN/v2rayN/Handler/ProxySetting.cs @@ -2,7 +2,7 @@ using System; using System.Runtime.InteropServices; -namespace v2rayN.HttpProxyHandler +namespace v2rayN.Handler { class ProxySetting { diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs similarity index 81% rename from v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs rename to v2rayN/v2rayN/Handler/SysProxyHandle.cs index 2d6f96e0..0dc19e72 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -8,7 +8,7 @@ using v2rayN.Mode; using v2rayN.Properties; using v2rayN.Tool; -namespace v2rayN.HttpProxyHandler +namespace v2rayN.Handler { public static class SysProxyHandle { @@ -47,6 +47,56 @@ namespace v2rayN.HttpProxyHandler } } + + public static bool UpdateSysProxy(Config config, bool forceDisable) + { + var type = config.sysProxyType; + + if (forceDisable && type == ESysProxyType.ForcedChange) + { + type = ESysProxyType.ForcedClear; + } + + try + { + Global.httpPort = config.GetLocalPort(Global.InboundHttp); + int port = Global.httpPort; + if (port <= 0) + { + return false; + } + if (type == ESysProxyType.ForcedChange) + { + var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; + SetIEProxy(true, $"{Global.Loopback}:{port}", strExceptions); + } + else if (type == ESysProxyType.ForcedClear) + { + ResetIEProxy(); + } + else if (type == ESysProxyType.Unchanged) + { + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; + } + + public static void ResetIEProxy4WindowsShutDown() + { + try + { + //TODO To be verified + Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); + } + catch + { + } + } + public static void SetIEProxy(bool enable, bool global, string strProxy) { //Read(); diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs deleted file mode 100644 index d4f14af0..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using v2rayN.Mode; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 系统代理(http)模式 - /// - public enum ListenerType - { - noHttpProxy = 0, - GlobalHttp = 1, - HttpOpenAndClear = 2, - HttpOpenOnly = 3, - } - /// - /// 系统代理(http)总处理 - /// 启动privoxy提供http协议 - /// 设置IE系统代理 - /// - class HttpProxyHandle - { - private static bool Update(Config config, bool forceDisable) - { - // ListenerType type = config.listenerType; - var type = ListenerType.noHttpProxy; - if (forceDisable) - { - type = ListenerType.noHttpProxy; - } - - try - { - if (type != ListenerType.noHttpProxy) - { - int port = Global.httpPort; - if (port <= 0) - { - return false; - } - if (type == ListenerType.GlobalHttp) - { - //ProxySetting.SetProxy($"{Global.Loopback}:{port}", Global.IEProxyExceptions, 2); - SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); - } - else if (type == ListenerType.HttpOpenAndClear) - { - SysProxyHandle.ResetIEProxy(); - } - else if (type == ListenerType.HttpOpenOnly) - { - //SysProxyHandle.ResetIEProxy(); - } - } - else - { - SysProxyHandle.ResetIEProxy(); - } - } - 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; - } - } - } - catch - { - } - } - - /// - /// 关闭系统代理 - /// - /// - public static void CloseHttpAgent(Config config) - { - try - { - //if (config.listenerType != ListenerType.HttpOpenOnly) - //{ - // 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 bool UpdateSysProxy(Config config, bool forceDisable) - { - var type = config.sysProxyType; - - if (forceDisable && type == ESysProxyType.ForcedChange) - { - type = ESysProxyType.ForcedClear; - } - - try - { - Global.httpPort = config.GetLocalPort(Global.InboundHttp); - int port = Global.httpPort; - if (port <= 0) - { - return false; - } - if (type == ESysProxyType.ForcedChange) - { - var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; - SysProxyHandle.SetIEProxy(true, $"{Global.Loopback}:{port}", strExceptions); - } - else if (type == ESysProxyType.ForcedClear) - { - SysProxyHandle.ResetIEProxy(); - } - else if (type == ESysProxyType.Unchanged) - { - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - return true; - } - - public static void ResetIEProxy4WindowsShutDown() - { - try - { - //TODO To be verified - Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); - } - catch - { - } - } - } -} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs deleted file mode 100644 index a49e2d04..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using v2rayN.Mode; -using v2rayN.Properties; -using v2rayN.Tool; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// Privoxy处理类,提供http协议代理 - /// - class PrivoxyHandler - { - /// - /// 单例 - /// - private static PrivoxyHandler instance; - - private static int _uid; - private static string _uniqueConfigFile; - private Process _process; - private static string _privoxyName = "v2ray_privoxy"; - - static PrivoxyHandler() - { - try - { - _uid = Application.StartupPath.GetHashCode(); - _uniqueConfigFile = string.Format("privoxy_{0}.conf", _uid); - - FileManager.UncompressFile(Utils.GetTempPath($"{_privoxyName}.exe"), Resources.privoxy_exe); - } - catch (IOException ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - /// - /// 单例 - /// - public static PrivoxyHandler Instance - { - get - { - if (instance == null) - { - instance = new PrivoxyHandler(); - } - return instance; - } - } - - public int RunningPort - { - get; set; - } - - public void Restart(int localPort, Config config) - { - Stop(); - Start(localPort, config); - } - - - public void Start(int localPort, Config config) - { - try - { - if (_process == null) - { - - string privoxyConfig = "";//Resources.privoxy_conf; - RunningPort = config.GetLocalPort(Global.InboundHttp); - privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString()); - privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_PORT__", RunningPort.ToString()); - if (config.allowLANConn) - { - privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "0.0.0.0"); - } - else - { - privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", Global.Loopback); - } - FileManager.ByteArrayToFile(Utils.GetTempPath(_uniqueConfigFile), Encoding.UTF8.GetBytes(privoxyConfig)); - - _process = new Process - { - // Configure the process using the StartInfo properties. - StartInfo = - { - FileName = $"{_privoxyName}.exe", - Arguments = _uniqueConfigFile, - WorkingDirectory = Utils.GetTempPath(), - WindowStyle = ProcessWindowStyle.Hidden, - UseShellExecute = true, - CreateNoWindow = true - } - }; - _process.Start(); - - /* - * 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. - */ - - Global.processJob.AddProcess(_process.Handle); - } - } - catch (Exception ex) - { - RunningPort = 0; - Utils.SaveLog(ex.Message, ex); - } - } - - public void Stop() - { - if (_process != null) - { - KillProcess(_process); - _process.Dispose(); - _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) - { - try - { - p.CloseMainWindow(); - p.WaitForExit(100); - if (!p.HasExited) - { - p.Kill(); - p.WaitForExit(100); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - /* - * We won't like to kill other ss instances' v2ray_privoxy.exe. - * This function will check whether the given process is created - * by this process by checking the module path or command line. - * - * Since it's required to put ss in different dirs to run muti instances, - * different instance will create their unique "privoxy_UID.conf" where - * UID is hash of ss's location. - */ - - private static bool IsChildProcess(Process process) - { - try - { - /* - * Under PortableMode, we could identify it by the path of v2ray_privoxy.exe. - */ - string path = process.MainModule.FileName; - - return Utils.GetTempPath($"{_privoxyName}.exe").Equals(path); - - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - /* - * Sometimes Process.GetProcessesByName will return some processes that - * are already dead, and that will cause exceptions here. - * We could simply ignore those exceptions. - */ - //Logging.LogUsefulException(ex); - return false; - } - } - - } -} diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 505a6101..f2ca1c04 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using v2rayN.Base; -using v2rayN.HttpProxyHandler; namespace v2rayN.Mode diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index 672c250f..a1c0e06f 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -47,8 +47,8 @@ namespace v2rayN.Properties { } /// - /// 重写当前线程的 CurrentUICulture 属性 - /// 重写当前线程的 CurrentUICulture 属性。 + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -120,16 +120,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] privoxy_exe { - get { - object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 2ffcd3a9..c5d8319b 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -118,9 +118,6 @@ 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 diff --git a/v2rayN/v2rayN/Resources/privoxy.exe.gz b/v2rayN/v2rayN/Resources/privoxy.exe.gz deleted file mode 100644 index bf58503c7723efe21f90ec8fadd2da877a1252e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191684 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

G_V13C!@8IAZKj2n*K}|~+ z)<2aDCFNyP0RjKAyqkCN-()fe%#7}z3uRF|dPieb!{>b3pzN~>)k2G4w)+NxSq8yu z!jB`L5BFo#S%=0~Z{MGm`QFYtPyNP$vrzBj%v~W$(!j-i{ z3s=cfpblRl(>!pmNOAAUUD4BC{n?{R?6y!!{Dmf^b7rfYWB*Og?^Vw4{wg`&kIDJ? z?$hVouX4Vkay~>khYo|p&!Vi~?mT_g!z$}ND(etrjuG4UM;ZFQmfOJ7PvQ*8$|ZemI8DhtLl26GHWDR6avl z`Fx$v&LAoTgr-8Ja({2W+PoL~vs6R(y9hY(o2%-T|GjjK;dTNqoh(D^h~5G1@d{O{I8LIWyHSB@^VZV5!H>p;5uo�`Tu@awv%1os#2>LkF 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 ServerTransportControl.cs + @@ -198,13 +199,11 @@ - - - + Component - + @@ -466,7 +465,6 @@ - From 734df5def54c1c4de232b07b99d984bf7289d6aa Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 25 Feb 2022 19:05:54 +0800 Subject: [PATCH 096/252] Update subscription is to keep the same item --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 77 ++++++++++++++++-------- v2rayN/v2rayN/Handler/MainFormHandler.cs | 14 +---- v2rayN/v2rayN/Handler/UpdateHandle.cs | 4 +- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index ef587c0a..01df629f 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -176,7 +176,7 @@ namespace v2rayN.Handler VmessItem vmessItem = config.vmess[i]; UpgradeServerVersion(ref vmessItem); - if (string.IsNullOrEmpty(vmessItem.indexId)) + if (Utils.IsNullOrEmpty(vmessItem.indexId)) { vmessItem.indexId = Utils.GetGUID(false); } @@ -724,6 +724,14 @@ namespace v2rayN.Handler { return -1; } + + //copy sub items + List lstOriSub = null; + if (!Utils.IsNullOrEmpty(subid)) + { + lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); + RemoveServerViaSubid(ref config, subid); + } //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) //{ // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); @@ -735,7 +743,7 @@ namespace v2rayN.Handler foreach (string str in arrData) { //maybe sub - if (string.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) + if (Utils.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) { if (AddSubItem(ref config, str) == 0) { @@ -748,7 +756,18 @@ namespace v2rayN.Handler { continue; } - vmessItem.subid = subid; + + //exist sub items + if (!Utils.IsNullOrEmpty(subid)) + { + var existItem = lstOriSub?.FirstOrDefault(t => CompareVmessItem(t, vmessItem, true)); + if (existItem != null) + { + vmessItem = existItem; + } + vmessItem.subid = subid; + } + if (vmessItem.configType == (int)EConfigType.Vmess) { if (AddServer(ref config, vmessItem, -1, false) == 0) @@ -955,31 +974,15 @@ namespace v2rayN.Handler { var indexId = config.indexId(); - List source = config.vmess; + List source = config.vmess; bool keepOlder = config.keepOlderDedupl; - List list = new List(); + List list = new List(); if (!keepOlder) source.Reverse(); // Remove the early items first - bool _isAdded(Mode.VmessItem o, Mode.VmessItem n) + foreach (VmessItem item in source) { - 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))) + if (!list.Exists(i => CompareVmessItem(i, item, false))) { list.Add(item); } @@ -994,7 +997,10 @@ namespace v2rayN.Handler public static int AddServerCommon(ref Config config, VmessItem vmessItem) { - vmessItem.indexId = Utils.GetGUID(false); + if (Utils.IsNullOrEmpty(vmessItem.indexId)) + { + vmessItem.indexId = Utils.GetGUID(false); + } vmessItem.configVersion = 2; if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { @@ -1041,6 +1047,29 @@ namespace v2rayN.Handler return 0; } + private static bool CompareVmessItem(VmessItem o, VmessItem n, bool remarks) + { + if (o == null || n == null) + { + return false; + } + + 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 + && o.flow == n.flow + && (remarks ? o.remarks == n.remarks : true); + } + #endregion #region UI diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 7e57c7cc..499d1ec8 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -9,9 +9,9 @@ using v2rayN.Mode; namespace v2rayN.Handler { - class MainFormHandler + public sealed class MainFormHandler { - private static MainFormHandler instance; + private static readonly Lazy instance = new Lazy(() => new MainFormHandler()); Action _updateUI; //private DownloadHandle downloadHandle2; @@ -22,16 +22,8 @@ namespace v2rayN.Handler //Action _updateFunc; public static MainFormHandler Instance { - get - { - if (instance == null) - { - instance = new MainFormHandler(); - } - return instance; - } + get { return instance.Value; } } - public Icon GetNotifyIcon(Config config, Icon def) { try diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 6f503b89..509bfc0e 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -204,8 +204,8 @@ namespace v2rayN.Handler return; } - ConfigHandler.RemoveServerViaSubid(ref config, id); - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + //ConfigHandler.RemoveServerViaSubid(ref config, id); + //_updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); // RefreshServers(); int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); if (ret > 0) From fada5f99bbf6e25871aa461ce37199b747c47b45 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 26 Feb 2022 12:27:59 +0800 Subject: [PATCH 097/252] enable Security Protocol Tls13 option --- .../Forms/OptionSettingForm.Designer.cs | 9 + v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 515 +++++++++--------- .../Forms/OptionSettingForm.zh-Hans.resx | 3 + v2rayN/v2rayN/Global.cs | 5 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 8 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 2 +- v2rayN/v2rayN/Mode/Config.cs | 101 ++-- v2rayN/v2rayN/Tool/Utils.cs | 6 +- 9 files changed, 348 insertions(+), 303 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index e5c94c06..66c4f9ff 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -69,6 +69,7 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.chkEnableSecurityProtocolTls13 = new System.Windows.Forms.CheckBox(); this.chkEnableAutoAdjustMainLvColWidth = new System.Windows.Forms.CheckBox(); this.btnSetLoopback = new System.Windows.Forms.Button(); this.txtautoUpdateInterval = new System.Windows.Forms.TextBox(); @@ -376,6 +377,7 @@ // tabPage7 // resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13); this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth); this.tabPage7.Controls.Add(this.btnSetLoopback); this.tabPage7.Controls.Add(this.txtautoUpdateInterval); @@ -392,6 +394,12 @@ this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // chkEnableSecurityProtocolTls13 + // + resources.ApplyResources(this.chkEnableSecurityProtocolTls13, "chkEnableSecurityProtocolTls13"); + this.chkEnableSecurityProtocolTls13.Name = "chkEnableSecurityProtocolTls13"; + this.chkEnableSecurityProtocolTls13.UseVisualStyleBackColor = true; + // // chkEnableAutoAdjustMainLvColWidth // resources.ApplyResources(this.chkEnableAutoAdjustMainLvColWidth, "chkEnableAutoAdjustMainLvColWidth"); @@ -614,5 +622,6 @@ private System.Windows.Forms.Label label15; private System.Windows.Forms.Button btnSetLoopback; private System.Windows.Forms.CheckBox chkEnableAutoAdjustMainLvColWidth; + private System.Windows.Forms.CheckBox chkEnableSecurityProtocolTls13; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 7a8c0525..a21e6b31 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -124,6 +124,7 @@ namespace v2rayN.Forms cmbCoreType.SelectedIndex = (int)config.coreType; txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; + chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13; } private void btnOK_Click(object sender, EventArgs e) { @@ -308,6 +309,7 @@ namespace v2rayN.Forms config.coreType = (ECoreType)cmbCoreType.SelectedIndex; config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked; + config.enableSecurityProtocolTls13 = chkEnableSecurityProtocolTls13.Checked; return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index f8510aaf..bd348c62 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -134,7 +134,7 @@ Keep older when deduplication - 2 + 3 @@ -146,11 +146,11 @@ tabPage7 - - 4 + + 12 - - 0 + + 4, 22 txtKcpwriteBufferSize @@ -159,10 +159,10 @@ groupBox1 - 9 + 10 - - tti + + False 14 @@ -173,9 +173,6 @@ tabControl1 - - label10 - groupBox1 @@ -191,8 +188,8 @@ txtautoUpdateInterval - - 662, 523 + + 2 35 @@ -210,17 +207,17 @@ 102, 16 + + cmbprotocol + 6 - - 14 + + tabPage6 - - 40 - - - 12 + + tabPage3 5 @@ -255,24 +252,30 @@ label13 + + tabPage2 + True - - 234, 16 + + tti - - 4, 22 + + tabPage6 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + chkdefAllowInsecure - - 1 + + 75, 23 7 + + tabPage7 + 33 @@ -282,8 +285,11 @@ 662, 60 - - label7 + + chkEnableSecurityProtocolTls13 + + + NoControl http @@ -291,8 +297,8 @@ 7 - - chkdefAllowInsecure + + label5 648, 421 @@ -306,6 +312,9 @@ tabPage6 + + 14 + 654, 427 @@ -318,12 +327,21 @@ 15, 63 + + System.Windows.Forms.CheckBox, 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 + 2 Enable UDP + + 198, 16 + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -333,8 +351,8 @@ &Cancel - - 111, 62 + + label10 654, 427 @@ -366,8 +384,8 @@ label4 - - 42 + + 236, 66 txtKcpmtu @@ -378,8 +396,8 @@ 12 - - True + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 label11 @@ -405,17 +423,20 @@ False - - groupBox1 + + tabControl1 - - NoControl + + $this 3 + + 662, 523 + - 11 + 12 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -429,8 +450,8 @@ 0 - - 19 + + tabPage6 Fill @@ -444,8 +465,8 @@ True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 39 15, 40 @@ -462,14 +483,17 @@ 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 + + 15, 211 + + + 1 89, 12 - - info + + NoControl 0 @@ -507,23 +531,17 @@ 8 - - True + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 198, 16 + + Enable Security Protocol TLS v1.3 (subscription/update/speedtest) Automatically start at system startup - - 654, 427 - - - 1 - - - 4, 4, 4, 4 + + Fill txtKcptti @@ -540,11 +558,14 @@ Ignore Geo files when updating core - - 2 + + tabPage7 - - 3, 3, 3, 3 + + 355, 16 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 3 @@ -552,14 +573,14 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 662, 453 33, 29 - - 325, 130 + + 1 124, 60 @@ -576,9 +597,6 @@ 59, 12 - - cmbCoreType - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null @@ -591,9 +609,18 @@ 4 + + 11 + Statistics freshrate + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + 120, 16 @@ -609,17 +636,14 @@ 20, 143 - - 11 + + 15 True - - tabPage6 - - - tabPage6 + + 4, 4, 4, 4 tabPage6 @@ -691,7 +715,7 @@ groupBox1 - 4 + 5 18, 104 @@ -708,8 +732,8 @@ socks - - tabPage1 + + 36 System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -717,6 +741,9 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox2 + panel1 @@ -757,7 +784,7 @@ chkudpEnabled - 5 + 6 Allow connections from the LAN @@ -768,8 +795,8 @@ 8, 17 - - label9 + + tabPage1 tabPage7 @@ -792,32 +819,29 @@ 15 - - 6 + + True False - - tabPage6 + + label7 txtlocalPort - - tabControl1 - - - tabPage7 + + info tabPage7 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 19 - - 125, 12 + + readBufferSize tabPage6 @@ -846,6 +870,9 @@ socks + + 8 + 3, 3 @@ -858,7 +885,7 @@ 84, 16 - + tabControl1 @@ -894,20 +921,20 @@ groupBox1 - - 10 + + 253, 134 - + NoControl - - True + + chkEnableStatistics 4 - - 355, 16 + + 4 53, 12 @@ -936,8 +963,8 @@ Set Windows10 UWP Loopback - - False + + 654, 427 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -945,17 +972,11 @@ 9 - - 8 - - - 0 - 101, 12 - 10 + 11 tabPage7 @@ -966,8 +987,8 @@ 20 - - cmbprotocol + + allowInsecure groupBox2 @@ -981,11 +1002,8 @@ 107, 12 - - 204, 16 - - - 662, 453 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -1002,20 +1020,20 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + False + 41 - - tabPage3 - 257, 60 0 - - 94, 21 + + tabControl1 True @@ -1059,12 +1077,15 @@ 257, 25 - - tabPage2 + + 3, 3, 3, 3 tabControl1 + + True + 30, 376 @@ -1077,9 +1098,6 @@ chkAllowIn2 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tabPage3 @@ -1116,11 +1134,8 @@ Core: KCP settings - - 10 - - - tabPage6 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 error @@ -1140,20 +1155,20 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - downlinkCapacity + + 8 120, 16 - - 75, 23 + + 2 txtlocalPort2 - - 2 + + True 246, 16 @@ -1161,8 +1176,8 @@ True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 506, 16 654, 427 @@ -1170,8 +1185,8 @@ 42 - - 15, 108 + + 10 False @@ -1179,8 +1194,8 @@ 206, 29 - - 2 + + downlinkCapacity chkudpEnabled2 @@ -1191,6 +1206,9 @@ chkEnableAutoAdjustMainLvColWidth + + 40 + tabPage1 @@ -1206,14 +1224,14 @@ 2 - - groupBox2 + + NoControl panel2 - - 39 + + 3 8 @@ -1221,9 +1239,15 @@ linkDnsObjectDoc + + tabPage7 + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 125, 12 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1239,17 +1263,17 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill + + 638, 219 - - protocol + + 6 - - 4, 22 + + OptionSettingForm - - 15 + + 2 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1257,8 +1281,11 @@ 15, 64 + + 111, 62 + - 12 + 13 groupBox2 @@ -1269,9 +1296,6 @@ 5 - - $this - 13 @@ -1281,17 +1305,14 @@ 0 - - 3 - - - chkEnableStatistics + + 23 8, 52 - - True + + 8 78, 21 @@ -1305,8 +1326,8 @@ True - - allowInsecure + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True @@ -1314,17 +1335,14 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 638, 219 - 23, 12 - - 654, 427 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 + + panel2 Exception @@ -1332,29 +1350,29 @@ 37 - - tabControl1 - 345, 100 + + 94, 21 + NoControl - - True + + 654, 427 10 - - NoControl + + 204, 16 17 - - 23 + + 41 94, 21 @@ -1368,9 +1386,6 @@ 0, 463 - - tabPage7 - groupBox1 @@ -1380,9 +1395,6 @@ Do not use proxy server for addresses beginning with - - 8 - http @@ -1416,8 +1428,8 @@ &OK - - 94, 21 + + 10 1 @@ -1443,9 +1455,6 @@ txtsystemProxyExceptions - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 @@ -1461,8 +1470,8 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + 4, 22 groupBox1 @@ -1473,8 +1482,8 @@ 6 - - 236, 66 + + protocol tabPage7 @@ -1488,11 +1497,11 @@ True - - 36 + + True - - 7 + + 0 8 @@ -1509,9 +1518,6 @@ True - - 3 - writeBufferSize @@ -1548,8 +1554,8 @@ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl + + True 345, 24 @@ -1560,14 +1566,14 @@ cbFreshrate - - OptionSettingForm - 236, 104 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 42 + + + 4 NoControl @@ -1575,6 +1581,9 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 234, 16 + 94, 21 @@ -1584,9 +1593,15 @@ 8, 41 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 0, 0, 0, 0 + + 2 + uplinkCapacity @@ -1602,14 +1617,14 @@ 6 - - 0 + + 9 Settings - 6 + 7 3, 3, 3, 3 @@ -1620,8 +1635,11 @@ 107, 12 - - label5 + + 0 + + + 390, 16 15, 192 @@ -1629,32 +1647,32 @@ tabPage6 - - False - debug System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 + chkmuxEnabled label3 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage6 False - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 108 - - 253, 134 + + 325, 130 0, 0 @@ -1662,8 +1680,8 @@ Enable UDP - - 390, 16 + + cmbCoreType 3, 3, 3, 3 @@ -1677,9 +1695,6 @@ 267, 16 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 75, 23 @@ -1692,8 +1707,8 @@ NoControl - - readBufferSize + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 9 @@ -1707,6 +1722,9 @@ 342, 17 + + 94, 21 + 97, 20 @@ -1731,11 +1749,14 @@ 0 + + groupBox1 + NoControl - - panel2 + + True 7 @@ -1767,6 +1788,9 @@ NoControl + + label9 + True @@ -1779,7 +1803,4 @@ True - - zh-Hans - \ 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 d4dc2f22..133efd06 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -226,6 +226,9 @@ Core:KCP设置 + + 启用安全协议TLS v1.3 (订阅/检查更新/测速) + 204, 16 diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 76c64d66..879d20ea 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -175,10 +175,7 @@ namespace v2rayN /// Language /// public const string MyRegKeyLanguage = "CurrentLanguage"; - ///

- /// - /// - public const string MyRegKeySecurityProtocolTls13 = "SecurityProtocolTls13"; + /// /// Icon /// diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 24d8e140..ca0cd7d0 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -37,7 +37,7 @@ namespace v2rayN.Handler WebClientEx ws = new WebClientEx(); try { - Utils.SetSecurityProtocol(); + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); progressPercentage = -1; @@ -136,7 +136,7 @@ namespace v2rayN.Handler string source = string.Empty; try { - Utils.SetSecurityProtocol(); + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); WebClientEx ws = new WebClientEx(); if (webProxy != null) @@ -187,7 +187,7 @@ namespace v2rayN.Handler string source = string.Empty; try { - Utils.SetSecurityProtocol(); + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); WebClientEx ws = new WebClientEx(); @@ -205,7 +205,7 @@ namespace v2rayN.Handler WebClientEx ws = new WebClientEx(); try { - Utils.SetSecurityProtocol(); + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); progressPercentage = -1; diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 509bfc0e..ee3e8188 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -293,7 +293,7 @@ namespace v2rayN.Handler { try { - Utils.SetSecurityProtocol(); + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); WebRequestHandler webRequestHandler = new WebRequestHandler { AllowAutoRedirect = false diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index f2ca1c04..6293fcc7 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -11,13 +11,7 @@ namespace v2rayN.Mode [Serializable] public class Config { - /// - /// 本地监听 - /// - public List inbound - { - get; set; - } + #region property /// /// 允许日志 @@ -43,14 +37,6 @@ namespace v2rayN.Mode get; set; } - /// - /// vmess服务器信息 - /// - public List vmess - { - get; set; - } - /// /// 允许Mux多路复用 /// @@ -59,14 +45,6 @@ namespace v2rayN.Mode get; set; } - /// - /// KcpItem - /// - public KcpItem kcpItem - { - get; set; - } - /// /// /// @@ -107,7 +85,6 @@ namespace v2rayN.Mode get; set; } - /// /// 自定义远程DNS /// @@ -124,20 +101,6 @@ namespace v2rayN.Mode get; set; } - /// - /// 订阅 - /// - public List subItem - { - get; set; - } - /// - /// UI - /// - public UIItem uiItem - { - get; set; - } /// /// 域名解析策略 /// @@ -153,10 +116,6 @@ namespace v2rayN.Mode { get; set; } - public List routings - { - get; set; - } public bool enableRoutingAdvanced { get; set; @@ -184,11 +143,66 @@ namespace v2rayN.Mode get; set; } = 0; + public bool enableSecurityProtocolTls13 + { + get; set; + } + + #endregion + + #region other entities + + /// + /// 本地监听 + /// + public List inbound + { + get; set; + } + + /// + /// vmess服务器信息 + /// + public List vmess + { + get; set; + } + + /// + /// KcpItem + /// + public KcpItem kcpItem + { + get; set; + } + + /// + /// 订阅 + /// + public List subItem + { + get; set; + } + /// + /// UI + /// + public UIItem uiItem + { + get; set; + } + public List routings + { + get; set; + } + public ConstItem constItem { get; set; } - #region 函数 + + #endregion + + #region function public string address() { @@ -390,6 +404,7 @@ namespace v2rayN.Mode } return vmess.FindIndex(it => it.indexId == indexId); } + #endregion } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index c735f7ab..dc28ce38 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -715,11 +715,9 @@ namespace v2rayN return lstIPAddress; } - public static void SetSecurityProtocol() + public static void SetSecurityProtocol(bool enableSecurityProtocolTls13) { - string securityProtocolTls13 = RegReadValue(Global.MyRegPath, Global.MyRegKeySecurityProtocolTls13, "0"); - - if (securityProtocolTls13.Equals("1")) + if (enableSecurityProtocolTls13) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls From 31b7857238a0f82bcb7d39938c5ef7491e695c64 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:49:57 +0800 Subject: [PATCH 098/252] bug fix --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 01df629f..ea720624 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -298,7 +298,8 @@ namespace v2rayN.Handler sni = config.vmess[index].sni }; - config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 + //config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 + AddServerCommon(ref config, vmessItem); ToJsonFile(config); @@ -725,6 +726,7 @@ namespace v2rayN.Handler return -1; } + var indexId = config.indexId(); //copy sub items List lstOriSub = null; if (!Utils.IsNullOrEmpty(subid)) @@ -804,6 +806,9 @@ namespace v2rayN.Handler } } } + + SetIndex(ref config, indexId); + ToJsonFile(config); return countServers; } From ba8f24d398411fadb40a036ada5c9fbba92e50ef Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:50:17 +0800 Subject: [PATCH 099/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 03a84235..0120bdef 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.33")] +[assembly: AssemblyFileVersion("4.34")] From 32a07bceb23309e2d6a506f7dc1241056f0f1e4d Mon Sep 17 00:00:00 2001 From: PragmaTwice Date: Thu, 3 Mar 2022 17:13:34 +0800 Subject: [PATCH 100/252] add xchacha20-poly1305 to shadowsocks ciphers for xray --- v2rayN/v2rayN/Forms/AddServer3Form.cs | 2 +- v2rayN/v2rayN/Global.cs | 1 + v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 2 +- v2rayN/v2rayN/Mode/Config.cs | 10 ++++++++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index bd076170..e4920b37 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -15,7 +15,7 @@ namespace v2rayN.Forms private void AddServer3Form_Load(object sender, EventArgs e) { - cmbSecurity.Items.AddRange(Global.ssSecuritys.ToArray()); + cmbSecurity.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); if (EditIndex >= 0) { vmessItem = config.vmess[EditIndex]; diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 879d20ea..979d8b82 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -195,6 +195,7 @@ namespace v2rayN public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; + public static readonly List ssSecuritysInXray = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain" }; public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index ea720624..45284b21 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -540,7 +540,7 @@ namespace v2rayN.Handler vmessItem.id = vmessItem.id.TrimEx(); vmessItem.security = vmessItem.security.TrimEx(); - if (!Global.ssSecuritys.Contains(vmessItem.security)) + if (!config.GetShadowsocksSecuritys().Contains(vmessItem.security)) { return -1; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 452aed06..7af5ea3f 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -401,7 +401,7 @@ namespace v2rayN.Handler serversItem.address = config.address(); serversItem.port = config.port(); serversItem.password = config.id(); - if (Global.ssSecuritys.Contains(config.security())) + if (config.GetShadowsocksSecuritys().Contains(config.security())) { serversItem.method = config.security(); } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 6293fcc7..41e6c0ac 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -404,6 +404,16 @@ namespace v2rayN.Mode } return vmess.FindIndex(it => it.indexId == indexId); } + + public List GetShadowsocksSecuritys() + { + if (coreType == ECoreType.v2fly_core) + { + return Global.ssSecuritys; + } + + return Global.ssSecuritysInXray; + } #endregion From c0b7a8c33eeecb84c7450ac2726f847557236089 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 5 Mar 2022 07:29:58 +0800 Subject: [PATCH 101/252] clear --- v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs | 94 --- v2rayN/v2rayN/Forms/QRCodeForm.cs | 51 -- v2rayN/v2rayN/Forms/QRCodeForm.resx | 120 --- .../RoutingRuleQuicklyAddForm.Designer.cs | 170 ---- .../v2rayN/Forms/RoutingRuleQuicklyAddForm.cs | 73 -- .../Forms/RoutingRuleQuicklyAddForm.resx | 462 ----------- .../RoutingRuleQuicklyAddForm.zh-Hans.resx | 132 ---- .../RoutingSettingDetailsForm.Designer.cs | 234 ------ .../v2rayN/Forms/RoutingSettingDetailsForm.cs | 131 ---- .../Forms/RoutingSettingDetailsForm.resx | 723 ------------------ .../RoutingSettingDetailsForm.zh-Hans.resx | 145 ---- .../Forms/RoutingSubSettingForm.Designer.cs | 106 --- v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs | 61 -- .../v2rayN/Forms/RoutingSubSettingForm.resx | 300 -------- .../Forms/RoutingSubSettingForm.zh-Hans.resx | 133 ---- 15 files changed, 2935 deletions(-) delete mode 100644 v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/QRCodeForm.cs delete mode 100644 v2rayN/v2rayN/Forms/QRCodeForm.resx delete mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.resx delete mode 100644 v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx delete mode 100644 v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs delete mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx delete mode 100644 v2rayN/v2rayN/Forms/RoutingSubSettingForm.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs deleted file mode 100644 index 733adb47..00000000 --- a/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace v2rayN.Forms -{ - partial class QRCodeForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.picQRCode = new System.Windows.Forms.PictureBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtUrl = new System.Windows.Forms.TextBox(); - ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // picQRCode - // - this.picQRCode.Dock = System.Windows.Forms.DockStyle.Fill; - this.picQRCode.Location = new System.Drawing.Point(0, 0); - this.picQRCode.Name = "picQRCode"; - this.picQRCode.Size = new System.Drawing.Size(482, 483); - this.picQRCode.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.picQRCode.TabIndex = 23; - this.picQRCode.TabStop = false; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.txtUrl); - this.groupBox1.Dock = System.Windows.Forms.DockStyle.Bottom; - this.groupBox1.Location = new System.Drawing.Point(0, 483); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(482, 90); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "URL"; - // - // txtUrl - // - this.txtUrl.Dock = System.Windows.Forms.DockStyle.Fill; - this.txtUrl.Location = new System.Drawing.Point(3, 17); - this.txtUrl.Multiline = true; - this.txtUrl.Name = "txtUrl"; - this.txtUrl.ReadOnly = true; - this.txtUrl.Size = new System.Drawing.Size(476, 70); - this.txtUrl.TabIndex = 0; - // - // QRCodeForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(482, 573); - this.Controls.Add(this.picQRCode); - this.Controls.Add(this.groupBox1); - this.Name = "QRCodeForm"; - this.Text = "服务器配置二维码和URL"; - this.Load += new System.EventHandler(this.QRCodeForm_Load); - this.Shown += new System.EventHandler(this.QRCodeForm_Shown); - ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TextBox txtUrl; - private System.Windows.Forms.PictureBox picQRCode; - - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.cs b/v2rayN/v2rayN/Forms/QRCodeForm.cs deleted file mode 100644 index d170b173..00000000 --- a/v2rayN/v2rayN/Forms/QRCodeForm.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class QRCodeForm : BaseForm - { - public int Index { get; set; } - - public QRCodeForm() - { - InitializeComponent(); - } - - private void QRCodeForm_Load(object sender, EventArgs e) - { - txtUrl.MouseUp += txtUrl_MouseUp; - } - - void txtUrl_MouseUp(object sender, MouseEventArgs e) - { - txtUrl.SelectAll(); - } - - private void QRCodeForm_Shown(object sender, EventArgs e) - { - if (Index >= 0) - { - VmessQRCode vmessQRCode = null; - if (ConfigHandler.GetVmessQRCode(config, Index, ref vmessQRCode) != 0) - { - return; - } - string url = Utils.ToJson(vmessQRCode); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}", Global.vmessProtocol, url); - picQRCode.Image = QRCodeHelper.GetQRCode(url); - txtUrl.Text = url; - } - } - - } -} diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.resx b/v2rayN/v2rayN/Forms/QRCodeForm.resx deleted file mode 100644 index 1af7de15..00000000 --- a/v2rayN/v2rayN/Forms/QRCodeForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs deleted file mode 100644 index b187f725..00000000 --- a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.Designer.cs +++ /dev/null @@ -1,170 +0,0 @@ -namespace v2rayN.Forms -{ - partial class RoutingRuleQuicklyAddForm - { - /// - /// 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(RoutingRuleQuicklyAddForm)); - this.panel1 = new System.Windows.Forms.Panel(); - this.panel3 = new System.Windows.Forms.Panel(); - this.label4 = new System.Windows.Forms.Label(); - this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); - this.panel4 = new System.Windows.Forms.Panel(); - this.btnClose = new System.Windows.Forms.Button(); - this.btnOK = new System.Windows.Forms.Button(); - this.panel2 = new System.Windows.Forms.Panel(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.txtIP = new System.Windows.Forms.TextBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtDomain = new System.Windows.Forms.TextBox(); - this.panel3.SuspendLayout(); - this.panel4.SuspendLayout(); - this.panel2.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // panel1 - // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // - // panel3 - // - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Controls.Add(this.label4); - this.panel3.Controls.Add(this.cmbOutboundTag); - this.panel3.Name = "panel3"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // cmbOutboundTag - // - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); - this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbOutboundTag.FormattingEnabled = true; - this.cmbOutboundTag.Items.AddRange(new object[] { - resources.GetString("cmbOutboundTag.Items"), - resources.GetString("cmbOutboundTag.Items1"), - resources.GetString("cmbOutboundTag.Items2")}); - this.cmbOutboundTag.Name = "cmbOutboundTag"; - // - // panel4 - // - resources.ApplyResources(this.panel4, "panel4"); - this.panel4.Controls.Add(this.btnClose); - this.panel4.Controls.Add(this.btnOK); - this.panel4.Name = "panel4"; - // - // 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); - // - // btnOK - // - resources.ApplyResources(this.btnOK, "btnOK"); - this.btnOK.Name = "btnOK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // panel2 - // - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Controls.Add(this.groupBox2); - this.panel2.Controls.Add(this.groupBox1); - this.panel2.Name = "panel2"; - // - // groupBox2 - // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.txtIP); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // txtIP - // - resources.ApplyResources(this.txtIP, "txtIP"); - this.txtIP.Name = "txtIP"; - // - // groupBox1 - // - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Controls.Add(this.txtDomain); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // txtDomain - // - resources.ApplyResources(this.txtDomain, "txtDomain"); - this.txtDomain.Name = "txtDomain"; - // - // RoutingRuleQuicklyAddForm - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel4); - this.Controls.Add(this.panel3); - this.Controls.Add(this.panel1); - this.Name = "RoutingRuleQuicklyAddForm"; - this.Load += new System.EventHandler(this.RoutingRuleQuicklyAddForm_Load); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); - this.panel4.ResumeLayout(false); - this.panel2.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.ComboBox cmbOutboundTag; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TextBox txtDomain; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.TextBox txtIP; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs deleted file mode 100644 index 51f6d87b..00000000 --- a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class RoutingRuleQuicklyAddForm : BaseForm - { - public string domain - { - get; set; - } - private RulesItem rulesItem; - - public RoutingRuleQuicklyAddForm() - { - InitializeComponent(); - } - - private void RoutingRuleQuicklyAddForm_Load(object sender, EventArgs e) - { - rulesItem = new RulesItem(); - ClearBind(); - } - - private void EndBindingData() - { - if (rulesItem != null) - { - rulesItem.outboundTag = cmbOutboundTag.Text; - rulesItem.domain = Utils.String2List(txtDomain.Text); - rulesItem.ip = Utils.String2List(txtIP.Text); - } - } - - private void ClearBind() - { - cmbOutboundTag.Text = Global.agentTag; - txtDomain.Text = domain; - } - private void btnOK_Click(object sender, EventArgs e) - { - EndBindingData(); - var hasRule = false; - if (rulesItem.domain != null && rulesItem.domain.Count > 0) - { - hasRule = true; - } - if (rulesItem.ip != null && rulesItem.ip.Count > 0) - { - hasRule = true; - } - if (!hasRule) - { - return; - } - if (ConfigHandler.InsertRoutingRuleItem(ref config, rulesItem) == 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/RoutingRuleQuicklyAddForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.resx deleted file mode 100644 index b081d36d..00000000 --- a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.resx +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtIP - - - - Fill - - - - 8 - - - - 119, 20 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 3, 17 - - - 220, 207 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - - - btnOK - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - RoutingRuleQuicklyAddForm - - - $this - - - 0, 288 - - - Bottom - - - Fill - - - 32 - - - panel4 - - - proxy - - - Left - - - 24 - - - 75, 23 - - - 6, 12 - - - 506, 10 - - - 7 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - - - panel1 - - - Domain - - - groupBox1 - - - 0, 10 - - - System.Windows.Forms.Button, 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 - - - panel3 - - - 31 - - - 1 - - - 506, 51 - - - Fill - - - txtDomain - - - panel3 - - - NoControl - - - 5 - - - Top - - - panel4 - - - IP - - - 280, 0 - - - 75, 23 - - - 3, 17 - - - label4 - - - outboundTag - - - btnClose - - - block - - - direct - - - 1 - - - 2 - - - 0 - - - 305, 25 - - - panel3 - - - Top - - - 0, 0 - - - 506, 227 - - - True - - - 3 - - - 280, 227 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 3 - - - NoControl - - - &OK - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbOutboundTag - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 506, 60 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &Cancel - - - 226, 227 - - - 107, 16 - - - RoutingRuleQuicklyAddForm - - - NoControl - - - 0 - - - 1 - - - True - - - groupBox2 - - - 19, 20 - - - $this - - - 71, 12 - - - panel2 - - - groupBox2 - - - 4 - - - 0, 0 - - - panel4 - - - $this - - - groupBox1 - - - panel2 - - - 0, 61 - - - 0 - - - 1 - - - 274, 207 - - - 506, 348 - - - 25 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 0 - - - panel2 - - - $this - - - 398, 25 - - - True - - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - zh-Hans - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx deleted file mode 100644 index ee735361..00000000 --- a/v2rayN/v2rayN/Forms/RoutingRuleQuicklyAddForm.zh-Hans.resx +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OutboundTag - - - 取消(&C) - - - 确定(&O) - - - 快速添加路由规则 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs deleted file mode 100644 index 43d2de45..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.Designer.cs +++ /dev/null @@ -1,234 +0,0 @@ -namespace v2rayN.Forms -{ - partial class RoutingSettingDetailsForm - { - /// - /// 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(RoutingSettingDetailsForm)); - this.panel1 = new System.Windows.Forms.Panel(); - this.panel3 = new System.Windows.Forms.Panel(); - this.clbProtocol = new System.Windows.Forms.CheckedListBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.labRoutingTips = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.panel4 = new System.Windows.Forms.Panel(); - this.btnClose = new System.Windows.Forms.Button(); - this.btnOK = new System.Windows.Forms.Button(); - this.panel2 = new System.Windows.Forms.Panel(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.txtIP = new System.Windows.Forms.TextBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtDomain = new System.Windows.Forms.TextBox(); - this.panel3.SuspendLayout(); - this.panel4.SuspendLayout(); - this.panel2.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // panel1 - // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // - // panel3 - // - this.panel3.Controls.Add(this.clbProtocol); - this.panel3.Controls.Add(this.label3); - this.panel3.Controls.Add(this.txtPort); - this.panel3.Controls.Add(this.label1); - this.panel3.Controls.Add(this.labRoutingTips); - this.panel3.Controls.Add(this.label4); - this.panel3.Controls.Add(this.cmbOutboundTag); - this.panel3.Controls.Add(this.txtRemarks); - this.panel3.Controls.Add(this.label2); - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Name = "panel3"; - // - // clbProtocol - // - this.clbProtocol.CheckOnClick = true; - resources.ApplyResources(this.clbProtocol, "clbProtocol"); - this.clbProtocol.FormattingEnabled = true; - this.clbProtocol.Items.AddRange(new object[] { - resources.GetString("clbProtocol.Items"), - resources.GetString("clbProtocol.Items1"), - resources.GetString("clbProtocol.Items2")}); - this.clbProtocol.MultiColumn = true; - this.clbProtocol.Name = "clbProtocol"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtPort - // - resources.ApplyResources(this.txtPort, "txtPort"); - this.txtPort.Name = "txtPort"; - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // labRoutingTips - // - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); - this.labRoutingTips.Name = "labRoutingTips"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // cmbOutboundTag - // - this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbOutboundTag.FormattingEnabled = true; - this.cmbOutboundTag.Items.AddRange(new object[] { - resources.GetString("cmbOutboundTag.Items"), - resources.GetString("cmbOutboundTag.Items1"), - resources.GetString("cmbOutboundTag.Items2")}); - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); - this.cmbOutboundTag.Name = "cmbOutboundTag"; - // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // panel4 - // - this.panel4.Controls.Add(this.btnClose); - this.panel4.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel4, "panel4"); - this.panel4.Name = "panel4"; - // - // 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); - // - // btnOK - // - resources.ApplyResources(this.btnOK, "btnOK"); - this.btnOK.Name = "btnOK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // panel2 - // - this.panel2.Controls.Add(this.groupBox2); - this.panel2.Controls.Add(this.groupBox1); - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Name = "panel2"; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.txtIP); - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // txtIP - // - resources.ApplyResources(this.txtIP, "txtIP"); - this.txtIP.Name = "txtIP"; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.txtDomain); - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // txtDomain - // - resources.ApplyResources(this.txtDomain, "txtDomain"); - this.txtDomain.Name = "txtDomain"; - // - // RoutingSettingDetailsForm - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel4); - this.Controls.Add(this.panel3); - this.Controls.Add(this.panel1); - this.Name = "RoutingSettingDetailsForm"; - this.Load += new System.EventHandler(this.RoutingSettingDetailsForm_Load); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); - this.panel4.ResumeLayout(false); - this.panel2.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.ComboBox cmbOutboundTag; - private System.Windows.Forms.TextBox txtRemarks; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TextBox txtDomain; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.TextBox txtIP; - private System.Windows.Forms.Label labRoutingTips; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox txtPort; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.CheckedListBox clbProtocol; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs deleted file mode 100644 index 65fe6a8f..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using v2rayN.Base; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class RoutingSettingDetailsForm : BaseForm - { - public int EditIndex - { - get; set; - } - protected RulesItem routingItem = null; - - public RoutingSettingDetailsForm() - { - InitializeComponent(); - } - - private void RoutingSettingDetailsForm_Load(object sender, EventArgs e) - { - if (EditIndex >= 0) - { - routingItem = config.rules[EditIndex]; - BindingData(); - } - else - { - routingItem = new RulesItem(); - ClearBind(); - } - } - - private void EndBindingData() - { - if (routingItem != null) - { - routingItem.remarks = txtRemarks.Text.TrimEx(); - routingItem.port = txtPort.Text.TrimEx(); - routingItem.outboundTag = cmbOutboundTag.Text; - routingItem.domain = Utils.String2List(txtDomain.Text); - routingItem.ip = Utils.String2List(txtIP.Text); - - var protocol = new List(); - for (int i = 0; i < clbProtocol.Items.Count; i++) - { - if (clbProtocol.GetItemChecked(i)) - { - protocol.Add(clbProtocol.Items[i].ToString()); - } - } - routingItem.protocol = protocol; - } - } - private void BindingData() - { - if (routingItem != null) - { - txtRemarks.Text = routingItem.remarks ?? string.Empty; - txtPort.Text = routingItem.port ?? string.Empty; - cmbOutboundTag.Text = routingItem.outboundTag; - txtDomain.Text = Utils.List2String(routingItem.domain, true); - txtIP.Text = Utils.List2String(routingItem.ip, true); - - if (routingItem.protocol != null) - { - for (int i = 0; i < clbProtocol.Items.Count; i++) - { - if (routingItem.protocol.Contains(clbProtocol.Items[i].ToString())) - { - clbProtocol.SetItemChecked(i, true); - } - } - } - } - } - private void ClearBind() - { - txtRemarks.Text = string.Empty; - txtPort.Text = string.Empty; - cmbOutboundTag.Text = Global.agentTag; - txtDomain.Text = string.Empty; - txtIP.Text = string.Empty; - } - private void btnOK_Click(object sender, EventArgs e) - { - EndBindingData(); - var hasRule = false; - if (routingItem.domain != null && routingItem.domain.Count > 0) - { - hasRule = true; - } - if (routingItem.ip != null && routingItem.ip.Count > 0) - { - hasRule = true; - } - if (routingItem.protocol != null && routingItem.protocol.Count > 0) - { - hasRule = true; - } - if (!Utils.IsNullOrEmpty(routingItem.port)) - { - hasRule = true; - } - if (!hasRule) - { - UI.ShowWarning(string.Format(UIRes.I18N("RoutingRuleDetailRequiredTips"), "Port/Protocol/Domain/IP")); - return; - } - - if (ConfigHandler.AddRoutingRule(ref config, routingItem, EditIndex) == 0) - { - this.DialogResult = DialogResult.OK; - } - else - { - UI.ShowWarning(UIRes.I18N("OperationFailed")); - } - - this.DialogResult = DialogResult.OK; - } - - private void btnClose_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - } -} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx deleted file mode 100644 index d9472064..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.resx +++ /dev/null @@ -1,723 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Top - - - - 0, 0 - - - 742, 10 - - - - 7 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 80 - - - http - - - tls - - - bittorrent - - - 347, 43 - - - 245, 20 - - - 39 - - - clbProtocol - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 0 - - - True - - - NoControl - - - 274, 47 - - - 53, 12 - - - 36 - - - Protocol - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 1 - - - 84, 43 - - - 166, 21 - - - 35 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 2 - - - True - - - NoControl - - - 19, 47 - - - 29, 12 - - - 34 - - - Port - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 3 - - - NoControl - - - 19, 82 - - - 598, 16 - - - 33 - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - labRoutingTips - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 4 - - - True - - - NoControl - - - 274, 20 - - - 47, 12 - - - 32 - - - Out Tag - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 5 - - - proxy - - - direct - - - block - - - 347, 16 - - - 119, 20 - - - 31 - - - cmbOutboundTag - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 6 - - - 84, 16 - - - 166, 21 - - - 30 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 7 - - - True - - - NoControl - - - 19, 20 - - - 47, 12 - - - 29 - - - Remarks - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 8 - - - Top - - - 0, 10 - - - 742, 111 - - - 8 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 0 - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 1 - - - Bottom - - - 0, 516 - - - 742, 60 - - - 10 - - - panel4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - NoControl - - - 504, 15 - - - 75, 23 - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 0 - - - NoControl - - - 411, 15 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 1 - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Fill - - - 0, 121 - - - 742, 395 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - txtIP - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - Fill - - - 392, 0 - - - 350, 395 - - - 4 - - - IP - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - Fill - - - 3, 17 - - - True - - - 344, 375 - - - 25 - - - txtIP - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - txtDomain - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - Left - - - 0, 0 - - - 392, 395 - - - 3 - - - Domain - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Fill - - - 3, 17 - - - True - - - 386, 375 - - - 24 - - - txtDomain - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - 6, 12 - - - 742, 576 - - - RoutingSettingDetailsForm - - - RoutingSettingDetailsForm - - - 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/RoutingSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx deleted file mode 100644 index bac9081a..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSettingDetailsForm.zh-Hans.resx +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 - - - - 71, 12 - - - OutboundTag - - - 29, 12 - - - 别名 - - - 取消(&C) - - - 确定(&O) - - - 路由规则详情设置 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs deleted file mode 100644 index e085f27f..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.Designer.cs +++ /dev/null @@ -1,106 +0,0 @@ -namespace v2rayN.Forms -{ - partial class RoutingSubSettingForm - { - /// - /// 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(RoutingSubSettingForm)); - this.panel2 = new System.Windows.Forms.Panel(); - this.btnClose = new System.Windows.Forms.Button(); - this.btnOK = new System.Windows.Forms.Button(); - this.panCon = new System.Windows.Forms.Panel(); - this.txtUrl = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.panel2.SuspendLayout(); - this.panCon.SuspendLayout(); - this.SuspendLayout(); - // - // panel2 - // - this.panel2.Controls.Add(this.btnClose); - this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Name = "panel2"; - // - // 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); - // - // btnOK - // - resources.ApplyResources(this.btnOK, "btnOK"); - this.btnOK.Name = "btnOK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // panCon - // - resources.ApplyResources(this.panCon, "panCon"); - this.panCon.Controls.Add(this.txtUrl); - this.panCon.Controls.Add(this.label3); - this.panCon.Name = "panCon"; - // - // txtUrl - // - resources.ApplyResources(this.txtUrl, "txtUrl"); - this.txtUrl.Name = "txtUrl"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // RoutingSubSettingForm - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.Controls.Add(this.panCon); - this.Controls.Add(this.panel2); - this.Name = "RoutingSubSettingForm"; - this.Load += new System.EventHandler(this.RoutingSubSettingForm_Load); - this.panel2.ResumeLayout(false); - this.panCon.ResumeLayout(false); - this.panCon.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Panel panCon; - private System.Windows.Forms.TextBox txtUrl; - private System.Windows.Forms.Label label3; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs deleted file mode 100644 index 7ccb683d..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class RoutingSubSettingForm : BaseForm - { - public string Url; - public RoutingSubSettingForm() - { - InitializeComponent(); - } - - private void RoutingSubSettingForm_Load(object sender, EventArgs e) - { - if (config.ruleSubItem == null) - { - config.ruleSubItem = new List(); - } - if (config.ruleSubItem.Count <= 0) - { - config.ruleSubItem.Add(new SubItem - { - remarks = "def", - url = Global.CustomRoutingListUrl + "custom_routing_rules" - }); - } - txtUrl.Text = config.ruleSubItem[0].url; - } - - private void btnOK_Click(object sender, EventArgs e) - { - var url = txtUrl.Text.Trim(); - - if (Utils.IsNullOrEmpty(url)) - { - return; - } - Url = url; - config.ruleSubItem[0].url = url; - ConfigHandler.SaveRuleSubItem(ref config); - - this.DialogResult = DialogResult.OK; - } - - private void btnClose_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - - } -} diff --git a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx deleted file mode 100644 index 144946ab..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.resx +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - NoControl - - - - 448, 17 - - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - NoControl - - - 355, 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, 166 - - - 545, 60 - - - 8 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - True - - - 83, 19 - - - True - - - 450, 113 - - - 25 - - - txtUrl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panCon - - - 0 - - - True - - - NoControl - - - 12, 19 - - - 23, 12 - - - 24 - - - Url - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panCon - - - 1 - - - Fill - - - 0, 0 - - - 545, 166 - - - 11 - - - panCon - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 6, 12 - - - 545, 226 - - - RoutingSubSetting - - - RoutingSubSettingForm - - - 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/RoutingSubSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSubSettingForm.zh-Hans.resx deleted file mode 100644 index 614f26d1..00000000 --- a/v2rayN/v2rayN/Forms/RoutingSubSettingForm.zh-Hans.resx +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 取消(&C) - - - 确定(&O) - - - - 65, 12 - - - 地址 (url) - - \ No newline at end of file From 0b8d66a87e3764d415a2b797cd936cdd06a95ced Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 5 Mar 2022 15:00:02 +0800 Subject: [PATCH 102/252] Add Global Hotkey --- .../Forms/GlobalHotkeySettingForm.Designer.cs | 186 ++ .../v2rayN/Forms/GlobalHotkeySettingForm.cs | 138 + .../v2rayN/Forms/GlobalHotkeySettingForm.resx | 537 ++++ .../GlobalHotkeySettingForm.zh-Hans.resx | 166 + v2rayN/v2rayN/Forms/MainForm.Designer.cs | 219 +- v2rayN/v2rayN/Forms/MainForm.cs | 38 +- v2rayN/v2rayN/Forms/MainForm.resx | 2722 +++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 122 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 60 +- v2rayN/v2rayN/Mode/Config.cs | 25 +- v2rayN/v2rayN/Mode/EGlobalHotkey.cs | 11 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 18 + v2rayN/v2rayN/Resx/ResUI.resx | 6 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 6 + v2rayN/v2rayN/v2rayN.csproj | 24 +- 15 files changed, 2751 insertions(+), 1527 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Mode/EGlobalHotkey.cs diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs new file mode 100644 index 00000000..ba25fdee --- /dev/null +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs @@ -0,0 +1,186 @@ +namespace v2rayN.Forms +{ + partial class GlobalHotkeySettingForm + { + /// + /// 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(GlobalHotkeySettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnReset = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey3 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey2 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey0 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.panel2.SuspendLayout(); + this.panel1.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); + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnReset); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // btnReset + // + resources.ApplyResources(this.btnReset, "btnReset"); + this.btnReset.Name = "btnReset"; + this.btnReset.UseVisualStyleBackColor = true; + this.btnReset.Click += new System.EventHandler(this.btnReset_Click); + // + // 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.Controls.Add(this.label6); + this.panel1.Controls.Add(this.label5); + this.panel1.Controls.Add(this.txtGlobalHotkey3); + this.panel1.Controls.Add(this.label4); + this.panel1.Controls.Add(this.txtGlobalHotkey2); + this.panel1.Controls.Add(this.label3); + this.panel1.Controls.Add(this.txtGlobalHotkey1); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtGlobalHotkey0); + this.panel1.Controls.Add(this.label2); + this.panel1.Name = "panel1"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.ForeColor = System.Drawing.Color.Red; + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.ForeColor = System.Drawing.Color.Red; + this.label5.Name = "label5"; + // + // txtGlobalHotkey3 + // + resources.ApplyResources(this.txtGlobalHotkey3, "txtGlobalHotkey3"); + this.txtGlobalHotkey3.Name = "txtGlobalHotkey3"; + this.txtGlobalHotkey3.ReadOnly = true; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtGlobalHotkey2 + // + resources.ApplyResources(this.txtGlobalHotkey2, "txtGlobalHotkey2"); + this.txtGlobalHotkey2.Name = "txtGlobalHotkey2"; + this.txtGlobalHotkey2.ReadOnly = true; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtGlobalHotkey1 + // + resources.ApplyResources(this.txtGlobalHotkey1, "txtGlobalHotkey1"); + this.txtGlobalHotkey1.Name = "txtGlobalHotkey1"; + this.txtGlobalHotkey1.ReadOnly = true; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // txtGlobalHotkey0 + // + resources.ApplyResources(this.txtGlobalHotkey0, "txtGlobalHotkey0"); + this.txtGlobalHotkey0.Name = "txtGlobalHotkey0"; + this.txtGlobalHotkey0.ReadOnly = true; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // GlobalHotkeySettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "GlobalHotkeySettingForm"; + this.Load += new System.EventHandler(this.GlobalHotkeySettingForm_Load); + this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TextBox txtGlobalHotkey0; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtGlobalHotkey3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtGlobalHotkey2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtGlobalHotkey1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Button btnReset; + private System.Windows.Forms.Label label6; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs new file mode 100644 index 00000000..66799af0 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class GlobalHotkeySettingForm : BaseForm + { + List lstKey; + public GlobalHotkeySettingForm() + { + InitializeComponent(); + } + + private void GlobalHotkeySettingForm_Load(object sender, EventArgs e) + { + if (config.globalHotkeys == null) + { + config.globalHotkeys = new List(); + } + + foreach (EGlobalHotkey it in Enum.GetValues(typeof(EGlobalHotkey))) + { + if (config.globalHotkeys.FindIndex(t => t.eGlobalHotkey == it) >= 0) + { + continue; + } + + config.globalHotkeys.Add(new KeyEventItem() + { + eGlobalHotkey = it, + Alt = false, + Control = false, + Shift = false, + KeyCode = null + }); + } + + lstKey = Utils.DeepCopy(config.globalHotkeys); + + txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey3.KeyDown += TxtGlobalHotkey_KeyDown; + + BindingData(-1); + } + + private void TxtGlobalHotkey_KeyDown(object sender, KeyEventArgs e) + { + var txt = ((TextBox)sender); + var index = Utils.ToInt(txt.Name.Substring(txt.Name.Length - 1, 1)); + + lstKey[index].KeyCode = e.KeyCode; + lstKey[index].Alt = e.Alt; + lstKey[index].Control = e.Control; + lstKey[index].Shift = e.Shift; + + BindingData(index); + } + + private void BindingData(int index) + { + for (int k = 0; k < lstKey.Count; k++) + { + if (index >= 0 && index != k) + { + continue; + } + var item = lstKey[k]; + var keys = string.Empty; + + if (item.Control) + { + keys += $"{Keys.Control.ToString()} + "; + } + if (item.Alt) + { + keys += $"{Keys.Alt.ToString()} + "; + } + if (item.Shift) + { + keys += $"{Keys.Shift.ToString()} + "; + } + if (item.KeyCode != null) + { + keys += $"{item.KeyCode.ToString()}"; + } + + panel1.Controls[$"txtGlobalHotkey{k}"].Text = keys; + } + } + + private void btnOK_Click(object sender, EventArgs e) + { + config.globalHotkeys = lstKey; + + if (ConfigHandler.SaveConfig(ref config, false) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnReset_Click(object sender, EventArgs e) + { + lstKey.Clear(); + foreach (EGlobalHotkey it in Enum.GetValues(typeof(EGlobalHotkey))) + { + if (lstKey.FindIndex(t => t.eGlobalHotkey == it) >= 0) + { + continue; + } + + lstKey.Add(new KeyEventItem() + { + eGlobalHotkey = it, + Alt = false, + Control = false, + Shift = false, + KeyCode = null + }); + } + BindingData(-1); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx new file mode 100644 index 00000000..62c49a4f --- /dev/null +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Clear system proxy + + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bottom + + + 1 + + + + 75, 23 + + + panel2 + + + panel1 + + + &Reset + + + + True + + + 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + btnOK + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + GlobalHotkeySettingForm + + + label1 + + + 189, 138 + + + 34 + + + 37 + + + panel2 + + + 18, 215 + + + 6 + + + 101, 12 + + + 8 + + + 75, 23 + + + NoControl + + + NoControl + + + Take effect after restart + + + 278, 21 + + + 189, 18 + + + 11 + + + 7 + + + panel1 + + + 18, 103 + + + 18, 190 + + + panel1 + + + 278, 21 + + + System.Windows.Forms.Button, 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 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 527, 60 + + + 113, 12 + + + 32 + + + txtGlobalHotkey2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label5 + + + 527, 242 + + + 211, 17 + + + 9 + + + 40 + + + 71, 12 + + + panel1 + + + panel1 + + + 75, 23 + + + 1 + + + panel1 + + + 18, 22 + + + label4 + + + txtGlobalHotkey1 + + + 33 + + + Do not change system proxy + + + Set system proxy + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + txtGlobalHotkey0 + + + 39 + + + btnClose + + + 303, 17 + + + 0, 242 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + Fill + + + 3 + + + btnReset + + + 6, 12 + + + 6 + + + 189, 58 + + + 0 + + + 7 + + + panel1 + + + NoControl + + + 36 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 31 + + + NoControl + + + True + + + 278, 21 + + + True + + + NoControl + + + 189, 99 + + + label2 + + + label3 + + + True + + + Set directly by pressing the keyboard + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + &Cancel + + + 18, 62 + + + &OK + + + 1 + + + Display GUI + + + 35 + + + NoControl + + + True + + + panel1 + + + 18, 142 + + + 2 + + + $this + + + 161, 12 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 227, 12 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 0, 0 + + + panel2 + + + 4 + + + 155, 12 + + + GlobalHotkey Setting + + + 2 + + + 5 + + + 527, 302 + + + 4 + + + 38 + + + txtGlobalHotkey3 + + + 278, 21 + + + $this + + + 396, 17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label6 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + True + + + 25 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx new file mode 100644 index 00000000..06a7a69c --- /dev/null +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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) + + + 重置(&R) + + + 确定(&O) + + + + 65, 12 + + + 重启后生效 + + + 113, 12 + + + 直接按键盘进行设置 + + + 89, 12 + + + 不改变系统代理 + + + 自动配置系统代理 + + + 77, 12 + + + 清除系统代理 + + + 65, 12 + + + 显示主界面 + + + 全局热键设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index cea1cf45..425eebe3 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -64,8 +64,8 @@ this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); - this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.gbMsgTitle = new System.Windows.Forms.GroupBox(); @@ -113,6 +113,7 @@ this.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbGlobalHotkeySetting = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.tsbBackupGuiNConfig = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); @@ -160,17 +161,19 @@ // // scMain.Panel1 // + resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); // // scMain.Panel2 // + 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; @@ -189,6 +192,7 @@ // // 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, @@ -223,202 +227,201 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - 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 // - this.menuAddVlessServer.Name = "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 // - this.menuAddTrojanServer.Name = "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 // - this.tsbTestMe.Name = "tsbTestMe"; resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); + this.tsbTestMe.Name = "tsbTestMe"; this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - this.menuClearServerStatistics.Name = "menuClearServerStatistics"; resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); + this.menuClearServerStatistics.Name = "menuClearServerStatistics"; this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_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 + // + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + this.tsbServer.Name = "tsbServer"; + // // qrCodeControl // resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // - // tsbServer - // - this.tsbServer.DropDown = this.cmsLv; - this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); - this.tsbServer.Name = "tsbServer"; - // // splitContainer1 // resources.ApplyResources(this.splitContainer1, "splitContainer1"); @@ -426,33 +429,35 @@ // // splitContainer1.Panel1 // + resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // // splitContainer1.Panel2 // + resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - this.groupBox1.Controls.Add(this.scMain); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.scMain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // gbMsgTitle // + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Controls.Add(this.txtMsgBox); this.gbMsgTitle.Controls.Add(this.ssMain); - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Name = "gbMsgTitle"; this.gbMsgTitle.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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; - 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; @@ -460,6 +465,7 @@ // // cmsMsgBox // + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, @@ -468,46 +474,46 @@ this.menuMsgBoxAddRoutingRule, this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); + this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); + this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); + this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxClear // - this.menuMsgBoxClear.Name = "menuMsgBoxClear"; resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); + this.menuMsgBoxClear.Name = "menuMsgBoxClear"; this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); // // menuMsgBoxAddRoutingRule // - this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); + this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // menuMsgBoxFilter // - this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); + this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); // // ssMain // + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslInboundInfo, @@ -516,14 +522,13 @@ this.toolSslBlank2, this.toolSslServerSpeed, this.toolSslBlank4}); - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslInboundInfo // - this.toolSslInboundInfo.Name = "toolSslInboundInfo"; resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); + this.toolSslInboundInfo.Name = "toolSslInboundInfo"; // // toolSslBlank1 // @@ -533,13 +538,13 @@ // // toolSslRoutingRule // - this.toolSslRoutingRule.Name = "toolSslRoutingRule"; resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); + this.toolSslRoutingRule.Name = "toolSslRoutingRule"; // // toolSslBlank2 // - this.toolSslBlank2.Name = "toolSslBlank2"; resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Name = "toolSslBlank2"; this.toolSslBlank2.Spring = true; // // toolSslServerSpeed @@ -550,19 +555,19 @@ // // toolSslBlank4 // - this.toolSslBlank4.Name = "toolSslBlank4"; resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; // // 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.menuRoutings, @@ -582,87 +587,87 @@ // // menuSysAgentMode // + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - this.menuKeepClear.Name = "menuKeepClear"; resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - this.menuGlobal.Name = "menuGlobal"; resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - this.menuKeepNothing.Name = "menuKeepNothing"; resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); + this.menuKeepNothing.Name = "menuKeepNothing"; this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - this.menuRoutings.Name = "menuRoutings"; resources.ApplyResources(this.menuRoutings, "menuRoutings"); + this.menuRoutings.Name = "menuRoutings"; // // menuServers // - this.menuServers.Name = "menuServers"; resources.ApplyResources(this.menuServers, "menuServers"); + this.menuServers.Name = "menuServers"; // // menuServers2 // + resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.BackColor = System.Drawing.SystemColors.Window; this.menuServers2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.menuServers2.DropDownWidth = 500; - resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.Name = "menuServers2"; // // toolStripSeparator13 // - this.toolStripSeparator13.Name = "toolStripSeparator13"; resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); + this.toolStripSeparator13.Name = "toolStripSeparator13"; // // 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); // // menuUpdateSubscriptions // - this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); + this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // // menuUpdateSubViaProxy // - this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy"; resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); + this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy"; this.menuUpdateSubViaProxy.Click += new System.EventHandler(this.menuUpdateSubViaProxy_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 @@ -678,6 +683,7 @@ // // 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, @@ -695,95 +701,101 @@ 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.tsbSubUpdateViaProxy}); 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); // // tsbSubUpdateViaProxy // - this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy"; resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); + this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy"; this.tsbSubUpdateViaProxy.Click += new System.EventHandler(this.tsbSubUpdateViaProxy_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; - resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); 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"; // // tsbSetting // + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, + this.tsbGlobalHotkeySetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - this.tsbOptionSetting.Name = "tsbOptionSetting"; resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Name = "tsbOptionSetting"; this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - this.tsbRoutingSetting.Name = "tsbRoutingSetting"; resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // + // tsbGlobalHotkeySetting + // + resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting"); + this.tsbGlobalHotkeySetting.Name = "tsbGlobalHotkeySetting"; + this.tsbGlobalHotkeySetting.Click += new System.EventHandler(this.tsbGlobalHotkeySetting_Click); + // // toolStripSeparator14 // - this.toolStripSeparator14.Name = "toolStripSeparator14"; resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); + this.toolStripSeparator14.Name = "toolStripSeparator14"; // // tsbBackupGuiNConfig // - this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); + this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - this.toolStripSeparator5.Name = "toolStripSeparator5"; resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + this.toolStripSeparator5.Name = "toolStripSeparator5"; // // tsbReload // @@ -793,11 +805,12 @@ // // 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, @@ -806,51 +819,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); 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); // // tsbCheckUpdateXrayCore // - this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator15 // - this.toolStripSeparator15.Name = "toolStripSeparator15"; resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); + this.toolStripSeparator15.Name = "toolStripSeparator15"; // // tsbCheckUpdateGeoSite // - this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); + this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); // // tsbCheckUpdateGeoIP // - this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); + this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_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, @@ -858,50 +871,49 @@ 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 // - this.tsbV2rayWebsite.Name = "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 // @@ -1054,6 +1066,7 @@ private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy; private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; + private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index a2fec808..dcc36de7 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1,4 +1,5 @@ -using System; +using NHotkey; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; @@ -53,7 +54,6 @@ namespace v2rayN.Forms { statistics = new StatisticsHandler(config, UpdateStatisticsHandler); } - MainFormHandler.Instance.UpdateTask(config, UpdateTaskHandler); } private void MainForm_VisibleChanged(object sender, EventArgs e) @@ -80,6 +80,8 @@ namespace v2rayN.Forms HideForm(); + MainFormHandler.Instance.UpdateTask(config, UpdateTaskHandler); + MainFormHandler.Instance.RegisterGlobalHotkey(config, OnHotkeyHandler, UpdateTaskHandler); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) @@ -163,6 +165,26 @@ namespace v2rayN.Forms } } + private void OnHotkeyHandler(object sender, HotkeyEventArgs e) + { + switch (Utils.ToInt(e.Name)) + { + case (int)EGlobalHotkey.ShowForm: + ShowForm(); + break; + case (int)EGlobalHotkey.SystemProxyClear: + SetListenerType(ESysProxyType.ForcedClear); + break; + case (int)EGlobalHotkey.SystemProxySet: + SetListenerType(ESysProxyType.ForcedChange); + break; + case (int)EGlobalHotkey.SystemProxyUnchanged: + SetListenerType(ESysProxyType.Unchanged); + break; + } + e.Handled = true; + } + #endregion #region 显示服务器 listview 和 menu @@ -792,6 +814,18 @@ namespace v2rayN.Forms } } + private void tsbGlobalHotkeySetting_Click(object sender, EventArgs e) + { + var fm = new GlobalHotkeySettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsMenu(); + RefreshServers(); + LoadV2ray(); + } + + } + private void tsbReload_Click(object sender, EventArgs e) { Global.reloadV2ray = true; diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 47687761..82b8d55d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,203 +117,785 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + Remove duplicate servers - - 3, 17 - - - 327, 17 - - + 355, 22 - - Add [VMess] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 355, 22 + + + 97, 53 + + 355, 22 Add [VLESS] server - - 355, 22 + + 0 - - Add [Shadowsocks] server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Restart service + + + 200, 25 + + + tsbSubSetting + + + 264, 22 + + + toolSslInboundInfo + + + gbMsgTitle + + + menuMoveUp Add [Socks] server + + 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 + + + menuUpdateSubViaProxy + + + + ImageAboveText + + + 227, 22 + + + 语言-[中文简体] + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Settings + + + tsbHelp + + + System.Windows.Forms.ToolStripMenuItem, 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 + + + toolStripSeparator6 + 355, 22 - - Add [Trojan] server + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + 99, 53 - - Add a custom configuration server + + Update subscriptions - - 355, 22 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Import bulk URL from clipboard (Ctrl+V) + + 187, 22 - - 355, 22 + + 67, 53 - - Scan QR code on the screen (Ctrl+S) + + tsbSetting - - 352, 6 + + toolSslBlank2 355, 22 - - Remove selected servers (Delete) - - + 355, 22 - - Remove duplicate servers + + tsbCheckUpdateN + + + 45, 53 + + + Do not change system proxy + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + Update v2flyCore + + + Update GeoSite + + + Magenta + + + menuMsgBoxAddRoutingRule 355, 22 - - Clone selected server + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + menuExport2SubContent - - Set as active server (Enter) + + Share - - 352, 6 + + 227, 22 + + + tsbQRCodeSwitch + + + Add Routing Rule (Ctrl+V) 355, 22 - - Move to top (T) - - - 355, 22 - - - Up (U) - - - 355, 22 - - - Down (D) - - - 355, 22 - - - Move to bottom (B) - - - 355, 22 - - - Select All (Ctrl+A) - - - 352, 6 - - - 355, 22 - - - Test servers ping (Ctrl+P) - - - 355, 22 - - - Test servers with tcping (Ctrl+O) - - - 355, 22 - - - Test servers real delay (Ctrl+R) - - - 355, 22 - - - Test servers download speed (Ctrl+T) - - - 355, 22 - - - Test current service status - - - 355, 22 - - - Clear all service statistics - - - 352, 6 - - - 355, 22 + + Horizontal Export selected server for client configuration - - 355, 22 + + tsbRoutingSetting + + + 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 + + + 227, 22 Export selected server for server configuration - - 355, 22 + + splitContainer1 - - Export share URLs to clipboard (Ctrl+C) + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + 128, 53 - - Export subscription (base64) share to clipboard + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + Test servers real delay (Ctrl+R) + + + menuTcpingServer + + + ImageAboveText + + + toolSslRoutingRule 356, 622 - - cmsLv + + tsbGlobalHotkeySetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + 355, 22 + + + toolStripSeparator1 + + + 355, 22 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + 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 + + + menuPingServer + + + 200, 6 + + + 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 + + + + System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Export subscription (base64) share to clipboard + + + 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 + + + 250, 21 + + + menuAddCustomServer + + + menuMoveDown + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Import bulk URL from clipboard + + + gbMsgTitle + + + Move to bottom (B) + + + Move to top (T) + + + 6, 12 + + + 48, 53 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Copy All + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + Fill + + + 0 + + + 686, 280 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 195, 22 + + + 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 + + + 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 + + + menuAddServers2 + + + Fill + + + tsbServer + + + Add [VMess] server + + + $this + + + 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 + + + 300, 21 + + + toolStripSeparator5 + + + 182, 22 + + + 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 + + + tsbPromotion + + + 256, 280 + + + 355, 22 + + + 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 + + + 352, 6 + + + groupBox1 + + + 300, 21 + + + 2 + + + 182, 22 + + + Clear all service statistics + + + scMain.Panel2 + + + 195, 22 + + + 3 + + + 187, 22 + + + 6, 56 + + + Test servers download speed (Ctrl+T) + + + ssMain + + + 686 + + + splitContainer1 + + + 265, 221 + + + 243, 22 + + + menuUpdateSubscriptions + + + scMain + + + Check for updates + + + tsbCheckUpdateXrayCore + + + Copy (Ctrl+C) + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 182, 22 + + + GlobalHotkeySetting + + + scMain + + + 203, 22 + + + 2 + + + 952, 56 + + + tsbReload + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + Help + + + menuMsgBoxSelectAll + + + menuSelectAll + + + splitContainer1.Panel1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + 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 + + + menuServers2 + + + 50 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + BottomCenter + + + menuExport2ShareUrl + + + menuMsgBoxClear + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + v2rayN (this software) + + + tsbOptionSetting + + + Magenta + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0, 0 + + + 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 + + + Server + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + menuAddShadowsocksServer + + + txtMsgBox + + + toolSslBlank4 + + + menuAddTrojanServer + + + 355, 22 + + + 80, 21 + + + v2rayN + + + Language-[English] + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 264, 22 + + + menuScanScreen2 + + + 0 + + + Fill + + + Routing + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add [Trojan] server + + + 195, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ImageAboveText System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + Set message filters + + + 952, 593 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 352, 6 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + V2Ray Website + + Fill + + No + + + 1 + + + cmsMsgBox + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + OptionSetting + + + menuMoveTop + + + tsbCheckUpdateCore + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -331,1340 +913,770 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 0, 0 + + 952, 300 - - 686, 280 + + tsbCheckUpdateGeoIP - - - 0 + + menuScanScreen - - lvServers - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel1 - - - 0 - - - scMain.Panel1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 0 - - - Fill - - - 0, 0 - - - 4, 4, 4, 4 - - - 256, 280 - - - 2 - - - qrCodeControl - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - scMain.Panel2 - - - 0 - - - scMain.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - 1 - - - 100 - - - 946, 280 - - - 686 - - - 0 - - - scMain - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - Magenta - - - 64, 53 - - - Servers - - + ImageAboveText - - Fill + + cmsLv - - 0, 66 + + toolStripSeparator12 - - Horizontal + + 6, 56 Fill - - 0, 0 + + toolSslBlank1 - - 952, 300 + + tsbSubUpdate - + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsMain + + + 5 + + + SPEED Disabled + + + 355, 22 + + + Promotion + + + menuSysAgentMode + + + menuKeepNothing + + + 952, 527 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ImageAboveText + + + 227, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + cmsMain + + + 264, 22 + + + menuServers + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxFilter + + + 203, 22 + + + RoutingSetting + + + Standard + + + Update GeoIP + + + 3, 194 + + + True + + + 355, 22 + + + 195, 22 + + + Subscriptions + + + 952, 10 + + + Updates + + + 264, 22 + + + toolStripSeparator14 + + 0 + + toolStripSeparator8 + + + menuMsgBoxCopyAll + + + menuExport2ServerConfig + + + 89, 53 + + + 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.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 264, 22 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 203, 22 + + + Settings + + + menuCopyServer + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + groupBox1 + + + MainForm + + + toolStripSeparator9 + + + menuExit + + + 227, 22 + + + tsbSubUpdateViaProxy + + + False + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Servers list - - groupBox1 + + lvServers - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuRealPingServer - - splitContainer1.Panel1 + + Magenta - + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbV2rayWebsite + + + Magenta + + + 4, 4, 4, 4 + + + Magenta + + + 355, 22 + + + v2rayN Project + + + Servers + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + menuRoutings + + + 3 + + + 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 + + + menuSpeedServer + + + 355, 22 + + + menuRemoveServer + + + tsbBackupGuiNConfig + + + tsbTestMe + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - splitContainer1.Panel1 + + 946, 177 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddVmessServer + + + scMain + + + Down (D) + + + 0 + + + 352, 6 + + + Magenta + + + 243, 22 + + + Remove selected servers (Delete) + + + 952, 223 + + + 355, 22 + + + tsbSub + + + Magenta + + + toolStripSeparator11 + + + ImageAboveText + + + Clone selected server + + + 0, 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 227, 22 + + + Export share URLs to clipboard (Ctrl+C) + + + 243, 22 + + + 355, 22 + + + Server + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 300 + + + System.Windows.Forms.ToolStrip, 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 + + + Updates via proxy + + + 0 + + + $this + + + 0, 0 + + + qrCodeControl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Update subscriptions via proxy + + + Clear system proxy + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ImageAboveText + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 21 + + + 203, 22 + + + 184, 6 + + + splitContainer1.Panel2 + + + 0, 0 + + + scMain.Panel1 + + + Up (U) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + Set system proxy + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MiddleRight + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + 0, 66 + + + 100 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + scMain.Panel1 + + + 微软雅黑, 8pt + + + 64, 53 + + + 228, 136 + + + 946, 26 + + + 5 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + Set as active server (Enter) + + + menuAddVlessServer + + + 946, 280 + + + 6, 56 + + + Add [Shadowsocks] server + + + 261, 6 + + + 微软雅黑, 8pt + + splitContainer1 0 - - 603, 17 - - - 227, 22 + + 261, 6 - - Select All (Ctrl+A) + + Test current service status - - 227, 22 + + NoControl - - Copy (Ctrl+C) + + toolStripSeparator10 - - 227, 22 + + menuMoveBottom - - Copy All + + 355, 22 - - 227, 22 + + 1 - - Clear All - - - 227, 22 - - - Add Routing Rule (Ctrl+V) - - - 227, 22 - - - Set message filters - - - 228, 136 - - - cmsMsgBox - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 3, 17 - - - 0 - - - True - - - Vertical - - - 946, 177 - - - 3 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 0 - - - 228, 18 - - - 80, 21 + + Magenta InboundInfo - - 微软雅黑, 8pt + + 355, 22 - - 300, 21 - - - 0, 21 - - - 300, 21 - - - False - - - 微软雅黑, 8pt - - - No - - - 250, 21 - - - SPEED Disabled - - - MiddleRight - - - 0, 21 - - - 3, 194 - - - 946, 26 - - - 0 - - - statusStrip1 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 1 - - - Fill - - - 0, 0 - - - 952, 223 - - - 3 - - - Informations - - - gbMsgTitle - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1.Panel2 - - - 0 - - - splitContainer1.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1 - - - 1 - - - 952, 527 - - - 300 - - - 5 - - - splitContainer1 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 17, 17 - - - 137, 17 - - - NoControl - - - 243, 22 - - - Clear system proxy - - - 243, 22 - - - Set system proxy - - - 243, 22 - - - Do not change system proxy - - - 264, 22 - - - Http proxy - - - 264, 22 - - - Routing - - - 264, 22 - - - Server - - - Standard - - - 50 - - - 200, 25 - - - Server - - - 261, 6 - - - 264, 22 - - - Import bulk URL from clipboard - - - 264, 22 - - - Scan QR code on the screen - - - 264, 22 - - - Update subscriptions - - - 264, 22 - - - Update subscriptions via proxy - - - 261, 6 - - - 264, 22 - - - Exit - - - 265, 243 - - - cmsMain - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - True - - - 498, 17 - - - Top - - - 0, 56 - - - 952, 10 - - - 2 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - 409, 17 - - - 6, 56 - - - 182, 22 - - - Settings - - - 182, 22 - - - Updates - - - 182, 22 - - - Updates via proxy - - - Magenta - - - 99, 53 - - - Subscriptions - - - ImageAboveText - - - Magenta - - - 45, 53 - - - Share - - - BottomCenter - - - ImageAboveText - - - 6, 56 - - - 176, 22 - - - OptionSetting - - - 176, 22 - - - RoutingSetting - - - 173, 6 - - - 176, 22 - - - BackupGuiConfig - - - Magenta - - - 67, 53 - - - Settings - - - 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 - - - 203, 22 - - - v2rayN (this software) - - - 203, 22 - - - Update v2flyCore - - - 203, 22 - - - Update XrayCore - - - 200, 6 - - - 203, 22 - - - Update GeoSite - - - 203, 22 - - - Update GeoIP - - - Magenta - - - 128, 53 - - - Check for updates - - - ImageAboveText - - - 6, 56 - - - 187, 22 - - - v2rayN Project - - - 187, 22 - - - V2Ray Website - - - 184, 6 + + menuExport2ClientConfig 187, 22 - - Language-[English] + + Informations - - 187, 22 + + 0 - - 语言-[中文简体] + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Magenta - - - 48, 53 - - - Help - - - ImageAboveText - - - Magenta - - - 89, 53 - - - Promotion - - - ImageAboveText + + 264, 22 6, 56 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - + + splitContainer1.Panel2 - + + 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 - - - 1 - - - tsMain - - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 5 - - - True - - - 88 - - - 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 - - - menuAddVlessServer - - - 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 - - - menuAddTrojanServer - - - 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.NotifyIcon, 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 - - toolStripSeparator1 + + Exit - - 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 - - - tsbTestMe - - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 menuClearServerStatistics - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator6 + + Scan QR code on the screen - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 56 - - menuExport2ClientConfig + + Close - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 264, 22 - - menuExport2ServerConfig + + 0, 21 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - menuExport2ShareUrl + + Import bulk URL from clipboard (Ctrl+V) - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - 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 - - - menuMsgBoxSelectAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopyAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxClear - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxAddRoutingRule - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxFilter - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslInboundInfo - - - 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 - - - toolSslRoutingRule - - - 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 - - - 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 - - - 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 - - - menuKeepClear - - - 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 - - - menuKeepNothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRoutings - - - 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 - - - menuServers2 - - - System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - System.Windows.Forms.ToolStripSeparator, 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 - - - menuUpdateSubscriptions - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuUpdateSubViaProxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Update XrayCore toolStripSeparator2 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - menuExit + + 192, 6 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 1 bgwScan - - System.ComponentModel.BackgroundWorker, System, 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSubUpdateViaProxy + + 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 - - tsbQRCodeSwitch + + statusStrip1 - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator8 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSetting - - + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbOptionSetting + + 0, 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - - tsbRoutingSetting + + 3, 17 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Clear All - - toolStripSeparator14 + + toolStripSeparator3 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + BackupGuiConfig - - tsbBackupGuiNConfig + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 355, 22 - - toolStripSeparator5 + + 355, 22 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 264, 22 - - tsbReload + + ImageAboveText - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator7 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdate - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateN - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateXrayCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuKeepClear toolStripSeparator15 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateGeoIP - - - 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 - - - tsbV2rayWebsite - - - 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 + + + 327, 17 + + + 88 + + + 137, 17 + + + 498, 17 + + + 17, 17 + + + 409, 17 + + + 603, 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 3a4674fe..c68b28d2 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -118,6 +118,26 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 301, 622 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + 300, 22 @@ -298,29 +318,15 @@ 服务器 - - 301, 622 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA - BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 - bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp - bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz - dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA - CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp - bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 - bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 - ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 - ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 服务器列表 + + 信息 + + + 222, 136 + 221, 22 @@ -339,6 +345,12 @@ 复制所有 + + 221, 22 + + + 清除所有 + 221, 22 @@ -351,14 +363,17 @@ 设置信息过滤器 - - 222, 114 - 网速显示未启用 - - 信息 + + 261, 221 + + + 260, 22 + + + 系统代理 172, 22 @@ -378,12 +393,6 @@ 不改变系统代理 - - 260, 22 - - - 系统代理 - 260, 22 @@ -435,8 +444,11 @@ 退出 - - 261, 227 + + 61, 53 + + + 订阅 180, 22 @@ -456,18 +468,18 @@ 更新订阅(通过代理) - - 61, 53 - - - 订阅 - 52, 53 分享 + + 61, 53 + + + 设置 + 189, 22 @@ -480,6 +492,12 @@ 路由设置 + + 189, 22 + + + 全局热键设置 + 186, 6 @@ -489,12 +507,6 @@ 备份v2rayN配置文件 - - 61, 53 - - - 设置 - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -512,6 +524,12 @@ 重启服务 + + 85, 53 + + + 检查更新 + 168, 22 @@ -539,11 +557,11 @@ 168, 22 - - 85, 53 + + 69, 53 - - 检查更新 + + 帮助 v2rayN 项目 @@ -551,12 +569,6 @@ V2Ray 官网 - - 69, 53 - - - 帮助 - 68, 53 diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 499d1ec8..1895fcbb 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,10 +1,11 @@ -using System; +using NHotkey; +using NHotkey.WindowsForms; +using System; using System.Drawing; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; -using v2rayN.Base; using v2rayN.Mode; namespace v2rayN.Handler @@ -12,7 +13,7 @@ namespace v2rayN.Handler public sealed class MainFormHandler { private static readonly Lazy instance = new Lazy(() => new MainFormHandler()); - Action _updateUI; + //Action _updateUI; //private DownloadHandle downloadHandle2; //private Config _config; @@ -218,11 +219,10 @@ namespace v2rayN.Handler public void UpdateTask(Config config, Action update) { - _updateUI = update; - Task.Run(() => UpdateTaskRun(config)); + Task.Run(() => UpdateTaskRun(config, update)); } - private void UpdateTaskRun(Config config) + private void UpdateTaskRun(Config config, Action update) { var updateHandle = new UpdateHandle(); while (true) @@ -236,7 +236,7 @@ namespace v2rayN.Handler updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => { - _updateUI(false, msg); + update(false, msg); if (success) Utils.SaveLog("geosite" + msg); }); @@ -245,7 +245,7 @@ namespace v2rayN.Handler updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) => { - _updateUI(false, msg); + update(false, msg); if (success) Utils.SaveLog("geoip" + msg); }); @@ -253,5 +253,49 @@ namespace v2rayN.Handler Thread.Sleep(1000 * 3600 * config.autoUpdateInterval); } } + + public void RegisterGlobalHotkey(Config config, EventHandler handler, Action update) + { + if (config.globalHotkeys == null) + { + return; + } + + foreach (var item in config.globalHotkeys) + { + if (item.KeyCode == null) + { + continue; + } + + Keys keys = (Keys)item.KeyCode; + if (item.Control) + { + keys |= Keys.Control; + } + if (item.Alt) + { + keys |= Keys.Alt; + } + if (item.Shift) + { + keys |= Keys.Shift; + } + + try + { + HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), keys, handler); + var msg = string.Format(UIRes.I18N("RegisterGlobalHotkeySuccessfully"), $"{item.eGlobalHotkey.ToString()} = {keys}"); + update(false, msg); + } + catch (Exception ex) + { + var msg = string.Format(UIRes.I18N("RegisterGlobalHotkeyFailed"), $"{item.eGlobalHotkey.ToString()} = {keys}", ex.Message); + update(false, msg); + Utils.SaveLog(msg); + } + } + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 6293fcc7..f940cf84 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Windows.Forms; using v2rayN.Base; @@ -147,7 +148,7 @@ namespace v2rayN.Mode { get; set; } - + #endregion #region other entities @@ -200,6 +201,11 @@ namespace v2rayN.Mode get; set; } + public List globalHotkeys + { + get; set; + } + #endregion #region function @@ -404,7 +410,7 @@ namespace v2rayN.Mode } return vmess.FindIndex(it => it.indexId == indexId); } - + #endregion } @@ -822,4 +828,19 @@ namespace v2rayN.Mode get; set; } } + + [Serializable] + public class KeyEventItem + { + public EGlobalHotkey eGlobalHotkey { get; set; } + + public bool Alt { get; set; } + + public bool Control { get; set; } + + public bool Shift { get; set; } + + public Keys? KeyCode { get; set; } + + } } diff --git a/v2rayN/v2rayN/Mode/EGlobalHotkey.cs b/v2rayN/v2rayN/Mode/EGlobalHotkey.cs new file mode 100644 index 00000000..de7cd336 --- /dev/null +++ b/v2rayN/v2rayN/Mode/EGlobalHotkey.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum EGlobalHotkey + { + ShowForm = 0, + SystemProxyClear = 1, + SystemProxySet = 2, + SystemProxyUnchanged = 3, + } +} diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index fa3511a5..53145d83 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -771,6 +771,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 + /// + internal static string RegisterGlobalHotkeyFailed { + get { + return ResourceManager.GetString("RegisterGlobalHotkeyFailed", resourceCulture); + } + } + + /// + /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 + /// + internal static string RegisterGlobalHotkeySuccessfully { + get { + return ResourceManager.GetString("RegisterGlobalHotkeySuccessfully", resourceCulture); + } + } + /// /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 638172c8..4c3ca750 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -439,4 +439,10 @@ *Kcp seed + + Global hotkey {0} registered failed, reason {1} + + + Global hotkey {0} registered successfully + \ 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 b8466714..db8c9970 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -439,4 +439,10 @@ *Kcp seed + + 注册全局热键 {0} 失败,原因 {1} + + + 注册全局热键 {0} 成功 + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 202d3e56..70b76468 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -137,6 +137,12 @@ RoutingRuleSettingDetailsForm.cs + + Form + + + GlobalHotkeySettingForm.cs + Form @@ -204,6 +210,7 @@ Component + @@ -308,6 +315,9 @@ BaseServerForm.cs Designer + + GlobalHotkeySettingForm.cs + MainForm.cs Designer @@ -337,6 +347,10 @@ RoutingRuleSettingDetailsForm.cs Designer + + GlobalHotkeySettingForm.cs + Designer + RoutingRuleSettingForm.cs Designer @@ -490,10 +504,10 @@ 3.19.4 - 2.43.0 + 2.44.0 - 2.43.0 + 2.44.0 runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -503,6 +517,12 @@ 13.0.1 + + 2.1.0 + + + 2.1.0 + 0.16.8 From 03ea24f29b82853ab2622418b7dea745de30a17b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 5 Mar 2022 18:01:01 +0800 Subject: [PATCH 103/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 0120bdef..b105c5a3 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.34")] +[assembly: AssemblyFileVersion("4.35")] From bfdc0a2e77f738a44c2fd90805a805554966179e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 6 Mar 2022 20:24:35 +0800 Subject: [PATCH 104/252] Update MainForm.cs --- v2rayN/v2rayN/Forms/MainForm.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index dcc36de7..15bcc343 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -131,6 +131,7 @@ namespace v2rayN.Forms SysProxyHandle.UpdateSysProxy(config, true); } + StorageUI(); ConfigHandler.SaveConfig(ref config); statistics?.SaveToFile(); statistics?.Close(); @@ -170,7 +171,7 @@ namespace v2rayN.Forms switch (Utils.ToInt(e.Name)) { case (int)EGlobalHotkey.ShowForm: - ShowForm(); + if (this.ShowInTaskbar) HideForm(); else ShowForm(); break; case (int)EGlobalHotkey.SystemProxyClear: SetListenerType(ESysProxyType.ForcedClear); @@ -834,6 +835,7 @@ namespace v2rayN.Forms private void tsbClose_Click(object sender, EventArgs e) { + StorageUI(); HideForm(); //this.WindowState = FormWindowState.Minimized; } From 731db2541d29085078e4bf7075ed635c8f15e6c5 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 8 Mar 2022 18:28:39 +0800 Subject: [PATCH 105/252] load core async, remove Ssl3 --- v2rayN/v2rayN/Forms/MainForm.cs | 9 +++++++-- v2rayN/v2rayN/Tool/Utils.cs | 6 ++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 15bcc343..15733e9c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Drawing; using System.Text; using System.Text.RegularExpressions; +using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; @@ -463,7 +464,7 @@ namespace v2rayN.Forms /// /// 载入V2ray /// - private void LoadV2ray() + async Task LoadV2ray() { tsbReload.Enabled = false; @@ -471,7 +472,11 @@ namespace v2rayN.Forms { ClearMsg(); } - v2rayHandler.LoadV2ray(config); + await Task.Run(() => + { + v2rayHandler.LoadV2ray(config); + }); + Global.reloadV2ray = false; ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index dc28ce38..97e1934d 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -719,16 +719,14 @@ namespace v2rayN { if (enableSecurityProtocolTls13) { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 - | SecurityProtocolType.Tls + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; } else { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 - | SecurityProtocolType.Tls + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; } From 887dd8da3b37496adfe3f63e244e5144bac03d63 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 8 Mar 2022 18:29:04 +0800 Subject: [PATCH 106/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index b105c5a3..ee45935f 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.35")] +[assembly: AssemblyFileVersion("4.36")] From d42346d50053dc3498f8b15b988df61ce4fcada3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 13 Mar 2022 10:41:04 +0800 Subject: [PATCH 107/252] Add server group --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 7 +- v2rayN/v2rayN/Forms/AddServer3Form.cs | 10 +- v2rayN/v2rayN/Forms/AddServer4Form.cs | 10 +- v2rayN/v2rayN/Forms/AddServer5Form.cs | 6 +- v2rayN/v2rayN/Forms/AddServer6Form.cs | 8 +- v2rayN/v2rayN/Forms/AddServerForm.cs | 8 +- v2rayN/v2rayN/Forms/BaseServerForm.cs | 4 +- .../Forms/GroupSettingControl.Designer.cs | 86 + v2rayN/v2rayN/Forms/GroupSettingControl.cs | 59 + v2rayN/v2rayN/Forms/GroupSettingControl.resx | 243 ++ .../Forms/GroupSettingControl.zh-Hans.resx | 133 + .../v2rayN/Forms/GroupSettingForm.Designer.cs | 97 + v2rayN/v2rayN/Forms/GroupSettingForm.cs | 108 + v2rayN/v2rayN/Forms/GroupSettingForm.resx | 273 ++ .../Forms/GroupSettingForm.zh-Hans.resx | 132 + v2rayN/v2rayN/Forms/MainForm.Designer.cs | 220 +- v2rayN/v2rayN/Forms/MainForm.cs | 151 +- v2rayN/v2rayN/Forms/MainForm.resx | 2813 +++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 131 +- v2rayN/v2rayN/Forms/QRCodeControl.cs | 10 +- .../Forms/RoutingSettingForm.Designer.cs | 79 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 8 + v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 2112 +++++++------ .../Forms/RoutingSettingForm.zh-Hans.resx | 111 +- .../Forms/SubSettingControl.Designer.cs | 19 + v2rayN/v2rayN/Forms/SubSettingControl.cs | 22 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 131 +- .../Forms/SubSettingControl.zh-Hans.resx | 6 + v2rayN/v2rayN/Forms/SubSettingForm.resx | 8 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 464 ++- v2rayN/v2rayN/Handler/MainFormHandler.cs | 36 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 14 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 47 +- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 2 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 3 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 241 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 3 +- v2rayN/v2rayN/Mode/Config.cs | 315 +- v2rayN/v2rayN/Mode/ServerTestItem.cs | 4 - v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 + v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + v2rayN/v2rayN/Sample/SampleServerConfig.txt | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 12 + v2rayN/v2rayN/v2rayN.csproj | 28 + 45 files changed, 4843 insertions(+), 3348 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.resx create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 999b0c25..012f3039 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer2Form : BaseServerForm - { + { public AddServer2Form() { @@ -15,7 +15,7 @@ namespace v2rayN.Forms private void AddServer2Form_Load(object sender, EventArgs e) { - if (EditIndex >= 0) + if (vmessItem != null) { BindingServer(); } @@ -30,7 +30,6 @@ namespace v2rayN.Forms /// private void BindingServer() { - vmessItem = config.vmess[EditIndex]; txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; txtAddress.ReadOnly = true; @@ -55,7 +54,7 @@ namespace v2rayN.Forms } vmessItem.remarks = remarks; - if (ConfigHandler.EditCustomServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.EditCustomServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index e4920b37..b300df46 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer3Form : BaseServerForm - { + { public AddServer3Form() { @@ -16,14 +16,14 @@ namespace v2rayN.Forms private void AddServer3Form_Load(object sender, EventArgs e) { cmbSecurity.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -89,7 +89,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } @@ -101,7 +101,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; - } + } } } diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs index 66d63999..800eaf7d 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer4Form : BaseServerForm - { + { public AddServer4Form() { @@ -15,14 +15,14 @@ namespace v2rayN.Forms private void AddServer4Form_Load(object sender, EventArgs e) { - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -77,7 +77,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddSocksServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddSocksServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } @@ -90,7 +90,7 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } - + } } diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 7635e839..5c1d747a 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -17,14 +17,14 @@ namespace v2rayN.Forms { cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); transportControl.AllowXtls = true; - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -94,7 +94,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddVlessServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs index 70c60443..7b0abb05 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -16,14 +16,14 @@ namespace v2rayN.Forms { cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); transportControl.AllowXtls = true; - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -52,7 +52,7 @@ namespace v2rayN.Forms txtPort.Text = ""; txtId.Text = ""; cmbFlow.Text = ""; - txtRemarks.Text = ""; + txtRemarks.Text = ""; transportControl.ClearServer(vmessItem); } @@ -89,7 +89,7 @@ namespace v2rayN.Forms vmessItem.flow = flow; vmessItem.remarks = remarks; - if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddTrojanServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 02223070..57b5871f 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -16,14 +16,14 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -58,7 +58,7 @@ namespace v2rayN.Forms transportControl.ClearServer(vmessItem); } - + private void btnOK_Click(object sender, EventArgs e) { string address = txtAddress.Text; @@ -93,7 +93,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.cs b/v2rayN/v2rayN/Forms/BaseServerForm.cs index 84711727..e68198fe 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.cs +++ b/v2rayN/v2rayN/Forms/BaseServerForm.cs @@ -6,8 +6,8 @@ namespace v2rayN.Forms { public partial class BaseServerForm : BaseForm { - public int EditIndex { get; set; } - protected VmessItem vmessItem = null; + public VmessItem vmessItem = null; + public string groupId; public BaseServerForm() { diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs new file mode 100644 index 00000000..239057e5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs @@ -0,0 +1,86 @@ +namespace v2rayN.Forms +{ + partial class GroupSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingControl)); + this.grbMain = new System.Windows.Forms.GroupBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.grbMain.SuspendLayout(); + this.SuspendLayout(); + // + // grbMain + // + resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.btnRemove); + this.grbMain.Controls.Add(this.txtRemarks); + this.grbMain.Controls.Add(this.label2); + this.grbMain.Name = "grbMain"; + this.grbMain.TabStop = false; + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // GroupSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.grbMain); + this.Name = "GroupSettingControl"; + this.Load += new System.EventHandler(this.GroupSettingControl_Load); + this.grbMain.ResumeLayout(false); + this.grbMain.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grbMain; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnRemove; + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.cs new file mode 100644 index 00000000..ac10087a --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.cs @@ -0,0 +1,59 @@ +using System; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class GroupSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public GroupItem groupItem + { + get; set; + } + + public GroupSettingControl() + { + InitializeComponent(); + } + + private void GroupSettingControl_Load(object sender, EventArgs e) + { + this.Height = grbMain.Height; + BindingSub(); + } + + private void BindingSub() + { + if (groupItem != null) + { + txtRemarks.Text = groupItem.remarks.ToString(); + } + } + private void EndBindingSub() + { + if (groupItem != null) + { + groupItem.remarks = txtRemarks.Text.TrimEx(); + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (groupItem != null) + { + groupItem.remarks = string.Empty; + } + + OnButtonClicked?.Invoke(sender, e); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.resx new file mode 100644 index 00000000..c8761f6e --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.resx @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 10 + + + + 6, 12 + + + 0 + + + 292, 21 + + + 525, 21 + + + 127, 21 + + + grbMain + + + 12, 25 + + + 24 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + GroupSettingControl + + + grbMain + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + label2 + + + 75, 23 + + + 0, 0 + + + 619, 61 + + + Remarks + + + grbMain + + + Group details + + + + NoControl + + + 1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 47, 12 + + + txtRemarks + + + 0 + + + btnRemove + + + Fill + + + 10 + + + True + + + NoControl + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + $this + + + 619, 61 + + + Remove + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx new file mode 100644 index 00000000..c68bf863 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 移除 + + + + 29, 12 + + + 备注 + + + 分组详情 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs new file mode 100644 index 00000000..1eedb2ee --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs @@ -0,0 +1,97 @@ +namespace v2rayN.Forms +{ + partial class GroupSettingForm + { + /// + /// 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(GroupSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2.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); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // GroupSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "GroupSettingForm"; + this.Load += new System.EventHandler(this.GroupSettingForm_Load); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs new file mode 100644 index 00000000..11e5d7ad --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class GroupSettingForm : BaseForm + { + List lstControls = new List(); + + public GroupSettingForm() + { + InitializeComponent(); + } + + private void GroupSettingForm_Load(object sender, EventArgs e) + { + if (config.groupItem == null) + { + config.groupItem = new List(); + } + + RefreshGroupsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshGroupsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.groupItem.Count - 1; k >= 0; k--) + { + GroupItem item = config.groupItem[k]; + if (Utils.IsNullOrEmpty(item.remarks)) + { + if (!Utils.IsNullOrEmpty(item.id)) + { + ConfigHandler.RemoveGroupItem(ref config, item.id); + } + config.groupItem.RemoveAt(k); + } + } + + foreach (GroupItem item in config.groupItem) + { + GroupSettingControl control = new GroupSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.groupItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshGroupsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (config.groupItem.Count <= 0) + { + AddGroup(); + } + + if (ConfigHandler.SaveGroupItem(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddGroup(); + + RefreshGroupsView(); + } + + + private void AddGroup() + { + GroupItem groupItem = new GroupItem + { + id = string.Empty, + remarks = "remarks" + }; + config.groupItem.Add(groupItem); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.resx new file mode 100644 index 00000000..043f3152 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.resx @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + NoControl + + + + 448, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 0 + + + 614, 351 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 355, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 351 + + + 614, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 614, 411 + + + Group settings + + + GroupSettingForm + + + 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/GroupSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx new file mode 100644 index 00000000..0d4dba82 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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) + + + 添加(&A) + + + 确定(&O) + + + 服务器分组设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 425eebe3..914921d4 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -65,6 +65,7 @@ this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.tabGroup = new System.Windows.Forms.TabControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); @@ -114,6 +115,7 @@ this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbGlobalHotkeySetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbGroupSetting = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.tsbBackupGuiNConfig = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); @@ -161,19 +163,18 @@ // // scMain.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); + this.scMain.Panel1.Controls.Add(this.tabGroup); // // scMain.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); this.scMain.Panel2.Controls.Add(this.qrCodeControl); this.scMain.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -192,7 +193,6 @@ // // 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, @@ -227,196 +227,205 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // // tsbServer // - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // + // tabGroup + // + resources.ApplyResources(this.tabGroup, "tabGroup"); + this.tabGroup.Name = "tabGroup"; + this.tabGroup.SelectedIndex = 0; + this.tabGroup.SelectedIndexChanged += new System.EventHandler(this.tabGroup_SelectedIndexChanged); + // // qrCodeControl // resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); @@ -429,35 +438,33 @@ // // splitContainer1.Panel1 // - resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // // splitContainer1.Panel2 // - resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.scMain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // gbMsgTitle // - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Controls.Add(this.txtMsgBox); this.gbMsgTitle.Controls.Add(this.ssMain); + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Name = "gbMsgTitle"; this.gbMsgTitle.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; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + 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; @@ -465,7 +472,6 @@ // // cmsMsgBox // - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, @@ -474,46 +480,46 @@ this.menuMsgBoxAddRoutingRule, this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxClear // - resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); this.menuMsgBoxClear.Name = "menuMsgBoxClear"; + resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); // // menuMsgBoxAddRoutingRule // - resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // menuMsgBoxFilter // - resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); // // ssMain // - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslInboundInfo, @@ -522,13 +528,14 @@ this.toolSslBlank2, this.toolSslServerSpeed, this.toolSslBlank4}); + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslInboundInfo // - resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); this.toolSslInboundInfo.Name = "toolSslInboundInfo"; + resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); // // toolSslBlank1 // @@ -538,13 +545,13 @@ // // toolSslRoutingRule // - resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); // // toolSslBlank2 // - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.Name = "toolSslBlank2"; + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.Spring = true; // // toolSslServerSpeed @@ -555,19 +562,19 @@ // // toolSslBlank4 // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuRoutings, @@ -587,87 +594,87 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - resources.ApplyResources(this.menuRoutings, "menuRoutings"); this.menuRoutings.Name = "menuRoutings"; + resources.ApplyResources(this.menuRoutings, "menuRoutings"); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); // // menuServers2 // - resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.BackColor = System.Drawing.SystemColors.Window; this.menuServers2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.menuServers2.DropDownWidth = 500; + resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.Name = "menuServers2"; // // toolStripSeparator13 // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); this.toolStripSeparator13.Name = "toolStripSeparator13"; + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // // menuUpdateSubViaProxy // - resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy"; + resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); this.menuUpdateSubViaProxy.Click += new System.EventHandler(this.menuUpdateSubViaProxy_Click); // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -683,7 +690,6 @@ // // 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, @@ -701,116 +707,124 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); // // tsbSub // - resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbSubSetting, this.tsbSubUpdate, this.tsbSubUpdateViaProxy}); this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; + resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.Name = "tsbSub"; // // tsbSubSetting // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); // // tsbSubUpdateViaProxy // - resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy"; + resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); this.tsbSubUpdateViaProxy.Click += new System.EventHandler(this.tsbSubUpdateViaProxy_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; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); // // tsbSetting // - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.tsbGlobalHotkeySetting, + this.tsbGroupSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // tsbGlobalHotkeySetting // - resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting"); this.tsbGlobalHotkeySetting.Name = "tsbGlobalHotkeySetting"; + resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting"); this.tsbGlobalHotkeySetting.Click += new System.EventHandler(this.tsbGlobalHotkeySetting_Click); // + // tsbGroupSetting + // + this.tsbGroupSetting.Name = "tsbGroupSetting"; + resources.ApplyResources(this.tsbGroupSetting, "tsbGroupSetting"); + this.tsbGroupSetting.Click += new System.EventHandler(this.tsbGroupSetting_Click); + // // toolStripSeparator14 // - resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); this.toolStripSeparator14.Name = "toolStripSeparator14"; + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); // // tsbBackupGuiNConfig // - resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // + this.tsbReload.Image = global::v2rayN.Properties.Resources.restart; resources.ApplyResources(this.tsbReload, "tsbReload"); this.tsbReload.Name = "tsbReload"; this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click); // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, @@ -819,51 +833,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator15 // - resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); this.toolStripSeparator15.Name = "toolStripSeparator15"; + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); // // tsbCheckUpdateGeoSite // - resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; + resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); // // tsbCheckUpdateGeoIP // - resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; + resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -871,52 +885,54 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "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 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // + this.tsbClose.Image = global::v2rayN.Properties.Resources.minimize; resources.ApplyResources(this.tsbClose, "tsbClose"); this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); @@ -1067,6 +1083,8 @@ private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; + private System.Windows.Forms.TabControl tabGroup; + private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 15733e9c..820ffae2 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -11,15 +11,18 @@ using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; using v2rayN.Tool; +using System.Linq; namespace v2rayN.Forms { public partial class MainForm : BaseForm { private V2rayHandler v2rayHandler; - private List lvSelecteds = new List(); + private List lvSelecteds = new List(); private StatisticsHandler statistics = null; private string MsgFilter = string.Empty; + private List lstVmess = null; + private string groupId = string.Empty; #region Window 事件 @@ -46,6 +49,7 @@ namespace v2rayN.Forms Environment.Exit(0); return; } + ConfigHandler.InitBuiltinRouting(ref config); MainFormHandler.Instance.BackupGuiNConfig(config, true); v2rayHandler = new V2rayHandler(); @@ -72,6 +76,7 @@ namespace v2rayN.Forms private void MainForm_Shown(object sender, EventArgs e) { + InitGroupView(); InitServersView(); RefreshServers(); RefreshRoutingsMenu(); @@ -196,8 +201,10 @@ namespace v2rayN.Forms /// private void RefreshServers() { + lstVmess = config.vmess.Where(it => it.groupId == groupId).OrderBy(it => it.sort).ToList(); + + ConfigHandler.SetDefaultServer(config, lstVmess); RefreshServersView(); - //lvServers.AutoResizeColumns(); RefreshServersMenu(); } @@ -247,24 +254,24 @@ namespace v2rayN.Forms lvServers.BeginUpdate(); lvServers.Items.Clear(); - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { string def = string.Empty; string totalUp = string.Empty, totalDown = string.Empty, todayUp = string.Empty, todayDown = string.Empty; - if (config.index.Equals(k)) + + VmessItem item = lstVmess[k]; + if (config.IsActiveNode(item)) { def = "√"; } - VmessItem item = config.vmess[k]; - bool stats = statistics != null && statistics.Enable; if (stats) { - ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.getItemId()); + ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.indexId); if (sItem != null) { totalUp = Utils.HumanFy(sItem.totalUp); @@ -295,7 +302,7 @@ namespace v2rayN.Forms { lvItem.BackColor = Color.WhiteSmoke; } - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { //lvItem.Checked = true; lvItem.ForeColor = Color.DodgerBlue; @@ -324,37 +331,37 @@ namespace v2rayN.Forms menuServers.Visible = false; menuServers2.Visible = false; - if (config.vmess.Count > 20) + if (lstVmess.Count > 20) { - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { - VmessItem item = config.vmess[k]; + VmessItem item = lstVmess[k]; string name = item.getSummary(); - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { name = $"√ {name}"; } menuServers2.Items.Add(name); } - menuServers2.SelectedIndex = config.index; + menuServers2.SelectedIndex = lstVmess.FindIndex(it => it.indexId == config.indexId); menuServers2.SelectedIndexChanged += MenuServers2_SelectedIndexChanged; menuServers2.Visible = true; } else { List lst = new List(); - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { - VmessItem item = config.vmess[k]; + VmessItem item = lstVmess[k]; string name = item.getSummary(); ToolStripMenuItem ts = new ToolStripMenuItem(name) { Tag = k }; - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { ts.Checked = true; } @@ -439,7 +446,7 @@ namespace v2rayN.Forms 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) + if (ConfigHandler.SortServers(ref config, ref lstVmess, (EServerColName)e.Column, asc) != 0) { return; } @@ -457,6 +464,40 @@ namespace v2rayN.Forms } } + + private void InitGroupView() + { + tabGroup.TabPages.Clear(); + + foreach (var item in config.groupItem) + { + var tabPage2 = new TabPage($" {item.remarks} "); + tabPage2.Name = item.id; + tabGroup.TabPages.Add(tabPage2); + } + + string title = $" {UIRes.I18N("UngroupedServers")} "; + var tabPage = new TabPage(title); + tabPage.Name = "Ungrouped"; + tabGroup.TabPages.Add(tabPage); + + tabGroup.SelectedIndex = tabGroup.TabPages.Count - 1; + } + + private void tabGroup_SelectedIndexChanged(object sender, EventArgs e) + { + if (tabGroup.SelectedIndex < 0) + { + return; + } + groupId = string.Empty; + if (tabGroup.SelectedIndex < config.groupItem.Count) + { + groupId = config.groupItem[tabGroup.SelectedIndex].id; + } + + RefreshServers(); + } #endregion #region v2ray 操作 @@ -520,7 +561,7 @@ namespace v2rayN.Forms { return; } - qrCodeControl.showQRCode(index, config); + qrCodeControl.showQRCode(lstVmess[index]); } private void lvServers_DoubleClick(object sender, EventArgs e) @@ -530,7 +571,7 @@ namespace v2rayN.Forms { return; } - ShowServerForm(config.vmess[index].configType, index); + ShowServerForm(lstVmess[index].configType, index); } private void ShowServerForm(int configType, int index) { @@ -556,7 +597,8 @@ namespace v2rayN.Forms fm = new AddServer2Form(); break; } - fm.EditIndex = index; + fm.vmessItem = index >= 0 ? lstVmess[index] : null; + fm.groupId = groupId; if (fm.ShowDialog() == DialogResult.OK) { RefreshServers(); @@ -646,7 +688,7 @@ namespace v2rayN.Forms return; } - ConfigHandler.RemoveServer(ref config, lvSelecteds); + ConfigHandler.RemoveServer(config, lvSelecteds); RefreshServers(); LoadV2ray(); @@ -654,9 +696,9 @@ namespace v2rayN.Forms private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) { - int oldCount = config.vmess.Count; - ConfigHandler.DedupServerList(ref config); - int newCount = config.vmess.Count; + int oldCount = lstVmess.Count; + ConfigHandler.DedupServerList(ref config, ref lstVmess); + int newCount = lstVmess.Count; RefreshServers(); LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); @@ -669,7 +711,7 @@ namespace v2rayN.Forms { return; } - if (ConfigHandler.CopyServer(ref config, index) == 0) + if (ConfigHandler.CopyServer(ref config, lstVmess[index]) == 0) { RefreshServers(); } @@ -745,13 +787,13 @@ namespace v2rayN.Forms private void menuExport2ClientConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ClientConfig(index, config); + MainFormHandler.Instance.Export2ClientConfig(lstVmess[index], config); } private void menuExport2ServerConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ServerConfig(index, config); + MainFormHandler.Instance.Export2ServerConfig(lstVmess[index], config); } private void menuExport2ShareUrl_Click(object sender, EventArgs e) @@ -759,9 +801,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (int v in lvSelecteds) + foreach (var v in lvSelecteds) { - string url = ShareHandler.GetShareUrl(config, v); + string url = ShareHandler.GetShareUrl(v); if (Utils.IsNullOrEmpty(url)) { continue; @@ -782,9 +824,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (int v in lvSelecteds) + foreach (var v in lvSelecteds) { - string url = ShareHandler.GetShareUrl(config, v); + string url = ShareHandler.GetShareUrl(v); if (Utils.IsNullOrEmpty(url)) { continue; @@ -832,6 +874,17 @@ namespace v2rayN.Forms } + private void tsbGroupSetting_Click(object sender, EventArgs e) + { + var fm = new GroupSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + InitGroupView(); + RefreshServers(); + } + + } + private void tsbReload_Click(object sender, EventArgs e) { Global.reloadV2ray = true; @@ -857,7 +910,7 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("PleaseSelectServer")); return -1; } - if (ConfigHandler.SetDefaultServer(ref config, index) == 0) + if (ConfigHandler.SetDefaultServer(ref config, lstVmess[index]) == 0) { RefreshServers(); LoadV2ray(); @@ -884,7 +937,7 @@ namespace v2rayN.Forms index = lvServers.SelectedIndices[0]; foreach (int i in lvServers.SelectedIndices) { - lvSelecteds.Add(i); + lvSelecteds.Add(lstVmess[i]); } return index; } @@ -913,7 +966,7 @@ namespace v2rayN.Forms return; } - if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) + if (ConfigHandler.AddCustomServer(ref config, fileName, groupId) == 0) { RefreshServers(); //LoadV2ray(); @@ -946,7 +999,7 @@ namespace v2rayN.Forms private void menuAddServers_Click(object sender, EventArgs e) { string clipboardData = Utils.GetClipboardData(); - int ret = MainFormHandler.Instance.AddBatchServers(config, clipboardData); + int ret = MainFormHandler.Instance.AddBatchServers(config, clipboardData, "", groupId); if (ret > 0) { RefreshServers(); @@ -1114,27 +1167,35 @@ namespace v2rayN.Forms #endregion #region 后台测速 - + private void SetTestResult(string indexId, string txt) + { + int k = lstVmess.FindIndex(it => it.indexId == indexId); + if (k >= 0 && k < lvServers.Items.Count) + { + lstVmess[k].testResult = txt; + lvServers.Items[k].SubItems["testResult"].Text = txt; + } + } private void SetTestResult(int k, string txt) { if (k < lvServers.Items.Count) { - config.vmess[k].testResult = txt; + lstVmess[k].testResult = txt; lvServers.Items[k].SubItems["testResult"].Text = txt; } } private void ClearTestResult() { - foreach (int s in lvSelecteds) + foreach (var s in lvSelecteds) { - SetTestResult(s, ""); + SetTestResult(s.indexId, ""); } } - private void UpdateSpeedtestHandler(int index, string msg) + private void UpdateSpeedtestHandler(string indexId, string msg) { lvServers.Invoke((MethodInvoker)delegate { - SetTestResult(index, msg); + SetTestResult(indexId, msg); }); } @@ -1147,9 +1208,9 @@ namespace v2rayN.Forms 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++) + for (int i = 0; i < lstVmess.Count; i++) { - int index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); + int index = statistics.FindIndex(item_ => item_.itemId == lstVmess[i].indexId); if (index != -1) { lvServers.Invoke((MethodInvoker)delegate @@ -1213,7 +1274,7 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("PleaseSelectServer")); return; } - if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) + if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, eMove) == 0) { //TODO: reload is not good. RefreshServers(); @@ -1381,7 +1442,7 @@ namespace v2rayN.Forms } else { - int ret = MainFormHandler.Instance.AddBatchServers(config, result); + int ret = MainFormHandler.Instance.AddBatchServers(config, result, "", groupId); if (ret > 0) { RefreshServers(); diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 82b8d55d..b7d19fed 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,785 +117,215 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - + + 3, 17 + + + 327, 17 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VMess] server - - 355, 22 - - - 97, 53 - - + 355, 22 Add [VLESS] server - - 0 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [Shadowsocks] server - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Restart service - - - 200, 25 - - - tsbSubSetting - - - 264, 22 - - - toolSslInboundInfo - - - gbMsgTitle - - - menuMoveUp + + 355, 22 Add [Socks] server - - 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 - - - menuUpdateSubViaProxy - - - - ImageAboveText - - - 227, 22 - - - 语言-[中文简体] - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - tsbHelp - - - System.Windows.Forms.ToolStripMenuItem, 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 - - - toolStripSeparator6 - 355, 22 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 99, 53 - - - Update subscriptions - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - 67, 53 - - - tsbSetting - - - toolSslBlank2 - - - 355, 22 - - - 355, 22 - - - tsbCheckUpdateN - - - 45, 53 - - - Do not change system proxy - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - Update v2flyCore - - - Update GeoSite - - - Magenta - - - menuMsgBoxAddRoutingRule - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - Share - - - 227, 22 - - - tsbQRCodeSwitch - - - Add Routing Rule (Ctrl+V) - - - 355, 22 - - - Horizontal - - - Export selected server for client configuration - - - tsbRoutingSetting - - - 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 - - - 227, 22 - - - Export selected server for server configuration - - - splitContainer1 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 128, 53 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Test servers real delay (Ctrl+R) - - - menuTcpingServer - - - ImageAboveText - - - toolSslRoutingRule - - - 356, 622 - - - tsbGlobalHotkeySetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - 355, 22 - - - toolStripSeparator1 - - - 355, 22 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - 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 - - - menuPingServer - - - 200, 6 - - - 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 - - - - System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Export subscription (base64) share to clipboard - - - 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 - - - 250, 21 - - - menuAddCustomServer - - - menuMoveDown - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Import bulk URL from clipboard - - - gbMsgTitle - - - Move to bottom (B) - - - Move to top (T) - - - 6, 12 - - - 48, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copy All - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - Fill - - - 0 - - - 686, 280 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 195, 22 - - - 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 - - - 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 - - - menuAddServers2 - - - Fill - - - tsbServer - - - Add [VMess] server - - - $this - - - 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 - - - 300, 21 - - - toolStripSeparator5 - - - 182, 22 - - - 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 - - - tsbPromotion - - - 256, 280 - - - 355, 22 - - - 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 - - - 352, 6 - - - groupBox1 - - - 300, 21 - - - 2 - - - 182, 22 - - - Clear all service statistics - - - scMain.Panel2 - - - 195, 22 - - - 3 - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - ssMain - - - 686 - - - splitContainer1 - - - 265, 221 - - - 243, 22 - - - menuUpdateSubscriptions - - - scMain - - - Check for updates - - - tsbCheckUpdateXrayCore - - - Copy (Ctrl+C) - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 182, 22 - - - GlobalHotkeySetting - - - scMain - - - 203, 22 - - - 2 - - - 952, 56 - - - tsbReload - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Help - - - menuMsgBoxSelectAll - - - menuSelectAll - - - splitContainer1.Panel1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - 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 - - - menuServers2 - - - 50 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - menuExport2ShareUrl - - - menuMsgBoxClear - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - v2rayN (this software) - - - tsbOptionSetting - - - Magenta - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1.Panel1 - - - 0, 0 - - - 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 - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - txtMsgBox - - - toolSslBlank4 - - - menuAddTrojanServer - - - 355, 22 - - - 80, 21 - - - v2rayN - - - Language-[English] - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 264, 22 - - - menuScanScreen2 - - - 0 - - - Fill - - - Routing - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Add [Trojan] server - - 195, 22 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - ImageAboveText + + 355, 22 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Import bulk URL from clipboard (Ctrl+V) - - Set message filters + + 355, 22 - - 952, 593 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Scan QR code on the screen (Ctrl+S) 352, 6 - + + 355, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + Remove duplicate servers + + + 355, 22 + + + Clone selected server + + + 355, 22 + + + Set as active server (Enter) + + + 352, 6 + + + 355, 22 + + + Move to top (T) + + + 355, 22 + + + Up (U) + + + 355, 22 + + + Down (D) + + + 355, 22 + + + Move to bottom (B) + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Test current service status + + + 355, 22 + + + Clear all service statistics + + + 352, 6 + + + 355, 22 + + + Export selected server for client configuration + + + 355, 22 + + + Export selected server for server configuration + + + 355, 22 + + + Export share URLs to clipboard (Ctrl+C) + + + 355, 22 + + + Export subscription (base64) share to clipboard + + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + + + 356, 622 + + + cmsLv + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - V2Ray Website - - + Fill - - No - - - 1 - - - cmsMsgBox - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OptionSetting - - - menuMoveTop - - - tsbCheckUpdateCore - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -913,770 +343,1355 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 300 + + 0, 20 - - tsbCheckUpdateGeoIP + + 686, 260 - - menuScanScreen - - - ImageAboveText - - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - Fill - - - toolSslBlank1 - - - tsbSubUpdate - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsMain - - - 5 - - - SPEED Disabled - - - 355, 22 - - - Promotion - - - menuSysAgentMode - - - menuKeepNothing - - - 952, 527 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - 227, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - cmsMain - - - 264, 22 - - - menuServers - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxFilter - - - 203, 22 - - - RoutingSetting - - - Standard - - - Update GeoIP - - - 3, 194 - - - True - - - 355, 22 - - - 195, 22 - - - Subscriptions - - - 952, 10 - - - Updates - - - 264, 22 - - - toolStripSeparator14 - - + + 0 - - toolStripSeparator8 - - - menuMsgBoxCopyAll - - - menuExport2ServerConfig - - - 89, 53 - - - 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.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 264, 22 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - Settings - - - menuCopyServer - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - groupBox1 - - - MainForm - - - toolStripSeparator9 - - - menuExit - - - 227, 22 - - - tsbSubUpdateViaProxy - - - False - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Servers list - lvServers - - menuRealPingServer - - - Magenta - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbV2rayWebsite - - - Magenta - - - 4, 4, 4, 4 - - - Magenta - - - 355, 22 - - - v2rayN Project - - - Servers - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - menuRoutings - - - 3 - - - 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 - - - menuSpeedServer - - - 355, 22 - - - menuRemoveServer - - - tsbBackupGuiNConfig - - - tsbTestMe - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 946, 177 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddVmessServer - - - scMain - - - Down (D) - - - 0 - - - 352, 6 - - - Magenta - - - 243, 22 - - - Remove selected servers (Delete) - - - 952, 223 - - - 355, 22 - - - tsbSub - - - Magenta - - - toolStripSeparator11 - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdate - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 227, 22 - - - Export share URLs to clipboard (Ctrl+C) - - - 243, 22 - - - 355, 22 - - - Server - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 300 - - - System.Windows.Forms.ToolStrip, 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 - - - Updates via proxy - - - 0 - - - $this - - - 0, 0 - - - qrCodeControl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Update subscriptions via proxy - - - Clear system proxy - - - 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 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 21 - - - 203, 22 - - - 184, 6 - - - splitContainer1.Panel2 - - - 0, 0 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null scMain.Panel1 - - Up (U) + + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Top - - notifyMain + + 0, 0 - - Set system proxy + + 686, 20 - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - MiddleRight + + tabGroup - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Select All (Ctrl+A) + + scMain.Panel1 - - 0, 66 - - - 100 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer + + 1 scMain.Panel1 - - 微软雅黑, 8pt + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 64, 53 + + scMain - - 228, 136 + + 0 - - 946, 26 + + Fill - - 5 + + 0, 0 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 4, 4, 4 - - 355, 22 + + 256, 280 - - Set as active server (Enter) + + 2 - - menuAddVlessServer + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scMain.Panel2 + + + 0 + + + scMain.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 1 + + + 100 946, 280 - - 6, 56 + + 686 - - Add [Shadowsocks] server + + 0 - - 261, 6 + + scMain - - 微软雅黑, 8pt + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + + 0 + + + Fill + + + 0, 66 + + + Horizontal + + + Fill + + + 0, 0 + + + 952, 300 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + splitContainer1 0 - - 261, 6 + + 603, 17 + + + 227, 22 - - Test current service status + + Select All (Ctrl+A) - - NoControl + + 227, 22 - - toolStripSeparator10 + + Copy (Ctrl+C) - - menuMoveBottom + + 227, 22 - - 355, 22 + + Copy All - - 1 + + 227, 22 - - Magenta + + Clear All - - InboundInfo + + 227, 22 - - 355, 22 + + Add Routing Rule (Ctrl+V) - - menuExport2ClientConfig + + 227, 22 - - 187, 22 + + Set message filters - - Informations + + 228, 136 + + + cmsMsgBox + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - 264, 22 + + Vertical - - 6, 56 + + 946, 177 + + + 3 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 0 + + + 228, 18 + + + 80, 21 + + + InboundInfo + + + 微软雅黑, 8pt + + + 300, 21 + + + 0, 21 + + + 300, 21 + + + False + + + 微软雅黑, 8pt + + + No + + + 250, 21 + + + SPEED Disabled + + + MiddleRight + + + 0, 21 + + + 3, 194 + + + 946, 26 + + + 0 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 1 + + + Fill + + + 0, 0 + + + 952, 223 + + + 3 + + + Informations + + + gbMsgTitle + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 splitContainer1.Panel2 - - System.Windows.Forms.ToolStripMenuItem, 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 + + + splitContainer1 + + + 1 + + + 952, 527 + + + 300 + + + 5 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 243, 22 + + + Clear system proxy + + + 243, 22 + + + Set system proxy + + + 243, 22 + + + Do not change system proxy + + + 264, 22 + + + System proxy + + + 264, 22 + + + Routing + + + 264, 22 + + + Server + + + Standard + + + 50 + + + 200, 25 + + + Server + + + 261, 6 + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Update subscriptions + + + 264, 22 + + + Update subscriptions via proxy + + + 261, 6 + + + 264, 22 + + + Exit + + + 265, 221 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 498, 17 + + + Top + + + 0, 56 + + + 952, 10 + + + 2 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 409, 17 + + + 6, 56 + + + 182, 22 + + + Settings + + + 182, 22 + + + Updates + + + 182, 22 + + + Updates via proxy + + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + + + Magenta + + + 45, 53 + + + Share + + + BottomCenter + + + ImageAboveText + + + 6, 56 + + + 195, 22 + + + OptionSetting + + + 195, 22 + + + RoutingSetting + + + 195, 22 + + + GlobalHotkeySetting + + + 195, 22 + + + GroupSetting + + + 192, 6 + + + 195, 22 + + + BackupGuiConfig + + + Magenta + + + 67, 53 + + + Settings + + + ImageAboveText + + + 6, 56 + + + BottomCenter + + + Magenta + + + 97, 53 + + + Restart service + + + ImageAboveText + + + 6, 56 + + + 203, 22 + + + v2rayN (this software) + + + 203, 22 + + + Update v2flyCore + + + 203, 22 + + + Update XrayCore + + + 200, 6 + + + 203, 22 + + + Update GeoSite + + + 203, 22 + + + Update GeoIP + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + + + 6, 56 + + + 187, 22 + + + v2rayN Project + + + 187, 22 + + + V2Ray Website + + + 184, 6 + + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] Magenta + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + + + 6, 56 + + + Magenta + 52, 53 - - System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Close + + + ImageAboveText + + + 0, 0 + + + 952, 56 + + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + 90 + + + 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 + + + menuAddVlessServer + + + 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 + + + menuAddTrojanServer + + + 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 - - Exit + + 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 + + + tsbTestMe + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 menuClearServerStatistics - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Scan QR code on the screen + + toolStripSeparator6 - - 0, 56 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Close + + menuExport2ClientConfig - - 264, 22 - - - 0, 21 - - - 0 - - - Import bulk URL from clipboard (Ctrl+V) - - - $this - - - Update XrayCore - - - toolStripSeparator2 - - - Add a custom configuration server - - - 192, 6 - - - 1 - - - bgwScan - - - 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 - - statusStrip1 + + 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 - - 0, 0 + + menuMsgBoxSelectAll - - Fill + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 17 + + menuMsgBoxCopy - - Clear All + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator3 + + menuMsgBoxCopyAll - - BackupGuiConfig + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - + + menuMsgBoxClear - - 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + menuMsgBoxAddRoutingRule - - 264, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ImageAboveText + + menuMsgBoxFilter - - System.Windows.Forms.StatusStrip, 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 + + + toolSslInboundInfo + + + 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 + + + toolSslRoutingRule + + + 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 + + + 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 + + + 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 menuKeepClear + + 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 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRoutings + + + 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 + + + menuServers2 + + + System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, 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 + + + menuUpdateSubscriptions + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubViaProxy + + + 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 + + + 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 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdateViaProxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbGlobalHotkeySetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbGroupSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator14 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbBackupGuiNConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolStripSeparator15 - - 228, 18 - - - True - - - 327, 17 - - - 88 - - - 137, 17 - - - 498, 17 - - - 17, 17 - - - 409, 17 - - - 603, 17 - + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoIP + + + 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 + + + tsbV2rayWebsite + + + 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 + \ 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 c68b28d2..97a5be43 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -118,26 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 301, 622 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA - BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 - bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp - bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz - dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA - CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp - bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 - bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 - ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 - ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 300, 22 @@ -318,14 +298,25 @@ 服务器 - - 服务器列表 + + 301, 622 - - 信息 - - - 222, 136 + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + 221, 22 @@ -363,17 +354,14 @@ 设置信息过滤器 + + 222, 136 + 网速显示未启用 - - 261, 221 - - - 260, 22 - - - 系统代理 + + 信息 172, 22 @@ -393,6 +381,12 @@ 不改变系统代理 + + 260, 22 + + + 系统代理 + 260, 22 @@ -444,11 +438,8 @@ 退出 - - 61, 53 - - - 订阅 + + 261, 221 180, 22 @@ -468,18 +459,18 @@ 更新订阅(通过代理) + + 61, 53 + + + 订阅 + 52, 53 分享 - - 61, 53 - - - 设置 - 189, 22 @@ -498,6 +489,12 @@ 全局热键设置 + + 189, 22 + + + 服务器分组设置 + 186, 6 @@ -507,16 +504,11 @@ 备份v2rayN配置文件 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - + + 61, 53 + + + 设置 76, 53 @@ -524,12 +516,6 @@ 重启服务 - - 85, 53 - - - 检查更新 - 168, 22 @@ -557,11 +543,11 @@ 168, 22 - - 69, 53 + + 85, 53 - - 帮助 + + 检查更新 v2rayN 项目 @@ -569,19 +555,18 @@ V2Ray 官网 + + 69, 53 + + + 帮助 + 68, 53 推广 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - - 76, 53 diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs index 855db30d..89e47cd1 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.cs +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -12,7 +12,7 @@ namespace v2rayN.Forms } private void QRCodeControl_Load(object sender, System.EventArgs e) { - txtUrl.MouseUp += txtUrl_MouseUp; + txtUrl.MouseUp += txtUrl_MouseUp; } void txtUrl_MouseUp(object sender, MouseEventArgs e) @@ -20,11 +20,11 @@ namespace v2rayN.Forms txtUrl.SelectAll(); } - public void showQRCode(int Index, Config config) + public void showQRCode(VmessItem item) { - if (Index >= 0) + if (item != null) { - string url = ShareHandler.GetShareUrl(config, Index); + string url = ShareHandler.GetShareUrl(item); if (Utils.IsNullOrEmpty(url)) { picQRCode.Image = null; @@ -32,7 +32,7 @@ namespace v2rayN.Forms return; } txtUrl.Text = url; - picQRCode.Image = QRCodeHelper.GetQRCode(url); + picQRCode.Image = QRCodeHelper.GetQRCode(url); } } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index d24ecee8..5deebb1a 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -45,6 +45,7 @@ this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportAdvancedRules = new System.Windows.Forms.ToolStripMenuItem(); this.MenuItemAdvanced = new System.Windows.Forms.ToolStripMenuItem(); this.menuServer = new System.Windows.Forms.MenuStrip(); this.MenuItemBasic = new System.Windows.Forms.ToolStripMenuItem(); @@ -70,6 +71,7 @@ this.txtBlockDomain = new System.Windows.Forms.TextBox(); this.tabPageRuleList = new System.Windows.Forms.TabPage(); this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); this.cmsLv.SuspendLayout(); @@ -92,24 +94,24 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.labRoutingTips); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // labRoutingTips // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.Name = "labRoutingTips"; // // btnOK @@ -121,22 +123,22 @@ // // panel1 // - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Controls.Add(this.cmbdomainMatcher); this.panel1.Controls.Add(this.label6); this.panel1.Controls.Add(this.chkenableRoutingAdvanced); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // // cmbdomainMatcher // - resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher"); this.cmbdomainMatcher.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbdomainMatcher.FormattingEnabled = true; this.cmbdomainMatcher.Items.AddRange(new object[] { resources.GetString("cmbdomainMatcher.Items"), resources.GetString("cmbdomainMatcher.Items1")}); + resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher"); this.cmbdomainMatcher.Name = "cmbdomainMatcher"; // // label6 @@ -160,107 +162,115 @@ // // 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"; // // 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.menuAdd, this.menuRemove, this.menuSelectAll, - this.menuSetDefaultRouting}); + this.menuSetDefaultRouting, + this.toolStripSeparator1, + this.menuImportAdvancedRules}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.MenuItemAdvanced; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuSetDefaultRouting // - resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; + resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); // + // menuImportAdvancedRules + // + this.menuImportAdvancedRules.Name = "menuImportAdvancedRules"; + resources.ApplyResources(this.menuImportAdvancedRules, "menuImportAdvancedRules"); + this.menuImportAdvancedRules.Click += new System.EventHandler(this.menuImportAdvancedRules_Click); + // // MenuItemAdvanced // - resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); this.MenuItemAdvanced.DropDown = this.cmsLv; this.MenuItemAdvanced.Name = "MenuItemAdvanced"; + resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); // // menuServer // - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItemBasic, this.MenuItemAdvanced}); + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // MenuItemBasic // - resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); this.MenuItemBasic.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuImportBasicRules}); this.MenuItemBasic.Name = "MenuItemBasic"; + resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); // // menuImportBasicRules // - resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); this.menuImportBasicRules.Name = "menuImportBasicRules"; + resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); this.menuImportBasicRules.Click += new System.EventHandler(this.menuImportBasicRules_Click); // // tabNormal // - resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Controls.Add(this.tabPageProxy); this.tabNormal.Controls.Add(this.tabPageDirect); this.tabNormal.Controls.Add(this.tabPageBlock); this.tabNormal.Controls.Add(this.tabPageRuleList); + resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Name = "tabNormal"; this.tabNormal.SelectedIndex = 0; this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting); // // tabPageProxy // - resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); this.tabPageProxy.Controls.Add(this.panel5); + resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); this.tabPageProxy.Name = "tabPageProxy"; this.tabPageProxy.UseVisualStyleBackColor = true; // // panel5 // - resources.ApplyResources(this.panel5, "panel5"); this.panel5.Controls.Add(this.groupBox5); this.panel5.Controls.Add(this.groupBox6); + resources.ApplyResources(this.panel5, "panel5"); this.panel5.Name = "panel5"; // // groupBox5 // - resources.ApplyResources(this.groupBox5, "groupBox5"); this.groupBox5.Controls.Add(this.txtProxyIp); + resources.ApplyResources(this.groupBox5, "groupBox5"); this.groupBox5.Name = "groupBox5"; this.groupBox5.TabStop = false; // @@ -271,8 +281,8 @@ // // groupBox6 // - resources.ApplyResources(this.groupBox6, "groupBox6"); this.groupBox6.Controls.Add(this.txtProxyDomain); + resources.ApplyResources(this.groupBox6, "groupBox6"); this.groupBox6.Name = "groupBox6"; this.groupBox6.TabStop = false; // @@ -283,22 +293,22 @@ // // tabPageDirect // - resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); this.tabPageDirect.Controls.Add(this.panel4); + resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); this.tabPageDirect.Name = "tabPageDirect"; this.tabPageDirect.UseVisualStyleBackColor = true; // // panel4 // - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.groupBox3); this.panel4.Controls.Add(this.groupBox4); + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // groupBox3 // - resources.ApplyResources(this.groupBox3, "groupBox3"); this.groupBox3.Controls.Add(this.txtDirectIp); + resources.ApplyResources(this.groupBox3, "groupBox3"); this.groupBox3.Name = "groupBox3"; this.groupBox3.TabStop = false; // @@ -309,8 +319,8 @@ // // groupBox4 // - resources.ApplyResources(this.groupBox4, "groupBox4"); this.groupBox4.Controls.Add(this.txtDirectDomain); + resources.ApplyResources(this.groupBox4, "groupBox4"); this.groupBox4.Name = "groupBox4"; this.groupBox4.TabStop = false; // @@ -321,22 +331,22 @@ // // tabPageBlock // - resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); this.tabPageBlock.Controls.Add(this.panel3); + resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); this.tabPageBlock.Name = "tabPageBlock"; this.tabPageBlock.UseVisualStyleBackColor = true; // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.groupBox2); this.panel3.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtBlockIp); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -347,8 +357,8 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtBlockDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -359,15 +369,15 @@ // // tabPageRuleList // - resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); this.tabPageRuleList.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); this.tabPageRuleList.Name = "tabPageRuleList"; this.tabPageRuleList.UseVisualStyleBackColor = true; // // lvRoutings // - resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -380,6 +390,11 @@ this.lvRoutings.View = System.Windows.Forms.View.Details; this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // // RoutingSettingForm // resources.ApplyResources(this, "$this"); @@ -464,5 +479,7 @@ private System.Windows.Forms.ToolStripMenuItem menuImportBasicRules; private System.Windows.Forms.ComboBox cmbdomainMatcher; private System.Windows.Forms.Label label6; + private System.Windows.Forms.ToolStripMenuItem menuImportAdvancedRules; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 4628d16e..b1c6755a 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -304,6 +304,14 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("OperationSuccess")); } + private void menuImportAdvancedRules_Click(object sender, EventArgs e) + { + if (ConfigHandler.InitBuiltinRouting(ref config, true) == 0) + { + RefreshRoutingsView(); + } + } + #endregion } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 707462c4..c3346803 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,10 +117,579 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + + 753, 17 + + + 75, 23 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 613 + + + 853, 60 + 7 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 5, 22 + + + 562, 16 + + + 34 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 660, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + cmbdomainMatcher + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + Top + + + 0, 25 + + + 853, 51 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + linear + + + mph + + + 681, 17 + + + 116, 20 + + + 28 + + + cmbdomainMatcher + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + True + + + NoControl + + + 575, 21 + + + 89, 12 + + + 27 + + + Domain Matcher + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + True + + + NoControl + + + 318, 17 + + + 216, 16 + + + 26 + + + Enable advanced routing function + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + 17, 17 + + + 212, 22 + + + Add + + + 212, 22 + + + Remove selected + + + 212, 22 + + + Select All (Ctrl+A) + + + 212, 22 + + + Set as active routing + + + 209, 6 + + + 212, 22 + + + Import Advanced Rules + + + 129, 21 + + + Advanced Function + + + 213, 142 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 139, 17 + + + 0, 0 + + + 853, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 102, 21 + + + Basic Function + + + 185, 22 + + + Import Basic Rules + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 0 + + + 1.Proxy Domain or IP + + + tabPageProxy + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 0 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 1 + + + 2.Direct Domain or IP + + + tabPageDirect + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 1 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageBlock + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 2 + + + 3.Block Domain or IP + + + tabPageBlock + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 2 + + + Fill + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -138,352 +707,548 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - + + 3, 3 + + + 839, 505 + + + 15 + + + lvRoutings + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageRuleList + + 0 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 22 - + + 3, 3, 3, 3 + + + 845, 511 + + + 3 + + + Pre-defined Rule Set List + + + tabPageRuleList + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 3 + + + Fill + + + 0, 76 + + + 853, 537 + + + 16 + + + tabNormal + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 1 - + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + 1 - - txtBlockIp + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + txtDirectDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical - 386, 485 24 - - 15 + + txtDirectDomain - + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + 0 - - linkLabelRoutingDoc - - - - Top - groupBox2 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - tabNormal - - - 25 - - - 839, 505 - - - 0 - - - True - - - 562, 16 - - - 441, 485 - - - panel2 - - - tabNormal - - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill - - - NoControl - - - Fill - - - 12 - - - 5, 22 - - - mph - - - groupBox5 - - - 392, 505 - - - Basic Function - - - cmbdomainStrategy - - - 3, 3, 3, 3 - - - groupBox3 - - - 386, 485 - - - 2 - - - panel5 - - - tabPageRuleList - - - groupBox3 - - - 1 - - - 447, 505 - - - $this - - - 575, 21 - - - &Cancel - - - 447, 505 - - - 4 - - - 195, 92 - - - Fill - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 0, 0 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 853, 537 - - - menuAdd - - - 0 - - - 24 - - - 4 - - - txtBlockDomain - - - 3, 17 - - - tabNormal - - - 5 - - - 441, 485 - - - Vertical - - - 2.Direct Domain or IP - - - 447, 505 - - - 2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - NoControl - - - linear - - + panel3 - - Fill - - - 4, 22 - - - Left - - - 392, 505 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - tabPageBlock - - - 392, 0 - - - 3, 3, 3, 3 - - - 16 - - - 165, 20 - - - 3, 17 - - - 6, 12 - - - 16 - - - 2 - - - Fill - - - System.Windows.Forms.ComboBox, 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 - - - Fill - - - panel1 - - - panel5 - - - Fill - - - 0, 0 - - - 753, 17 - - - Fill - - - Left - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 392, 505 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 681, 17 - - - panel2 - - - tabPageProxy - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemove - - - 318, 17 - - + 0 - - btnClose - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 - + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageBlock + + + 0 + + + txtBlockIp + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + Fill + + + 3, 17 + + True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Vertical 441, 485 @@ -491,640 +1256,157 @@ 25 - - 12 + + txtBlockIp - - 28 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl + + groupBox2 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabNormal - - - NoControl - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - 2 - - - 26 - - - Vertical - - - panel3 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3.Block Domain or IP - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox4 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 - - tabNormal + + txtBlockDomain - - 3, 3 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - labRoutingTips + + groupBox1 - + 0 - - 89, 12 - - - 845, 511 - - - panel1 + + Left 0, 0 - - 853, 60 + + 392, 505 - - txtDirectIp + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtBlockDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 6, 12 + + + 853, 673 + + + Routing Settings + + + menuAdd System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuRemove + + + 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 + + + menuSetDefaultRouting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportAdvancedRules + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemAdvanced + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + MenuItemBasic - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - chkenableRoutingAdvanced - - - Fill - - - 185, 22 - - - label6 - - - 3, 3 - - - 25 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 392, 0 - - - 194, 22 - - - Remove selected - - - panel4 - - - Domain strategy - - - Bottom - - - groupBox4 - - - 102, 21 - - - 0 - - - Vertical - - - cmsLv - - - Left - - - Add - - - 3 - - - System.Windows.Forms.GroupBox, 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 - - - 392, 0 - - - 24 - - - tabPageBlock - - - 12 - - - 3 - - - lvRoutings - - - groupBox6 - - - 2 - - - panel4 - - - Fill - - - panel3 - - - tabPageDirect - - - 0, 613 - - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - tabPageProxy - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 6, 21 - - - Import Basic Rules - - - 853, 51 - - - Fill - - - 116, 20 - - - 0, 0, 0, 0 - - - 3, 3, 3, 3 - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 3, 17 - - - groupBox6 - - - panel2 - - - 0 - - - Domain - - - 1 - - - 95, 12 - - - 386, 485 - - - 0 - - - 845, 511 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Advanced Function - - - AsIs - - - tabPageRuleList - - - 3 - - - groupBox5 - - - 660, 17 - - - 34 - - - 11 - - - 19 - - - MenuItemAdvanced - - - 194, 22 - - - Vertical - - - Select All (Ctrl+A) - - - IP - - - 839, 505 - - - txtProxyIp - - - True - - - Fill - - - 1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Set as active routing - - - 4, 22 - - - 1 - - - NoControl - - - Domain Matcher - - - 4 - - - RoutingSettingForm - - - 194, 22 - - - &OK - - - 4, 22 - - - IP - - - panel2 - - - 116, 17 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - Pre-defined Rule Set List - - - 845, 511 - - - menuServer - - - True - - - IPIfNonMatch - - - menuSetDefaultRouting - - - Domain - - - Vertical - - - 4 - - - 0 - - - NoControl - - - $this - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 194, 22 - - - panel1 - - - $this - - - txtProxyDomain - - - groupBox1 - - - 0 - - - 3, 17 - - - txtDirectDomain - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - IP - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - menuImportBasicRules - - 0 - - - True - - - 129, 21 - - - 0, 76 - - - 839, 505 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - cmbdomainMatcher - - - 0 - - - 3, 17 - - - Domain - - - panel5 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Enable advanced routing function + + toolStripSeparator1 - - 839, 505 + + 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 + + RoutingSettingForm - - 75, 23 + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 216, 16 - - - 853, 673 - - - True - - - IPOnDemand - - - 3 - - - 3 - - - 0, 0 - - - Routing Settings - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - panel1 - - - menuSelectAll - - - 4 - - - 3 - - - 0 - - - btnOK - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15 - - - 3, 3 - - - 0, 25 - - - 0 - - - 75, 23 - - - 845, 511 - - - 1 - - - True - - - 3, 3 - - - Fill - - - 1.Proxy Domain or IP - - - groupBox2 - - - $this - - - tabPageDirect - - - Fill - - - 3, 17 - - - 27 - - - 853, 25 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - zh-Hans - - - True - - - 17, 17 - - - 139, 17 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index 8b98b506..fe451130 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -124,6 +124,12 @@ 取消(&C) + + 0, 545 + + + 817, 60 + 518, 16 @@ -136,11 +142,8 @@ 确定(&O) - - 0, 545 - - - 817, 60 + + 817, 51 77, 12 @@ -160,8 +163,8 @@ 域名解析策略 - - 817, 51 + + 149, 114 148, 22 @@ -193,14 +196,8 @@ 高级功能 - - 149, 92 - - - 172, 22 - - - 一键导入基础规则 + + 817, 25 68, 21 @@ -208,23 +205,14 @@ 基础功能 - - 817, 25 + + 180, 22 - - 405, 417 + + 一键导入基础规则 - - 411, 437 - - - 386, 417 - - - 392, 437 - - - 803, 437 + + 817, 469 809, 443 @@ -232,20 +220,20 @@ 1.代理的Domain或IP - - 405, 417 + + 803, 437 - + 411, 437 - - 386, 417 + + 405, 417 - + 392, 437 - - 803, 437 + + 386, 417 809, 443 @@ -253,20 +241,20 @@ 2.直连的Domain或IP - - 405, 417 + + 803, 437 - + 411, 437 - - 386, 417 + + 405, 417 - + 392, 437 - - 803, 437 + + 386, 417 809, 443 @@ -274,6 +262,27 @@ 3.阻止的Domain或IP + + 803, 437 + + + 411, 437 + + + 405, 417 + + + 392, 437 + + + 386, 417 + + + 809, 443 + + + 预定义规则集列表 + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -294,14 +303,8 @@ 803, 437 - - 809, 443 - - - 预定义规则集列表 - - - 817, 469 + + 一键导入高级规则 817, 605 diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index e1a31157..bff96482 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -30,6 +30,8 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); this.grbMain = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbGroup = new System.Windows.Forms.ComboBox(); this.txtUserAgent = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.btnShare = new System.Windows.Forms.Button(); @@ -47,6 +49,8 @@ // grbMain // resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.label4); + this.grbMain.Controls.Add(this.cmbGroup); this.grbMain.Controls.Add(this.txtUserAgent); this.grbMain.Controls.Add(this.label1); this.grbMain.Controls.Add(this.btnShare); @@ -59,6 +63,19 @@ this.grbMain.Name = "grbMain"; this.grbMain.TabStop = false; // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbGroup + // + resources.ApplyResources(this.cmbGroup, "cmbGroup"); + this.cmbGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbGroup.FormattingEnabled = true; + this.cmbGroup.Name = "cmbGroup"; + this.cmbGroup.Leave += new System.EventHandler(this.txtRemarks_Leave); + // // txtUserAgent // resources.ApplyResources(this.txtUserAgent, "txtUserAgent"); @@ -147,5 +164,7 @@ private System.Windows.Forms.PictureBox picQRCode; private System.Windows.Forms.TextBox txtUserAgent; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbGroup; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 3d816c10..cfa29848 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -3,6 +3,8 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using System.Linq; +using System.Collections.Generic; namespace v2rayN.Forms { @@ -10,7 +12,7 @@ namespace v2rayN.Forms public partial class SubSettingControl : UserControl { public event ChangeEventHandler OnButtonClicked; - + private List groupItem; public SubItem subItem { @@ -25,6 +27,12 @@ namespace v2rayN.Forms private void SubSettingControl_Load(object sender, EventArgs e) { this.Height = grbMain.Height; + + groupItem = LazyConfig.Instance.GetConfig().groupItem; + + cmbGroup.Items.AddRange(groupItem.Select(t => t.remarks).ToArray()); + cmbGroup.Items.Add(string.Empty); + BindingSub(); } @@ -36,6 +44,12 @@ namespace v2rayN.Forms txtUrl.Text = subItem.url.ToString(); chkEnabled.Checked = subItem.enabled; txtUserAgent.Text = subItem.userAgent; + + var index = groupItem.FindIndex(t => t.id == subItem.groupId); + if (index >= 0) + { + cmbGroup.SelectedIndex = index; + } } } private void EndBindingSub() @@ -46,6 +60,12 @@ namespace v2rayN.Forms subItem.url = txtUrl.Text.TrimEx(); subItem.enabled = chkEnabled.Checked; subItem.userAgent = txtUserAgent.Text.TrimEx(); + + var index = groupItem.FindIndex(t => t.remarks == cmbGroup.Text); + if (index >= 0) + { + subItem.groupId = groupItem[index].id; + } } } private void txtRemarks_Leave(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index 71c5a7f5..d750067b 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -131,17 +131,20 @@ 619, 162 - - 0 + + 127, 147 60, 16 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + txtUrl - - 8 + + grbMain picQRCode @@ -177,6 +180,9 @@ 26 + + System.Windows.Forms.GroupBox, 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 @@ -186,12 +192,18 @@ grbMain + + 36 + 434, 21 83, 12 + + cmbGroup + 232, 21 @@ -213,17 +225,20 @@ Share + + 10 + grbMain - 3 + 5 12, 53 - 1 + 3 Fill @@ -231,14 +246,17 @@ 27 - - 10 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 473, 21 125, 12 - - 25 + + label4 127, 53 @@ -250,14 +268,23 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 5 + 7 - - Zoom + + grbMain + + + 232, 20 + + + 2 1 + + NoControl + 47, 12 @@ -276,11 +303,20 @@ chkEnabled - - 6 + + Zoom - - NoControl + + 8 + + + 25 + + + Belong to Group + + + 35 txtRemarks @@ -288,14 +324,11 @@ NoControl - - 0, 148 - 75, 23 - 4 + 6 grbMain @@ -303,20 +336,26 @@ 25 + + 0 + grbMain - - 10 + + 1 2 + + 10 + grbMain - - 473, 21 + + grbMain 368, 23 @@ -333,9 +372,6 @@ True - - grbMain - True @@ -351,20 +387,23 @@ $this - - grbMain + + True - 619, 148 + 619, 188 btnShare + + 619, 350 + - 2 + 4 - 7 + 9 NoControl @@ -372,8 +411,8 @@ 12, 115 - - 619, 310 + + 0, 188 txtUserAgent @@ -381,8 +420,8 @@ Remarks - - 0 + + grbMain NoControl @@ -396,7 +435,13 @@ 75, 23 - + + 12, 151 + + + 95, 12 + + grbMain @@ -411,6 +456,9 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -420,8 +468,8 @@ grbMain - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -432,6 +480,9 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 + True diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx index 71226592..27cc0315 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -118,6 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 53, 12 + + + 所属分组 + 101, 12 diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index 923a69e4..316b8ff2 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -157,7 +157,7 @@ 0, 0 - 614, 351 + 634, 401 10 @@ -232,10 +232,10 @@ Bottom - 0, 351 + 0, 401 - 614, 60 + 634, 60 7 @@ -259,7 +259,7 @@ 6, 12 - 614, 411 + 634, 461 Subscription settings diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 45284b21..42d78b9b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -45,7 +45,6 @@ namespace v2rayN.Handler { config = new Config { - index = -1, logEnabled = false, loglevel = "warning", vmess = new List(), @@ -53,9 +52,6 @@ namespace v2rayN.Handler //Mux muxEnabled = false, - ////默认监听端口 - //config.pacPort = 8888; - // 默认不开启统计 enableStatistics = false, @@ -89,7 +85,6 @@ namespace v2rayN.Handler } else { - //http协议不由core提供,只保留socks if (config.inbound.Count > 0) { config.inbound[0].protocol = Global.InboundSocks; @@ -157,11 +152,14 @@ namespace v2rayN.Handler { config.subItem = new List(); } + if (config.groupItem == null) + { + config.groupItem = new List(); + } + if (config == null - || config.index < 0 || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 ) { Global.reloadV2ray = false; @@ -196,9 +194,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Vmess; @@ -216,19 +213,7 @@ namespace v2rayN.Handler return -1; } - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -241,25 +226,19 @@ namespace v2rayN.Handler /// 移除服务器 /// /// - /// + /// /// - public static int RemoveServer(ref Config config, List indexs) + public static int RemoveServer(Config config, List indexs) { - var indexId = config.indexId(); - - for (int k = indexs.Count - 1; k >= 0; k--) + foreach (var item in indexs) { - var index = indexs[k]; - if (index < 0 || index > config.vmess.Count - 1) + var index = config.FindIndexId(item.indexId); + if (index >= 0) { - continue; + config.vmess.RemoveAt(index); } - - config.vmess.RemoveAt(index); } - SetIndex(ref config, indexId); - ToJsonFile(config); return 0; @@ -271,34 +250,33 @@ namespace v2rayN.Handler /// /// /// - public static int CopyServer(ref Config config, int index) + public static int CopyServer(ref Config config, VmessItem item) { - if (index < 0 || index > config.vmess.Count - 1) + if (item == null) { return -1; } 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, - flow = config.vmess[index].flow, - sni = config.vmess[index].sni + configVersion = item.configVersion, + address = item.address, + port = item.port, + id = item.id, + alterId = item.alterId, + security = item.security, + network = item.network, + remarks = string.Format("{0}-clone", item.remarks), + headerType = item.headerType, + requestHost = item.requestHost, + path = item.path, + streamSecurity = item.streamSecurity, + allowInsecure = item.allowInsecure, + configType = item.configType, + flow = item.flow, + sni = item.sni }; - //config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 AddServerCommon(ref config, vmessItem); ToJsonFile(config); @@ -310,21 +288,16 @@ namespace v2rayN.Handler /// 设置活动服务器 /// /// - /// + /// /// - public static int SetDefaultServer(ref Config config, int index) + public static int SetDefaultServer(ref Config config, VmessItem item) { - if (index < 0 || index > config.vmess.Count - 1) + if (item == null) { return -1; } - ////和现在相同 - //if (config.index.Equals(index)) - //{ - // return -1; - //} - config.index = index; + config.indexId = item.indexId; Global.reloadV2ray = true; ToJsonFile(config); @@ -332,6 +305,42 @@ namespace v2rayN.Handler return 0; } + public static int SetDefaultServer(Config config, List lstVmess) + { + if (lstVmess.Exists(t => t.indexId == config.indexId)) + { + return 0; + } + if (config.vmess.Exists(t => t.indexId == config.indexId)) + { + return 0; + } + if (lstVmess.Count > 0) + { + return SetDefaultServer(ref config, lstVmess[0]); + } + if (config.vmess.Count > 0) + { + return SetDefaultServer(ref config, config.vmess[0]); + } + return -1; + } + public static VmessItem GetDefaultServer(ref Config config) + { + if (config.vmess.Count <= 0) + { + return null; + } + var index = config.FindIndexId(config.indexId); + if (index < 0) + { + SetDefaultServer(ref config, config.vmess[0]); + return config.vmess[0]; + } + + return config.vmess[index]; + } + /// /// 保参数 /// @@ -359,16 +368,23 @@ namespace v2rayN.Handler /// 移动服务器 /// /// + /// /// /// /// - public static int MoveServer(ref Config config, int index, EMove eMove) + public static int MoveServer(ref Config config, ref List lstVmess, int index, EMove eMove) { - int count = config.vmess.Count; - if (index < 0 || index > config.vmess.Count - 1) + int count = lstVmess.Count; + if (index < 0 || index > lstVmess.Count - 1) { return -1; } + + for (int i = 0; i < lstVmess.Count; i++) + { + lstVmess[i].sort = (i + 1) * 10; + } + switch (eMove) { case EMove.Top: @@ -377,21 +393,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(0, vmess); - if (index < config.index) - { - // - } - else if (config.index == index) - { - config.index = 0; - } - else - { - config.index++; - } + lstVmess[index].sort = lstVmess[0].sort - 1; + break; } case EMove.Up: @@ -400,17 +403,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(index - 1, vmess); - if (index == config.index + 1) - { - config.index++; - } - else if (config.index == index) - { - config.index--; - } + lstVmess[index].sort = lstVmess[index - 1].sort - 1; + break; } @@ -420,17 +414,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(index + 1, vmess); - if (index == config.index - 1) - { - config.index--; - } - else if (config.index == index) - { - config.index++; - } + lstVmess[index].sort = lstVmess[index + 1].sort + 1; + break; } case EMove.Bottom: @@ -439,26 +424,11 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Add(vmess); - if (index < config.index) - { - config.index--; - } - else if (config.index == index) - { - config.index = count - 1; - } - else - { - // - } + lstVmess[index].sort = lstVmess[lstVmess.Count - 1].sort + 1; + break; } - } - Global.reloadV2ray = true; ToJsonFile(config); @@ -471,7 +441,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddCustomServer(ref Config config, string fileName) + public static int AddCustomServer(ref Config config, string fileName, string groupId) { string newFileName = string.Format("{0}.json", Utils.GetGUID()); //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); @@ -487,17 +457,13 @@ namespace v2rayN.Handler VmessItem vmessItem = new VmessItem { + groupId = groupId, address = newFileName, configType = (int)EConfigType.Custom, remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()) }; - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + AddServerCommon(ref config, vmessItem); ToJsonFile(config); @@ -509,17 +475,9 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int EditCustomServer(ref Config config, VmessItem vmessItem, int index) + public static int EditCustomServer(ref Config config, VmessItem vmessItem) { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - ToJsonFile(config); return 0; @@ -530,9 +488,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Shadowsocks; @@ -545,19 +502,7 @@ namespace v2rayN.Handler return -1; } - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -572,27 +517,14 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddSocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Socks; vmessItem.address = vmessItem.address.TrimEx(); - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -608,9 +540,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddTrojanServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Trojan; @@ -625,19 +556,7 @@ namespace v2rayN.Handler vmessItem.allowInsecure = config.defAllowInsecure.ToString(); } - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -719,14 +638,13 @@ namespace v2rayN.Handler /// /// /// 成功导入的数量 - public static int AddBatchServers(ref Config config, string clipboardData, string subid = "") + public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId) { if (Utils.IsNullOrEmpty(clipboardData)) { return -1; } - var indexId = config.indexId(); //copy sub items List lstOriSub = null; if (!Utils.IsNullOrEmpty(subid)) @@ -770,45 +688,46 @@ namespace v2rayN.Handler vmessItem.subid = subid; } + //groupId + vmessItem.groupId = groupId; + if (vmessItem.configType == (int)EConfigType.Vmess) { - if (AddServer(ref config, vmessItem, -1, false) == 0) + if (AddServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Shadowsocks) { - if (AddShadowsocksServer(ref config, vmessItem, -1, false) == 0) + if (AddShadowsocksServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Socks) { - if (AddSocksServer(ref config, vmessItem, -1, false) == 0) + if (AddSocksServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Trojan) { - if (AddTrojanServer(ref config, vmessItem, -1, false) == 0) + if (AddTrojanServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.VLESS) { - if (AddVlessServer(ref config, vmessItem, -1, false) == 0) + if (AddVlessServer(ref config, vmessItem, false) == 0) { countServers++; } } } - SetIndex(ref config, indexId); - ToJsonFile(config); return countServers; } @@ -850,11 +769,11 @@ namespace v2rayN.Handler return -1; } - foreach (SubItem sub in config.subItem) + foreach (SubItem item in config.subItem) { - if (Utils.IsNullOrEmpty(sub.id)) + if (Utils.IsNullOrEmpty(item.id)) { - sub.id = Utils.GetGUID(false); + item.id = Utils.GetGUID(false); } } @@ -870,7 +789,6 @@ namespace v2rayN.Handler /// public static int RemoveServerViaSubid(ref Config config, string subid) { - var indexId = config.indexId(); if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) { return -1; @@ -883,15 +801,13 @@ namespace v2rayN.Handler } } - SetIndex(ref config, indexId); - ToJsonFile(config); return 0; } - public static int SortServers(ref Config config, EServerColName name, bool asc) + public static int SortServers(ref Config config, ref List lstVmess, EServerColName name, bool asc) { - if (config.vmess.Count <= 0) + if (lstVmess.Count <= 0) { return -1; } @@ -915,19 +831,20 @@ namespace v2rayN.Handler return -1; } - var indexId = config.indexId(); - var items = config.vmess.AsQueryable(); + var items = lstVmess.AsQueryable(); if (asc) { - config.vmess = items.OrderBy(propertyName).ToList(); + lstVmess = items.OrderBy(propertyName).ToList(); } else { - config.vmess = items.OrderByDescending(propertyName).ToList(); + lstVmess = items.OrderByDescending(propertyName).ToList(); + } + for (int i = 0; i < lstVmess.Count; i++) + { + lstVmess[i].sort = (i + 1) * 10; } - - SetIndex(ref config, indexId); ToJsonFile(config); return 0; @@ -938,9 +855,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddVlessServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.VLESS; @@ -953,19 +869,7 @@ namespace v2rayN.Handler 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 - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -975,11 +879,9 @@ namespace v2rayN.Handler return 0; } - public static int DedupServerList(ref Config config) + public static int DedupServerList(ref Config config, ref List lstVmess) { - var indexId = config.indexId(); - - List source = config.vmess; + List source = lstVmess; bool keepOlder = config.keepOlderDedupl; List list = new List(); @@ -991,21 +893,23 @@ namespace v2rayN.Handler { list.Add(item); } + else + { + var index = config.FindIndexId(item.indexId); + if (index >= 0) + { + config.vmess.RemoveAt(index); + } + } } - if (!keepOlder) list.Reverse(); - config.vmess = list; - - SetIndex(ref config, indexId); + //if (!keepOlder) list.Reverse(); + //config.vmess = list; return 0; } public static int AddServerCommon(ref Config config, VmessItem vmessItem) { - if (Utils.IsNullOrEmpty(vmessItem.indexId)) - { - vmessItem.indexId = Utils.GetGUID(false); - } vmessItem.configVersion = 2; if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { @@ -1016,39 +920,23 @@ namespace v2rayN.Handler vmessItem.network = Global.DefaultNetwork; } - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) + if (Utils.IsNullOrEmpty(vmessItem.indexId)) { - config.index = 0; - Global.reloadV2ray = true; + vmessItem.indexId = Utils.GetGUID(false); } - return 0; - } + if (!config.vmess.Exists(it => it.indexId == vmessItem.indexId)) + { + var maxSort = config.vmess.Max(t => t.sort); + vmessItem.sort = maxSort++; - public static int SetIndex(ref Config config, string indexId) - { - var index_ = config.FindIndexId(indexId); + config.vmess.Add(vmessItem); + } - if (config.index == index_) - { - return 0; - } - else if (index_ >= 0) - { - config.index = index_; - } - else - { - if (config.vmess.Count > 0) - { - config.index = 0; - } - else - { - config.index = -1; - } - } - Global.reloadV2ray = true; + //if (config.vmess.Count == 1) + //{ + // config.indexId = config.vmess[0].indexId; + // Global.reloadV2ray = true; + //} return 0; } @@ -1075,6 +963,55 @@ namespace v2rayN.Handler && (remarks ? o.remarks == n.remarks : true); } + /// + /// save Group + /// + /// + /// + public static int SaveGroupItem(ref Config config) + { + if (config.groupItem == null || config.groupItem.Count <= 0) + { + return -1; + } + + foreach (GroupItem item in config.groupItem) + { + if (Utils.IsNullOrEmpty(item.id)) + { + item.id = Utils.GetGUID(false); + } + } + + ToJsonFile(config); + return 0; + } + + public static int RemoveGroupItem(ref Config config, string groupId) + { + if (Utils.IsNullOrEmpty(groupId) || config.vmess.Count <= 0) + { + return -1; + } + + foreach (var item in config.vmess) + { + if (item.groupId.Equals(groupId)) + { + item.groupId = string.Empty; + } + } + foreach (var item in config.subItem) + { + if (item.groupId.Equals(groupId)) + { + item.groupId = string.Empty; + } + } + + ToJsonFile(config); + return 0; + } #endregion #region UI @@ -1290,14 +1227,14 @@ namespace v2rayN.Handler return 0; } - public static int InitBuiltinRouting(ref Config config) + public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false) { if (config.routings == null) { config.routings = new List(); } - if (config.routings.Count(it => it.locked != true) <= 0) + if (blImportAdvancedRules || config.routings.Count(it => it.locked != true) <= 0) { //Bypass the mainland var item2 = new RoutingItem() @@ -1326,7 +1263,10 @@ namespace v2rayN.Handler AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); config.routings.Add(item1); - config.routingIndex = 0; + if (!blImportAdvancedRules) + { + config.routingIndex = 0; + } } if (GetLockedRoutingItem(ref config) == null) diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 1895fcbb..f81bb165 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -77,15 +77,14 @@ namespace v2rayN.Handler } } - public void Export2ClientConfig(int index, Config config) + public void Export2ClientConfig(VmessItem item, Config config) { - //int index = GetLvSelectedIndex(); - if (index < 0) + if (item == null) { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess - && config.vmess[index].configType != (int)EConfigType.VLESS) + if (item.configType != (int)EConfigType.Vmess + && item.configType != (int)EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; @@ -106,9 +105,9 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); - configCopy.index = index; - if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0) + //Config configCopy = Utils.DeepCopy(config); + //configCopy.index = index; + if (V2rayConfigHandler.Export2ClientConfig(item, fileName, out string msg) != 0) { UI.Show(msg); } @@ -118,15 +117,14 @@ namespace v2rayN.Handler } } - public void Export2ServerConfig(int index, Config config) + public void Export2ServerConfig(VmessItem item, Config config) { - //int index = GetLvSelectedIndex(); - if (index < 0) + if (item == null) { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess - && config.vmess[index].configType != (int)EConfigType.VLESS) + if (item.configType != (int)EConfigType.Vmess + && item.configType != (int)EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; @@ -147,9 +145,9 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); - configCopy.index = index; - if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0) + //Config configCopy = Utils.DeepCopy(config); + //configCopy.index = index; + if (V2rayConfigHandler.Export2ServerConfig(item, fileName, out string msg) != 0) { UI.Show(msg); } @@ -159,12 +157,12 @@ namespace v2rayN.Handler } } - public int AddBatchServers(Config config, string clipboardData, string subid = "") + public int AddBatchServers(Config config, string clipboardData, string subid, string groupId) { int counter; int _Add() { - return ConfigHandler.AddBatchServers(ref config, clipboardData, subid); + return ConfigHandler.AddBatchServers(ref config, clipboardData, subid, groupId); } counter = _Add(); if (counter < 1) @@ -227,12 +225,12 @@ namespace v2rayN.Handler var updateHandle = new UpdateHandle(); while (true) { - Utils.SaveLog("UpdateTaskRun"); Thread.Sleep(60000); if (config.autoUpdateInterval <= 0) { continue; } + Utils.SaveLog("UpdateTaskRun"); updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => { diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 93cf78fe..badd9812 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -20,16 +20,14 @@ namespace v2rayN.Handler /// /// GetShareUrl /// - /// - /// + /// /// - public static string GetShareUrl(Config config, int index) + public static string GetShareUrl(VmessItem item) { try { string url = string.Empty; - VmessItem item = config.vmess[index]; switch (item.configType) { case (int)EConfigType.Vmess: @@ -297,7 +295,7 @@ namespace v2rayN.Handler } return 0; } - + #endregion #region ImportShareUrl @@ -635,7 +633,7 @@ namespace v2rayN.Handler Match details; try { - details = DetailsParser.Match(Utils.Base64Decode(base64)); + details = DetailsParser.Match(Utils.Base64Decode(base64)); } catch (FormatException) { @@ -726,7 +724,7 @@ namespace v2rayN.Handler { server.security = userInfoParts[0]; server.id = userInfoParts[1]; - } + } return server; } @@ -775,7 +773,7 @@ namespace v2rayN.Handler private static int ResolveStdTransport(NameValueCollection query, ref VmessItem item) { - item.flow = query["flow"] ?? ""; + item.flow = query["flow"] ?? ""; item.streamSecurity = query["security"] ?? ""; item.sni = query["sni"] ?? ""; item.alpn = Utils.String2List(Utils.UrlDecode(query["alpn"] ?? "")); diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 57ca1456..1783782b 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -14,14 +14,14 @@ namespace v2rayN.Handler private Config _config; private V2rayHandler _v2rayHandler; private List _selecteds; - Action _updateFunc; + Action _updateFunc; public SpeedtestHandler(ref Config config) { _config = config; } - public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) + public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) { _config = config; _v2rayHandler = v2rayHandler; @@ -33,11 +33,10 @@ namespace v2rayN.Handler { _selecteds.Add(new ServerTestItem() { - selected = it, - indexId = config.vmess[it].indexId, - address = config.vmess[it].address, - port = config.vmess[it].port, - configType = config.vmess[it].configType + indexId = it.indexId, + address = it.address, + port = it.port, + configType = it.configType }); } @@ -93,9 +92,8 @@ namespace v2rayN.Handler RunPingSub((ServerTestItem it) => { long time = Utils.Ping(it.address); - var index = _config.FindIndexId(it.indexId); - if (index < 0) return; - _updateFunc(index, FormatOut(time, "ms")); + + _updateFunc(it.indexId, FormatOut(time, "ms")); }); } @@ -104,9 +102,8 @@ namespace v2rayN.Handler RunPingSub((ServerTestItem it) => { int time = GetTcpingTime(it.address, it.port); - var index = _config.FindIndexId(it.indexId); - if (index < 0) return; - _updateFunc(index, FormatOut(time, "ms")); + + _updateFunc(it.indexId, FormatOut(time, "ms")); }); } @@ -120,7 +117,7 @@ namespace v2rayN.Handler pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0].selected, UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].indexId, UIRes.I18N("OperationFailed")); return; } @@ -144,9 +141,8 @@ namespace v2rayN.Handler int responseTime = -1; string status = GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; - var index = _config.FindIndexId(it.indexId); - if (index < 0) return; - _updateFunc(index, output); + + _updateFunc(it.indexId, output); } catch (Exception ex) { @@ -203,15 +199,10 @@ namespace v2rayN.Handler string testIndexId = string.Empty; int pid = -1; - if (_config.vmess.Count <= 0) - { - return; - } - pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0].selected, UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].indexId, UIRes.I18N("OperationFailed")); return; } @@ -219,15 +210,11 @@ namespace v2rayN.Handler DownloadHandle downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { - var index = _config.FindIndexId(testIndexId); - if (index < 0) return; - _updateFunc(index, args.Msg); + _updateFunc(testIndexId, args.Msg); }; downloadHandle2.Error += (sender2, args) => { - var index = _config.FindIndexId(testIndexId); - if (index < 0) return; - _updateFunc(index, args.GetException().Message); + _updateFunc(testIndexId, args.GetException().Message); }; var timeout = 10; @@ -243,7 +230,7 @@ namespace v2rayN.Handler } testIndexId = it.indexId; if (_config.FindIndexId(it.indexId) < 0) continue; - + WebProxy webProxy = new WebProxy(Global.Loopback, it.port); var ws = downloadHandle2.DownloadDataAsync(url, webProxy, timeout - 2); diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index 988cc7c8..0cdcb98f 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -116,7 +116,7 @@ namespace v2rayN.Handler if (res != null) { - string itemId = config_.getItemId(); + string itemId = config_.indexId; ServerStatItem serverStatItem = GetServerStatItem(itemId); //TODO: parse output diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index ee3e8188..5688b797 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -180,6 +180,7 @@ namespace v2rayN.Handler string id = config.subItem[k - 1].id.Trim(); string url = config.subItem[k - 1].url.Trim(); string userAgent = config.subItem[k - 1].userAgent.Trim(); + string groupId = config.subItem[k - 1].groupId.Trim(); string hashCode = $"{k}->"; if (config.subItem[k - 1].enabled == false) { @@ -207,7 +208,7 @@ namespace v2rayN.Handler //ConfigHandler.RemoveServerViaSubid(ref config, id); //_updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); // RefreshServers(); - int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); + int ret = MainFormHandler.Instance.AddBatchServers(config, result, id, groupId); if (ret > 0) { // RefreshServers(); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 7af5ea3f..27021a16 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using v2rayN.Base; using v2rayN.Mode; namespace v2rayN.Handler @@ -21,29 +22,24 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件 /// - /// + /// /// /// /// - public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) + public static int GenerateClientConfig(VmessItem node, string fileName, bool blExport, out string msg) { try { - //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { msg = UIRes.I18N("CheckServerSettings"); return -1; } msg = UIRes.I18N("InitialConfiguration"); - if (config.configType() == (int)EConfigType.Custom) + if (node.configType == (int)EConfigType.Custom) { - return GenerateClientCustomConfig(config, fileName, out msg); + return GenerateClientCustomConfig(node, fileName, out msg); } //取得默认配置 @@ -62,6 +58,8 @@ namespace v2rayN.Handler return -1; } + var config = LazyConfig.Instance.GetConfig(); + //开始修改配置 log(config, ref v2rayConfig, blExport); @@ -72,7 +70,7 @@ namespace v2rayN.Handler routing(config, ref v2rayConfig); //outbound - outbound(config, ref v2rayConfig); + outbound(node, ref v2rayConfig); //dns dns(config, ref v2rayConfig); @@ -82,7 +80,7 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{config.GetGroupRemarks(node.groupId)}] {node.getSummary()}"); } catch { @@ -327,15 +325,16 @@ namespace v2rayN.Handler /// /// vmess协议服务器配置 /// - /// + /// /// /// - private static int outbound(Config config, ref V2rayConfig v2rayConfig) + private static int outbound(VmessItem node, ref V2rayConfig v2rayConfig) { try { + var config = LazyConfig.Instance.GetConfig(); Outbounds outbound = v2rayConfig.outbounds[0]; - if (config.configType() == (int)EConfigType.Vmess) + if (node.configType == (int)EConfigType.Vmess) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -348,8 +347,8 @@ namespace v2rayN.Handler vnextItem = outbound.settings.vnext[0]; } //远程服务器地址和端口 - vnextItem.address = config.address(); - vnextItem.port = config.port(); + vnextItem.address = node.address; + vnextItem.port = node.port; UsersItem usersItem; if (vnextItem.users.Count <= 0) @@ -362,12 +361,12 @@ namespace v2rayN.Handler usersItem = vnextItem.users[0]; } //远程服务器用户ID - usersItem.id = config.id(); - usersItem.alterId = config.alterId(); + usersItem.id = node.id; + usersItem.alterId = node.alterId; usersItem.email = Global.userEMail; - if (Global.vmessSecuritys.Contains(config.security())) + if (Global.vmessSecuritys.Contains(node.security)) { - usersItem.security = config.security(); + usersItem.security = node.security; } else { @@ -380,12 +379,12 @@ namespace v2rayN.Handler //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", ref streamSettings); outbound.protocol = Global.vmessProtocolLite; outbound.settings.servers = null; } - else if (config.configType() == (int)EConfigType.Shadowsocks) + else if (node.configType == (int)EConfigType.Shadowsocks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -398,12 +397,12 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); - serversItem.password = config.id(); - if (config.GetShadowsocksSecuritys().Contains(config.security())) + serversItem.address = node.address; + serversItem.port = node.port; + serversItem.password = node.id; + if (config.GetShadowsocksSecuritys().Contains(node.security)) { - serversItem.method = config.security(); + serversItem.method = node.security; } else { @@ -421,7 +420,7 @@ namespace v2rayN.Handler outbound.protocol = Global.ssProtocolLite; outbound.settings.vnext = null; } - else if (config.configType() == (int)EConfigType.Socks) + else if (node.configType == (int)EConfigType.Socks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -434,18 +433,18 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); + serversItem.address = node.address; + serversItem.port = node.port; serversItem.method = null; serversItem.password = null; - if (!Utils.IsNullOrEmpty(config.security()) - && !Utils.IsNullOrEmpty(config.id())) + if (!Utils.IsNullOrEmpty(node.security) + && !Utils.IsNullOrEmpty(node.id)) { SocksUsersItem socksUsersItem = new SocksUsersItem { - user = config.security(), - pass = config.id(), + user = node.security, + pass = node.id, level = 1 }; @@ -458,7 +457,7 @@ namespace v2rayN.Handler outbound.protocol = Global.socksProtocolLite; outbound.settings.vnext = null; } - else if (config.configType() == (int)EConfigType.VLESS) + else if (node.configType == (int)EConfigType.VLESS) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -471,8 +470,8 @@ namespace v2rayN.Handler vnextItem = outbound.settings.vnext[0]; } //远程服务器地址和端口 - vnextItem.address = config.address(); - vnextItem.port = config.port(); + vnextItem.address = node.address; + vnextItem.port = node.port; UsersItem usersItem; if (vnextItem.users.Count <= 0) @@ -485,10 +484,10 @@ namespace v2rayN.Handler usersItem = vnextItem.users[0]; } //远程服务器用户ID - usersItem.id = config.id(); + usersItem.id = node.id; usersItem.flow = string.Empty; usersItem.email = Global.userEMail; - usersItem.encryption = config.security(); + usersItem.encryption = node.security; //Mux outbound.mux.enabled = config.muxEnabled; @@ -496,18 +495,18 @@ namespace v2rayN.Handler //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", ref streamSettings); //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - if (Utils.IsNullOrEmpty(config.flow())) + if (Utils.IsNullOrEmpty(node.flow)) { usersItem.flow = Global.xtlsFlows[1]; } else { - usersItem.flow = config.flow().Replace("splice", "direct"); + usersItem.flow = node.flow.Replace("splice", "direct"); } outbound.mux.enabled = false; @@ -517,7 +516,7 @@ namespace v2rayN.Handler outbound.protocol = Global.vlessProtocolLite; outbound.settings.servers = null; } - else if (config.configType() == (int)EConfigType.Trojan) + else if (node.configType == (int)EConfigType.Trojan) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -530,24 +529,24 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); - serversItem.password = config.id(); + serversItem.address = node.address; + serversItem.port = node.port; + serversItem.password = node.id; serversItem.flow = string.Empty; serversItem.ota = false; serversItem.level = 1; //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - if (Utils.IsNullOrEmpty(config.flow())) + if (Utils.IsNullOrEmpty(node.flow)) { serversItem.flow = Global.xtlsFlows[1]; } else { - serversItem.flow = config.flow().Replace("splice", "direct"); + serversItem.flow = node.flow.Replace("splice", "direct"); } outbound.mux.enabled = false; @@ -560,7 +559,7 @@ namespace v2rayN.Handler //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", ref streamSettings); outbound.protocol = Global.trojanProtocolLite; outbound.settings.vnext = null; @@ -575,28 +574,29 @@ namespace v2rayN.Handler /// /// vmess协议远程服务器底层传输配置 /// - /// + /// /// /// /// - private static int boundStreamSettings(Config config, string iobound, ref StreamSettings streamSettings) + private static int boundStreamSettings(VmessItem node, string iobound, ref StreamSettings streamSettings) { try { + var config = LazyConfig.Instance.GetConfig(); //远程服务器底层传输配置 - streamSettings.network = config.network(); - string host = config.requestHost(); - string sni = config.sni(); + streamSettings.network = node.getNetwork(); + string host = node.requestHost.TrimEx(); + string sni = node.sni; //if tls - if (config.streamSecurity() == Global.StreamSecurity) + if (node.streamSecurity == Global.StreamSecurity) { - streamSettings.security = config.streamSecurity(); + streamSettings.security = node.streamSecurity; TlsSettings tlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure(), - alpn = config.alpn() + allowInsecure = Utils.ToBool(node.allowInsecure), + alpn = node.getAlpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -610,14 +610,14 @@ namespace v2rayN.Handler } //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - streamSettings.security = config.streamSecurity(); + streamSettings.security = node.streamSecurity; TlsSettings xtlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure(), - alpn = config.alpn() + allowInsecure = Utils.ToBool(node.allowInsecure), + alpn = node.getAlpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -631,7 +631,7 @@ namespace v2rayN.Handler } //streamSettings - switch (config.network()) + switch (node.getNetwork()) { //kcp基本配置暂时是默认值,用户能自己设置伪装类型 case "kcp": @@ -661,11 +661,11 @@ namespace v2rayN.Handler kcpSettings.writeBufferSize = config.kcpItem.writeBufferSize; kcpSettings.header = new Header { - type = config.headerType() + type = node.headerType }; - if (!Utils.IsNullOrEmpty(config.path())) + if (!Utils.IsNullOrEmpty(node.path)) { - kcpSettings.seed = config.path(); + kcpSettings.seed = node.path; } streamSettings.kcpSettings = kcpSettings; break; @@ -675,7 +675,7 @@ namespace v2rayN.Handler { }; - string path = config.path(); + string path = node.path; if (!string.IsNullOrWhiteSpace(host)) { wsSettings.headers = new Headers @@ -705,7 +705,7 @@ namespace v2rayN.Handler { httpSettings.host = Utils.String2List(host); } - httpSettings.path = config.path(); + httpSettings.path = node.path; streamSettings.httpSettings = httpSettings; @@ -718,14 +718,14 @@ namespace v2rayN.Handler QuicSettings quicsettings = new QuicSettings { security = host, - key = config.path(), + key = node.path, header = new Header { - type = config.headerType() + type = node.headerType } }; streamSettings.quicSettings = quicsettings; - if (config.streamSecurity() == Global.StreamSecurity) + if (node.streamSecurity == Global.StreamSecurity) { if (!string.IsNullOrWhiteSpace(sni)) { @@ -733,26 +733,26 @@ namespace v2rayN.Handler } else { - streamSettings.tlsSettings.serverName = config.address(); + streamSettings.tlsSettings.serverName = node.address; } } break; case "grpc": var grpcSettings = new GrpcSettings(); - grpcSettings.serviceName = config.path(); - grpcSettings.multiMode = (config.headerType() == Global.GrpcmultiMode ? true : false); + grpcSettings.serviceName = node.path; + grpcSettings.multiMode = (node.headerType == Global.GrpcmultiMode ? true : false); streamSettings.grpcSettings = grpcSettings; break; default: //tcp带http伪装 - if (config.headerType().Equals(Global.TcpHeaderHttp)) + if (node.headerType.Equals(Global.TcpHeaderHttp)) { TcpSettings tcpSettings = new TcpSettings { header = new Header { - type = config.headerType() + type = node.headerType } }; @@ -767,9 +767,9 @@ namespace v2rayN.Handler //填入自定义Path string pathHttp = @"/"; - if (!Utils.IsNullOrEmpty(config.path())) + if (!Utils.IsNullOrEmpty(node.path)) { - string[] arrPath = config.path().Split(','); + string[] arrPath = node.path.Split(','); pathHttp = string.Join("\",\"", arrPath); } request = request.Replace("$requestPath$", string.Format("\"{0}\"", pathHttp)); @@ -837,7 +837,7 @@ namespace v2rayN.Handler return 0; } - public static int statistic(Config config, ref V2rayConfig v2rayConfig) + private static int statistic(Config config, ref V2rayConfig v2rayConfig) { if (config.enableStatistics) { @@ -889,20 +889,16 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件(自定义配置) /// - /// + /// /// /// /// - public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) + private static int GenerateClientCustomConfig(VmessItem node, string fileName, out string msg) { try { //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { msg = UIRes.I18N("CheckServerSettings"); return -1; @@ -913,7 +909,7 @@ namespace v2rayN.Handler File.Delete(fileName); } - string addressFileName = config.address(); + string addressFileName = node.address; if (!File.Exists(addressFileName)) { addressFileName = Path.Combine(Utils.GetTempPath(), addressFileName); @@ -925,7 +921,7 @@ namespace v2rayN.Handler } File.Copy(addressFileName, fileName); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.getSummary()}"); } catch { @@ -942,20 +938,16 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件 /// - /// + /// /// /// /// - public static int GenerateServerConfig(Config config, string fileName, out string msg) + public static int GenerateServerConfig(VmessItem node, string fileName, out string msg) { try { //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { msg = UIRes.I18N("CheckServerSettings"); return -1; @@ -979,18 +971,20 @@ namespace v2rayN.Handler return -1; } + var config = LazyConfig.Instance.GetConfig(); + ////开始修改配置 log(config, ref v2rayConfig, true); //vmess协议服务器配置 - ServerInbound(config, ref v2rayConfig); + ServerInbound(node, ref v2rayConfig); //传出设置 ServerOutbound(config, ref v2rayConfig); Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.getSummary()); } catch { @@ -1003,10 +997,10 @@ namespace v2rayN.Handler /// /// vmess协议服务器配置 /// - /// + /// /// /// - private static int ServerInbound(Config config, ref V2rayConfig v2rayConfig) + private static int ServerInbound(VmessItem node, ref V2rayConfig v2rayConfig) { try { @@ -1022,28 +1016,28 @@ namespace v2rayN.Handler usersItem = inbound.settings.clients[0]; } //远程服务器端口 - inbound.port = config.port(); + inbound.port = node.port; //远程服务器用户ID - usersItem.id = config.id(); + usersItem.id = node.id; usersItem.email = Global.userEMail; - if (config.configType() == (int)EConfigType.Vmess) + if (node.configType == (int)EConfigType.Vmess) { inbound.protocol = Global.vmessProtocolLite; - usersItem.alterId = config.alterId(); + usersItem.alterId = node.alterId; } - else if (config.configType() == (int)EConfigType.VLESS) + else if (node.configType == (int)EConfigType.VLESS) { inbound.protocol = Global.vlessProtocolLite; - usersItem.flow = config.flow(); - inbound.settings.decryption = config.security(); + usersItem.flow = node.flow; + inbound.settings.decryption = node.security; } //远程服务器底层传输配置 StreamSettings streamSettings = inbound.streamSettings; - boundStreamSettings(config, "in", ref streamSettings); + boundStreamSettings(node, "in", ref streamSettings); } catch { @@ -1054,7 +1048,7 @@ namespace v2rayN.Handler /// /// 传出设置 /// - /// + /// /// /// private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig) @@ -1368,25 +1362,25 @@ namespace v2rayN.Handler /// /// 导出为客户端配置 /// - /// + /// /// /// /// - public static int Export2ClientConfig(Config config, string fileName, out string msg) + public static int Export2ClientConfig(VmessItem node, string fileName, out string msg) { - return GenerateClientConfig(config, fileName, true, out msg); + return GenerateClientConfig(node, fileName, true, out msg); } /// /// 导出为服务端配置 /// - /// + /// /// /// /// - public static int Export2ServerConfig(Config config, string fileName, out string msg) + public static int Export2ServerConfig(VmessItem node, string fileName, out string msg) { - return GenerateServerConfig(config, fileName, out msg); + return GenerateServerConfig(node, fileName, out msg); } #endregion @@ -1398,11 +1392,7 @@ namespace v2rayN.Handler { try { - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (config == null) { msg = UIRes.I18N("CheckServerSettings"); return ""; @@ -1470,7 +1460,6 @@ namespace v2rayN.Handler { continue; } - configCopy.index = it.selected; it.port = port; Inbounds inbound = new Inbounds @@ -1482,9 +1471,9 @@ namespace v2rayN.Handler inbound.tag = Global.InboundHttp + inbound.port.ToString(); v2rayConfig.inbounds.Add(inbound); - + var index = configCopy.FindIndexId(it.indexId); V2rayConfig v2rayConfigCopy = Utils.FromJson(result); - outbound(configCopy, ref v2rayConfigCopy); + outbound(configCopy.vmess[index], ref v2rayConfigCopy); v2rayConfigCopy.outbounds[0].tag = Global.agentTag + inbound.port.ToString(); v2rayConfig.outbounds.Add(v2rayConfigCopy.outbounds[0]); @@ -1497,7 +1486,7 @@ namespace v2rayN.Handler v2rayConfig.routing.rules.Add(rule); } - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), configCopy.getSummary()); + //msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.getSummary()); return Utils.ToJson(v2rayConfig); } catch diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 1b0b99b8..b3d2df98 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -56,8 +56,9 @@ namespace v2rayN.Handler if (Global.reloadV2ray) { + var item = ConfigHandler.GetDefaultServer(ref config); string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) + if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) { ShowMsg(false, msg); } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 834deb1c..727eb0e5 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Base; +using System.Linq; namespace v2rayN.Mode @@ -30,10 +31,7 @@ namespace v2rayN.Mode get; set; } - /// - /// 活动配置序号 - /// - public int index + public string indexId { get; set; } @@ -206,111 +204,13 @@ namespace v2rayN.Mode get; set; } + public List groupItem + { + get; set; + } #endregion - #region function - - public string address() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].address.TrimEx(); - } - - public int port() - { - if (index < 0) - { - return 10808; - } - return vmess[index].port; - } - - public string id() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].id.TrimEx(); - } - - public int alterId() - { - if (index < 0) - { - return 0; - } - return vmess[index].alterId; - } - - public string security() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].security.TrimEx(); - } - - public string remarks() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].remarks.TrimEx(); - } - public string network() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network) || !Global.networks.Contains(vmess[index].network)) - { - return Global.DefaultNetwork; - } - return vmess[index].network.TrimEx(); - } - public string headerType() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType)) - { - return Global.None; - } - return vmess[index].headerType.Replace(" ", "").TrimEx(); - } - public string requestHost() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost)) - { - return string.Empty; - } - return vmess[index].requestHost.Replace(" ", "").TrimEx(); - } - public string path() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path)) - { - return string.Empty; - } - return vmess[index].path.Replace(" ", "").TrimEx(); - } - public string streamSecurity() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity)) - { - return string.Empty; - } - return vmess[index].streamSecurity; - } - public bool allowInsecure() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure)) - { - return defAllowInsecure; - } - return Convert.ToBoolean(vmess[index].allowInsecure); - } + #region function public int GetLocalPort(string protocol) { @@ -336,79 +236,13 @@ namespace v2rayN.Mode return localPort; } - public int configType() + public int FindIndexId(string id) { - if (index < 0) - { - return 0; - } - return vmess[index].configType; - } - - public string getSummary() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].getSummary(); - } - - public string getItemId() - { - if (index < 0) - { - return string.Empty; - } - - return vmess[index].getItemId(); - } - public string flow() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].flow.TrimEx(); - } - public string sni() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].sni.TrimEx(); - } - public List alpn() - { - if (index < 0) - { - return null; - } - if (vmess[index].alpn != null && vmess[index].alpn.Count > 0) - { - return vmess[index].alpn; - } - else - { - return null; - } - } - public string indexId() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].indexId.TrimEx(); - } - public int FindIndexId(string indexId) - { - if (string.IsNullOrEmpty(indexId)) + if (string.IsNullOrEmpty(id)) { return -1; } - return vmess.FindIndex(it => it.indexId == indexId); + return vmess.FindIndex(it => it.indexId == id); } public List GetShadowsocksSecuritys() @@ -420,7 +254,26 @@ namespace v2rayN.Mode return Global.ssSecuritysInXray; } - + + public bool IsActiveNode(VmessItem item) + { + if (!Utils.IsNullOrEmpty(item.indexId) && item.indexId == indexId) + { + return true; + } + + return false; + } + + public string GetGroupRemarks(string groupId) + { + if (string.IsNullOrEmpty(groupId)) + { + return string.Empty; + } + return groupItem.Where(it => it.id == groupId).FirstOrDefault()?.remarks; + } + #endregion } @@ -431,7 +284,9 @@ namespace v2rayN.Mode public VmessItem() { indexId = string.Empty; - configVersion = 1; + configType = (int)EConfigType.Vmess; + configVersion = 2; + sort = 0; address = string.Empty; port = 0; id = string.Empty; @@ -444,12 +299,13 @@ namespace v2rayN.Mode path = string.Empty; streamSecurity = string.Empty; allowInsecure = string.Empty; - configType = (int)EConfigType.Vmess; testResult = string.Empty; subid = string.Empty; flow = string.Empty; + groupId = string.Empty; } + #region function public string getSummary() { string summary = string.Format("[{0}] ", ((EConfigType)configType).ToString()); @@ -470,23 +326,33 @@ namespace v2rayN.Mode switch (configType) { 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; + //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; } @@ -511,17 +377,40 @@ namespace v2rayN.Mode return subid.Substring(0, 4); } - public string getItemId() + public List getAlpn() { - string itemId = $"{address}{port}{requestHost}{path}"; - itemId = Utils.Base64Encode(itemId); - return itemId; + if (alpn != null && alpn.Count > 0) + { + return alpn; + } + else + { + return null; + } } + public string getNetwork() + { + if (Utils.IsNullOrEmpty(network) || !Global.networks.Contains(network)) + { + return Global.DefaultNetwork; + } + return network.TrimEx(); + } + #endregion + public string indexId { get; set; } + /// + /// config type(1=normal,2=custom) + /// + public int configType + { + get; set; + } + /// /// 版本(现在=2) /// @@ -530,6 +419,11 @@ namespace v2rayN.Mode get; set; } + public int sort + { + get; set; + } + /// /// 远程服务器地址 /// @@ -620,15 +514,6 @@ namespace v2rayN.Mode get; set; } - - /// - /// config type(1=normal,2=custom) - /// - public int configType - { - get; set; - } - /// /// /// @@ -666,6 +551,11 @@ namespace v2rayN.Mode { get; set; } + + public string groupId + { + get; set; + } } [Serializable] @@ -795,6 +685,11 @@ namespace v2rayN.Mode { get; set; } = string.Empty; + + public string groupId + { + get; set; + } } [Serializable] @@ -853,4 +748,24 @@ namespace v2rayN.Mode public Keys? KeyCode { get; set; } } + + [Serializable] + public class GroupItem + { + /// + /// + /// + public string id + { + get; set; + } + + /// + /// + /// + public string remarks + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs index 8c4651f3..c15aa9ea 100644 --- a/v2rayN/v2rayN/Mode/ServerTestItem.cs +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -5,10 +5,6 @@ namespace v2rayN.Mode [Serializable] class ServerTestItem { - public int selected - { - get; set; - } public string indexId { get; set; diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 53145d83..cdb60dff 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -1041,5 +1041,14 @@ namespace v2rayN.Resx { return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); } } + + /// + /// 查找类似 Ungrouped 的本地化字符串。 + /// + internal static string UngroupedServers { + get { + return ResourceManager.GetString("UngroupedServers", resourceCulture); + } + } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 4c3ca750..81897dae 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -445,4 +445,7 @@ Global hotkey {0} registered successfully + + Ungrouped + \ 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 db8c9970..e0fc1b08 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -445,4 +445,7 @@ 注册全局热键 {0} 成功 + + 未分组服务器 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig.txt index 29186903..3aa0bb76 100644 --- a/v2rayN/v2rayN/Sample/SampleServerConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleServerConfig.txt @@ -18,7 +18,7 @@ "network": "tcp" } }], - "outbound": [{ + "outbounds": [{ "protocol": "freedom", "settings": {} }, { diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 97e1934d..7de1c760 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -284,6 +284,18 @@ namespace v2rayN return 0; } } + public static bool ToBool(object obj) + { + try + { + return Convert.ToBoolean(obj); + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + return false; + } + } public static string ToString(object obj) { diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 70b76468..6cb109d8 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -85,6 +85,7 @@ + @@ -155,6 +156,18 @@ ServerTransportControl.cs + + UserControl + + + GroupSettingControl.cs + + + Form + + + GroupSettingForm.cs + @@ -364,6 +377,14 @@ ServerTransportControl.cs + + GroupSettingControl.cs + Designer + + + GroupSettingControl.cs + Designer + SubSettingControl.cs Designer @@ -378,6 +399,13 @@ RoutingSettingForm.cs + + GroupSettingForm.cs + Designer + + + GroupSettingForm.cs + SubSettingForm.cs Designer From f6ccee197618fd503bb958e1278fb06104a53d73 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 13 Mar 2022 16:15:11 +0800 Subject: [PATCH 108/252] Refactor Scan Screen Task --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 25 ++++------ v2rayN/v2rayN/Forms/MainForm.cs | 58 +++++++++++------------- v2rayN/v2rayN/Forms/MainForm.resx | 37 ++++++--------- 3 files changed, 48 insertions(+), 72 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 914921d4..0a309df6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -64,9 +64,9 @@ 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.tabGroup = new System.Windows.Forms.TabControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); + this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.gbMsgTitle = new System.Windows.Forms.GroupBox(); @@ -101,7 +101,6 @@ this.menuUpdateSubViaProxy = 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(); this.panel1 = new System.Windows.Forms.Panel(); this.tsMain = new System.Windows.Forms.ToolStrip(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); @@ -227,7 +226,6 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -412,13 +410,6 @@ resources.ApplyResources(this.menuExport2SubContent, "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"; - // // tabGroup // resources.ApplyResources(this.tabGroup, "tabGroup"); @@ -431,6 +422,13 @@ resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // + // tsbServer + // + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.Name = "tsbServer"; + // // splitContainer1 // resources.ApplyResources(this.splitContainer1, "splitContainer1"); @@ -677,12 +675,6 @@ resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // - // bgwScan - // - this.bgwScan.WorkerReportsProgress = true; - this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork); - this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged); - // // panel1 // resources.ApplyResources(this.panel1, "panel1"); @@ -1027,7 +1019,6 @@ private System.Windows.Forms.ToolStripDropDownButton tsbHelp; private System.Windows.Forms.ToolStripMenuItem tsbAbout; private System.Windows.Forms.ToolStripMenuItem menuAddServers2; - private System.ComponentModel.BackgroundWorker bgwScan; private System.Windows.Forms.ToolStripMenuItem menuScanScreen; private System.Windows.Forms.ToolStripMenuItem menuScanScreen2; private System.Windows.Forms.ToolStripDropDownButton tsbSub; diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 820ffae2..c6c7e02c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1008,9 +1008,34 @@ namespace v2rayN.Forms } private void menuScanScreen_Click(object sender, EventArgs e) + { + _ = ScanScreenTaskAsync(); + } + + public async Task ScanScreenTaskAsync() { HideForm(); - bgwScan.RunWorkerAsync(); + + string result = await Task.Run(() => + { + return Utils.ScanScreen(); + }); + + ShowForm(); + + if (Utils.IsNullOrEmpty(result)) + { + UI.ShowWarning(UIRes.I18N("NoValidQRcodeFound")); + } + else + { + int ret = MainFormHandler.Instance.AddBatchServers(config, result, "", groupId); + if (ret > 0) + { + RefreshServers(); + UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); + } + } } private void menuUpdateSubscriptions_Click(object sender, EventArgs e) @@ -1422,37 +1447,6 @@ namespace v2rayN.Forms } #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 - { - int ret = MainFormHandler.Instance.AddBatchServers(config, result, "", groupId); - if (ret > 0) - { - RefreshServers(); - UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); - } - } - } - - #endregion - #region 订阅 private void tsbSubSetting_Click(object sender, EventArgs e) { diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index b7d19fed..7a643648 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -302,18 +302,6 @@ Export subscription (base64) share to clipboard - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - 356, 622 @@ -464,6 +452,18 @@ 0 + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + Fill @@ -510,7 +510,7 @@ 0 - 603, 17 + 493, 20 227, 22 @@ -549,7 +549,7 @@ Set message filters - 228, 136 + 228, 158 cmsMsgBox @@ -824,9 +824,6 @@ True - - 498, 17 - Top @@ -1478,12 +1475,6 @@ 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 - toolStripSeparator4 From 4d7cf140cdbe0014458306c06039bcb0f1557971 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 13 Mar 2022 18:47:17 +0800 Subject: [PATCH 109/252] fix speed test display --- v2rayN/v2rayN/Forms/MainForm.cs | 6 +++--- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 4 +++- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 17 ++++++++-------- v2rayN/v2rayN/Mode/Config.cs | 22 +++++++++++++++++---- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index c6c7e02c..cb24c786 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -288,7 +288,7 @@ namespace v2rayN.Forms Utils.AddSubItem(lvItem, EServerColName.security.ToString(), item.security); Utils.AddSubItem(lvItem, EServerColName.network.ToString(), item.network); Utils.AddSubItem(lvItem, EServerColName.streamSecurity.ToString(), item.streamSecurity); - Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); + Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.GetSubRemarks(config)); Utils.AddSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); if (stats) { @@ -336,7 +336,7 @@ namespace v2rayN.Forms for (int k = 0; k < lstVmess.Count; k++) { VmessItem item = lstVmess[k]; - string name = item.getSummary(); + string name = item.GetSummary(); if (config.IsActiveNode(item)) { @@ -355,7 +355,7 @@ namespace v2rayN.Forms for (int k = 0; k < lstVmess.Count; k++) { VmessItem item = lstVmess[k]; - string name = item.getSummary(); + string name = item.GetSummary(); ToolStripMenuItem ts = new ToolStripMenuItem(name) { diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 1783782b..2e7d7746 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -141,7 +141,8 @@ namespace v2rayN.Handler int responseTime = -1; string status = GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; - + + _config.GetVmessItem(it.indexId)?.SetTestResult(output); _updateFunc(it.indexId, output); } catch (Exception ex) @@ -210,6 +211,7 @@ namespace v2rayN.Handler DownloadHandle downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { + _config.GetVmessItem(testIndexId)?.SetTestResult(args.Msg); _updateFunc(testIndexId, args.Msg); }; downloadHandle2.Error += (sender2, args) => diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 27021a16..cf78774a 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -80,7 +80,7 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{config.GetGroupRemarks(node.groupId)}] {node.getSummary()}"); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{config.GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } catch { @@ -584,7 +584,7 @@ namespace v2rayN.Handler { var config = LazyConfig.Instance.GetConfig(); //远程服务器底层传输配置 - streamSettings.network = node.getNetwork(); + streamSettings.network = node.GetNetwork(); string host = node.requestHost.TrimEx(); string sni = node.sni; @@ -596,7 +596,7 @@ namespace v2rayN.Handler TlsSettings tlsSettings = new TlsSettings { allowInsecure = Utils.ToBool(node.allowInsecure), - alpn = node.getAlpn() + alpn = node.GetAlpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -617,7 +617,7 @@ namespace v2rayN.Handler TlsSettings xtlsSettings = new TlsSettings { allowInsecure = Utils.ToBool(node.allowInsecure), - alpn = node.getAlpn() + alpn = node.GetAlpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -631,7 +631,7 @@ namespace v2rayN.Handler } //streamSettings - switch (node.getNetwork()) + switch (node.GetNetwork()) { //kcp基本配置暂时是默认值,用户能自己设置伪装类型 case "kcp": @@ -921,7 +921,7 @@ namespace v2rayN.Handler } File.Copy(addressFileName, fileName); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.getSummary()}"); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } catch { @@ -984,7 +984,7 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.GetSummary()); } catch { @@ -1471,9 +1471,8 @@ namespace v2rayN.Handler inbound.tag = Global.InboundHttp + inbound.port.ToString(); v2rayConfig.inbounds.Add(inbound); - var index = configCopy.FindIndexId(it.indexId); V2rayConfig v2rayConfigCopy = Utils.FromJson(result); - outbound(configCopy.vmess[index], ref v2rayConfigCopy); + outbound(configCopy.GetVmessItem(it.indexId), ref v2rayConfigCopy); v2rayConfigCopy.outbounds[0].tag = Global.agentTag + inbound.port.ToString(); v2rayConfig.outbounds.Add(v2rayConfigCopy.outbounds[0]); diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 727eb0e5..4f146871 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -245,6 +245,15 @@ namespace v2rayN.Mode return vmess.FindIndex(it => it.indexId == id); } + public VmessItem GetVmessItem(string id) + { + if (string.IsNullOrEmpty(id)) + { + return null; + } + return vmess.FirstOrDefault(it => it.indexId == id); + } + public List GetShadowsocksSecuritys() { if (coreType == ECoreType.v2fly_core) @@ -306,7 +315,7 @@ namespace v2rayN.Mode } #region function - public string getSummary() + public string GetSummary() { string summary = string.Format("[{0}] ", ((EConfigType)configType).ToString()); string[] arrAddr = address.Split('.'); @@ -356,7 +365,7 @@ namespace v2rayN.Mode } return summary; } - public string getSubRemarks(Config config) + public string GetSubRemarks(Config config) { string subRemarks = string.Empty; if (Utils.IsNullOrEmpty(subid)) @@ -377,7 +386,7 @@ namespace v2rayN.Mode return subid.Substring(0, 4); } - public List getAlpn() + public List GetAlpn() { if (alpn != null && alpn.Count > 0) { @@ -388,7 +397,7 @@ namespace v2rayN.Mode return null; } } - public string getNetwork() + public string GetNetwork() { if (Utils.IsNullOrEmpty(network) || !Global.networks.Contains(network)) { @@ -396,6 +405,11 @@ namespace v2rayN.Mode } return network.TrimEx(); } + + public void SetTestResult(string value) + { + testResult = value; + } #endregion public string indexId From e030fae1c42e40e4f8910433e5701485fc02f259 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:16:59 +0800 Subject: [PATCH 110/252] Update GroupSettingForm.cs --- v2rayN/v2rayN/Forms/GroupSettingForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs index 11e5d7ad..0b0d3e4c 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingForm.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -100,7 +100,7 @@ namespace v2rayN.Forms GroupItem groupItem = new GroupItem { id = string.Empty, - remarks = "remarks" + remarks = "Group" }; config.groupItem.Add(groupItem); } From 82682d44740f3c771c33f4cb1e7a0dbed7e21e39 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:36:09 +0800 Subject: [PATCH 111/252] Update MainForm.cs --- v2rayN/v2rayN/Forms/MainForm.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index cb24c786..78f1d58c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1164,7 +1164,10 @@ namespace v2rayN.Forms private void ShowForm() { this.Show(); - this.WindowState = FormWindowState.Normal; + if (this.WindowState == FormWindowState.Minimized) + { + this.WindowState = FormWindowState.Normal; + } this.Activate(); this.ShowInTaskbar = true; //this.notifyIcon1.Visible = false; From 6517f668767fa286690da0f1b8917b3b8dd25ac8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:41:39 +0800 Subject: [PATCH 112/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index ee45935f..ff232a58 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("4.36")] +[assembly: AssemblyFileVersion("5.0")] From 0463c1a6e79307efc10e3b5d6685733c6ae296ff Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 15 Mar 2022 19:17:32 +0800 Subject: [PATCH 113/252] bug fix --- v2rayN/v2rayN/Forms/GroupSettingForm.cs | 7 +------ v2rayN/v2rayN/Forms/MainForm.cs | 28 ++++++++++++------------- v2rayN/v2rayN/Forms/SubSettingForm.cs | 5 ----- v2rayN/v2rayN/Handler/ConfigHandler.cs | 11 +++++----- v2rayN/v2rayN/Handler/UpdateHandle.cs | 9 ++++---- v2rayN/v2rayN/Mode/Config.cs | 4 ++-- 6 files changed, 28 insertions(+), 36 deletions(-) diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs index 0b0d3e4c..7856256c 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingForm.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -66,12 +66,7 @@ namespace v2rayN.Forms } private void btnOK_Click(object sender, EventArgs e) - { - if (config.groupItem.Count <= 0) - { - AddGroup(); - } - + { if (ConfigHandler.SaveGroupItem(ref config) == 0) { this.DialogResult = DialogResult.OK; diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 78f1d58c..85f43a9a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -82,7 +82,7 @@ namespace v2rayN.Forms RefreshRoutingsMenu(); RestoreUI(); - LoadV2ray(); + _ = LoadV2ray(); HideForm(); @@ -602,7 +602,7 @@ namespace v2rayN.Forms if (fm.ShowDialog() == DialogResult.OK) { RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } } @@ -691,7 +691,7 @@ namespace v2rayN.Forms ConfigHandler.RemoveServer(config, lvSelecteds); RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) @@ -700,7 +700,7 @@ namespace v2rayN.Forms ConfigHandler.DedupServerList(ref config, ref lstVmess); int newCount = lstVmess.Count; RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); } @@ -847,7 +847,7 @@ namespace v2rayN.Forms if (fm.ShowDialog() == DialogResult.OK) { RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } } @@ -858,7 +858,7 @@ namespace v2rayN.Forms { RefreshRoutingsMenu(); RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } } @@ -869,7 +869,7 @@ namespace v2rayN.Forms { RefreshRoutingsMenu(); RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } } @@ -888,7 +888,7 @@ namespace v2rayN.Forms private void tsbReload_Click(object sender, EventArgs e) { Global.reloadV2ray = true; - LoadV2ray(); + _ = LoadV2ray(); } private void tsbClose_Click(object sender, EventArgs e) @@ -913,7 +913,7 @@ namespace v2rayN.Forms if (ConfigHandler.SetDefaultServer(ref config, lstVmess[index]) == 0) { RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } return 0; } @@ -1267,7 +1267,7 @@ namespace v2rayN.Forms if (success) { Global.reloadV2ray = true; - LoadV2ray(); + _ = LoadV2ray(); } } #endregion @@ -1396,7 +1396,7 @@ namespace v2rayN.Forms AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); Global.reloadV2ray = true; - LoadV2ray(); + _ = LoadV2ray(); AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); } @@ -1412,7 +1412,7 @@ namespace v2rayN.Forms if (success) { Global.reloadV2ray = true; - LoadV2ray(); + _ = LoadV2ray(); } }); } @@ -1425,7 +1425,7 @@ namespace v2rayN.Forms if (success) { Global.reloadV2ray = true; - LoadV2ray(); + _ = LoadV2ray(); } }); } @@ -1576,7 +1576,7 @@ namespace v2rayN.Forms if (ConfigHandler.SetDefaultRouting(ref config, index) == 0) { RefreshRoutingsMenu(); - LoadV2ray(); + _ = LoadV2ray(); } } catch diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index c8e7725b..e7ba4dd3 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -68,11 +68,6 @@ namespace v2rayN.Forms private void btnOK_Click(object sender, EventArgs e) { - if (config.subItem.Count <= 0) - { - AddSub(); - } - if (ConfigHandler.SaveSubItem(ref config) == 0) { this.DialogResult = DialogResult.OK; diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 42d78b9b..3547a9b3 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -764,7 +764,7 @@ namespace v2rayN.Handler /// public static int SaveSubItem(ref Config config) { - if (config.subItem == null || config.subItem.Count <= 0) + if (config.subItem == null) { return -1; } @@ -926,7 +926,7 @@ namespace v2rayN.Handler } if (!config.vmess.Exists(it => it.indexId == vmessItem.indexId)) { - var maxSort = config.vmess.Max(t => t.sort); + var maxSort = config.vmess.Any() ? config.vmess.Max(t => t.sort) : 0; vmessItem.sort = maxSort++; config.vmess.Add(vmessItem); @@ -970,7 +970,7 @@ namespace v2rayN.Handler /// public static int SaveGroupItem(ref Config config) { - if (config.groupItem == null || config.groupItem.Count <= 0) + if (config.groupItem == null) { return -1; } @@ -989,12 +989,13 @@ namespace v2rayN.Handler public static int RemoveGroupItem(ref Config config, string groupId) { - if (Utils.IsNullOrEmpty(groupId) || config.vmess.Count <= 0) + if (Utils.IsNullOrEmpty(groupId)) { return -1; } - foreach (var item in config.vmess) + var items = config.vmess.Where(t => t.groupId == groupId).ToList(); + foreach (var item in items) { if (item.groupId.Equals(groupId)) { diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 5688b797..ccbd3ecd 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -6,6 +6,7 @@ using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; +using v2rayN.Base; using v2rayN.Mode; namespace v2rayN.Handler @@ -177,10 +178,10 @@ namespace v2rayN.Handler for (int k = 1; k <= config.subItem.Count; k++) { - string id = config.subItem[k - 1].id.Trim(); - string url = config.subItem[k - 1].url.Trim(); - string userAgent = config.subItem[k - 1].userAgent.Trim(); - string groupId = config.subItem[k - 1].groupId.Trim(); + string id = config.subItem[k - 1].id.TrimEx(); + string url = config.subItem[k - 1].url.TrimEx(); + string userAgent = config.subItem[k - 1].userAgent.TrimEx(); + string groupId = config.subItem[k - 1].groupId.TrimEx(); string hashCode = $"{k}->"; if (config.subItem[k - 1].enabled == false) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 4f146871..53846f65 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -569,7 +569,7 @@ namespace v2rayN.Mode public string groupId { get; set; - } + } = string.Empty; } [Serializable] @@ -703,7 +703,7 @@ namespace v2rayN.Mode public string groupId { get; set; - } + } = string.Empty; } [Serializable] From 1f0a77bde2c65d3c3436d102f68dc68845b1d715 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 15 Mar 2022 19:17:54 +0800 Subject: [PATCH 114/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index ff232a58..99d6a68d 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.0")] +[assembly: AssemblyFileVersion("5.1")] From c2af982272e65a1f2cd9fef22d143586b29351dc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 15 Mar 2022 20:32:14 +0800 Subject: [PATCH 115/252] add all servers group --- v2rayN/v2rayN/Forms/MainForm.cs | 25 +++++++++++++------------ v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 +++++++++ v2rayN/v2rayN/Resx/ResUI.resx | 3 +++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 +++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 85f43a9a..7a1fa555 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -201,7 +201,10 @@ namespace v2rayN.Forms /// private void RefreshServers() { - lstVmess = config.vmess.Where(it => it.groupId == groupId).OrderBy(it => it.sort).ToList(); + lstVmess = config.vmess + .Where(it => Utils.IsNullOrEmpty(groupId) ? true : it.groupId == groupId) + .OrderBy(it => it.sort) + .ToList(); ConfigHandler.SetDefaultServer(config, lstVmess); RefreshServersView(); @@ -469,6 +472,11 @@ namespace v2rayN.Forms { tabGroup.TabPages.Clear(); + string title = $" {UIRes.I18N("AllGroupServers")} "; + var tabPage = new TabPage(title); + tabPage.Name = ""; + tabGroup.TabPages.Add(tabPage); + foreach (var item in config.groupItem) { var tabPage2 = new TabPage($" {item.remarks} "); @@ -476,12 +484,7 @@ namespace v2rayN.Forms tabGroup.TabPages.Add(tabPage2); } - string title = $" {UIRes.I18N("UngroupedServers")} "; - var tabPage = new TabPage(title); - tabPage.Name = "Ungrouped"; - tabGroup.TabPages.Add(tabPage); - - tabGroup.SelectedIndex = tabGroup.TabPages.Count - 1; + tabGroup.SelectedIndex = 0; } private void tabGroup_SelectedIndexChanged(object sender, EventArgs e) @@ -491,11 +494,9 @@ namespace v2rayN.Forms return; } groupId = string.Empty; - if (tabGroup.SelectedIndex < config.groupItem.Count) - { - groupId = config.groupItem[tabGroup.SelectedIndex].id; - } - + //groupId = tabGroup.TabPages[tabGroup.SelectedIndex].Name; + groupId = tabGroup.SelectedTab.Name; + RefreshServers(); } #endregion diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index cdb60dff..d2eaae06 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -69,6 +69,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 All servers 的本地化字符串。 + /// + internal static string AllGroupServers { + get { + return ResourceManager.GetString("AllGroupServers", resourceCulture); + } + } + /// /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 81897dae..563b7092 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -448,4 +448,7 @@ Ungrouped + + All servers + \ 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 e0fc1b08..fe9c7606 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -448,4 +448,7 @@ 未分组服务器 + + 所有服务器 + \ No newline at end of file From b69387361903373afb7d33dfb27173df1c162704 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 17 Mar 2022 18:41:07 +0800 Subject: [PATCH 116/252] Subscription support authentication --- .../Forms/OptionSettingForm.Designer.cs | 33 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3120 ++++++++--------- v2rayN/v2rayN/Forms/SubSettingControl.cs | 4 + v2rayN/v2rayN/Global.cs | 3 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 9 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 3 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.resx | 2 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 2 +- 10 files changed, 1593 insertions(+), 1587 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 66c4f9ff..00c105a5 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -104,33 +104,32 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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); this.tabControl1.Controls.Add(this.tabPage3); + resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); 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.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); @@ -148,6 +147,7 @@ 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; // @@ -190,12 +190,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 @@ -210,8 +210,8 @@ // // cmbprotocol // - resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -237,7 +237,6 @@ // // cmbloglevel // - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -246,6 +245,7 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -265,10 +265,10 @@ // // tabPage2 // - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -291,7 +291,6 @@ // // tabPage6 // - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -305,6 +304,7 @@ 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; // @@ -376,7 +376,6 @@ // // tabPage7 // - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13); this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth); this.tabPage7.Controls.Add(this.btnSetLoopback); @@ -391,6 +390,7 @@ this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // @@ -431,12 +431,9 @@ // // cmbCoreType // - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType.FormattingEnabled = true; - this.cmbCoreType.Items.AddRange(new object[] { - resources.GetString("cmbCoreType.Items"), - resources.GetString("cmbCoreType.Items1")}); + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); this.cmbCoreType.Name = "cmbCoreType"; // // label4 @@ -452,9 +449,9 @@ // // 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 @@ -482,17 +479,17 @@ // // tabPage3 // - resources.ApplyResources(this.tabPage3, "tabPage3"); this.tabPage3.Controls.Add(this.groupBox2); + resources.ApplyResources(this.tabPage3, "tabPage3"); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -513,9 +510,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 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index a21e6b31..e3673fde 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -16,6 +16,8 @@ namespace v2rayN.Forms private void OptionSettingForm_Load(object sender, EventArgs e) { + cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); + InitBase(); InitKCP(); diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index bd348c62..26bac3d1 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,34 +117,995 @@ 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 + + + 15, 192 + + + 102, 16 + + + 35 + + + allowInsecure + + + chkdefAllowInsecure + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 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 + + + 1 + + + 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 + + + 2 + + + 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 + + + 3 + True - - Xray_core + + 15, 63 - - 11 + + 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 + + + 4 + + + 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 + + + 5 + + + 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 + + + 6 + + + 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 + + + 7 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Keep older when deduplication + + groupBox1 - - 3 + + 8 - - - 6, 283 + + 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 + + + 9 + + + 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 + + + 10 + + + 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 + + + 11 + + + True + + + 15, 160 + + + 126, 16 + + + 9 Record local logs - - tabPage7 + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 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 + + + 13 + + + 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 + + + 14 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + 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 + + + 16 + + + Fill + + + 3, 3 + + + 648, 421 + + + 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, 427 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + True + + + NoControl + + + 342, 17 + + + 0, 0, 0, 0 + + + 107, 12 + + + 40 + + + Support DnsObject + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 8, 41 + + + True + + + Vertical + + + 638, 356 + + + 39 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + True + + + NoControl + + + 8, 17 + + + 281, 12 + + + 38 + + + Custom DNS (multiple, separated by commas (,)) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 654, 427 + + + 4 + + + Core: DNS 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 + + + 1 + + + True + + + 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 + + + 94, 21 + + + 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 12 @@ -152,1655 +1113,688 @@ 4, 22 - - txtKcpwriteBufferSize + + 3, 3, 3, 3 - - groupBox1 + + 654, 427 - - 10 - - - False - - - 14 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - groupBox1 - - - 9 - - - groupBox1 - - - label15 - - - txtautoUpdateInterval - - + 2 - - 35 - - - 1 - - - 468, 60 - - - - Top - - - 102, 16 - - - cmbprotocol - - - 6 - - - tabPage6 - - - tabPage3 - - - 5 - - - 30, 88 - - - 111, 100 - - - True - - - System.Windows.Forms.Label, 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 - - - 84, 16 - - - 40 - - - True - - - 120, 16 - - - label13 - - - tabPage2 - - - True - - - tti + + Core: KCP settings tabPage6 - - chkdefAllowInsecure + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 75, 23 - - - 7 - - - tabPage7 - - - 33 - - - 12 - - - 662, 60 - - - chkEnableSecurityProtocolTls13 - - - NoControl - - - http - - - 7 - - - label5 - - - 648, 421 - - - 206, 64 - - - 95, 12 - - - tabPage6 - - - 14 - - - 654, 427 - - - 39 - - - 317, 12 - - - 15, 63 - - - System.Windows.Forms.CheckBox, 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 + + tabControl1 2 - - Enable UDP - - - 198, 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - &Cancel - - - label10 - - - 654, 427 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 662, 10 - - - True - - - 15, 189 - - - 15, 132 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label4 - - - 236, 66 - - - txtKcpmtu - - - lbFreshrate - - - 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label11 - - - 29 - - - True - - - 0, 10 - - - 58, 20 - - - Support DnsObject - - - tabPage6 - - - False - - - tabControl1 - - - $this - - - 3 - - - 662, 523 - - - 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - tabPage7 - - - 0 - - - tabPage6 - - - Fill - - - 576, 16 - - - 18 - - - True - - - 39 - - - 15, 40 - - - congestion - - - NoControl - - - panel2 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 15, 211 - - 1 + + 506, 16 - - 89, 12 - - - NoControl - - - 0 - - - tabPage7 - - - v2rayN settings - - - 16 - - - groupBox1 - - - 10 - - - 32 - - - 6, 12 - - - groupBox1 - - - 1 - - - True - - - 8 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 41 Enable Security Protocol TLS v1.3 (subscription/update/speedtest) - - Automatically start at system startup + + chkEnableSecurityProtocolTls13 - - Fill - - - txtKcptti - - - Vertical - - - Turn on Sniffing - - - 281, 12 - - - Ignore Geo files when updating core - - - tabPage7 - - - 355, 16 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 662, 453 - - - 33, 29 - - - 1 - - - 124, 60 - - - 78, 21 - - - Log level - - - tabControl1 - - - 59, 12 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - warning - - - tabPage2 - - - 4 - - - 11 - - - Statistics freshrate - - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + tabPage7 + + + 0 + + True - - 120, 16 + + NoControl - - 89, 12 + + 15, 189 - - btnOK + + 390, 16 - - 18, 66 + + 40 - - 20, 143 + + Automatically adjust column width after updating subscription - - 15 + + chkEnableAutoAdjustMainLvColWidth - + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + NoControl + + + 30, 376 + + + 282, 23 + + + 39 + + + Set Windows10 UWP Loopback + + + btnSetLoopback + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + 325, 156 + + + 97, 21 + + + 38 + + + txtautoUpdateInterval + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + True - - 4, 4, 4, 4 + + NoControl - - tabPage6 + + 30, 162 - - 5 + + 239, 12 - - Turn on Sniffing + + 37 - - groupBox1 + + Automatic update interval of Geo(hours) - - 18, 28 + + label15 - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage7 - - 20 - - - 29 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - - - 5 - - - label12 - - - 4, 22 - - - Core Type - - - True - - - 8, 28 - - - chksniffingEnabled - - - 2 - - - 174, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - 18, 104 - - - tabPage2 - - - mtu - - - 282, 23 - - - socks - - - 36 - - - System.Windows.Forms.GroupBox, 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 - - - groupBox2 - - - panel1 - - - 30 - - - 53, 12 - - - 13 - - - label8 - - - 468, 27 - - - 236, 28 - - - chkAutoRun - - - 94, 21 - - - 345, 62 - - - 11 - - - 15, 129 - - - chkudpEnabled - - - 6 - - - Allow connections from the LAN - - - True - - - 8, 17 - - - tabPage1 - - - tabPage7 - - - tabPage6 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 84, 16 - - - 15 - - - True - - - False - - - label7 - - - txtlocalPort - - - info - - - tabPage7 - - - 19 - - - readBufferSize - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnClose - - - 124, 25 - - - protocol - - - True - - - 23, 12 - - - 638, 356 - - - socks - - - 8 - - - 3, 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - chkAllowLANConn - - - 84, 16 - - - tabControl1 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - - - 369, 62 - - - 161, 84 - - - 9 - - - System proxy settings - - - groupBox1 - - - 253, 134 - - - NoControl - - - chkEnableStatistics - - - 4 - 4 - - 53, 12 - - - 193, 162 - - - btnSetLoopback - - - 369, 27 - - - 1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - label2 - - - Set Windows10 UWP Loopback - - - 654, 427 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - - - 101, 12 - - - 11 - - - tabPage7 - - - 12 - - - 20 - - - allowInsecure - - - groupBox2 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + True NoControl - - 107, 12 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - Listening port - - - Fill - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - 41 - - - 257, 60 - - - 0 - - - tabControl1 - - - True - - - 34 - - - cmbprotocol2 - - - NoControl - - - chkKeepOlderDedupl - - - True - - - 16 - - - True - - - True - - - True - - - chkKcpcongestion - - - Core: basic settings - - - 0 - - - 257, 25 - - - 3, 3, 3, 3 - - - tabControl1 - - - True - - - 30, 376 - - - listening port 2 - - - 97, 20 - - - chkAllowIn2 - - - tabPage3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Automatically adjust column width after updating subscription - - - 15, 160 - - - Vertical - - - 38 - - - Automatic update interval of Geo(hours) - - - 4, 22 - - - v2fly_core - - - 9 - - - label1 - - - Core: KCP settings - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - error - - - True - - - 59, 12 - - - 38 - - - System.Windows.Forms.CheckBox, 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 - - - 8 - - - 120, 16 - - - 2 - - - txtlocalPort2 - - - True - - - 246, 16 - - - True - - - 506, 16 - - - 654, 427 - - - 42 - - - 10 - - - False - - - 206, 29 - - - downlinkCapacity - - - chkudpEnabled2 - - - chkIgnoreGeoUpdateCore - - - chkEnableAutoAdjustMainLvColWidth - - - 40 - - - tabPage1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - NoControl - - - panel2 - - - 3 - - - 8 - - - linkDnsObjectDoc - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 125, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtKcpreadBufferSize - - - none - - - groupBox1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 638, 219 - - - 6 - - - OptionSettingForm - - - 2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 64 - - - 111, 62 - - - 13 - - - groupBox2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - 13 - - - 97, 20 - - - 0 - - - 23 - - - 8, 52 - - - 8 - - - 78, 21 - - - tabPage7 - - - tabPage7 - - - True - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 23, 12 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - Exception - - - 37 - - - 345, 100 - - - 94, 21 - - - NoControl - - - 654, 427 - - - 10 - - - 204, 16 - - - 17 - - - 41 - - - 94, 21 - - - 6 - - - 0 - - - 0, 463 - - - groupBox1 - - - 3 - - - Do not use proxy server for addresses beginning with - - - http - - - 0 - - - Use semicolon (;) - - - 97, 20 - - - tabPage6 - - - tabPage6 - - - 7 - - - False - - - 257, 158 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &OK - - - 10 - - - 1 - - - 94, 21 - - - txtKcpuplinkCapacity - - - tabPage2 - - - chklogEnabled - - - chksniffingEnabled2 - - - tabPage7 - - - txtsystemProxyExceptions - - - groupBox2 - - - 4, 22 - - - $this - - - 40 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - groupBox1 - - - NoControl - - - 6 - - - protocol - - - tabPage7 - - - 15, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - 0 - - - 8 - - - txtremoteDNS - - - 0, 0 - - - True - - - True - - - 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 - - - 31 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - Core: DNS settings - - - groupBox1 - - - 32 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 345, 24 - - - tabPage7 - - - cbFreshrate - - - 236, 104 - - - 42 - - - 4 - - - NoControl - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 132 234, 16 - - 94, 21 + + 36 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Ignore Geo files when updating core - - 8, 41 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0, 0, 0 - - - 2 - - - uplinkCapacity - - - txtKcpdownlinkCapacity - - - Bottom - - - 35 - - - 6 - - - 9 - - - Settings - - - 7 - - - 3, 3, 3, 3 - - - 97, 21 - - - 107, 12 - - - 0 - - - 390, 16 - - - 15, 192 - - - tabPage6 - - - debug + + chkIgnoreGeoUpdateCore System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 + + tabPage7 - - chkmuxEnabled - - - label3 - - - tabPage6 - - - False - - - 15, 108 + + 5 325, 130 - - 0, 0 + + 97, 20 - - Enable UDP + + 34 cmbCoreType - - 3, 3, 3, 3 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + tabPage7 - - 126, 16 + + 6 - - 267, 16 + + True - - 75, 23 - - - 239, 12 - - - groupBox1 - - + NoControl - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 253, 134 - - 9 + + 59, 12 - + + 35 + + + Core Type + + + label4 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + tabPage7 - - 342, 17 - - - 94, 21 - - - 97, 20 - - - 3 - - - 30, 162 - - - Custom DNS (multiple, separated by commas (,)) - - - 654, 427 - - - 11 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - groupBox1 - - - NoControl + + 7 True - - 7 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - Turn on Mux Multiplexing - - - cmbloglevel - - - label6 - - - 111, 24 - - + NoControl - - 4 + + 15, 108 + + + 198, 16 + + + 33 + + + Keep older when deduplication + + + chkKeepOlderDedupl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 8 + + + 161, 84 + + + 58, 20 + + + 32 + + + cbFreshrate + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 9 + + + True + + + NoControl + + + 30, 88 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 10 + + + True + + + NoControl + + + 15, 64 + + + 576, 16 + + + 29 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 11 + + + True + + + 15, 40 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 12 + + + True + + + 15, 16 + + + 246, 16 + + + 23 + + + Automatically start at system startup + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 13 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + True NoControl - - label9 + + 6, 283 + + + 107, 12 + + + 42 + + + Use semicolon (;) + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 True - - 325, 156 + + NoControl - - label14 + + 8, 28 + + + 317, 12 + + + 40 + + + Do not use proxy server for addresses beginning with + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + 8, 52 + + + True + + + Vertical + + + 638, 219 + + + 41 + + + txtsystemProxyExceptions + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + Fill + + + 0, 0 + + + 654, 427 + + + 42 + + + Exception + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + 4, 22 + + + 654, 427 + + + 5 + + + System proxy settings + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 4 + + + Fill + + + 0, 10 + + + 662, 453 + + + 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, 463 + + + 662, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 0 + + + 662, 10 + + + 9 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 True + + 6, 12 + + + 662, 523 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + 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/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index cfa29848..3d4a36c4 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -66,6 +66,10 @@ namespace v2rayN.Forms { subItem.groupId = groupItem[index].id; } + else + { + subItem.groupId = string.Empty; + } } } private void txtRemarks_Leave(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 979d8b82..16b07df9 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -175,7 +175,7 @@ namespace v2rayN /// Language /// public const string MyRegKeyLanguage = "CurrentLanguage"; - + /// /// Icon /// @@ -199,6 +199,7 @@ namespace v2rayN public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; + public static readonly List coreTypes = new List { "v2fly_core", "Xray_core" }; public const string GrpcgunMode = "gun"; public const string GrpcmultiMode = "multi"; diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index ca0cd7d0..2a1778ff 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -150,8 +150,15 @@ namespace v2rayN.Handler } ws.Headers.Add("user-agent", userAgent); + Uri uri = new Uri(url); + //Authorization Header + if (!Utils.IsNullOrEmpty(uri.UserInfo)) + { + ws.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo)); + } + ws.DownloadStringCompleted += Ws_DownloadStringCompleted; - ws.DownloadStringAsync(new Uri(url)); + ws.DownloadStringAsync(uri); } catch (Exception ex) { diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index ccbd3ecd..5d005685 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -199,7 +199,8 @@ namespace v2rayN.Handler if (args.Success) { _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); - string result = Utils.Base64Decode(args.Msg); + //string result = Utils.Base64Decode(args.Msg); + string result = args.Msg; if (Utils.IsNullOrEmpty(result)) { _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index d2eaae06..f08cfec5 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -610,7 +610,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Subscription content decoding failed (non-BASE64 code) 的本地化字符串。 + /// 查找类似 Failed to get subscription content 的本地化字符串。 /// internal static string MsgSubscriptionDecodingFailed { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 563b7092..626a0ce2 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -268,7 +268,7 @@ Start updating PAC... - Subscription content decoding failed (non-BASE64 code) + Failed to get subscription content is unpacking... diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index fe9c7606..44dce0d3 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -268,7 +268,7 @@ 开始更新 PAC... - 订阅内容解码失败(非BASE64码) + 订阅内容获取失败 正在解压...... From 6408d51c8529ecaecd4d86443b3840851a628442 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 17 Mar 2022 18:41:51 +0800 Subject: [PATCH 117/252] Improve custom configuration --- .../v2rayN/Forms/AddServer2Form.Designer.cs | 16 +- v2rayN/v2rayN/Forms/AddServer2Form.cs | 46 ++- v2rayN/v2rayN/Forms/AddServer2Form.resx | 303 +++++++++++++----- v2rayN/v2rayN/Forms/AddServerForm.cs | 4 + v2rayN/v2rayN/Forms/MainForm.cs | 52 +-- v2rayN/v2rayN/Handler/ConfigHandler.cs | 17 +- 6 files changed, 312 insertions(+), 126 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs index 0e407a43..312658e5 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs @@ -31,6 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form)); this.btnClose = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnBrowse = new System.Windows.Forms.Button(); this.txtAddress = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.txtRemarks = new System.Windows.Forms.TextBox(); @@ -45,23 +46,31 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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 // - resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.btnBrowse); this.groupBox1.Controls.Add(this.txtAddress); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // btnBrowse + // + resources.ApplyResources(this.btnBrowse, "btnBrowse"); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.UseVisualStyleBackColor = true; + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + // // txtAddress // resources.ApplyResources(this.txtAddress, "txtAddress"); @@ -89,9 +98,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 @@ -136,5 +145,6 @@ private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Button btnBrowse; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 012f3039..38145096 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -15,12 +15,15 @@ namespace v2rayN.Forms private void AddServer2Form_Load(object sender, EventArgs e) { + txtAddress.ReadOnly = true; if (vmessItem != null) { BindingServer(); } else { + vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -32,7 +35,6 @@ namespace v2rayN.Forms { txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; - txtAddress.ReadOnly = true; } @@ -66,7 +68,47 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + if (Utils.IsNullOrEmpty(vmessItem.indexId)) + { + this.DialogResult = DialogResult.Cancel; + } + else + { + this.DialogResult = DialogResult.OK; + } + } + + private void btnBrowse_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; + } + + vmessItem.address = fileName; + vmessItem.remarks = txtRemarks.Text; + + if (ConfigHandler.AddCustomServer(ref config, vmessItem) == 0) + { + BindingServer(); + UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); + } + else + { + UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); + } } } } diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx index 969bc410..c6c7ec13 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -117,74 +117,83 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 6, 12 - - - 611, 271 - - - True - - - Edit custom configuration server - - 396, 17 + 450, 17 75, 23 + 4 &Cancel - - 303, 17 + + btnClose - - 75, 23 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 5 + + panel2 - - &OK - - - Fill - - - 0, 10 - - - 611, 201 - - - 3 - - - Server - - - True - - - 12, 62 - - - 83, 12 - - + 0 - - Address + + + NoControl + + + 127, 121 + + + 75, 23 + + + 40 + + + &Browse + + + btnBrowse + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 127, 62 + + + True + + + 432, 37 + + + 23 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 True @@ -201,6 +210,39 @@ * Fill in manually + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + 127, 23 + + + 313, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + True @@ -208,7 +250,7 @@ 12, 27 - 83, 12 + 95, 12 10 @@ -216,6 +258,120 @@ Alias (remarks) + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + True + + + 12, 62 + + + 47, 12 + + + 0 + + + Address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + Fill + + + 0, 10 + + + 611, 189 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 357, 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, 199 + + + 611, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + Top @@ -228,37 +384,34 @@ 6 - - Bottom + + panel1 - - 0, 211 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 611, 60 + + $this - - 7 + + 2 - - 127, 62 - - + True + + + 6, 12 - - 432, 104 + + 611, 259 - - 23 + + Edit custom configuration server - - 127, 23 + + AddServer2Form - - 313, 21 - - - 11 + + 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.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 57b5871f..44e58ee0 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -16,6 +16,8 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); + //FillCoreType(cmbCoreType); + if (vmessItem != null) { BindingServer(); @@ -39,6 +41,7 @@ namespace v2rayN.Forms txtAlterId.Text = vmessItem.alterId.ToString(); cmbSecurity.Text = vmessItem.security; txtRemarks.Text = vmessItem.remarks; + // BindingCoreType(cmbCoreType, vmessItem); transportControl.BindingServer(vmessItem); } @@ -92,6 +95,7 @@ namespace v2rayN.Forms vmessItem.alterId = Utils.ToInt(alterId); vmessItem.security = security; vmessItem.remarks = remarks; + //vmessItem.coreType = GetCoreType(cmbCoreType); if (ConfigHandler.AddServer(ref config, vmessItem) == 0) { diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 7a1fa555..a362787a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -18,7 +18,7 @@ namespace v2rayN.Forms public partial class MainForm : BaseForm { private V2rayHandler v2rayHandler; - private List lvSelecteds = new List(); + private List lstSelecteds = new List(); private StatisticsHandler statistics = null; private string MsgFilter = string.Empty; private List lstVmess = null; @@ -498,6 +498,8 @@ namespace v2rayN.Forms groupId = tabGroup.SelectedTab.Name; RefreshServers(); + + lvServers.Focus(); } #endregion @@ -689,7 +691,7 @@ namespace v2rayN.Forms return; } - ConfigHandler.RemoveServer(config, lvSelecteds); + ConfigHandler.RemoveServer(config, lstSelecteds); RefreshServers(); _ = LoadV2ray(); @@ -767,7 +769,7 @@ namespace v2rayN.Forms { if (GetLvSelectedIndex() < 0) return; ClearTestResult(); - SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler); + SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); } private void tsbTestMe_Click(object sender, EventArgs e) @@ -802,9 +804,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (var v in lvSelecteds) + foreach (var it in lstSelecteds) { - string url = ShareHandler.GetShareUrl(v); + string url = ShareHandler.GetShareUrl(it); if (Utils.IsNullOrEmpty(url)) { continue; @@ -825,9 +827,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (var v in lvSelecteds) + foreach (var it in lstSelecteds) { - string url = ShareHandler.GetShareUrl(v); + string url = ShareHandler.GetShareUrl(it); if (Utils.IsNullOrEmpty(url)) { continue; @@ -926,7 +928,7 @@ namespace v2rayN.Forms private int GetLvSelectedIndex() { int index = -1; - lvSelecteds.Clear(); + lstSelecteds.Clear(); try { if (lvServers.SelectedIndices.Count <= 0) @@ -938,7 +940,7 @@ namespace v2rayN.Forms index = lvServers.SelectedIndices[0]; foreach (int i in lvServers.SelectedIndices) { - lvSelecteds.Add(lstVmess[i]); + lstSelecteds.Add(lstVmess[i]); } return index; } @@ -950,33 +952,7 @@ namespace v2rayN.Forms 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, groupId) == 0) - { - RefreshServers(); - //LoadV2ray(); - UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); - } - else - { - UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); - } + ShowServerForm((int)EConfigType.Custom, -1); } private void menuAddShadowsocksServer_Click(object sender, EventArgs e) @@ -1215,9 +1191,9 @@ namespace v2rayN.Forms } private void ClearTestResult() { - foreach (var s in lvSelecteds) + foreach (var it in lstSelecteds) { - SetTestResult(s.indexId, ""); + SetTestResult(it.indexId, ""); } } private void UpdateSpeedtestHandler(string indexId, string msg) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 3547a9b3..a8eac639 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -439,10 +439,11 @@ namespace v2rayN.Handler /// 添加自定义服务器 /// /// - /// + /// /// - public static int AddCustomServer(ref Config config, string fileName, string groupId) + public static int AddCustomServer(ref Config config, VmessItem vmessItem) { + var fileName = vmessItem.address; string newFileName = string.Format("{0}.json", Utils.GetGUID()); //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); @@ -455,13 +456,13 @@ namespace v2rayN.Handler return -1; } - VmessItem vmessItem = new VmessItem + vmessItem.address = newFileName; + vmessItem.configType = (int)EConfigType.Custom; + if (Utils.IsNullOrEmpty(vmessItem.remarks)) { - groupId = groupId, - address = newFileName, - configType = (int)EConfigType.Custom, - remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()) - }; + vmessItem.remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()); + } + AddServerCommon(ref config, vmessItem); From 291fd491ff2a4a978e547d25cf623d07f6517263 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 17 Mar 2022 19:07:06 +0800 Subject: [PATCH 118/252] Improve speedtest --- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 8 ++-- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 8 ++++ v2rayN/v2rayN/Mode/ServerTestItem.cs | 4 ++ v2rayN/v2rayN/Tool/Utils.cs | 46 ++++++++++++++++----- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 2e7d7746..db05ec2f 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -125,11 +125,11 @@ namespace v2rayN.Handler List tasks = new List(); foreach (var it in _selecteds) { - if (it.configType == (int)EConfigType.Custom) + if (!it.allowTest) { continue; } - if (it.port <= 0) + if (it.configType == (int)EConfigType.Custom) { continue; } @@ -222,11 +222,11 @@ namespace v2rayN.Handler var timeout = 10; foreach (var it in _selecteds) { - if (it.configType == (int)EConfigType.Custom) + if (!it.allowTest) { continue; } - if (it.port <= 0) + if (it.configType == (int)EConfigType.Custom) { continue; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index cf78774a..5324683c 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -1440,6 +1440,13 @@ namespace v2rayN.Handler { continue; } + if (it.configType == (int)EConfigType.Vmess || it.configType == (int)EConfigType.VLESS) + { + if (!Utils.IsGuidByParse(configCopy.GetVmessItem(it.indexId).id)) + { + continue; + } + } //find unuse port var port = httpPort; @@ -1461,6 +1468,7 @@ namespace v2rayN.Handler continue; } it.port = port; + it.allowTest = true; Inbounds inbound = new Inbounds { diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs index c15aa9ea..2d204a8d 100644 --- a/v2rayN/v2rayN/Mode/ServerTestItem.cs +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -21,5 +21,9 @@ namespace v2rayN.Mode { get; set; } + public bool allowTest + { + get; set; + } } } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 7de1c760..f0f3076d 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -22,6 +22,7 @@ using v2rayN.Base; using Newtonsoft.Json.Linq; using System.Web; using log4net; +using System.Linq; namespace v2rayN { @@ -748,20 +749,26 @@ namespace v2rayN public static bool PortInUse(int port) { bool inUse = false; - - IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); - IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); - - var lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); - - foreach (IPEndPoint endPoint in ipEndPoints) + try { - if (endPoint.Port == port) + IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); + + var lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + + foreach (IPEndPoint endPoint in ipEndPoints) { - inUse = true; - break; + if (endPoint.Port == port) + { + inUse = true; + break; + } } } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + } return inUse; } #endregion @@ -912,6 +919,25 @@ namespace v2rayN return fileName; } + + public static IPAddress GetDefaultGateway() + { + return NetworkInterface + .GetAllNetworkInterfaces() + .Where(n => n.OperationalStatus == OperationalStatus.Up) + .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback) + .SelectMany(n => n.GetIPProperties()?.GatewayAddresses) + .Select(g => g?.Address) + .Where(a => a != null) + // .Where(a => a.AddressFamily == AddressFamily.InterNetwork) + // .Where(a => Array.FindIndex(a.GetAddressBytes(), b => b != 0) >= 0) + .FirstOrDefault(); + } + + public static bool IsGuidByParse(string strSrc) + { + return Guid.TryParse(strSrc, out Guid g); + } #endregion #region TempPath From ac794660412baa92f963af993d9e4fd501d04bc2 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 17 Mar 2022 19:07:24 +0800 Subject: [PATCH 119/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 99d6a68d..472855c1 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.1")] +[assembly: AssemblyFileVersion("5.2")] From 583e824337aad0e5925d5534044e0da05f4aed8e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 18 Mar 2022 18:52:06 +0800 Subject: [PATCH 120/252] Refactor core type --- .../v2rayN/Forms/AddServer2Form.Designer.cs | 18 + v2rayN/v2rayN/Forms/AddServer2Form.cs | 20 + v2rayN/v2rayN/Forms/AddServer2Form.resx | 67 +- .../v2rayN/Forms/AddServer2Form.zh-Hans.resx | 8 +- v2rayN/v2rayN/Forms/AddServerForm.Designer.cs | 496 ++++-- v2rayN/v2rayN/Forms/AddServerForm.cs | 307 ++-- v2rayN/v2rayN/Forms/AddServerForm.resx | 1382 ++++++++++++----- .../v2rayN/Forms/AddServerForm.zh-Hans.resx | 248 ++- v2rayN/v2rayN/Forms/BaseServerForm.cs | 5 +- v2rayN/v2rayN/Forms/MainForm.cs | 30 +- .../Forms/OptionSettingForm.Designer.cs | 138 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 53 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 420 ++++- .../Forms/OptionSettingForm.zh-Hans.resx | 3 + v2rayN/v2rayN/Global.cs | 3 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 32 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 46 +- v2rayN/v2rayN/Mode/Config.cs | 44 +- v2rayN/v2rayN/Mode/ECoreType.cs | 4 +- 19 files changed, 2356 insertions(+), 968 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs index 312658e5..88808170 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs @@ -40,6 +40,8 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.cmbCoreType = new System.Windows.Forms.ComboBox(); + this.labCoreType = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); @@ -54,6 +56,8 @@ // // groupBox1 // + this.groupBox1.Controls.Add(this.cmbCoreType); + this.groupBox1.Controls.Add(this.labCoreType); this.groupBox1.Controls.Add(this.btnBrowse); this.groupBox1.Controls.Add(this.txtAddress); this.groupBox1.Controls.Add(this.label13); @@ -115,6 +119,18 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // cmbCoreType + // + this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); + this.cmbCoreType.Name = "cmbCoreType"; + // + // labCoreType + // + resources.ApplyResources(this.labCoreType, "labCoreType"); + this.labCoreType.Name = "labCoreType"; + // // AddServer2Form // resources.ApplyResources(this, "$this"); @@ -146,5 +162,7 @@ private System.Windows.Forms.Label label13; private System.Windows.Forms.TextBox txtAddress; private System.Windows.Forms.Button btnBrowse; + private System.Windows.Forms.ComboBox cmbCoreType; + private System.Windows.Forms.Label labCoreType; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 38145096..7e7a28fb 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -15,6 +15,9 @@ namespace v2rayN.Forms private void AddServer2Form_Load(object sender, EventArgs e) { + cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); + cmbCoreType.Items.Add(string.Empty); + txtAddress.ReadOnly = true; if (vmessItem != null) { @@ -35,6 +38,15 @@ namespace v2rayN.Forms { txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; + + if (vmessItem.coreType == null) + { + cmbCoreType.Text = string.Empty; + } + else + { + cmbCoreType.Text = vmessItem.coreType.ToString(); + } } @@ -55,6 +67,14 @@ namespace v2rayN.Forms return; } vmessItem.remarks = remarks; + if (Utils.IsNullOrEmpty(cmbCoreType.Text)) + { + vmessItem.coreType = null; + } + else + { + vmessItem.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), cmbCoreType.Text); + } if (ConfigHandler.EditCustomServer(ref config, vmessItem) == 0) { diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx index c6c7ec13..726f0cae 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -143,12 +143,63 @@ 0 + + 127, 157 + + + 89, 20 + + + 41 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + NoControl + + + 12, 161 + + + 59, 12 + + + 42 + + + Core Type + + + labCoreType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + NoControl - 127, 121 + 127, 110 75, 23 @@ -169,7 +220,7 @@ groupBox1 - 0 + 2 127, 62 @@ -193,7 +244,7 @@ groupBox1 - 1 + 3 True @@ -220,7 +271,7 @@ groupBox1 - 2 + 4 127, 23 @@ -241,7 +292,7 @@ groupBox1 - 3 + 5 True @@ -268,7 +319,7 @@ groupBox1 - 4 + 6 True @@ -295,7 +346,7 @@ groupBox1 - 5 + 7 Fill @@ -406,7 +457,7 @@ 611, 259 - Edit custom configuration server + Custom configuration server AddServer2Form diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx index 482593c4..232e5b76 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx @@ -118,7 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 编辑自定义配置服务器 + 自定义配置 + + + 浏览(&B) 取消(&C) @@ -129,6 +132,9 @@ 服务器 + + Core类型 + 地址(address) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index c48ec522..33aa7ade 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -31,36 +31,62 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServerForm)); this.btnClose = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.btnGUID = new System.Windows.Forms.Button(); - this.label13 = new System.Windows.Forms.Label(); - 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.txtAlterId = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); + this.panSocks = new System.Windows.Forms.Panel(); + this.label17 = new System.Windows.Forms.Label(); + this.txtSecurity4 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.txtId4 = new System.Windows.Forms.TextBox(); + this.panSs = new System.Windows.Forms.Panel(); + this.txtId3 = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.cmbSecurity3 = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.panTrojan = new System.Windows.Forms.Panel(); + this.label12 = new System.Windows.Forms.Label(); + this.cmbFlow6 = new System.Windows.Forms.ComboBox(); + this.txtId6 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.panVless = new System.Windows.Forms.Panel(); + this.label7 = new System.Windows.Forms.Label(); + this.cmbFlow5 = new System.Windows.Forms.ComboBox(); + this.txtId5 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.btnGUID5 = new System.Windows.Forms.Button(); + this.cmbSecurity5 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.panVmess = new System.Windows.Forms.Panel(); 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.txtId = new System.Windows.Forms.TextBox(); + this.btnGUID = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.txtAlterId = new System.Windows.Forms.TextBox(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.panAddr = new System.Windows.Forms.Panel(); + this.label6 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.panBottom = 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.panel3 = new System.Windows.Forms.Panel(); + this.panTop = new System.Windows.Forms.Panel(); + this.panTran = new System.Windows.Forms.Panel(); this.transportControl = new v2rayN.Forms.ServerTransportControl(); + this.cmbCoreType = new System.Windows.Forms.ComboBox(); + this.labCoreType = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); - this.panel3.SuspendLayout(); + this.panSocks.SuspendLayout(); + this.panSs.SuspendLayout(); + this.panTrojan.SuspendLayout(); + this.panVless.SuspendLayout(); + this.panVmess.SuspendLayout(); + this.panAddr.SuspendLayout(); + this.panBottom.SuspendLayout(); + this.panTran.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -73,25 +99,189 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.btnGUID); - this.groupBox1.Controls.Add(this.label13); - 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.txtAlterId); - this.groupBox1.Controls.Add(this.label4); - 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.Controls.Add(this.panSocks); + this.groupBox1.Controls.Add(this.panSs); + this.groupBox1.Controls.Add(this.panTrojan); + this.groupBox1.Controls.Add(this.panVless); + this.groupBox1.Controls.Add(this.panVmess); + this.groupBox1.Controls.Add(this.panAddr); resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // panSocks + // + this.panSocks.Controls.Add(this.label17); + this.panSocks.Controls.Add(this.txtSecurity4); + this.panSocks.Controls.Add(this.label18); + this.panSocks.Controls.Add(this.txtId4); + resources.ApplyResources(this.panSocks, "panSocks"); + this.panSocks.Name = "panSocks"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // txtSecurity4 + // + resources.ApplyResources(this.txtSecurity4, "txtSecurity4"); + this.txtSecurity4.Name = "txtSecurity4"; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // txtId4 + // + resources.ApplyResources(this.txtId4, "txtId4"); + this.txtId4.Name = "txtId4"; + // + // panSs + // + this.panSs.Controls.Add(this.txtId3); + this.panSs.Controls.Add(this.label15); + this.panSs.Controls.Add(this.cmbSecurity3); + this.panSs.Controls.Add(this.label16); + resources.ApplyResources(this.panSs, "panSs"); + this.panSs.Name = "panSs"; + // + // txtId3 + // + resources.ApplyResources(this.txtId3, "txtId3"); + this.txtId3.Name = "txtId3"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // cmbSecurity3 + // + this.cmbSecurity3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbSecurity3.FormattingEnabled = true; + resources.ApplyResources(this.cmbSecurity3, "cmbSecurity3"); + this.cmbSecurity3.Name = "cmbSecurity3"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // panTrojan + // + this.panTrojan.Controls.Add(this.label12); + this.panTrojan.Controls.Add(this.cmbFlow6); + this.panTrojan.Controls.Add(this.txtId6); + this.panTrojan.Controls.Add(this.label14); + resources.ApplyResources(this.panTrojan, "panTrojan"); + this.panTrojan.Name = "panTrojan"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // cmbFlow6 + // + this.cmbFlow6.FormattingEnabled = true; + resources.ApplyResources(this.cmbFlow6, "cmbFlow6"); + this.cmbFlow6.Name = "cmbFlow6"; + // + // txtId6 + // + resources.ApplyResources(this.txtId6, "txtId6"); + this.txtId6.Name = "txtId6"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // panVless + // + this.panVless.Controls.Add(this.label7); + this.panVless.Controls.Add(this.cmbFlow5); + this.panVless.Controls.Add(this.txtId5); + this.panVless.Controls.Add(this.label9); + this.panVless.Controls.Add(this.label10); + this.panVless.Controls.Add(this.btnGUID5); + this.panVless.Controls.Add(this.cmbSecurity5); + this.panVless.Controls.Add(this.label11); + resources.ApplyResources(this.panVless, "panVless"); + this.panVless.Name = "panVless"; + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // cmbFlow5 + // + this.cmbFlow5.FormattingEnabled = true; + resources.ApplyResources(this.cmbFlow5, "cmbFlow5"); + this.cmbFlow5.Name = "cmbFlow5"; + // + // txtId5 + // + resources.ApplyResources(this.txtId5, "txtId5"); + this.txtId5.Name = "txtId5"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // btnGUID5 + // + resources.ApplyResources(this.btnGUID5, "btnGUID5"); + this.btnGUID5.Name = "btnGUID5"; + this.btnGUID5.UseVisualStyleBackColor = true; + this.btnGUID5.Click += new System.EventHandler(this.btnGUID_Click); + // + // cmbSecurity5 + // + this.cmbSecurity5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple; + this.cmbSecurity5.FormattingEnabled = true; + this.cmbSecurity5.Items.AddRange(new object[] { + resources.GetString("cmbSecurity5.Items")}); + resources.ApplyResources(this.cmbSecurity5, "cmbSecurity5"); + this.cmbSecurity5.Name = "cmbSecurity5"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // panVmess + // + this.panVmess.Controls.Add(this.label3); + this.panVmess.Controls.Add(this.txtId); + this.panVmess.Controls.Add(this.btnGUID); + this.panVmess.Controls.Add(this.label4); + this.panVmess.Controls.Add(this.label8); + this.panVmess.Controls.Add(this.txtAlterId); + this.panVmess.Controls.Add(this.cmbSecurity); + this.panVmess.Controls.Add(this.label5); + resources.ApplyResources(this.panVmess, "panVmess"); + this.panVmess.Name = "panVmess"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // // btnGUID // resources.ApplyResources(this.btnGUID, "btnGUID"); @@ -99,16 +289,21 @@ this.btnGUID.UseVisualStyleBackColor = true; this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click); // - // label13 + // label4 // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; // // label8 // resources.ApplyResources(this.label8, "label8"); this.label8.Name = "label8"; // + // txtAlterId + // + resources.ApplyResources(this.txtAlterId, "txtAlterId"); + this.txtAlterId.Name = "txtAlterId"; + // // cmbSecurity // this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -116,67 +311,60 @@ resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // - // txtRemarks + // label5 // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // panAddr + // + this.panAddr.Controls.Add(this.cmbCoreType); + this.panAddr.Controls.Add(this.labCoreType); + this.panAddr.Controls.Add(this.label6); + this.panAddr.Controls.Add(this.label1); + this.panAddr.Controls.Add(this.txtAddress); + this.panAddr.Controls.Add(this.label2); + this.panAddr.Controls.Add(this.txtPort); + this.panAddr.Controls.Add(this.txtRemarks); + resources.ApplyResources(this.panAddr, "panAddr"); + this.panAddr.Name = "panAddr"; // // label6 // resources.ApplyResources(this.label6, "label6"); this.label6.Name = "label6"; // - // label5 + // label1 // - resources.ApplyResources(this.label5, "label5"); - this.label5.Name = "label5"; - // - // txtAlterId - // - resources.ApplyResources(this.txtAlterId, "txtAlterId"); - this.txtAlterId.Name = "txtAlterId"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // 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"; + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; // // txtAddress // resources.ApplyResources(this.txtAddress, "txtAddress"); this.txtAddress.Name = "txtAddress"; // - // label1 + // label2 // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; // - // panel2 + // txtPort // - this.panel2.Controls.Add(this.btnClose); - this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Name = "panel2"; + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // panBottom + // + this.panBottom.Controls.Add(this.btnClose); + this.panBottom.Controls.Add(this.btnOK); + resources.ApplyResources(this.panBottom, "panBottom"); + this.panBottom.Name = "panBottom"; // // btnOK // @@ -185,56 +373,16 @@ this.btnOK.UseVisualStyleBackColor = true; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // - // panel1 + // panTop // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; + resources.ApplyResources(this.panTop, "panTop"); + this.panTop.Name = "panTop"; // - // menuServer + // panTran // - 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); - // - // panel3 - // - this.panel3.Controls.Add(this.transportControl); - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Name = "panel3"; + this.panTran.Controls.Add(this.transportControl); + resources.ApplyResources(this.panTran, "panTran"); + this.panTran.Name = "panTran"; // // transportControl // @@ -242,27 +390,46 @@ resources.ApplyResources(this.transportControl, "transportControl"); this.transportControl.Name = "transportControl"; // + // cmbCoreType + // + this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); + this.cmbCoreType.Name = "cmbCoreType"; + // + // labCoreType + // + resources.ApplyResources(this.labCoreType, "labCoreType"); + this.labCoreType.Name = "labCoreType"; + // // AddServerForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); - this.Controls.Add(this.panel3); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Controls.Add(this.menuServer); + this.Controls.Add(this.panTran); + this.Controls.Add(this.panBottom); + this.Controls.Add(this.panTop); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Name = "AddServerForm"; this.Load += new System.EventHandler(this.AddServerForm_Load); this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); - this.panel3.ResumeLayout(false); + this.panSocks.ResumeLayout(false); + this.panSocks.PerformLayout(); + this.panSs.ResumeLayout(false); + this.panSs.PerformLayout(); + this.panTrojan.ResumeLayout(false); + this.panTrojan.PerformLayout(); + this.panVless.ResumeLayout(false); + this.panVless.PerformLayout(); + this.panVmess.ResumeLayout(false); + this.panVmess.PerformLayout(); + this.panAddr.ResumeLayout(false); + this.panAddr.PerformLayout(); + this.panBottom.ResumeLayout(false); + this.panTran.ResumeLayout(false); this.ResumeLayout(false); - this.PerformLayout(); } @@ -284,17 +451,38 @@ private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox cmbSecurity; private System.Windows.Forms.Label label8; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - 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.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; + private System.Windows.Forms.Panel panTop; + private System.Windows.Forms.Panel panBottom; private System.Windows.Forms.Button btnGUID; - private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Panel panTran; private ServerTransportControl transportControl; + private System.Windows.Forms.Panel panAddr; + private System.Windows.Forms.Panel panVmess; + private System.Windows.Forms.Panel panVless; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.ComboBox cmbFlow5; + private System.Windows.Forms.TextBox txtId5; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button btnGUID5; + private System.Windows.Forms.ComboBox cmbSecurity5; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Panel panTrojan; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.ComboBox cmbFlow6; + private System.Windows.Forms.TextBox txtId6; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Panel panSs; + private System.Windows.Forms.TextBox txtId3; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.ComboBox cmbSecurity3; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Panel panSocks; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox txtSecurity4; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.TextBox txtId4; + private System.Windows.Forms.ComboBox cmbCoreType; + private System.Windows.Forms.Label labCoreType; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 44e58ee0..1f0c2722 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; @@ -7,7 +8,6 @@ namespace v2rayN.Forms { public partial class AddServerForm : BaseServerForm { - public AddServerForm() { InitializeComponent(); @@ -15,8 +15,46 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { + this.Text = ((EConfigType)eConfigType).ToString(); + cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); - //FillCoreType(cmbCoreType); + cmbSecurity3.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); + + cmbFlow5.Items.AddRange(Global.xtlsFlows.ToArray()); + cmbFlow6.Items.AddRange(Global.xtlsFlows.ToArray()); + + cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); + cmbCoreType.Items.Add(string.Empty); + + switch (eConfigType) + { + case EConfigType.Vmess: + panVmess.Dock = DockStyle.Fill; + panVmess.Visible = true; + break; + case EConfigType.Shadowsocks: + panSs.Dock = DockStyle.Fill; + panSs.Visible = true; + panTran.Visible = false; + this.Height = this.Height - panTran.Height; + break; + case EConfigType.Socks: + panSocks.Dock = DockStyle.Fill; + panSocks.Visible = true; + panTran.Visible = false; + this.Height = this.Height - panTran.Height; + break; + case EConfigType.VLESS: + panVless.Dock = DockStyle.Fill; + panVless.Visible = true; + transportControl.AllowXtls = true; + break; + case EConfigType.Trojan: + panTrojan.Dock = DockStyle.Fill; + panTrojan.Visible = true; + transportControl.AllowXtls = true; + break; + } if (vmessItem != null) { @@ -35,41 +73,122 @@ namespace v2rayN.Forms /// private void BindingServer() { + txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); - cmbSecurity.Text = vmessItem.security; - txtRemarks.Text = vmessItem.remarks; - // BindingCoreType(cmbCoreType, vmessItem); + + switch (eConfigType) + { + case EConfigType.Vmess: + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + cmbSecurity.Text = vmessItem.security; + break; + case EConfigType.Shadowsocks: + txtId3.Text = vmessItem.id; + cmbSecurity3.Text = vmessItem.security; + break; + case EConfigType.Socks: + txtId4.Text = vmessItem.id; + txtSecurity4.Text = vmessItem.security; + break; + case EConfigType.VLESS: + txtId5.Text = vmessItem.id; + cmbFlow5.Text = vmessItem.flow; + cmbSecurity5.Text = vmessItem.security; + break; + case EConfigType.Trojan: + txtId6.Text = vmessItem.id; + cmbFlow6.Text = vmessItem.flow; + break; + } + + if (vmessItem.coreType == null) + { + cmbCoreType.Text = string.Empty; + } + else + { + cmbCoreType.Text = vmessItem.coreType.ToString(); + } transportControl.BindingServer(vmessItem); } - /// /// 清除设置 /// private void ClearServer() { + txtRemarks.Text = ""; txtAddress.Text = ""; txtPort.Text = ""; - txtId.Text = ""; - txtAlterId.Text = "0"; - cmbSecurity.Text = Global.DefaultSecurity; - txtRemarks.Text = ""; + + switch (eConfigType) + { + case EConfigType.Vmess: + txtId.Text = ""; + txtAlterId.Text = "0"; + cmbSecurity.Text = Global.DefaultSecurity; + break; + case EConfigType.Shadowsocks: + txtId3.Text = ""; + cmbSecurity3.Text = Global.DefaultSecurity; + break; + case EConfigType.Socks: + txtId4.Text = ""; + txtSecurity4.Text = ""; + break; + case EConfigType.VLESS: + txtId5.Text = ""; + cmbFlow5.Text = ""; + cmbSecurity5.Text = Global.None; + break; + case EConfigType.Trojan: + txtId6.Text = ""; + cmbFlow6.Text = ""; + break; + } transportControl.ClearServer(vmessItem); } private void btnOK_Click(object sender, EventArgs e) { + string remarks = txtRemarks.Text; string address = txtAddress.Text; string port = txtPort.Text; - string id = txtId.Text; - string alterId = txtAlterId.Text; - string security = cmbSecurity.Text; - string remarks = txtRemarks.Text; + + string id = string.Empty; + string alterId = string.Empty; + string security = string.Empty; + string flow = string.Empty; + + switch (eConfigType) + { + case EConfigType.Vmess: + id = txtId.Text; + alterId = txtAlterId.Text; + security = cmbSecurity.Text; + break; + case EConfigType.Shadowsocks: + id = txtId3.Text; + security = cmbSecurity3.Text; + break; + case EConfigType.Socks: + id = txtId4.Text; + security = txtSecurity4.Text; + break; + case EConfigType.VLESS: + id = txtId5.Text; + flow = cmbFlow5.Text; + security = cmbSecurity5.Text; + break; + case EConfigType.Trojan: + id = txtId6.Text; + flow = cmbFlow6.Text; + break; + } if (Utils.IsNullOrEmpty(address)) { @@ -81,23 +200,69 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("FillCorrectServerPort")); return; } - if (Utils.IsNullOrEmpty(id)) + if (eConfigType == EConfigType.Shadowsocks) { - UI.Show(UIRes.I18N("FillUUID")); - return; + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillPassword")); + return; + } + if (Utils.IsNullOrEmpty(security)) + { + UI.Show(UIRes.I18N("PleaseSelectEncryption")); + return; + } + } + if (eConfigType != EConfigType.Socks) + { + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillUUID")); + return; + } } transportControl.EndBindingServer(); + vmessItem.remarks = remarks; vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; vmessItem.alterId = Utils.ToInt(alterId); vmessItem.security = security; - vmessItem.remarks = remarks; - //vmessItem.coreType = GetCoreType(cmbCoreType); - if (ConfigHandler.AddServer(ref config, vmessItem) == 0) + if (Utils.IsNullOrEmpty(cmbCoreType.Text)) + { + vmessItem.coreType = null; + } + else + { + vmessItem.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), cmbCoreType.Text); + } + + int ret = -1; + switch (eConfigType) + { + case EConfigType.Vmess: + ret = ConfigHandler.AddServer(ref config, vmessItem); + break; + case EConfigType.Shadowsocks: + ret = ConfigHandler.AddShadowsocksServer(ref config, vmessItem); + break; + case EConfigType.Socks: + ret = ConfigHandler.AddSocksServer(ref config, vmessItem); + break; + case EConfigType.VLESS: + vmessItem.flow = flow; + ret = ConfigHandler.AddVlessServer(ref config, vmessItem); + break; + case EConfigType.Trojan: + vmessItem.flow = flow; + ret = ConfigHandler.AddTrojanServer(ref config, vmessItem); + break; + } + + if (ret == 0) { this.DialogResult = DialogResult.OK; } @@ -105,110 +270,18 @@ namespace v2rayN.Forms { UI.ShowWarning(UIRes.I18N("OperationFailed")); } + } private void btnGUID_Click(object sender, EventArgs e) { - txtId.Text = Utils.GetGUID(); + txtId.Text = + txtId5.Text = Utils.GetGUID(); } private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; } - - #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 vmessItemTemp; - if (type.Equals(1)) - { - vmessItemTemp = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); - } - else - { - vmessItemTemp = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); - } - if (vmessItemTemp == null) - { - UI.ShowWarning(msg); - return; - } - vmessItem = vmessItemTemp; - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); - txtRemarks.Text = vmessItem.remarks; - - transportControl.BindingServer(vmessItem); - } - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void MenuItemImportClipboard_Click(object sender, EventArgs e) - { - ClearServer(); - - VmessItem vmessItemTemp = ShareHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItemTemp == null) - { - UI.ShowWarning(msg); - return; - } - vmessItem = vmessItemTemp; - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); - txtRemarks.Text = vmessItem.remarks; - - transportControl.BindingServer(vmessItem); - } - #endregion - } } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 1e251a8f..31a88ee9 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -138,259 +138,632 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - panel2 + panBottom 0 - - 411, 83 + + True - - 75, 23 + + + NoControl - - 23 + + 11, 11 - - &Generate + + 89, 12 - - btnGUID + + 25 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + User(Optional) - - groupBox1 + + label17 - + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSocks + + 0 - - True + + 126, 7 - - 411, 175 + + 278, 21 - - 113, 12 + + 2 - - 22 + + txtSecurity4 - - * Fill in manually + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - label13 + + panSocks - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - + 1 - + True - - 411, 147 + + NoControl - - 119, 12 + + 11, 42 - - 14 + + 113, 12 - - *Recommended (auto) + + 23 - - label8 + + Password(Optional) - + + label18 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + panSocks - + 2 - - 195, 143 + + 126, 38 - - 210, 20 + + 278, 21 - + + 3 + + + txtId4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSocks + + + 3 + + + 303, 163 + + + 82, 39 + + + 31 + + + False + + + panSocks + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 126, 7 + + + 278, 21 + + + 2 + + + txtId3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSs + + + 0 + + + True + + + NoControl + + + 11, 9 + + + 53, 12 + + 4 - - cmbSecurity + + Password - + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSs + + + 1 + + + 126, 39 + + + 278, 20 + + + 3 + + + cmbSecurity3 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + panSs - - 3 - - - 127, 171 - - - 278, 21 - - - 5 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - True - - - 12, 175 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - 12, 147 - - - 173, 12 - - - 8 - - - Encryption method (security) - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 114 - - - 143, 21 - - - 3 - - - txtAlterId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 12, 118 - - - 47, 12 - - - 6 - - - AlterId - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - 127, 85 - - - 278, 21 - - + 2 - - txtId + + True - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl - + + 11, 40 + + + 65, 12 + + + 8 + + + Encryption + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSs + + + 3 + + + 142, 163 + + + 82, 39 + + + 30 + + + False + + + panSs + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - 9 + + 1 + + + True + + + NoControl + + + 12, 9 + + + 53, 12 + + + 4 + + + Password + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTrojan + + + 0 + + + 127, 39 + + + 211, 20 + + + 3 + + + cmbFlow6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTrojan + + + 1 + + + 127, 7 + + + 265, 21 + + + 2 + + + txtId6 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTrojan + + + 2 + + + True + + + NoControl + + + 12, 43 + + + 29, 12 + + + 27 + + + Flow + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTrojan + + + 3 + + + 534, 163 + + + 82, 39 + + + 29 + + + False + + + panTrojan + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + NoControl + + + 11, 11 + + + 53, 12 + + + 4 + + + UUID(id) + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 0 + + + 126, 39 + + + 211, 20 + + + 3 + + + cmbFlow5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 1 + + + 126, 7 + + + 278, 21 + + + 2 + + + txtId5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 2 + + + True + + + NoControl + + + 11, 43 + + + 29, 12 + + + 25 + + + Flow + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 3 + + + True + + + NoControl + + + 11, 74 + + + 65, 12 + + + 8 + + + Encryption + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 4 + + + NoControl + + + 410, 7 + + + 75, 23 + + + 23 + + + Generate + + + btnGUID5 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 5 + + + none + + + 126, 70 + + + 211, 20 + + + 4 + + + cmbSecurity5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 6 + + + True + + + NoControl + + + 352, 73 + + + 119, 12 + + + 14 + + + *Recommended (none) + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 7 + + + 396, 166 + + + 92, 36 + + + 27 + + + False + + + panVless + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 True - 12, 89 + 11, 11 53, 12 @@ -408,85 +781,286 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 + panVmess - 10 - - - 127, 56 - - - 143, 21 - - - 1 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - True - - - 12, 60 - - - 29, 12 - - - 2 - - - Port - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - 127, 27 - - - 359, 21 - - 0 - - txtAddress + + 126, 7 - + + 278, 21 + + + 2 + + + txtId + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + panVmess + + + 1 + + + 410, 5 + + + 75, 23 + + + 23 + + + &Generate + + + btnGUID + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 2 + + + True + + + 11, 40 + + + 47, 12 + + + 6 + + + AlterId + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 3 + + + True + + + 410, 69 + + + 119, 12 + + + 14 + + + *Recommended (auto) + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 4 + + + 126, 36 + + + 143, 21 + + + 3 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 5 + + + 194, 65 + + + 210, 20 + + + 4 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 6 + + + True + + + 11, 69 + + + 173, 12 + + + 8 + + + Encryption method (security) + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 7 + + + 16, 163 + + + 82, 39 + + + 25 + + + False + + + panVmess + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - 13 + + 4 + + + 625, 8 + + + 89, 20 + + + 38 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 0 + + + True + + + NoControl + + + 553, 12 + + + 59, 12 + + + 39 + + + Core Type + + + labCoreType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 1 + + + True + + + 11, 12 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 2 True - 12, 31 + 11, 43 47, 12 @@ -504,20 +1078,133 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 + panAddr - 14 + 3 + + + 126, 39 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 4 + + + True + + + 11, 72 + + + 29, 12 + + + 2 + + + Port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 5 + + + 126, 68 + + + 143, 21 + + + 2 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 6 + + + 126, 8 + + + 278, 21 + + + 0 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 7 + + + Top + + + 3, 17 + + + 723, 100 + + + 24 + + + panAddr + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 - Fill - 0, 35 + 0, 10 - 729, 216 + 729, 221 3 @@ -556,109 +1243,58 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - panel2 + panBottom 1 - + Bottom - - 0, 481 + + 0, 461 - + 729, 60 - + 7 - - panel2 + + panBottom - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 2 - + Top - - 0, 25 - - - 729, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 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 + + 729, 10 - - 8 + + 6 - - menuServer + + panTop - - System.Windows.Forms.MenuStrip, 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 - + $this - - 4 + + 3 Fill @@ -679,33 +1315,33 @@ v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - panel3 + panTran 0 - + Bottom - - 0, 251 + + 0, 231 - + 729, 230 - + 9 - - panel3 + + panTran - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 1 @@ -718,41 +1354,11 @@ 6, 12 - 729, 541 + 729, 521 Edit or add a [VMess] 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 - AddServerForm diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 47b4d4cd..b9c81218 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -120,93 +120,109 @@ 取消(&C) + + 服务器 + + + + None + + + + 270, 156 + + + 115, 61 + + + 77, 12 + + + 用户名(可选) + + + 65, 12 + + + 密码(可选) + + + None + + + 142, 147 + + + 137, 78 + + + 89, 12 + + + 密码(password) + + + 125, 12 + + + 加密方式(encryption) + + + 89, 12 + + + 密码(password) + + + 65, 12 + + + 流控(flow) + + + 110, 52 + + + 65, 12 + + + 用户ID(id) + + + 65, 12 + + + 流控(flow) + + + 101, 12 + + + 加密(encryption) + + + 生成 + + + 71, 12 + + + *非空(none) + + + 65, 12 + + + 用户ID(id) + 生成(&G) - - *手填,方便识别管理 - - - - 149, 12 - - + 95, 12 - - 167, 12 - - - 180, 7 - - - 350, 36 - - - 143, 12 - - - 149, 12 - - - 127, 168 - - - 127, 32 - - - 211, 20 - - - 9, 36 - - - 107, 12 - - - 9, 168 - - - 65, 12 - - - 161, 12 - - - 9, 237 - - - 107, 12 - - - 127, 237 - - - 282, 71 - - - 197, 12 - - - 127, 102 - - - 334, 51 - - - 9, 71 - - - 89, 12 - - - 9, 102 - - - 89, 12 - - - 127, 67 + + 额外ID(alterId) 113, 12 @@ -215,40 +231,22 @@ *随便选,建议(auto) - 127, 143 + 126, 65 211, 20 - - 83, 12 - - - 别名(remarks) - 113, 12 加密方式(security) - - 95, 12 + + 83, 12 - - 额外ID(alterId) - - - 65, 12 - - - 用户ID(id) - - - 65, 12 - - - 端口(port) + + 别名(remarks) 83, 12 @@ -256,40 +254,22 @@ 地址(address) - - 服务器 + + 65, 12 + + + 端口(port) 确定(&O) - - 171, 22 - - - 导入客户端配置 - - - 171, 22 - - - 导入服务端配置 - - - 168, 6 - - - 171, 22 - - - 从剪贴板导入URL - - - 92, 21 - - - 导入配置文件 - 编辑或添加[VMess]服务器 + + 生成 + + + Core类型 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.cs b/v2rayN/v2rayN/Forms/BaseServerForm.cs index e68198fe..9618c480 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.cs +++ b/v2rayN/v2rayN/Forms/BaseServerForm.cs @@ -8,11 +8,12 @@ namespace v2rayN.Forms { public VmessItem vmessItem = null; public string groupId; + public EConfigType eConfigType; public BaseServerForm() { InitializeComponent(); - } - + } + } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index a362787a..07ff609d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -496,7 +496,7 @@ namespace v2rayN.Forms groupId = string.Empty; //groupId = tabGroup.TabPages[tabGroup.SelectedIndex].Name; groupId = tabGroup.SelectedTab.Name; - + RefreshServers(); lvServers.Focus(); @@ -579,29 +579,17 @@ namespace v2rayN.Forms private void ShowServerForm(int configType, int index) { BaseServerForm fm; - switch (configType) + if (configType == (int)EConfigType.Custom) { - 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 = new AddServer2Form(); } + else + { + fm = new AddServerForm(); + } fm.vmessItem = index >= 0 ? lstVmess[index] : null; fm.groupId = groupId; + fm.eConfigType = (EConfigType)configType; if (fm.ShowDialog() == DialogResult.OK) { RefreshServers(); @@ -714,7 +702,7 @@ namespace v2rayN.Forms { return; } - if (ConfigHandler.CopyServer(ref config, lstVmess[index]) == 0) + if (ConfigHandler.CopyServer(ref config, lstSelecteds) == 0) { RefreshServers(); } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 00c105a5..cba25aca 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -75,14 +75,25 @@ this.txtautoUpdateInterval = new System.Windows.Forms.TextBox(); this.label15 = new System.Windows.Forms.Label(); this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox(); - this.cmbCoreType = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); 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(); this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); + this.tabPageCoreType = new System.Windows.Forms.TabPage(); + this.cmbCoreType6 = new System.Windows.Forms.ComboBox(); + this.labCoreType6 = new System.Windows.Forms.Label(); + this.cmbCoreType5 = new System.Windows.Forms.ComboBox(); + this.labCoreType5 = new System.Windows.Forms.Label(); + this.cmbCoreType4 = new System.Windows.Forms.ComboBox(); + this.labCoreType4 = new System.Windows.Forms.Label(); + this.cmbCoreType3 = new System.Windows.Forms.ComboBox(); + this.labCoreType3 = new System.Windows.Forms.Label(); + this.cmbCoreType2 = new System.Windows.Forms.ComboBox(); + this.labCoreType2 = new System.Windows.Forms.Label(); + this.cmbCoreType1 = new System.Windows.Forms.ComboBox(); + this.labCoreType1 = new System.Windows.Forms.Label(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.label13 = new System.Windows.Forms.Label(); @@ -97,6 +108,7 @@ this.tabPage2.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); + this.tabPageCoreType.SuspendLayout(); this.tabPage3.SuspendLayout(); this.groupBox2.SuspendLayout(); this.panel2.SuspendLayout(); @@ -116,6 +128,7 @@ this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage6); this.tabControl1.Controls.Add(this.tabPage7); + this.tabControl1.Controls.Add(this.tabPageCoreType); this.tabControl1.Controls.Add(this.tabPage3); resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; @@ -382,8 +395,6 @@ this.tabPage7.Controls.Add(this.txtautoUpdateInterval); this.tabPage7.Controls.Add(this.label15); this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); - this.tabPage7.Controls.Add(this.cmbCoreType); - this.tabPage7.Controls.Add(this.label4); this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); @@ -429,18 +440,6 @@ this.chkIgnoreGeoUpdateCore.Name = "chkIgnoreGeoUpdateCore"; this.chkIgnoreGeoUpdateCore.UseVisualStyleBackColor = true; // - // cmbCoreType - // - this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbCoreType.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); - this.cmbCoreType.Name = "cmbCoreType"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // // chkKeepOlderDedupl // resources.ApplyResources(this.chkKeepOlderDedupl, "chkKeepOlderDedupl"); @@ -477,6 +476,96 @@ this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.UseVisualStyleBackColor = true; // + // tabPageCoreType + // + this.tabPageCoreType.Controls.Add(this.cmbCoreType6); + this.tabPageCoreType.Controls.Add(this.labCoreType6); + this.tabPageCoreType.Controls.Add(this.cmbCoreType5); + this.tabPageCoreType.Controls.Add(this.labCoreType5); + this.tabPageCoreType.Controls.Add(this.cmbCoreType4); + this.tabPageCoreType.Controls.Add(this.labCoreType4); + this.tabPageCoreType.Controls.Add(this.cmbCoreType3); + this.tabPageCoreType.Controls.Add(this.labCoreType3); + this.tabPageCoreType.Controls.Add(this.cmbCoreType2); + this.tabPageCoreType.Controls.Add(this.labCoreType2); + this.tabPageCoreType.Controls.Add(this.cmbCoreType1); + this.tabPageCoreType.Controls.Add(this.labCoreType1); + resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); + this.tabPageCoreType.Name = "tabPageCoreType"; + this.tabPageCoreType.UseVisualStyleBackColor = true; + // + // cmbCoreType6 + // + this.cmbCoreType6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType6.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); + this.cmbCoreType6.Name = "cmbCoreType6"; + // + // labCoreType6 + // + resources.ApplyResources(this.labCoreType6, "labCoreType6"); + this.labCoreType6.Name = "labCoreType6"; + // + // cmbCoreType5 + // + this.cmbCoreType5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType5.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); + this.cmbCoreType5.Name = "cmbCoreType5"; + // + // labCoreType5 + // + resources.ApplyResources(this.labCoreType5, "labCoreType5"); + this.labCoreType5.Name = "labCoreType5"; + // + // cmbCoreType4 + // + this.cmbCoreType4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType4.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); + this.cmbCoreType4.Name = "cmbCoreType4"; + // + // labCoreType4 + // + resources.ApplyResources(this.labCoreType4, "labCoreType4"); + this.labCoreType4.Name = "labCoreType4"; + // + // cmbCoreType3 + // + this.cmbCoreType3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType3.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); + this.cmbCoreType3.Name = "cmbCoreType3"; + // + // labCoreType3 + // + resources.ApplyResources(this.labCoreType3, "labCoreType3"); + this.labCoreType3.Name = "labCoreType3"; + // + // cmbCoreType2 + // + this.cmbCoreType2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType2.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); + this.cmbCoreType2.Name = "cmbCoreType2"; + // + // labCoreType2 + // + resources.ApplyResources(this.labCoreType2, "labCoreType2"); + this.labCoreType2.Name = "labCoreType2"; + // + // cmbCoreType1 + // + this.cmbCoreType1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType1.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); + this.cmbCoreType1.Name = "cmbCoreType1"; + // + // labCoreType1 + // + resources.ApplyResources(this.labCoreType1, "labCoreType1"); + this.labCoreType1.Name = "labCoreType1"; + // // tabPage3 // this.tabPage3.Controls.Add(this.groupBox2); @@ -548,6 +637,8 @@ this.tabPage6.PerformLayout(); this.tabPage7.ResumeLayout(false); this.tabPage7.PerformLayout(); + this.tabPageCoreType.ResumeLayout(false); + this.tabPageCoreType.PerformLayout(); this.tabPage3.ResumeLayout(false); this.groupBox2.ResumeLayout(false); this.groupBox2.PerformLayout(); @@ -607,8 +698,6 @@ private System.Windows.Forms.LinkLabel linkDnsObjectDoc; private System.Windows.Forms.TextBox txtremoteDNS; private System.Windows.Forms.Label label14; - private System.Windows.Forms.ComboBox cmbCoreType; - private System.Windows.Forms.Label label4; private System.Windows.Forms.CheckBox chkIgnoreGeoUpdateCore; private System.Windows.Forms.TabPage tabPage3; private System.Windows.Forms.TextBox txtsystemProxyExceptions; @@ -620,5 +709,18 @@ private System.Windows.Forms.Button btnSetLoopback; private System.Windows.Forms.CheckBox chkEnableAutoAdjustMainLvColWidth; private System.Windows.Forms.CheckBox chkEnableSecurityProtocolTls13; + private System.Windows.Forms.TabPage tabPageCoreType; + private System.Windows.Forms.ComboBox cmbCoreType1; + private System.Windows.Forms.Label labCoreType1; + private System.Windows.Forms.ComboBox cmbCoreType6; + private System.Windows.Forms.Label labCoreType6; + private System.Windows.Forms.ComboBox cmbCoreType5; + private System.Windows.Forms.Label labCoreType5; + private System.Windows.Forms.ComboBox cmbCoreType4; + private System.Windows.Forms.Label labCoreType4; + private System.Windows.Forms.ComboBox cmbCoreType3; + private System.Windows.Forms.Label labCoreType3; + private System.Windows.Forms.ComboBox cmbCoreType2; + private System.Windows.Forms.Label labCoreType2; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index e3673fde..33a5c1b8 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; using v2rayN.Base; @@ -16,13 +17,13 @@ namespace v2rayN.Forms private void OptionSettingForm_Load(object sender, EventArgs e) { - cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); - InitBase(); InitKCP(); InitGUI(); + + InitCoreType(); } /// @@ -123,11 +124,40 @@ namespace v2rayN.Forms } chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; - cmbCoreType.SelectedIndex = (int)config.coreType; txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13; } + + private void InitCoreType() + { + if (config.coreTypeItem == null) + { + config.coreTypeItem = new List(); + } + + foreach (EConfigType it in Enum.GetValues(typeof(EConfigType))) + { + if (config.coreTypeItem.FindIndex(t => t.configType == it) >= 0) + { + continue; + } + + config.coreTypeItem.Add(new CoreTypeItem() + { + configType = it, + coreType = ECoreType.v2fly + }); + } + for (int k = 1; k <= config.coreTypeItem.Count; k++) + { + var item = config.coreTypeItem[k - 1]; + ((ComboBox)tabPageCoreType.Controls[$"cmbCoreType{k}"]).Items.AddRange(Global.coreTypes.ToArray()); + tabPageCoreType.Controls[$"labCoreType{k}"].Text = item.configType.ToString(); + tabPageCoreType.Controls[$"cmbCoreType{k}"].Text = item.coreType.ToString(); + } + } + private void btnOK_Click(object sender, EventArgs e) { if (SaveBase() != 0) @@ -146,6 +176,11 @@ namespace v2rayN.Forms return; } + if (SaveCoreType() != 0) + { + return; + } + if (ConfigHandler.SaveConfig(ref config) == 0) { this.DialogResult = DialogResult.OK; @@ -308,7 +343,6 @@ namespace v2rayN.Forms config.keepOlderDedupl = chkKeepOlderDedupl.Checked; config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; - config.coreType = (ECoreType)cmbCoreType.SelectedIndex; config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked; config.enableSecurityProtocolTls13 = chkEnableSecurityProtocolTls13.Checked; @@ -316,6 +350,17 @@ namespace v2rayN.Forms return 0; } + private int SaveCoreType() + { + for (int k = 1; k <= config.coreTypeItem.Count; k++) + { + var item = config.coreTypeItem[k - 1]; + item.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), tabPageCoreType.Controls[$"cmbCoreType{k}"].Text); + } + + return 0; + } + private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 26bac3d1..ae888117 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -637,7 +637,7 @@ 3, 3 - 648, 421 + 722, 421 6 @@ -661,7 +661,7 @@ 3, 3, 3, 3 - 654, 427 + 728, 427 0 @@ -775,7 +775,7 @@ 4, 22 - 654, 427 + 728, 427 4 @@ -1117,7 +1117,7 @@ 3, 3, 3, 3 - 654, 427 + 728, 427 2 @@ -1299,57 +1299,6 @@ 5 - - 325, 130 - - - 97, 20 - - - 34 - - - cmbCoreType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 6 - - - True - - - NoControl - - - 253, 134 - - - 59, 12 - - - 35 - - - Core Type - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 7 - True @@ -1378,7 +1327,7 @@ tabPage7 - 8 + 6 161, 84 @@ -1399,7 +1348,7 @@ tabPage7 - 9 + 7 True @@ -1429,7 +1378,7 @@ tabPage7 - 10 + 8 True @@ -1459,7 +1408,7 @@ tabPage7 - 11 + 9 True @@ -1486,7 +1435,7 @@ tabPage7 - 12 + 10 True @@ -1513,7 +1462,7 @@ tabPage7 - 13 + 11 4, 22 @@ -1522,7 +1471,7 @@ 3, 3, 3, 3 - 654, 427 + 728, 427 3 @@ -1542,6 +1491,339 @@ 3 + + 117, 172 + + + 143, 20 + + + 46 + + + cmbCoreType6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 0 + + + True + + + NoControl + + + 45, 176 + + + 59, 12 + + + 47 + + + Core Type + + + labCoreType6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 1 + + + 117, 146 + + + 143, 20 + + + 44 + + + cmbCoreType5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 2 + + + True + + + NoControl + + + 45, 150 + + + 59, 12 + + + 45 + + + Core Type + + + labCoreType5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 3 + + + 117, 120 + + + 143, 20 + + + 42 + + + cmbCoreType4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 4 + + + True + + + NoControl + + + 45, 124 + + + 59, 12 + + + 43 + + + Core Type + + + labCoreType4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 5 + + + 117, 94 + + + 143, 20 + + + 40 + + + cmbCoreType3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 6 + + + True + + + NoControl + + + 45, 98 + + + 59, 12 + + + 41 + + + Core Type + + + labCoreType3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 7 + + + 117, 68 + + + 143, 20 + + + 38 + + + cmbCoreType2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 8 + + + True + + + NoControl + + + 45, 72 + + + 59, 12 + + + 39 + + + Core Type + + + labCoreType2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 9 + + + 117, 42 + + + 143, 20 + + + 36 + + + cmbCoreType1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 10 + + + True + + + NoControl + + + 45, 46 + + + 59, 12 + + + 37 + + + Core Type + + + labCoreType1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 11 + + + 4, 22 + + + 3, 3, 3, 3 + + + 728, 427 + + + 6 + + + CoreType settings + + + tabPageCoreType + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 4 + True @@ -1636,7 +1918,7 @@ 0, 0 - 654, 427 + 728, 427 42 @@ -1660,7 +1942,7 @@ 4, 22 - 654, 427 + 728, 427 5 @@ -1678,7 +1960,7 @@ tabControl1 - 4 + 5 Fill @@ -1687,7 +1969,7 @@ 0, 10 - 662, 453 + 736, 453 10 @@ -1735,7 +2017,7 @@ 0, 463 - 662, 60 + 736, 60 11 @@ -1759,7 +2041,7 @@ 0, 0 - 662, 10 + 736, 10 9 @@ -1783,7 +2065,7 @@ 6, 12 - 662, 523 + 736, 523 4, 4, 4, 4 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 133efd06..2d09cab8 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -334,4 +334,7 @@ 参数设置 + + Core类型设置 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 16b07df9..d4dccdaf 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -199,8 +199,7 @@ namespace v2rayN public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; - public static readonly List coreTypes = new List { "v2fly_core", "Xray_core" }; - + public static readonly List coreTypes = new List { "v2fly", "Xray" }; public const string GrpcgunMode = "gun"; public const string GrpcmultiMode = "multi"; diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index a8eac639..9c7f0b1c 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -250,35 +250,17 @@ namespace v2rayN.Handler /// /// /// - public static int CopyServer(ref Config config, VmessItem item) + public static int CopyServer(ref Config config, List indexs) { - if (item == null) + foreach (var item in indexs) { - return -1; + VmessItem vmessItem = Utils.DeepCopy(item); + vmessItem.indexId = string.Empty; + vmessItem.remarks = string.Format("{0}-clone", item.remarks); + + AddServerCommon(ref config, vmessItem); } - VmessItem vmessItem = new VmessItem - { - configVersion = item.configVersion, - address = item.address, - port = item.port, - id = item.id, - alterId = item.alterId, - security = item.security, - network = item.network, - remarks = string.Format("{0}-clone", item.remarks), - headerType = item.headerType, - requestHost = item.requestHost, - path = item.path, - streamSecurity = item.streamSecurity, - allowInsecure = item.allowInsecure, - configType = item.configType, - flow = item.flow, - sni = item.sni - }; - - AddServerCommon(ref config, vmessItem); - ToJsonFile(config); return 0; diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index b3d2df98..4b6c234a 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -36,27 +36,10 @@ namespace v2rayN.Handler /// public void LoadV2ray(Config config) { - if (config.coreType == ECoreType.v2fly_core) - { - lstV2ray = new List - { - "wv2ray", - "v2ray" - }; - coreUrl = Global.v2flyCoreUrl; - } - else - { - lstV2ray = new List - { - "xray" - }; - coreUrl = Global.xrayCoreUrl; - } - if (Global.reloadV2ray) { var item = ConfigHandler.GetDefaultServer(ref config); + SetCore(config, item); string fileName = Utils.GetPath(v2rayConfigRes); if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) { @@ -334,5 +317,32 @@ namespace v2rayN.Handler Utils.SaveLog(ex.Message, ex); } } + + private void SetCore(Config config, VmessItem item) + { + var coreType = config.GetCoreType((EConfigType)item.configType); + if (item.coreType != null) + { + coreType = (ECoreType)item.coreType; + } + + if (coreType == ECoreType.v2fly) + { + lstV2ray = new List + { + "wv2ray", + "v2ray" + }; + coreUrl = Global.v2flyCoreUrl; + } + else + { + lstV2ray = new List + { + "xray" + }; + coreUrl = Global.xrayCoreUrl; + } + } } } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 53846f65..ee4e9447 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -120,10 +120,6 @@ namespace v2rayN.Mode get; set; } - public ECoreType coreType - { - get; set; - } public bool ignoreGeoUpdateCore { get; set; @@ -208,6 +204,12 @@ namespace v2rayN.Mode { get; set; } + + public List coreTypeItem + { + get; set; + } + #endregion #region function @@ -256,7 +258,7 @@ namespace v2rayN.Mode public List GetShadowsocksSecuritys() { - if (coreType == ECoreType.v2fly_core) + if (GetCoreType(EConfigType.Shadowsocks) == ECoreType.v2fly) { return Global.ssSecuritys; } @@ -283,6 +285,19 @@ namespace v2rayN.Mode return groupItem.Where(it => it.id == groupId).FirstOrDefault()?.remarks; } + public ECoreType GetCoreType(EConfigType eConfigType) + { + if (coreTypeItem == null) + { + return ECoreType.v2fly; + } + var item = coreTypeItem.FirstOrDefault(it => it.configType == eConfigType); + if (item == null) + { + return ECoreType.v2fly; + } + return item.coreType; + } #endregion } @@ -570,6 +585,10 @@ namespace v2rayN.Mode { get; set; } = string.Empty; + public ECoreType? coreType + { + get; set; + } } [Serializable] @@ -782,4 +801,19 @@ namespace v2rayN.Mode get; set; } } + + + [Serializable] + public class CoreTypeItem + { + public EConfigType configType + { + get; set; + } + + public ECoreType coreType + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index 3076b8b7..e6d9af55 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -3,7 +3,7 @@ namespace v2rayN.Mode { public enum ECoreType { - v2fly_core = 0, - Xray_core = 1 + v2fly = 1, + Xray = 2 } } From 8f17331db24c9586e06646521d934307445621c4 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 18 Mar 2022 18:54:42 +0800 Subject: [PATCH 121/252] Refactor the server configuration --- .../v2rayN/Forms/AddServer3Form.Designer.cs | 191 ----- v2rayN/v2rayN/Forms/AddServer3Form.cs | 107 --- v2rayN/v2rayN/Forms/AddServer3Form.resx | 534 -------------- .../v2rayN/Forms/AddServer3Form.zh-Hans.resx | 178 ----- .../v2rayN/Forms/AddServer4Form.Designer.cs | 189 ----- v2rayN/v2rayN/Forms/AddServer4Form.cs | 96 --- v2rayN/v2rayN/Forms/AddServer4Form.resx | 537 -------------- .../v2rayN/Forms/AddServer4Form.zh-Hans.resx | 178 ----- .../v2rayN/Forms/AddServer5Form.Designer.cs | 246 ------- v2rayN/v2rayN/Forms/AddServer5Form.cs | 117 --- v2rayN/v2rayN/Forms/AddServer5Form.resx | 690 ------------------ .../v2rayN/Forms/AddServer5Form.zh-Hans.resx | 193 ----- .../v2rayN/Forms/AddServer6Form.Designer.cs | 209 ------ v2rayN/v2rayN/Forms/AddServer6Form.cs | 107 --- v2rayN/v2rayN/Forms/AddServer6Form.resx | 603 --------------- .../v2rayN/Forms/AddServer6Form.zh-Hans.resx | 166 ----- v2rayN/v2rayN/v2rayN.csproj | 56 -- 17 files changed, 4397 deletions(-) delete mode 100644 v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer3Form.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer3Form.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer4Form.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer4Form.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer5Form.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer5Form.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer6Form.cs delete mode 100644 v2rayN/v2rayN/Forms/AddServer6Form.resx delete mode 100644 v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs deleted file mode 100644 index b3cf7d3e..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs +++ /dev/null @@ -1,191 +0,0 @@ -namespace v2rayN.Forms -{ - partial class AddServer3Form - { - /// - /// 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(AddServer3Form)); - this.btnClose = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label13 = 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.groupBox1.SuspendLayout(); - this.panel2.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.label13); - 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; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // - // cmbSecurity - // - this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbSecurity.FormattingEnabled = true; - 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"; - // - // AddServer3Form - // - 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 = "AddServer3Form"; - this.Load += new System.EventHandler(this.AddServer3Form_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.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.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/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs deleted file mode 100644 index b300df46..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class AddServer3Form : BaseServerForm - { - - public AddServer3Form() - { - InitializeComponent(); - } - - private void AddServer3Form_Load(object sender, EventArgs e) - { - cmbSecurity.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); - if (vmessItem != null) - { - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - vmessItem.groupId = groupId; - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - cmbSecurity.Text = vmessItem.security; - txtRemarks.Text = vmessItem.remarks; - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - cmbSecurity.Text = Global.DefaultSecurity; - txtRemarks.Text = ""; - } - - private void btnOK_Click(object sender, EventArgs e) - { - string address = txtAddress.Text; - string port = txtPort.Text; - string id = txtId.Text; - string security = cmbSecurity.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; - } - if (Utils.IsNullOrEmpty(security)) - { - UI.Show(UIRes.I18N("PleaseSelectEncryption")); - return; - } - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.security = security; - vmessItem.remarks = remarks; - - if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem) == 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/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx deleted file mode 100644 index ce2ee4e9..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 396, 17 - - - 75, 23 - - - - 1 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - True - - - - NoControl - - - 426, 158 - - - 113, 12 - - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 127, 123 - - - 278, 20 - - - 3 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - 127, 154 - - - 278, 21 - - - 4 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - True - - - 12, 155 - - - 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 - - - Encryption - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 127, 91 - - - 278, 21 - - - 2 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - 12, 93 - - - 53, 12 - - - 4 - - - Password - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 59 - - - 194, 21 - - - 1 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 12, 62 - - - 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 - - - 0 - - - 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 - - - Fill - - - 0, 10 - - - 547, 221 - - - 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 - - - 0 - - - &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, 0 - - - 547, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - True - - - 6, 12 - - - 547, 291 - - - Edit or add a [Shadowsocks] server - - - AddServer3Form - - - 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/AddServer3Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx deleted file mode 100644 index e2cbcede..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 取消(&C) - - - 服务器 - - - *手填,方便识别管理 - - - - 83, 12 - - - 别名(remarks) - - - 53, 12 - - - 加密方式 - - - 29, 12 - - - 密码 - - - 65, 12 - - - 服务器端口 - - - 65, 12 - - - 服务器地址 - - - 确定(&O) - - - 92, 21 - - - 导入配置文件 - - - 171, 22 - - - 从剪贴板导入URL - - - 编辑或添加[Shadowsocks]服务器 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs deleted file mode 100644 index 628e6c9e..00000000 --- a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs +++ /dev/null @@ -1,189 +0,0 @@ -namespace v2rayN.Forms -{ - partial class AddServer4Form - { - /// - /// 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(AddServer4Form)); - this.btnClose = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtSecurity = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label6 = 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 - // - 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.txtSecurity); - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtId); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.txtRemarks); - this.groupBox1.Controls.Add(this.label6); - 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; - // - // txtSecurity - // - resources.ApplyResources(this.txtSecurity, "txtSecurity"); - this.txtSecurity.Name = "txtSecurity"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // txtId - // - resources.ApplyResources(this.txtId, "txtId"); - this.txtId.Name = "txtId"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // 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"; - // - // 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"; - // - // AddServer4Form - // - 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 = "AddServer4Form"; - this.Load += new System.EventHandler(this.AddServer4Form_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 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; - private System.Windows.Forms.TextBox txtId; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtSecurity; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs deleted file mode 100644 index 800eaf7d..00000000 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class AddServer4Form : BaseServerForm - { - - public AddServer4Form() - { - InitializeComponent(); - } - - private void AddServer4Form_Load(object sender, EventArgs e) - { - if (vmessItem != null) - { - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - vmessItem.groupId = groupId; - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtSecurity.Text = vmessItem.security; - txtRemarks.Text = vmessItem.remarks; - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - txtSecurity.Text = ""; - txtRemarks.Text = ""; - } - - private void btnOK_Click(object sender, EventArgs e) - { - string address = txtAddress.Text; - string port = txtPort.Text; - string id = txtId.Text; - string security = txtSecurity.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; - } - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.security = security; - vmessItem.remarks = remarks; - - if (ConfigHandler.AddSocksServer(ref config, vmessItem) == 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/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx deleted file mode 100644 index 45725ec7..00000000 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 396, 17 - - - 75, 23 - - - - 1 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - 127, 89 - - - 278, 21 - - - 2 - - - txtSecurity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - - NoControl - - - 12, 93 - - - 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, 120 - - - 278, 21 - - - 3 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - True - - - NoControl - - - 12, 124 - - - 113, 12 - - - 23 - - - Password(Optional) - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - 422, 155 - - - 113, 12 - - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 127, 151 - - - 278, 21 - - - 4 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - 12, 155 - - - 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, 58 - - - 194, 21 - - - 1 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 12, 62 - - - 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 - - - 0 - - - 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 - - - Fill - - - 0, 10 - - - 547, 221 - - - 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 - - - 0 - - - &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, 0 - - - 547, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - True - - - 6, 12 - - - 547, 291 - - - Edit or add a [Socks] server - - - AddServer4Form - - - 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/AddServer4Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx deleted file mode 100644 index eb8fc4d7..00000000 --- a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 取消(&C) - - - - 77, 12 - - - 用户名(可选) - - - 65, 12 - - - 密码(可选) - - - *手填,方便识别管理 - - - 83, 12 - - - 别名(remarks) - - - 65, 12 - - - 服务器端口 - - - 65, 12 - - - 服务器地址 - - - 服务器 - - - 确定(&O) - - - 171, 22 - - - 从剪贴板导入URL - - - 92, 21 - - - 导入配置文件 - - - 编辑或添加[Socks]服务器 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs deleted file mode 100644 index be02d20f..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ /dev/null @@ -1,246 +0,0 @@ -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.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.panel3 = new System.Windows.Forms.Panel(); - this.transportControl = new v2rayN.Forms.ServerTransportControl(); - this.groupBox1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.panel3.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.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; - 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"; - // - // 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"; - // - // panel3 - // - this.panel3.Controls.Add(this.transportControl); - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Name = "panel3"; - // - // transportControl - // - this.transportControl.AllowXtls = false; - resources.ApplyResources(this.transportControl, "transportControl"); - this.transportControl.Name = "transportControl"; - // - // 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.panel3); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - 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.panel2.ResumeLayout(false); - this.panel3.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.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.Label label8; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.Button btnGUID; - private System.Windows.Forms.ComboBox cmbFlow; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Panel panel3; - private ServerTransportControl transportControl; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs deleted file mode 100644 index 5c1d747a..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ /dev/null @@ -1,117 +0,0 @@ -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) - { - cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); - transportControl.AllowXtls = true; - if (vmessItem != null) - { - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - vmessItem.groupId = groupId; - 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; - txtRemarks.Text = vmessItem.remarks; - - transportControl.BindingServer(vmessItem); - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - cmbFlow.Text = ""; - cmbSecurity.Text = Global.None; - txtRemarks.Text = ""; - - transportControl.ClearServer(vmessItem); - } - - 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 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("FillUUID")); - return; - } - - transportControl.EndBindingServer(); - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.flow = flow; - vmessItem.security = security; - vmessItem.remarks = remarks; - - if (ConfigHandler.AddVlessServer(ref config, vmessItem) == 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; - } - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx deleted file mode 100644 index 48f6a172..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ /dev/null @@ -1,690 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 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, 123 - - - 211, 20 - - - 3 - - - 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 - - - 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 - - - 4 - - - none - - - 127, 154 - - - 211, 20 - - - 4 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - 127, 185 - - - 211, 21 - - - 5 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 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 - - - 7 - - - 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 - - - 8 - - - 127, 91 - - - 278, 21 - - - 2 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - 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 - - - 10 - - - 127, 59 - - - 143, 21 - - - 1 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - 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 - - - 12 - - - 127, 27 - - - 359, 21 - - - 0 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 13 - - - 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 - - - 14 - - - Fill - - - 0, 10 - - - 729, 221 - - - 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, 461 - - - 729, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - Top - - - 0, 0 - - - 729, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - Fill - - - 0, 0 - - - 729, 230 - - - 0 - - - transportControl - - - v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - panel3 - - - 0 - - - Bottom - - - 0, 231 - - - 729, 230 - - - 9 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - True - - - 25 - - - 6, 12 - - - 729, 521 - - - Edit or add a [VLESS] server - - - 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 deleted file mode 100644 index 3d03d416..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 取消(&C) - - - - 220, 20 - - - 65, 12 - - - 流控(flow) - - - 生成(&G) - - - *手填,方便识别管理 - - - 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) - - - 编辑或添加[VLESS]服务器 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs deleted file mode 100644 index 998dc789..00000000 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ /dev/null @@ -1,209 +0,0 @@ -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.cmbFlow = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); - 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.panel3 = new System.Windows.Forms.Panel(); - this.transportControl = new v2rayN.Forms.ServerTransportControl(); - 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.panel3.SuspendLayout(); - this.panel2.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.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); - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // cmbFlow - // - this.cmbFlow.FormattingEnabled = true; - resources.ApplyResources(this.cmbFlow, "cmbFlow"); - this.cmbFlow.Name = "cmbFlow"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // 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"; - // - // panel3 - // - this.panel3.Controls.Add(this.transportControl); - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Name = "panel3"; - // - // transportControl - // - this.transportControl.AllowXtls = false; - resources.ApplyResources(this.transportControl, "transportControl"); - this.transportControl.Name = "transportControl"; - // - // 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"; - // - // 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.panel3); - 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.panel3.ResumeLayout(false); - 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; - private System.Windows.Forms.Panel panel3; - private ServerTransportControl transportControl; - private System.Windows.Forms.ComboBox cmbFlow; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs deleted file mode 100644 index 7b0abb05..00000000 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ /dev/null @@ -1,107 +0,0 @@ -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) - { - cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); - transportControl.AllowXtls = true; - if (vmessItem != null) - { - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - vmessItem.groupId = groupId; - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - cmbFlow.Text = vmessItem.flow; - txtRemarks.Text = vmessItem.remarks; - - transportControl.BindingServer(vmessItem); - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - cmbFlow.Text = ""; - txtRemarks.Text = ""; - - transportControl.ClearServer(vmessItem); - } - - 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 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; - } - - transportControl.EndBindingServer(); - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.flow = flow; - vmessItem.remarks = remarks; - - if (ConfigHandler.AddTrojanServer(ref config, vmessItem) == 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 deleted file mode 100644 index 0050f788..00000000 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ /dev/null @@ -1,603 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - NoControl - - - - 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, 123 - - - 211, 20 - - - 3 - - - 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 - - - 27 - - - Flow - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - True - - - NoControl - - - 428, 158 - - - 113, 12 - - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - 127, 155 - - - 265, 21 - - - 4 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - NoControl - - - 12, 159 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 127, 91 - - - 265, 21 - - - 2 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - NoControl - - - 12, 93 - - - 53, 12 - - - 4 - - - Password - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 59 - - - 194, 21 - - - 1 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - NoControl - - - 12, 62 - - - 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 - - - 0 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - - - NoControl - - - 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 - - - Fill - - - 0, 10 - - - 707, 191 - - - 3 - - - Server - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - Fill - - - 0, 0 - - - 707, 230 - - - 0 - - - transportControl - - - v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - panel3 - - - 0 - - - Bottom - - - 0, 201 - - - 707, 230 - - - 8 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - NoControl - - - 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, 431 - - - 707, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - Top - - - 0, 0 - - - 707, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - 6, 12 - - - 707, 491 - - - Edit or add a [Trojan] server - - - AddServer6Form - - - 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/AddServer6Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx deleted file mode 100644 index 928ced2b..00000000 --- a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 取消(&C) - - - - 65, 12 - - - 流控(flow) - - - *手填,方便识别管理 - - - 83, 12 - - - 别名(remarks) - - - 29, 12 - - - 密码 - - - 65, 12 - - - 服务器端口 - - - 65, 12 - - - 服务器地址 - - - 服务器 - - - 确定(&O) - - - 编辑或添加[Trojan]服务器 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 6cb109d8..fe6e948d 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -99,27 +99,9 @@ - - Form - - - AddServer6Form.cs - - - Form - - - AddServer4Form.cs - Component - - Form - - - AddServer5Form.cs - Form @@ -196,12 +178,6 @@ AddServer2Form.cs - - Form - - - AddServer3Form.cs - UserControl @@ -292,34 +268,6 @@ AddServer2Form.cs Designer
- - AddServer6Form.cs - Designer - - - AddServer6Form.cs - Designer - - - AddServer4Form.cs - Designer - - - AddServer4Form.cs - Designer - - - AddServer3Form.cs - Designer - - - AddServer5Form.cs - Designer - - - AddServer5Form.cs - Designer - AddServerForm.cs Designer @@ -429,10 +377,6 @@ AddServer2Form.cs Designer - - AddServer3Form.cs - Designer - SubSettingForm.cs From c3971bda05d64f8958b3a96af9fea2a0ea6f6eff Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 18 Mar 2022 20:30:08 +0800 Subject: [PATCH 122/252] bug fix --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 4 +--- v2rayN/v2rayN/Handler/MainFormHandler.cs | 14 ++++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 9c7f0b1c..9bdf698b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -621,7 +621,7 @@ namespace v2rayN.Handler /// /// /// 成功导入的数量 - public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId) + public static int AddBatchServers(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) { if (Utils.IsNullOrEmpty(clipboardData)) { @@ -629,10 +629,8 @@ namespace v2rayN.Handler } //copy sub items - List lstOriSub = null; if (!Utils.IsNullOrEmpty(subid)) { - lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); RemoveServerViaSubid(ref config, subid); } //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index f81bb165..2387bb68 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,12 +1,14 @@ using NHotkey; using NHotkey.WindowsForms; using System; +using System.Collections.Generic; using System.Drawing; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Mode; +using System.Linq; namespace v2rayN.Handler { @@ -159,16 +161,16 @@ namespace v2rayN.Handler public int AddBatchServers(Config config, string clipboardData, string subid, string groupId) { - int counter; - int _Add() + List lstOriSub = null; + if (!Utils.IsNullOrEmpty(subid)) { - return ConfigHandler.AddBatchServers(ref config, clipboardData, subid, groupId); + lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); } - counter = _Add(); + + int counter = ConfigHandler.AddBatchServers(ref config, clipboardData, subid, lstOriSub, groupId); if (counter < 1) { - clipboardData = Utils.Base64Decode(clipboardData); - counter = _Add(); + counter = ConfigHandler.AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, lstOriSub, groupId); } return counter; From 539b6aafd932d2d865eccba5578bedb72fa31001 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 19 Mar 2022 07:53:48 +0800 Subject: [PATCH 123/252] Refactor --- v2rayN/v2rayN/Forms/AddServerForm.cs | 2 +- v2rayN/v2rayN/Forms/MainForm.cs | 20 ++++++------ v2rayN/v2rayN/Handler/ConfigHandler.cs | 24 +++++++------- v2rayN/v2rayN/Handler/MainFormHandler.cs | 8 ++--- v2rayN/v2rayN/Handler/ShareHandler.cs | 26 +++++++-------- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 6 ++-- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 20 ++++++------ v2rayN/v2rayN/Handler/V2rayHandler.cs | 2 +- v2rayN/v2rayN/Mode/Config.cs | 36 ++++++--------------- v2rayN/v2rayN/Mode/ServerTestItem.cs | 2 +- 10 files changed, 64 insertions(+), 82 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 1f0c2722..e623929a 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -15,7 +15,7 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { - this.Text = ((EConfigType)eConfigType).ToString(); + this.Text = (eConfigType).ToString(); cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); cmbSecurity3.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 07ff609d..30b959e2 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -284,7 +284,7 @@ namespace v2rayN.Forms } } ListViewItem lvItem = new ListViewItem(def); - Utils.AddSubItem(lvItem, EServerColName.configType.ToString(), ((EConfigType)item.configType).ToString()); + Utils.AddSubItem(lvItem, EServerColName.configType.ToString(), (item.configType).ToString()); Utils.AddSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); Utils.AddSubItem(lvItem, EServerColName.address.ToString(), item.address); Utils.AddSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); @@ -576,10 +576,10 @@ namespace v2rayN.Forms } ShowServerForm(lstVmess[index].configType, index); } - private void ShowServerForm(int configType, int index) + private void ShowServerForm(EConfigType configType, int index) { BaseServerForm fm; - if (configType == (int)EConfigType.Custom) + if (configType == EConfigType.Custom) { fm = new AddServer2Form(); } @@ -589,7 +589,7 @@ namespace v2rayN.Forms } fm.vmessItem = index >= 0 ? lstVmess[index] : null; fm.groupId = groupId; - fm.eConfigType = (EConfigType)configType; + fm.eConfigType = configType; if (fm.ShowDialog() == DialogResult.OK) { RefreshServers(); @@ -658,12 +658,12 @@ namespace v2rayN.Forms private void menuAddVmessServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Vmess, -1); + ShowServerForm(EConfigType.Vmess, -1); } private void menuAddVlessServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.VLESS, -1); + ShowServerForm(EConfigType.VLESS, -1); } private void menuRemoveServer_Click(object sender, EventArgs e) @@ -940,24 +940,24 @@ namespace v2rayN.Forms private void menuAddCustomServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Custom, -1); + ShowServerForm(EConfigType.Custom, -1); } private void menuAddShadowsocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Shadowsocks, -1); + ShowServerForm(EConfigType.Shadowsocks, -1); ShowForm(); } private void menuAddSocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Socks, -1); + ShowServerForm(EConfigType.Socks, -1); ShowForm(); } private void menuAddTrojanServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Trojan, -1); + ShowServerForm(EConfigType.Trojan, -1); ShowForm(); } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 9bdf698b..40b32a5b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -197,7 +197,7 @@ namespace v2rayN.Handler /// public static int AddServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configType = (int)EConfigType.Vmess; + vmessItem.configType = EConfigType.Vmess; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); @@ -439,7 +439,7 @@ namespace v2rayN.Handler } vmessItem.address = newFileName; - vmessItem.configType = (int)EConfigType.Custom; + vmessItem.configType = EConfigType.Custom; if (Utils.IsNullOrEmpty(vmessItem.remarks)) { vmessItem.remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()); @@ -474,7 +474,7 @@ namespace v2rayN.Handler /// public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configType = (int)EConfigType.Shadowsocks; + vmessItem.configType = EConfigType.Shadowsocks; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); @@ -503,7 +503,7 @@ namespace v2rayN.Handler /// public static int AddSocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configType = (int)EConfigType.Socks; + vmessItem.configType = EConfigType.Socks; vmessItem.address = vmessItem.address.TrimEx(); @@ -526,7 +526,7 @@ namespace v2rayN.Handler /// public static int AddTrojanServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configType = (int)EConfigType.Trojan; + vmessItem.configType = EConfigType.Trojan; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); @@ -563,7 +563,7 @@ namespace v2rayN.Handler { return 0; } - if (vmessItem.configType == (int)EConfigType.Vmess) + if (vmessItem.configType == EConfigType.Vmess) { string path = ""; string host = ""; @@ -672,35 +672,35 @@ namespace v2rayN.Handler //groupId vmessItem.groupId = groupId; - if (vmessItem.configType == (int)EConfigType.Vmess) + if (vmessItem.configType == EConfigType.Vmess) { if (AddServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.Shadowsocks) + else if (vmessItem.configType == EConfigType.Shadowsocks) { if (AddShadowsocksServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.Socks) + else if (vmessItem.configType == EConfigType.Socks) { if (AddSocksServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.Trojan) + else if (vmessItem.configType == EConfigType.Trojan) { if (AddTrojanServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.VLESS) + else if (vmessItem.configType == EConfigType.VLESS) { if (AddVlessServer(ref config, vmessItem, false) == 0) { @@ -839,7 +839,7 @@ namespace v2rayN.Handler /// public static int AddVlessServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configType = (int)EConfigType.VLESS; + vmessItem.configType = EConfigType.VLESS; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 2387bb68..1661bbd2 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -85,8 +85,8 @@ namespace v2rayN.Handler { return; } - if (item.configType != (int)EConfigType.Vmess - && item.configType != (int)EConfigType.VLESS) + if (item.configType != EConfigType.Vmess + && item.configType != EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; @@ -125,8 +125,8 @@ namespace v2rayN.Handler { return; } - if (item.configType != (int)EConfigType.Vmess - && item.configType != (int)EConfigType.VLESS) + if (item.configType != EConfigType.Vmess + && item.configType != EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index badd9812..fb755af5 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -30,19 +30,19 @@ namespace v2rayN.Handler switch (item.configType) { - case (int)EConfigType.Vmess: + case EConfigType.Vmess: url = ShareVmess(item); break; - case (int)EConfigType.Shadowsocks: + case EConfigType.Shadowsocks: url = ShareShadowsocks(item); break; - case (int)EConfigType.Socks: + case EConfigType.Socks: url = ShareSocks(item); break; - case (int)EConfigType.Trojan: + case EConfigType.Trojan: url = ShareTrojan(item); break; - case (int)EConfigType.VLESS: + case EConfigType.VLESS: url = ShareVLESS(item); break; default: @@ -354,7 +354,7 @@ namespace v2rayN.Handler return null; } - vmessItem.configType = (int)EConfigType.Shadowsocks; + vmessItem.configType = EConfigType.Shadowsocks; } else if (result.StartsWith(Global.socksProtocol)) { @@ -374,7 +374,7 @@ namespace v2rayN.Handler return null; } - vmessItem.configType = (int)EConfigType.Socks; + vmessItem.configType = EConfigType.Socks; } else if (result.StartsWith(Global.trojanProtocol)) { @@ -408,7 +408,7 @@ namespace v2rayN.Handler msg = string.Empty; VmessItem vmessItem = new VmessItem(); - vmessItem.configType = (int)EConfigType.Vmess; + vmessItem.configType = EConfigType.Vmess; result = result.Substring(Global.vmessProtocol.Length); result = Utils.Base64Decode(result); @@ -461,7 +461,7 @@ namespace v2rayN.Handler { VmessItem vmessItem = new VmessItem { - configType = (int)EConfigType.Vmess + configType = EConfigType.Vmess }; result = result.Substring(Global.vmessProtocol.Length); int indexSplit = result.IndexOf("?"); @@ -499,7 +499,7 @@ namespace v2rayN.Handler { VmessItem i = new VmessItem { - configType = (int)EConfigType.Vmess, + configType = EConfigType.Vmess, security = "auto" }; @@ -655,7 +655,7 @@ namespace v2rayN.Handler private static VmessItem ResolveSocks(string result) { VmessItem vmessItem = new VmessItem(); - vmessItem.configType = (int)EConfigType.Socks; + vmessItem.configType = EConfigType.Socks; result = result.Substring(Global.socksProtocol.Length); //remark int indexRemark = result.IndexOf("#"); @@ -733,7 +733,7 @@ namespace v2rayN.Handler { VmessItem item = new VmessItem { - configType = (int)EConfigType.Trojan + configType = EConfigType.Trojan }; Uri url = new Uri(result); @@ -752,7 +752,7 @@ namespace v2rayN.Handler { VmessItem item = new VmessItem { - configType = (int)EConfigType.VLESS, + configType = EConfigType.VLESS, security = "none" }; diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index db05ec2f..c6faabd2 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -64,7 +64,7 @@ namespace v2rayN.Handler { foreach (var it in _selecteds) { - if (it.configType == (int)EConfigType.Custom) + if (it.configType == EConfigType.Custom) { continue; } @@ -129,7 +129,7 @@ namespace v2rayN.Handler { continue; } - if (it.configType == (int)EConfigType.Custom) + if (it.configType == EConfigType.Custom) { continue; } @@ -226,7 +226,7 @@ namespace v2rayN.Handler { continue; } - if (it.configType == (int)EConfigType.Custom) + if (it.configType == EConfigType.Custom) { continue; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 5324683c..dae03c68 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -37,7 +37,7 @@ namespace v2rayN.Handler } msg = UIRes.I18N("InitialConfiguration"); - if (node.configType == (int)EConfigType.Custom) + if (node.configType == EConfigType.Custom) { return GenerateClientCustomConfig(node, fileName, out msg); } @@ -334,7 +334,7 @@ namespace v2rayN.Handler { var config = LazyConfig.Instance.GetConfig(); Outbounds outbound = v2rayConfig.outbounds[0]; - if (node.configType == (int)EConfigType.Vmess) + if (node.configType == EConfigType.Vmess) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -384,7 +384,7 @@ namespace v2rayN.Handler outbound.protocol = Global.vmessProtocolLite; outbound.settings.servers = null; } - else if (node.configType == (int)EConfigType.Shadowsocks) + else if (node.configType == EConfigType.Shadowsocks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -420,7 +420,7 @@ namespace v2rayN.Handler outbound.protocol = Global.ssProtocolLite; outbound.settings.vnext = null; } - else if (node.configType == (int)EConfigType.Socks) + else if (node.configType == EConfigType.Socks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -457,7 +457,7 @@ namespace v2rayN.Handler outbound.protocol = Global.socksProtocolLite; outbound.settings.vnext = null; } - else if (node.configType == (int)EConfigType.VLESS) + else if (node.configType == EConfigType.VLESS) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -516,7 +516,7 @@ namespace v2rayN.Handler outbound.protocol = Global.vlessProtocolLite; outbound.settings.servers = null; } - else if (node.configType == (int)EConfigType.Trojan) + else if (node.configType == EConfigType.Trojan) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -1022,13 +1022,13 @@ namespace v2rayN.Handler usersItem.id = node.id; usersItem.email = Global.userEMail; - if (node.configType == (int)EConfigType.Vmess) + if (node.configType == EConfigType.Vmess) { inbound.protocol = Global.vmessProtocolLite; usersItem.alterId = node.alterId; } - else if (node.configType == (int)EConfigType.VLESS) + else if (node.configType == EConfigType.VLESS) { inbound.protocol = Global.vlessProtocolLite; usersItem.flow = node.flow; @@ -1432,7 +1432,7 @@ namespace v2rayN.Handler foreach (var it in selecteds) { - if (it.configType == (int)EConfigType.Custom) + if (it.configType == EConfigType.Custom) { continue; } @@ -1440,7 +1440,7 @@ namespace v2rayN.Handler { continue; } - if (it.configType == (int)EConfigType.Vmess || it.configType == (int)EConfigType.VLESS) + if (it.configType == EConfigType.Vmess || it.configType == EConfigType.VLESS) { if (!Utils.IsGuidByParse(configCopy.GetVmessItem(it.indexId).id)) { diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 4b6c234a..1005366b 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -320,7 +320,7 @@ namespace v2rayN.Handler private void SetCore(Config config, VmessItem item) { - var coreType = config.GetCoreType((EConfigType)item.configType); + var coreType = config.GetCoreType(item.configType); if (item.coreType != null) { coreType = (ECoreType)item.coreType; diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index ee4e9447..d8ccb076 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -308,7 +308,7 @@ namespace v2rayN.Mode public VmessItem() { indexId = string.Empty; - configType = (int)EConfigType.Vmess; + configType = EConfigType.Vmess; configVersion = 2; sort = 0; address = string.Empty; @@ -332,7 +332,7 @@ namespace v2rayN.Mode #region function public string GetSummary() { - string summary = string.Format("[{0}] ", ((EConfigType)configType).ToString()); + string summary = string.Format("[{0}] ", (configType).ToString()); string[] arrAddr = address.Split('.'); string addr; if (arrAddr.Length > 2) @@ -349,34 +349,16 @@ namespace v2rayN.Mode } switch (configType) { - case (int)EConfigType.Vmess: - case (int)EConfigType.Shadowsocks: - case (int)EConfigType.Socks: - case (int)EConfigType.VLESS: - case (int)EConfigType.Trojan: + case EConfigType.Vmess: + case EConfigType.Shadowsocks: + case EConfigType.Socks: + case EConfigType.VLESS: + case EConfigType.Trojan: summary += string.Format("{0}({1}:{2})", remarks, addr, port); break; default: summary += string.Format("{0}", remarks); - break; - //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; + break; } return summary; } @@ -435,7 +417,7 @@ namespace v2rayN.Mode /// /// config type(1=normal,2=custom) /// - public int configType + public EConfigType configType { get; set; } diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs index 2d204a8d..45d6b5f9 100644 --- a/v2rayN/v2rayN/Mode/ServerTestItem.cs +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -17,7 +17,7 @@ namespace v2rayN.Mode { get; set; } - public int configType + public EConfigType configType { get; set; } From f947c541c998bcbb58e1adfb58de8576574151aa Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 19 Mar 2022 08:55:43 +0800 Subject: [PATCH 124/252] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 31e8f4ce..fab1f55a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # v2rayN +A V2Ray client for Windows, support [Xray core](https://github.com/XTLS/Xray-core) and [v2fly core](https://github.com/v2fly/v2ray-core) ### How to use - If you are newbie please download v2rayN-Core.zip from releases @@ -7,4 +8,5 @@ ### Requirements - Microsoft [.NET Framework 4.8](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) -- Project V core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) +- v2fly core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) +- Xray core [https://github.com/XTLS/Xray-core/releases](https://github.com/XTLS/Xray-core/releases) From 828f93bc5ccafb43cca05723d3f3578abd0a407c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 19 Mar 2022 09:23:19 +0800 Subject: [PATCH 125/252] Improve custom configuration --- .../v2rayN/Forms/AddServer2Form.Designer.cs | 38 +++++---- v2rayN/v2rayN/Forms/AddServer2Form.cs | 20 +++++ v2rayN/v2rayN/Forms/AddServer2Form.resx | 81 ++++++++++++++----- .../v2rayN/Forms/AddServer2Form.zh-Hans.resx | 3 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 +++ v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + 7 files changed, 122 insertions(+), 35 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs index 88808170..25f8d715 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs @@ -31,6 +31,9 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form)); this.btnClose = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnEdit = new System.Windows.Forms.Button(); + this.cmbCoreType = new System.Windows.Forms.ComboBox(); + this.labCoreType = new System.Windows.Forms.Label(); this.btnBrowse = new System.Windows.Forms.Button(); this.txtAddress = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); @@ -40,8 +43,6 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.cmbCoreType = new System.Windows.Forms.ComboBox(); - this.labCoreType = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); @@ -56,6 +57,7 @@ // // groupBox1 // + this.groupBox1.Controls.Add(this.btnEdit); this.groupBox1.Controls.Add(this.cmbCoreType); this.groupBox1.Controls.Add(this.labCoreType); this.groupBox1.Controls.Add(this.btnBrowse); @@ -68,6 +70,25 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // btnEdit + // + resources.ApplyResources(this.btnEdit, "btnEdit"); + this.btnEdit.Name = "btnEdit"; + this.btnEdit.UseVisualStyleBackColor = true; + this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click); + // + // cmbCoreType + // + this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); + this.cmbCoreType.Name = "cmbCoreType"; + // + // labCoreType + // + resources.ApplyResources(this.labCoreType, "labCoreType"); + this.labCoreType.Name = "labCoreType"; + // // btnBrowse // resources.ApplyResources(this.btnBrowse, "btnBrowse"); @@ -119,18 +140,6 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // - // cmbCoreType - // - this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbCoreType.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); - this.cmbCoreType.Name = "cmbCoreType"; - // - // labCoreType - // - resources.ApplyResources(this.labCoreType, "labCoreType"); - this.labCoreType.Name = "labCoreType"; - // // AddServer2Form // resources.ApplyResources(this, "$this"); @@ -164,5 +173,6 @@ private System.Windows.Forms.Button btnBrowse; private System.Windows.Forms.ComboBox cmbCoreType; private System.Windows.Forms.Label labCoreType; + private System.Windows.Forms.Button btnEdit; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 7e7a28fb..892bb48f 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -1,4 +1,6 @@ using System; +using System.Diagnostics; +using System.IO; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; @@ -66,6 +68,11 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("PleaseFillRemarks")); return; } + if (Utils.IsNullOrEmpty(txtAddress.Text)) + { + UI.Show(UIRes.I18N("FillServerAddressCustom")); + return; + } vmessItem.remarks = remarks; if (Utils.IsNullOrEmpty(cmbCoreType.Text)) { @@ -130,5 +137,18 @@ namespace v2rayN.Forms UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); } } + + private void btnEdit_Click(object sender, EventArgs e) + { + var address = txtAddress.Text; + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddressCustom")); + return; + } + + address = Path.Combine(Utils.GetTempPath(), address); + Process.Start(address); + } } } diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx index 726f0cae..23a0a255 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -143,6 +143,34 @@ 0 + + + NoControl + + + 208, 110 + + + 75, 23 + + + 43 + + + &Edit + + + btnEdit + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + 127, 157 @@ -162,12 +190,11 @@ groupBox1
- 0 + 1 True - NoControl @@ -193,7 +220,7 @@ groupBox1
- 1 + 2 NoControl @@ -220,7 +247,7 @@ groupBox1 - 2 + 3 127, 62 @@ -244,7 +271,7 @@ groupBox1 - 3 + 4 True @@ -271,7 +298,7 @@ groupBox1 - 4 + 5 127, 23 @@ -292,7 +319,7 @@ groupBox1 - 5 + 6 True @@ -319,7 +346,7 @@ groupBox1 - 6 + 7 True @@ -346,7 +373,7 @@ groupBox1 - 7 + 8 Fill @@ -375,18 +402,6 @@ 0 - - 357, 17 - - - 75, 23 - - - 5 - - - &OK - btnOK @@ -423,6 +438,30 @@ 1 + + 357, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + Top diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx index 232e5b76..45296254 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx @@ -126,6 +126,9 @@ 取消(&C) + + 编辑(&E) + 确定(&O) diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index f08cfec5..892684b2 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -249,6 +249,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please browse to import server configuration 的本地化字符串。 + /// + internal static string FillServerAddressCustom { + get { + return ResourceManager.GetString("FillServerAddressCustom", resourceCulture); + } + } + /// /// 查找类似 Please fill in the user ID 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 626a0ce2..81b80999 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -451,4 +451,7 @@ All servers + + Please browse to import server configuration + \ 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 44dce0d3..986200aa 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -451,4 +451,7 @@ 所有服务器 + + 请浏览导入服务器配置 + \ No newline at end of file From 5b8ce1836be6efdc491834a25d4f94149da79867 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 19 Mar 2022 09:24:30 +0800 Subject: [PATCH 126/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 472855c1..fc757995 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.2")] +[assembly: AssemblyFileVersion("5.3")] From 5e5893362c6a152c3b4d3469ab1fc19ad2a9f6af Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 19 Mar 2022 19:26:51 +0800 Subject: [PATCH 127/252] add clash core --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 3 ++- v2rayN/v2rayN/Global.cs | 3 +++ v2rayN/v2rayN/Handler/ConfigHandler.cs | 7 ++++++- v2rayN/v2rayN/Handler/V2rayHandler.cs | 27 +++++++++++++++++++++++++- v2rayN/v2rayN/Mode/ECoreType.cs | 3 ++- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 892bb48f..f19794f2 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -18,6 +18,7 @@ namespace v2rayN.Forms private void AddServer2Form_Load(object sender, EventArgs e) { cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); + cmbCoreType.Items.Add("clash"); cmbCoreType.Items.Add(string.Empty); txtAddress.ReadOnly = true; @@ -112,7 +113,7 @@ namespace v2rayN.Forms OpenFileDialog fileDialog = new OpenFileDialog { Multiselect = false, - Filter = "Config|*.json|All|*.*" + Filter = "Config|*.json|YAML|*.yaml|All|*.*" }; if (fileDialog.ShowDialog() != DialogResult.OK) { diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index d4dccdaf..774ee12f 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -14,6 +14,9 @@ namespace v2rayN public const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases"; public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; + public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases"; + + /// diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 40b32a5b..b196fc1f 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -426,7 +426,12 @@ namespace v2rayN.Handler public static int AddCustomServer(ref Config config, VmessItem vmessItem) { var fileName = vmessItem.address; - string newFileName = string.Format("{0}.json", Utils.GetGUID()); + if (!File.Exists(fileName)) + { + return -1; + } + var ext = Path.GetExtension(fileName); + string newFileName = string.Format("{0}{1}", Utils.GetGUID(), ext); //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); try diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 1005366b..1d81a90a 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -23,6 +23,7 @@ namespace v2rayN.Handler private static string v2rayConfigRes = Global.v2rayConfigFileName; private List lstV2ray; private string coreUrl; + private string coreArguments; public event ProcessDelegate ProcessEvent; //private int processId = 0; private Process _process; @@ -39,6 +40,12 @@ namespace v2rayN.Handler if (Global.reloadV2ray) { var item = ConfigHandler.GetDefaultServer(ref config); + if (item == null) + { + ShowMsg(false, UIRes.I18N("CheckServerSettings")); + return; + } + SetCore(config, item); string fileName = Utils.GetPath(v2rayConfigRes); if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) @@ -196,6 +203,7 @@ namespace v2rayN.Handler StartInfo = new ProcessStartInfo { FileName = fileName, + Arguments = coreArguments, WorkingDirectory = Utils.StartupPath(), UseShellExecute = false, RedirectStandardOutput = true, @@ -320,6 +328,10 @@ namespace v2rayN.Handler private void SetCore(Config config, VmessItem item) { + if (item == null) + { + return; + } var coreType = config.GetCoreType(item.configType); if (item.coreType != null) { @@ -334,14 +346,27 @@ namespace v2rayN.Handler "v2ray" }; coreUrl = Global.v2flyCoreUrl; + coreArguments = string.Empty; } - else + else if (coreType == ECoreType.Xray) { lstV2ray = new List { "xray" }; coreUrl = Global.xrayCoreUrl; + coreArguments = string.Empty; + } + else if (coreType == ECoreType.clash) + { + lstV2ray = new List + { + "clash-windows-amd64", + "clash-windows-386", + "clash" + }; + coreUrl = Global.clashCoreUrl; + coreArguments = "-f config.json"; } } } diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index e6d9af55..390f008f 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -4,6 +4,7 @@ namespace v2rayN.Mode public enum ECoreType { v2fly = 1, - Xray = 2 + Xray = 2, + clash = 3 } } From 026936c92faef731bf73b45903b8b47991ea6d77 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 19 Mar 2022 19:27:14 +0800 Subject: [PATCH 128/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index fc757995..039845c4 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.3")] +[assembly: AssemblyFileVersion("5.4")] From 78d6bcd57a152fd078283e8cc3635fa4ef337f23 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 20 Mar 2022 20:40:07 +0800 Subject: [PATCH 129/252] Full profile can be subscribed --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 4 +- v2rayN/v2rayN/Forms/MainForm.cs | 9 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 519 ++++++++++++-------- v2rayN/v2rayN/Handler/DownloadHandle.cs | 4 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 19 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 2 +- v2rayN/v2rayN/Mode/Config.cs | 4 +- v2rayN/v2rayN/Tool/Utils.cs | 42 +- 10 files changed, 368 insertions(+), 239 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index f19794f2..adc881a4 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -128,7 +128,7 @@ namespace v2rayN.Forms vmessItem.address = fileName; vmessItem.remarks = txtRemarks.Text; - if (ConfigHandler.AddCustomServer(ref config, vmessItem) == 0) + if (ConfigHandler.AddCustomServer(ref config, vmessItem, false) == 0) { BindingServer(); UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); @@ -148,7 +148,7 @@ namespace v2rayN.Forms return; } - address = Path.Combine(Utils.GetTempPath(), address); + address = Path.Combine(Utils.GetConfigPath(), address); Process.Start(address); } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 30b959e2..6f325a62 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -586,7 +586,7 @@ namespace v2rayN.Forms else { fm = new AddServerForm(); - } + } fm.vmessItem = index >= 0 ? lstVmess[index] : null; fm.groupId = groupId; fm.eConfigType = configType; @@ -688,8 +688,7 @@ namespace v2rayN.Forms private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) { int oldCount = lstVmess.Count; - ConfigHandler.DedupServerList(ref config, ref lstVmess); - int newCount = lstVmess.Count; + int newCount = ConfigHandler.DedupServerList(ref config, ref lstVmess); RefreshServers(); _ = LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); @@ -964,7 +963,7 @@ namespace v2rayN.Forms private void menuAddServers_Click(object sender, EventArgs e) { string clipboardData = Utils.GetClipboardData(); - int ret = MainFormHandler.Instance.AddBatchServers(config, clipboardData, "", groupId); + int ret = ConfigHandler.AddBatchServers(ref config, clipboardData, "", groupId); if (ret > 0) { RefreshServers(); @@ -994,7 +993,7 @@ namespace v2rayN.Forms } else { - int ret = MainFormHandler.Instance.AddBatchServers(config, result, "", groupId); + int ret = ConfigHandler.AddBatchServers(ref config, result, "", groupId); if (ret > 0) { RefreshServers(); diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 33a5c1b8..6268daf7 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -146,7 +146,7 @@ namespace v2rayN.Forms config.coreTypeItem.Add(new CoreTypeItem() { configType = it, - coreType = ECoreType.v2fly + coreType = ECoreType.Xray }); } for (int k = 1; k <= config.coreTypeItem.Count; k++) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index b196fc1f..631f2bc3 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -184,6 +184,28 @@ namespace v2rayN.Handler LazyConfig.Instance.SetConfig(ref config); return 0; } + /// + /// 保参数 + /// + /// + /// + public static int SaveConfig(ref Config config, bool reload = true) + { + Global.reloadV2ray = reload; + + ToJsonFile(config); + + return 0; + } + + /// + /// 存储文件 + /// + /// + private static void ToJsonFile(Config config) + { + Utils.ToJsonFile(config, Utils.GetPath(configRes)); + } #endregion @@ -235,7 +257,7 @@ namespace v2rayN.Handler var index = config.FindIndexId(item.indexId); if (index >= 0) { - config.vmess.RemoveAt(index); + RemoveVmessItem(config, index); } } @@ -323,29 +345,6 @@ namespace v2rayN.Handler return config.vmess[index]; } - /// - /// 保参数 - /// - /// - /// - public static int SaveConfig(ref Config config, bool reload = true) - { - Global.reloadV2ray = reload; - - ToJsonFile(config); - - return 0; - } - - /// - /// 存储文件 - /// - /// - private static void ToJsonFile(Config config) - { - Utils.ToJsonFile(config, Utils.GetPath(configRes)); - } - /// /// 移动服务器 /// @@ -423,7 +422,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddCustomServer(ref Config config, VmessItem vmessItem) + public static int AddCustomServer(ref Config config, VmessItem vmessItem, bool blDelete) { var fileName = vmessItem.address; if (!File.Exists(fileName)) @@ -436,7 +435,11 @@ namespace v2rayN.Handler try { - File.Copy(fileName, Path.Combine(Utils.GetTempPath(), newFileName)); + File.Copy(fileName, Path.Combine(Utils.GetConfigPath(), newFileName)); + if (blDelete) + { + File.Delete(fileName); + } } catch { @@ -522,7 +525,6 @@ namespace v2rayN.Handler return 0; } - /// /// 添加服务器或编辑 /// @@ -619,178 +621,6 @@ namespace v2rayN.Handler return 0; } - /// - /// 批量添加服务器 - /// - /// - /// - /// - /// 成功导入的数量 - public static int AddBatchServers(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) - { - if (Utils.IsNullOrEmpty(clipboardData)) - { - return -1; - } - - //copy sub items - if (!Utils.IsNullOrEmpty(subid)) - { - RemoveServerViaSubid(ref config, subid); - } - //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) - //{ - // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); - //} - int countServers = 0; - - //string[] arrData = clipboardData.Split(new string[] { "\r\n" }, StringSplitOptions.None); - string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray()); - foreach (string str in arrData) - { - //maybe sub - if (Utils.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) - { - if (AddSubItem(ref config, str) == 0) - { - countServers++; - } - continue; - } - VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(str, out string msg); - if (vmessItem == null) - { - continue; - } - - //exist sub items - if (!Utils.IsNullOrEmpty(subid)) - { - var existItem = lstOriSub?.FirstOrDefault(t => CompareVmessItem(t, vmessItem, true)); - if (existItem != null) - { - vmessItem = existItem; - } - vmessItem.subid = subid; - } - - //groupId - vmessItem.groupId = groupId; - - if (vmessItem.configType == EConfigType.Vmess) - { - if (AddServer(ref config, vmessItem, false) == 0) - { - countServers++; - } - } - else if (vmessItem.configType == EConfigType.Shadowsocks) - { - if (AddShadowsocksServer(ref config, vmessItem, false) == 0) - { - countServers++; - } - } - else if (vmessItem.configType == EConfigType.Socks) - { - if (AddSocksServer(ref config, vmessItem, false) == 0) - { - countServers++; - } - } - else if (vmessItem.configType == EConfigType.Trojan) - { - if (AddTrojanServer(ref config, vmessItem, false) == 0) - { - countServers++; - } - } - else if (vmessItem.configType == EConfigType.VLESS) - { - if (AddVlessServer(ref config, vmessItem, false) == 0) - { - countServers++; - } - } - } - - ToJsonFile(config); - return countServers; - } - - /// - /// add sub - /// - /// - /// - /// - public static int AddSubItem(ref Config config, string url) - { - //already exists - if (config.subItem.FindIndex(e => e.url == url) >= 0) - { - return 0; - } - - SubItem subItem = new SubItem - { - id = string.Empty, - remarks = "import sub", - url = url - }; - config.subItem.Add(subItem); - - return SaveSubItem(ref config); - } - - /// - /// save sub - /// - /// - /// - public static int SaveSubItem(ref Config config) - { - if (config.subItem == null) - { - return -1; - } - - foreach (SubItem item in config.subItem) - { - if (Utils.IsNullOrEmpty(item.id)) - { - item.id = Utils.GetGUID(false); - } - } - - ToJsonFile(config); - return 0; - } - - /// - /// 移除服务器 - /// - /// - /// - /// - public static int RemoveServerViaSubid(ref Config config, string subid) - { - if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) - { - return -1; - } - for (int k = config.vmess.Count - 1; k >= 0; k--) - { - if (config.vmess[k].subid.Equals(subid)) - { - config.vmess.RemoveAt(k); - } - } - - ToJsonFile(config); - return 0; - } - public static int SortServers(ref Config config, ref List lstVmess, EServerColName name, bool asc) { if (lstVmess.Count <= 0) @@ -884,14 +714,14 @@ namespace v2rayN.Handler var index = config.FindIndexId(item.indexId); if (index >= 0) { - config.vmess.RemoveAt(index); + RemoveVmessItem(config, index); } } } //if (!keepOlder) list.Reverse(); //config.vmess = list; - return 0; + return list.Count; } public static int AddServerCommon(ref Config config, VmessItem vmessItem) @@ -949,6 +779,291 @@ namespace v2rayN.Handler && (remarks ? o.remarks == n.remarks : true); } + private static int RemoveVmessItem(Config config, int index) + { + try + { + if (config.vmess[index].configType == EConfigType.Custom) + { + File.Delete(Utils.GetConfigPath(config.vmess[index].address)); + } + } + catch (Exception ex) + { + Utils.SaveLog("RemoveVmessItem", ex); + } + config.vmess.RemoveAt(index); + + return 0; + } + #endregion + + #region Batch add servers + + /// + /// 批量添加服务器 + /// + /// + /// + /// + /// 成功导入的数量 + private static int AddBatchServers(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + + //copy sub items + if (!Utils.IsNullOrEmpty(subid)) + { + RemoveServerViaSubid(ref config, subid); + } + //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) + //{ + // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); + //} + int countServers = 0; + + //string[] arrData = clipboardData.Split(new string[] { "\r\n" }, StringSplitOptions.None); + string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray()); + foreach (string str in arrData) + { + //maybe sub + if (Utils.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) + { + if (AddSubItem(ref config, str) == 0) + { + countServers++; + } + continue; + } + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(str, out string msg); + if (vmessItem == null) + { + continue; + } + + //exist sub items + if (!Utils.IsNullOrEmpty(subid)) + { + var existItem = lstOriSub?.FirstOrDefault(t => CompareVmessItem(t, vmessItem, true)); + if (existItem != null) + { + vmessItem = existItem; + } + vmessItem.subid = subid; + } + + //groupId + vmessItem.groupId = groupId; + + if (vmessItem.configType == EConfigType.Vmess) + { + if (AddServer(ref config, vmessItem, false) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == EConfigType.Shadowsocks) + { + if (AddShadowsocksServer(ref config, vmessItem, false) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == EConfigType.Socks) + { + if (AddSocksServer(ref config, vmessItem, false) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == EConfigType.Trojan) + { + if (AddTrojanServer(ref config, vmessItem, false) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == EConfigType.VLESS) + { + if (AddVlessServer(ref config, vmessItem, false) == 0) + { + countServers++; + } + } + } + + ToJsonFile(config); + return countServers; + } + + private static int AddBatchServers4Custom(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + + VmessItem vmessItem = new VmessItem(); + //Is v2ray configuration + V2rayConfig v2rayConfig = Utils.FromJson(clipboardData); + if (v2rayConfig != null + && v2rayConfig.inbounds != null + && v2rayConfig.inbounds.Count > 0 + && v2rayConfig.outbounds != null + && v2rayConfig.outbounds.Count > 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.Xray; + vmessItem.address = fileName; + vmessItem.remarks = "v2ray_custom"; + } + //Is Clash configuration + else if (clipboardData.IndexOf("port") >= 0 + && clipboardData.IndexOf("socks-port") >= 0 + && clipboardData.IndexOf("proxies") >= 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.yaml"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.clash; + vmessItem.address = fileName; + vmessItem.remarks = "clash_custom"; + } + + if (!Utils.IsNullOrEmpty(subid)) + { + RemoveServerViaSubid(ref config, subid); + } + if (lstOriSub != null && lstOriSub.Count == 1) + { + vmessItem.indexId = lstOriSub[0].indexId; + } + vmessItem.subid = subid; + vmessItem.groupId = groupId; + + if (Utils.IsNullOrEmpty(vmessItem.address)) + { + return -1; + } + + if (AddCustomServer(ref config, vmessItem, true) == 0) + { + return 1; + + } + else + { + return -1; + } + } + + public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId) + { + List lstOriSub = null; + if (!Utils.IsNullOrEmpty(subid)) + { + lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); + } + + int counter = AddBatchServers(ref config, clipboardData, subid, lstOriSub, groupId); + if (counter < 1) + { + counter = AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, lstOriSub, groupId); + } + + //maybe other sub + if (counter < 1) + { + counter = AddBatchServers4Custom(ref config, clipboardData, subid, lstOriSub, groupId); + } + + return counter; + } + + + #endregion + + #region Sub & Group + + /// + /// add sub + /// + /// + /// + /// + public static int AddSubItem(ref Config config, string url) + { + //already exists + if (config.subItem.FindIndex(e => e.url == url) >= 0) + { + return 0; + } + + SubItem subItem = new SubItem + { + id = string.Empty, + remarks = "import sub", + url = url + }; + config.subItem.Add(subItem); + + return SaveSubItem(ref config); + } + + /// + /// save sub + /// + /// + /// + public static int SaveSubItem(ref Config config) + { + if (config.subItem == null) + { + return -1; + } + + foreach (SubItem item in config.subItem) + { + if (Utils.IsNullOrEmpty(item.id)) + { + item.id = Utils.GetGUID(false); + } + } + + ToJsonFile(config); + return 0; + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static int RemoveServerViaSubid(ref Config config, string subid) + { + if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) + { + return -1; + } + for (int k = config.vmess.Count - 1; k >= 0; k--) + { + if (config.vmess[k].subid.Equals(subid)) + { + RemoveVmessItem(config, k); + } + } + + ToJsonFile(config); + return 0; + } + + /// /// save Group /// @@ -999,6 +1114,8 @@ namespace v2rayN.Handler ToJsonFile(config); return 0; } + + #endregion #region UI diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 2a1778ff..0bc47214 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Net; +using System.Text; using v2rayN.Base; namespace v2rayN.Handler @@ -139,6 +140,7 @@ namespace v2rayN.Handler Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); WebClientEx ws = new WebClientEx(); + ws.Encoding = Encoding.UTF8; if (webProxy != null) { ws.Proxy = webProxy; @@ -197,7 +199,7 @@ namespace v2rayN.Handler Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); WebClientEx ws = new WebClientEx(); - + ws.Encoding = Encoding.UTF8; return ws.DownloadString(new Uri(url)); } catch (Exception ex) diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 1661bbd2..7da72180 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -159,29 +159,12 @@ namespace v2rayN.Handler } } - public int AddBatchServers(Config config, string clipboardData, string subid, string groupId) - { - List lstOriSub = null; - if (!Utils.IsNullOrEmpty(subid)) - { - lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); - } - - int counter = ConfigHandler.AddBatchServers(ref config, clipboardData, subid, lstOriSub, groupId); - if (counter < 1) - { - counter = ConfigHandler.AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, lstOriSub, groupId); - } - - return counter; - } - public void BackupGuiNConfig(Config config, bool auto = false) { string fileName = $"guiNConfig_{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff")}.json"; if (auto) { - fileName = Utils.GetTempPath(fileName); + fileName = Utils.GetBackupPath(fileName); } else { diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 5d005685..5b280883 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -210,7 +210,7 @@ namespace v2rayN.Handler //ConfigHandler.RemoveServerViaSubid(ref config, id); //_updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); // RefreshServers(); - int ret = MainFormHandler.Instance.AddBatchServers(config, result, id, groupId); + int ret = ConfigHandler.AddBatchServers(ref config, result, id, groupId); if (ret > 0) { // RefreshServers(); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index dae03c68..1e299c9e 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -912,7 +912,7 @@ namespace v2rayN.Handler string addressFileName = node.address; if (!File.Exists(addressFileName)) { - addressFileName = Path.Combine(Utils.GetTempPath(), addressFileName); + addressFileName = Path.Combine(Utils.GetConfigPath(), addressFileName); } if (!File.Exists(addressFileName)) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index d8ccb076..f158768b 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -289,12 +289,12 @@ namespace v2rayN.Mode { if (coreTypeItem == null) { - return ECoreType.v2fly; + return ECoreType.Xray; } var item = coreTypeItem.FirstOrDefault(it => it.configType == eConfigType); if (item == null) { - return ECoreType.v2fly; + return ECoreType.Xray; } return item.coreType; } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index f0f3076d..49384694 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -943,19 +943,21 @@ namespace v2rayN #region TempPath // return path to store temporary files - public static string GetTempPath() + public static string GetTempPath(string filename = "") { string _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); if (!Directory.Exists(_tempPath)) { Directory.CreateDirectory(_tempPath); } - return _tempPath; - } - - public static string GetTempPath(string filename) - { - return Path.Combine(GetTempPath(), filename); + if (string.IsNullOrEmpty(filename)) + { + return _tempPath; + } + else + { + return Path.Combine(_tempPath, filename); + } } public static string UnGzip(byte[] buf) @@ -970,6 +972,32 @@ namespace v2rayN return Encoding.UTF8.GetString(sb.ToArray()); } + public static string GetBackupPath(string filename) + { + string _tempPath = Path.Combine(StartupPath(), "guiBackups"); + if (!Directory.Exists(_tempPath)) + { + Directory.CreateDirectory(_tempPath); + } + return Path.Combine(_tempPath, filename); + } + public static string GetConfigPath(string filename = "") + { + string _tempPath = Path.Combine(StartupPath(), "guiConfigs"); + if (!Directory.Exists(_tempPath)) + { + Directory.CreateDirectory(_tempPath); + } + if (string.IsNullOrEmpty(filename)) + { + return _tempPath; + } + else + { + return Path.Combine(_tempPath, filename); + } + } + #endregion #region Log From a2679e009dfe48911fe0ba9f547187c94de58ddc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 21 Mar 2022 20:20:29 +0800 Subject: [PATCH 130/252] refactor some code --- v2rayN/v2rayN/Forms/AddServerForm.cs | 16 ++++++----- v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 +- v2rayN/v2rayN/Handler/LazyConfig.cs | 31 +++++++++++++++++++++ v2rayN/v2rayN/Handler/MainFormHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 6 +--- v2rayN/v2rayN/Mode/Config.cs | 25 +---------------- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.resx | 2 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 2 +- 10 files changed, 48 insertions(+), 42 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index e623929a..ef8a9d9c 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -16,13 +16,7 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { this.Text = (eConfigType).ToString(); - - cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); - cmbSecurity3.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); - - cmbFlow5.Items.AddRange(Global.xtlsFlows.ToArray()); - cmbFlow6.Items.AddRange(Global.xtlsFlows.ToArray()); - + cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); cmbCoreType.Items.Add(string.Empty); @@ -31,12 +25,16 @@ namespace v2rayN.Forms case EConfigType.Vmess: panVmess.Dock = DockStyle.Fill; panVmess.Visible = true; + + cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); break; case EConfigType.Shadowsocks: panSs.Dock = DockStyle.Fill; panSs.Visible = true; panTran.Visible = false; this.Height = this.Height - panTran.Height; + + cmbSecurity3.Items.AddRange(LazyConfig.Instance.GetShadowsocksSecuritys().ToArray()); break; case EConfigType.Socks: panSocks.Dock = DockStyle.Fill; @@ -48,11 +46,15 @@ namespace v2rayN.Forms panVless.Dock = DockStyle.Fill; panVless.Visible = true; transportControl.AllowXtls = true; + + cmbFlow5.Items.AddRange(Global.xtlsFlows.ToArray()); break; case EConfigType.Trojan: panTrojan.Dock = DockStyle.Fill; panTrojan.Visible = true; transportControl.AllowXtls = true; + + cmbFlow6.Items.AddRange(Global.xtlsFlows.ToArray()); break; } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 631f2bc3..0cf56c5c 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -488,7 +488,7 @@ namespace v2rayN.Handler vmessItem.id = vmessItem.id.TrimEx(); vmessItem.security = vmessItem.security.TrimEx(); - if (!config.GetShadowsocksSecuritys().Contains(vmessItem.security)) + if (!LazyConfig.Instance.GetShadowsocksSecuritys().Contains(vmessItem.security)) { return -1; } diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 976c8970..d1be5442 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using v2rayN.Mode; +using System.Linq; namespace v2rayN.Handler { @@ -20,5 +22,34 @@ namespace v2rayN.Handler { return _config; } + + public List GetShadowsocksSecuritys() + { + if (GetCoreType(null, EConfigType.Shadowsocks) == ECoreType.v2fly) + { + return Global.ssSecuritys; + } + + return Global.ssSecuritysInXray; + } + + public ECoreType GetCoreType(VmessItem vmessItem, EConfigType eConfigType) + { + if (vmessItem != null && vmessItem.coreType != null) + { + return (ECoreType)vmessItem.coreType; + } + + if (_config.coreTypeItem == null) + { + return ECoreType.Xray; + } + var item = _config.coreTypeItem.FirstOrDefault(it => it.configType == eConfigType); + if (item == null) + { + return ECoreType.Xray; + } + return item.coreType; + } } } diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 7da72180..c7dc4337 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -53,7 +53,7 @@ namespace v2rayN.Handler if (!Utils.IsNullOrEmpty(item.customIcon) && File.Exists(item.customIcon)) { graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); - graphics.DrawImage(new Bitmap(item.customIcon), 0, 0); + graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height); customIcon = true; } } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 1e299c9e..9e213992 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -400,7 +400,7 @@ namespace v2rayN.Handler serversItem.address = node.address; serversItem.port = node.port; serversItem.password = node.id; - if (config.GetShadowsocksSecuritys().Contains(node.security)) + if (LazyConfig.Instance.GetShadowsocksSecuritys().Contains(node.security)) { serversItem.method = node.security; } diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 1d81a90a..7db95a8a 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -332,11 +332,7 @@ namespace v2rayN.Handler { return; } - var coreType = config.GetCoreType(item.configType); - if (item.coreType != null) - { - coreType = (ECoreType)item.coreType; - } + var coreType = LazyConfig.Instance.GetCoreType(item, item.configType); if (coreType == ECoreType.v2fly) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index f158768b..f7b00755 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -256,16 +256,6 @@ namespace v2rayN.Mode return vmess.FirstOrDefault(it => it.indexId == id); } - public List GetShadowsocksSecuritys() - { - if (GetCoreType(EConfigType.Shadowsocks) == ECoreType.v2fly) - { - return Global.ssSecuritys; - } - - return Global.ssSecuritysInXray; - } - public bool IsActiveNode(VmessItem item) { if (!Utils.IsNullOrEmpty(item.indexId) && item.indexId == indexId) @@ -285,19 +275,6 @@ namespace v2rayN.Mode return groupItem.Where(it => it.id == groupId).FirstOrDefault()?.remarks; } - public ECoreType GetCoreType(EConfigType eConfigType) - { - if (coreTypeItem == null) - { - return ECoreType.Xray; - } - var item = coreTypeItem.FirstOrDefault(it => it.configType == eConfigType); - if (item == null) - { - return ECoreType.Xray; - } - return item.coreType; - } #endregion } @@ -358,7 +335,7 @@ namespace v2rayN.Mode break; default: summary += string.Format("{0}", remarks); - break; + break; } return summary; } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 892684b2..e202e71b 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -115,7 +115,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 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. 的本地化字符串。 + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 /// internal static string CustomServerTips { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 81b80999..6077e7eb 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -130,7 +130,7 @@ 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. + Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. Downloading... diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 986200aa..6ad22fc8 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -130,7 +130,7 @@ 配置格式不正确 - 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 + 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。如需使用系统代理请手工修改监听端口。 下载开始... From e58e0d6ac7536fedac76d329118dbe1c5ebffe32 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 21 Mar 2022 20:36:07 +0800 Subject: [PATCH 131/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 039845c4..08155bc8 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.4")] +[assembly: AssemblyFileVersion("5.5")] From dee5613f2fab4ed18f10e6feda0dcb1d4f4fd8da Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:47:59 +0800 Subject: [PATCH 132/252] add move servers to group --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 26 ++++++---- v2rayN/v2rayN/Forms/MainForm.cs | 58 +++++++++++++++++++---- v2rayN/v2rayN/Forms/MainForm.resx | 40 ++++++++++------ v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 3 ++ v2rayN/v2rayN/Handler/ConfigHandler.cs | 10 ++++ 5 files changed, 107 insertions(+), 30 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 0a309df6..39988104 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -47,6 +47,7 @@ this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveToGroup = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); @@ -64,9 +65,9 @@ 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.tabGroup = new System.Windows.Forms.TabControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); - this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.gbMsgTitle = new System.Windows.Forms.GroupBox(); @@ -208,6 +209,7 @@ this.menuCopyServer, this.menuSetDefaultServer, this.toolStripSeparator3, + this.menuMoveToGroup, this.menuMoveTop, this.menuMoveUp, this.menuMoveDown, @@ -226,6 +228,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -310,6 +313,12 @@ this.toolStripSeparator3.Name = "toolStripSeparator3"; resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // + // menuMoveToGroup + // + this.menuMoveToGroup.Name = "menuMoveToGroup"; + resources.ApplyResources(this.menuMoveToGroup, "menuMoveToGroup"); + this.menuMoveToGroup.Click += new System.EventHandler(this.menuMoveToGroup_Click); + // // menuMoveTop // this.menuMoveTop.Name = "menuMoveTop"; @@ -410,6 +419,13 @@ resources.ApplyResources(this.menuExport2SubContent, "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"; + // // tabGroup // resources.ApplyResources(this.tabGroup, "tabGroup"); @@ -422,13 +438,6 @@ resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // - // tsbServer - // - this.tsbServer.DropDown = this.cmsLv; - this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); - this.tsbServer.Name = "tsbServer"; - // // splitContainer1 // resources.ApplyResources(this.splitContainer1, "splitContainer1"); @@ -1076,6 +1085,7 @@ private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; private System.Windows.Forms.TabControl tabGroup; private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; + private System.Windows.Forms.ToolStripMenuItem menuMoveToGroup; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 6f325a62..f741842f 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -485,6 +485,23 @@ namespace v2rayN.Forms } tabGroup.SelectedIndex = 0; + + //menuMoveToGroup + menuMoveToGroup.DropDownItems.Clear(); + + List lst = new List(); + foreach (var item in config.groupItem) + { + string name = item.remarks; + + ToolStripMenuItem ts = new ToolStripMenuItem(name) + { + Tag = item.id, + }; + ts.Click += new EventHandler(ts_Group_Click); + lst.Add(ts); + } + menuMoveToGroup.DropDownItems.AddRange(lst.ToArray()); } private void tabGroup_SelectedIndexChanged(object sender, EventArgs e) @@ -501,6 +518,29 @@ namespace v2rayN.Forms lvServers.Focus(); } + + private void ts_Group_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + var groupIdSelected = Utils.ToString(ts.Tag); + + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + + if (ConfigHandler.MoveServerToGroup(config, lstSelecteds, groupIdSelected) == 0) + { + RefreshServers(); + } + } + catch + { + } + } #endregion #region v2ray 操作 @@ -688,7 +728,7 @@ namespace v2rayN.Forms private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) { int oldCount = lstVmess.Count; - int newCount = ConfigHandler.DedupServerList(ref config, ref lstVmess); + int newCount = ConfigHandler.DedupServerList(ref config, ref lstVmess); RefreshServers(); _ = LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); @@ -720,11 +760,11 @@ namespace v2rayN.Forms private void menuPingServer_Click(object sender, EventArgs e) { - Speedtest("ping"); + Speedtest(ESpeedActionType.Ping); } private void menuTcpingServer_Click(object sender, EventArgs e) { - Speedtest("tcping"); + Speedtest(ESpeedActionType.Tcping); } private void menuRealPingServer_Click(object sender, EventArgs e) @@ -737,7 +777,7 @@ namespace v2rayN.Forms //UI.Show(UIRes.I18N("SpeedServerTips")); - Speedtest("realping"); + Speedtest(ESpeedActionType.Realping); } private void menuSpeedServer_Click(object sender, EventArgs e) @@ -750,13 +790,13 @@ namespace v2rayN.Forms //UI.Show(UIRes.I18N("SpeedServerTips")); - Speedtest("speedtest"); + Speedtest(ESpeedActionType.Speedtest); } - private void Speedtest(string actionType) + private void Speedtest(ESpeedActionType actionType) { if (GetLvSelectedIndex() < 0) return; ClearTestResult(); - SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); + SpeedtestHandler statistics = new SpeedtestHandler(ref config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); } private void tsbTestMe_Click(object sender, EventArgs e) @@ -1280,7 +1320,9 @@ namespace v2rayN.Forms item.Selected = true; } } - + private void menuMoveToGroup_Click(object sender, EventArgs e) + { + } #endregion #region 系统代理相关 diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 7a643648..e9c6dd11 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -206,6 +206,12 @@ 352, 6 + + 355, 22 + + + Move to Group + 355, 22 @@ -302,8 +308,20 @@ Export subscription (base64) share to clipboard + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + - 356, 622 + 356, 666 cmsLv @@ -452,18 +470,6 @@ 0 - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - Fill @@ -549,7 +555,7 @@ Set message filters - 228, 158 + 228, 136 cmsMsgBox @@ -1205,6 +1211,12 @@ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuMoveToGroup + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + menuMoveTop diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 97a5be43..593d0710 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -573,4 +573,7 @@ 关闭窗口 + + 移至分组 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 0cf56c5c..fdc6fc4a 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1115,7 +1115,17 @@ namespace v2rayN.Handler return 0; } + public static int MoveServerToGroup(Config config, List indexs, string groupId) + { + foreach (var item in indexs) + { + item.groupId = groupId; + } + ToJsonFile(config); + + return 0; + } #endregion #region UI From b7a600483034c1154ad35c0dfbe77e093cbffbed Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:48:57 +0800 Subject: [PATCH 133/252] some improvements --- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 10 +++++----- v2rayN/v2rayN/Handler/UpdateHandle.cs | 2 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 21 ++++++++++----------- v2rayN/v2rayN/Mode/ESpeedActionType.cs | 11 +++++++++++ v2rayN/v2rayN/v2rayN.csproj | 1 + 5 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 v2rayN/v2rayN/Mode/ESpeedActionType.cs diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index c6faabd2..df0eee21 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -21,7 +21,7 @@ namespace v2rayN.Handler _config = config; } - public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) + public SpeedtestHandler(ref Config config, V2rayHandler v2rayHandler, List selecteds, ESpeedActionType actionType, Action update) { _config = config; _v2rayHandler = v2rayHandler; @@ -40,19 +40,19 @@ namespace v2rayN.Handler }); } - if (actionType == "ping") + if (actionType == ESpeedActionType.Ping) { Task.Run(() => RunPing()); } - if (actionType == "tcping") + else if (actionType == ESpeedActionType.Tcping) { Task.Run(() => RunTcping()); } - else if (actionType == "realping") + else if (actionType == ESpeedActionType.Realping) { Task.Run(() => RunRealPing()); } - else if (actionType == "speedtest") + else if (actionType == ESpeedActionType.Speedtest) { Task.Run(() => RunSpeedTest()); } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 5b280883..62c795f4 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -182,7 +182,7 @@ namespace v2rayN.Handler string url = config.subItem[k - 1].url.TrimEx(); string userAgent = config.subItem[k - 1].userAgent.TrimEx(); string groupId = config.subItem[k - 1].groupId.TrimEx(); - string hashCode = $"{k}->"; + string hashCode = $"{k}){config.subItem[k - 1].remarks}->"; if (config.subItem[k - 1].enabled == false) { continue; diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 7db95a8a..bb4e4435 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -21,7 +21,7 @@ namespace v2rayN.Handler class V2rayHandler { private static string v2rayConfigRes = Global.v2rayConfigFileName; - private List lstV2ray; + private List lstCore; private string coreUrl; private string coreArguments; public event ProcessDelegate ProcessEvent; @@ -106,7 +106,7 @@ namespace v2rayN.Handler } else { - foreach (string vName in lstV2ray) + foreach (string vName in lstCore) { Process[] existing = Process.GetProcessesByName(vName); foreach (Process p in existing) @@ -163,12 +163,10 @@ namespace v2rayN.Handler } } - private string V2rayFindexe() + private string V2rayFindexe(List lstCoreTemp) { - //查找v2ray文件是否存在 string fileName = string.Empty; - //lstV2ray.Reverse(); - foreach (string name in lstV2ray) + foreach (string name in lstCoreTemp) { string vName = string.Format("{0}.exe", name); vName = Utils.GetPath(vName); @@ -195,7 +193,7 @@ namespace v2rayN.Handler try { - string fileName = V2rayFindexe(); + string fileName = V2rayFindexe(lstCore); if (fileName == "") return; Process p = new Process @@ -249,7 +247,8 @@ namespace v2rayN.Handler try { - string fileName = V2rayFindexe(); + coreUrl = Global.xrayCoreUrl; + string fileName = V2rayFindexe(new List { "xray" }); if (fileName == "") return -1; Process p = new Process @@ -336,7 +335,7 @@ namespace v2rayN.Handler if (coreType == ECoreType.v2fly) { - lstV2ray = new List + lstCore = new List { "wv2ray", "v2ray" @@ -346,7 +345,7 @@ namespace v2rayN.Handler } else if (coreType == ECoreType.Xray) { - lstV2ray = new List + lstCore = new List { "xray" }; @@ -355,7 +354,7 @@ namespace v2rayN.Handler } else if (coreType == ECoreType.clash) { - lstV2ray = new List + lstCore = new List { "clash-windows-amd64", "clash-windows-386", diff --git a/v2rayN/v2rayN/Mode/ESpeedActionType.cs b/v2rayN/v2rayN/Mode/ESpeedActionType.cs new file mode 100644 index 00000000..3e9bc3b6 --- /dev/null +++ b/v2rayN/v2rayN/Mode/ESpeedActionType.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum ESpeedActionType + { + Ping, + Tcping, + Realping, + Speedtest + } +} diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index fe6e948d..a6623b5d 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -199,6 +199,7 @@ Component + From 7bb91f57acea084d71730059fd3453939145b5c9 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:49:28 +0800 Subject: [PATCH 134/252] Custom configuration overwrite port --- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 25 ++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 9e213992..16762304 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -921,10 +921,33 @@ namespace v2rayN.Handler } File.Copy(addressFileName, fileName); + //check again + if (!File.Exists(fileName)) + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + + //overwrite port + var fileContent = File.ReadAllLines(fileName).ToList(); + var coreType = LazyConfig.Instance.GetCoreType(node, node.configType); + switch (coreType) + { + case ECoreType.v2fly: + case ECoreType.Xray: + break; + case ECoreType.clash: + fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}"); + fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}"); + break; + } + File.WriteAllLines(fileName, fileContent); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } - catch + catch (Exception ex) { + Utils.SaveLog("GenerateClientCustomConfig", ex); msg = UIRes.I18N("FailedGenDefaultConfiguration"); return -1; } From d20791bf739b28df651dd28283025c25079a6677 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:56:01 +0800 Subject: [PATCH 135/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 08155bc8..6365aee4 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.5")] +[assembly: AssemblyFileVersion("5.6")] From 1493a8b03f56f7aea4deaa9ababa83698d850ba1 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 24 Mar 2022 19:07:45 +0800 Subject: [PATCH 136/252] add drag to sort --- v2rayN/v2rayN/Base/ListViewFlickerFree.cs | 109 +++++++++++++----- v2rayN/v2rayN/Forms/MainForm.cs | 13 +++ v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 16 ++- v2rayN/v2rayN/Handler/ConfigHandler.cs | 21 +++- v2rayN/v2rayN/Mode/EMove.cs | 3 +- 5 files changed, 124 insertions(+), 38 deletions(-) diff --git a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs index c70ccfc6..91f555c3 100644 --- a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs +++ b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs @@ -1,10 +1,13 @@ -using System.Drawing; +using System; +using System.Drawing; using System.Windows.Forms; namespace v2rayN.Base { class ListViewFlickerFree : ListView { + Action _updateFunc; + public ListViewFlickerFree() { SetStyle(ControlStyles.OptimizedDoubleBuffer @@ -13,40 +16,82 @@ namespace v2rayN.Base UpdateStyles(); } - - public void AutoResizeColumns() + public void RegisterDragEvent(Action _update) { - try - { - this.SuspendLayout(); - Graphics graphics = this.CreateGraphics(); + _updateFunc = _update; + this.AllowDrop = true; - // 原生 ColumnHeaderAutoResizeStyle.ColumnContent 将忽略列头宽度 - this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - for (int i = 0; i < this.Columns.Count; i++) - { - ColumnHeader c = this.Columns[i]; - int cWidth = c.Width; - string MaxStr = ""; - Font font = this.Items[0].SubItems[0].Font; - - foreach (ListViewItem item in this.Items) - { - // 整行视作相同字形,不单独计算每个单元格 - font = item.SubItems[i].Font; - string str = item.SubItems[i].Text; - if (str.Length > MaxStr.Length) // 未考虑非等宽问题 - MaxStr = str; - } - int strWidth = (int)graphics.MeasureString(MaxStr, font).Width; - c.Width = System.Math.Max(cWidth, strWidth); - } - this.ResumeLayout(); - } - catch { } + this.ItemDrag += new ItemDragEventHandler(this.lv_ItemDrag); + this.DragDrop += new DragEventHandler(this.lv_DragDrop); + this.DragEnter += new DragEventHandler(this.lv_DragEnter); + this.DragOver += new DragEventHandler(this.lv_DragOver); + this.DragLeave += new EventHandler(this.lv_DragLeave); } - + private void lv_DragDrop(object sender, DragEventArgs e) + { + int targetIndex = this.InsertionMark.Index; + if (targetIndex == -1) + { + return; + } + if (this.InsertionMark.AppearsAfterItem) + { + targetIndex++; + } + + + if (this.SelectedIndices.Count <= 0) + { + return; + } + + _updateFunc(this.SelectedIndices[0], targetIndex); + + //ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); + //this.BeginUpdate(); + //this.Items.Insert(targetIndex, (ListViewItem)draggedItem.Clone()); + //this.Items.Remove(draggedItem); + //this.EndUpdate(); + } + + + private void lv_DragEnter(object sender, DragEventArgs e) + { + e.Effect = e.AllowedEffect; + } + + private void lv_DragLeave(object sender, EventArgs e) + { + this.InsertionMark.Index = -1; + } + + private void lv_DragOver(object sender, DragEventArgs e) + { + Point targetPoint = this.PointToClient(new Point(e.X, e.Y)); + int targetIndex = this.InsertionMark.NearestIndex(targetPoint); + + if (targetIndex > -1) + { + Rectangle itemBounds = this.GetItemRect(targetIndex); + this.EnsureVisible(targetIndex); + + if (targetPoint.Y > itemBounds.Top + (itemBounds.Height / 2)) + { + this.InsertionMark.AppearsAfterItem = true; + } + else + { + this.InsertionMark.AppearsAfterItem = false; + } + } + this.InsertionMark.Index = targetIndex; + } + + private void lv_ItemDrag(object sender, ItemDragEventArgs e) + { + this.DoDragDrop(e.Item, DragDropEffects.Move); + this.InsertionMark.Index = -1; + } } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index f741842f..5ec3cdc4 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -225,6 +225,7 @@ namespace v2rayN.Forms lvServers.Scrollable = true; lvServers.MultiSelect = true; lvServers.HeaderStyle = ColumnHeaderStyle.Clickable; + lvServers.RegisterDragEvent(UpdateDragEventHandler); lvServers.Columns.Add("", 30); lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80); @@ -247,6 +248,18 @@ namespace v2rayN.Forms lvServers.EndUpdate(); } + private void UpdateDragEventHandler(int index, int targetIndex) + { + if (index < 0 || targetIndex < 0) + { + return; + } + if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, EMove.Position, targetIndex) == 0) + { + RefreshServers(); + } + } + /// /// 刷新服务器列表 /// diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index 87fe775c..3ae9359f 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -54,6 +54,7 @@ namespace v2rayN.Forms lvRoutings.View = View.Details; lvRoutings.MultiSelect = true; lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; + lvRoutings.RegisterDragEvent(UpdateDragEventHandler); lvRoutings.Columns.Add("", 30); lvRoutings.Columns.Add("outboundTag", 80); @@ -61,11 +62,22 @@ namespace v2rayN.Forms lvRoutings.Columns.Add("protocol", 80); lvRoutings.Columns.Add("inboundTag", 80); lvRoutings.Columns.Add("domain", 160); - lvRoutings.Columns.Add("ip", 160); + lvRoutings.Columns.Add("ip", 160); lvRoutings.Columns.Add("enable", 60); lvRoutings.EndUpdate(); } + private void UpdateDragEventHandler(int index, int targetIndex) + { + if (index < 0 || targetIndex < 0) + { + return; + } + if (ConfigHandler.MoveRoutingRule(ref routingItem, index, EMove.Position, targetIndex) == 0) + { + RefreshRoutingsView(); + } + } private void RefreshRoutingsView() { @@ -353,6 +365,6 @@ namespace v2rayN.Forms #endregion - + } } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index fdc6fc4a..8556eb2c 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -15,6 +15,7 @@ namespace v2rayN.Handler class ConfigHandler { private static string configRes = Global.ConfigFileName; + private static object objLock = new object(); #region ConfigHandler @@ -204,7 +205,10 @@ namespace v2rayN.Handler /// private static void ToJsonFile(Config config) { - Utils.ToJsonFile(config, Utils.GetPath(configRes)); + lock (objLock) + { + Utils.ToJsonFile(config, Utils.GetPath(configRes)); + } } #endregion @@ -353,7 +357,7 @@ namespace v2rayN.Handler /// /// /// - public static int MoveServer(ref Config config, ref List lstVmess, int index, EMove eMove) + public static int MoveServer(ref Config config, ref List lstVmess, int index, EMove eMove, int pos = -1) { int count = lstVmess.Count; if (index < 0 || index > lstVmess.Count - 1) @@ -409,6 +413,9 @@ namespace v2rayN.Handler break; } + case EMove.Position: + lstVmess[index].sort = pos * 10 + 1; + break; } ToJsonFile(config); @@ -1258,7 +1265,7 @@ namespace v2rayN.Handler /// /// /// - public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove) + public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove, int pos = -1) { int count = routingItem.rules.Count; if (index < 0 || index > routingItem.rules.Count - 1) @@ -1316,6 +1323,14 @@ namespace v2rayN.Handler break; } + case EMove.Position: + { + var removeItem = routingItem.rules[index]; + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.Insert(pos, item); + routingItem.rules.Remove(removeItem); + break; + } } return 0; diff --git a/v2rayN/v2rayN/Mode/EMove.cs b/v2rayN/v2rayN/Mode/EMove.cs index 7f67d5b1..892a6ab3 100644 --- a/v2rayN/v2rayN/Mode/EMove.cs +++ b/v2rayN/v2rayN/Mode/EMove.cs @@ -6,6 +6,7 @@ namespace v2rayN.Mode Top = 1, Up = 2, Down = 3, - Bottom = 4 + Bottom = 4, + Position = 5 } } From 4d16a5e8013d2e344122beb528ed49667eca3ac1 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 24 Mar 2022 19:09:15 +0800 Subject: [PATCH 137/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 6365aee4..ad8bc328 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.6")] +[assembly: AssemblyFileVersion("5.7")] From ece45720581cd7e27c37b1d9e2b3927d1d12d0c3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 28 Mar 2022 18:54:05 +0800 Subject: [PATCH 138/252] Refactor and improve --- v2rayN/v2rayN/Forms/MainForm.cs | 6 +-- v2rayN/v2rayN/Handler/LazyConfig.cs | 41 +++++++++++++++ v2rayN/v2rayN/Handler/UpdateHandle.cs | 26 +++++----- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 1 + v2rayN/v2rayN/Handler/V2rayHandler.cs | 56 +++++++-------------- v2rayN/v2rayN/Mode/CoreInfo.cs | 17 +++++++ v2rayN/v2rayN/Mode/ECoreType.cs | 3 +- v2rayN/v2rayN/v2rayN.csproj | 1 + 8 files changed, 95 insertions(+), 56 deletions(-) create mode 100644 v2rayN/v2rayN/Mode/CoreInfo.cs diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 5ec3cdc4..2d8b22d3 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1392,15 +1392,15 @@ namespace v2rayN.Forms private void tsbCheckUpdateCore_Click(object sender, EventArgs e) { - CheckUpdateCore("v2fly"); + CheckUpdateCore(ECoreType.v2fly); } private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e) { - CheckUpdateCore("xray"); + CheckUpdateCore(ECoreType.Xray); } - private void CheckUpdateCore(string type) + private void CheckUpdateCore(ECoreType type) { void _updateUI(bool success, string msg) { diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index d1be5442..9303a1af 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -9,6 +9,7 @@ namespace v2rayN.Handler { private static readonly Lazy _instance = new Lazy(() => new LazyConfig()); private Config _config; + private List coreInfos; public static LazyConfig Instance { @@ -51,5 +52,45 @@ namespace v2rayN.Handler } return item.coreType; } + + public CoreInfo GetCoreInfo(ECoreType coreType) + { + if (coreInfos == null) + { + InitCoreInfo(); + } + return coreInfos.Where(t => t.coreType == coreType).FirstOrDefault(); + } + + private void InitCoreInfo() + { + coreInfos = new List(); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.v2fly, + coreExes = new List { "wv2ray", "v2ray" }, + arguments = "", + coreUrl = Global.v2flyCoreUrl + + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.Xray, + coreExes = new List { "xray" }, + arguments = "", + coreUrl = Global.xrayCoreUrl + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.clash, + coreExes = new List { "clash-windows-amd64", "clash-windows-386", "clash" }, + arguments = "-f config.json", + coreUrl = Global.clashCoreUrl + }); + } + } } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 62c795f4..1ab00e3b 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -104,11 +104,11 @@ namespace v2rayN.Handler } }; _updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); - CheckUpdateAsync("v2rayN"); + CheckUpdateAsync(ECoreType.v2rayN); } - public void CheckUpdateCore(string type, Config config, Action update) + public void CheckUpdateCore(ECoreType type, Config config, Action update) { _config = config; _updateFunc = update; @@ -292,7 +292,7 @@ namespace v2rayN.Handler #region private - private async void CheckUpdateAsync(string type) + private async void CheckUpdateAsync(ECoreType type) { try { @@ -310,15 +310,15 @@ namespace v2rayN.Handler HttpClient httpClient = new HttpClient(webRequestHandler); string url; - if (type == "v2fly") + if (type == ECoreType.v2fly) { url = v2flyCoreLatestUrl; } - else if (type == "xray") + else if (type == ECoreType.Xray) { url = xrayCoreLatestUrl; } - else if (type == "v2rayN") + else if (type == ECoreType.v2rayN) { url = nLatestUrl; } @@ -347,18 +347,18 @@ namespace v2rayN.Handler /// /// 获取V2RayCore版本 /// - private string getCoreVersion(string type) + private string getCoreVersion(ECoreType type) { try { var core = string.Empty; var match = string.Empty; - if (type == "v2fly") + if (type == ECoreType.v2fly) { core = "v2ray.exe"; match = "V2Ray"; } - else if (type == "xray") + else if (type == ECoreType.Xray) { core = "xray.exe"; match = "Xray"; @@ -392,7 +392,7 @@ namespace v2rayN.Handler return ""; } } - private void responseHandler(string type, string redirectUrl) + private void responseHandler(ECoreType type, string redirectUrl) { try { @@ -401,21 +401,21 @@ namespace v2rayN.Handler string curVersion; string message; string url; - if (type == "v2fly") + if (type == ECoreType.v2fly) { curVersion = "v" + getCoreVersion(type); message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; url = string.Format(v2flyCoreUrl, version, osBit); } - else if (type == "xray") + else if (type == ECoreType.Xray) { curVersion = "v" + getCoreVersion(type); message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; url = string.Format(xrayCoreUrl, version, osBit); } - else if (type == "v2rayN") + else if (type == ECoreType.v2rayN) { curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); message = string.Format(UIRes.I18N("IsLatestN"), curVersion); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 16762304..24887606 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -168,6 +168,7 @@ namespace v2rayN.Handler inbound2.protocol = Global.InboundHttp; inbound2.listen = inbound.listen; inbound2.settings.allowTransparent = false; + inbound2.sniffing.enabled = inbound.sniffing.enabled; } catch { diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index bb4e4435..e6796d34 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -21,9 +21,7 @@ namespace v2rayN.Handler class V2rayHandler { private static string v2rayConfigRes = Global.v2rayConfigFileName; - private List lstCore; - private string coreUrl; - private string coreArguments; + private CoreInfo coreInfo; public event ProcessDelegate ProcessEvent; //private int processId = 0; private Process _process; @@ -46,7 +44,11 @@ namespace v2rayN.Handler return; } - SetCore(config, item); + if (SetCore(config, item) != 0) + { + ShowMsg(false, UIRes.I18N("CheckServerSettings")); + return; + } string fileName = Utils.GetPath(v2rayConfigRes); if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) { @@ -106,7 +108,7 @@ namespace v2rayN.Handler } else { - foreach (string vName in lstCore) + foreach (string vName in coreInfo.coreExes) { Process[] existing = Process.GetProcessesByName(vName); foreach (Process p in existing) @@ -178,7 +180,7 @@ namespace v2rayN.Handler } if (Utils.IsNullOrEmpty(fileName)) { - string msg = string.Format(UIRes.I18N("NotFoundCore"), coreUrl); + string msg = string.Format(UIRes.I18N("NotFoundCore"), coreInfo.coreUrl); ShowMsg(false, msg); } return fileName; @@ -193,7 +195,7 @@ namespace v2rayN.Handler try { - string fileName = V2rayFindexe(lstCore); + string fileName = V2rayFindexe(coreInfo.coreExes); if (fileName == "") return; Process p = new Process @@ -201,7 +203,7 @@ namespace v2rayN.Handler StartInfo = new ProcessStartInfo { FileName = fileName, - Arguments = coreArguments, + Arguments = coreInfo.arguments, WorkingDirectory = Utils.StartupPath(), UseShellExecute = false, RedirectStandardOutput = true, @@ -247,7 +249,6 @@ namespace v2rayN.Handler try { - coreUrl = Global.xrayCoreUrl; string fileName = V2rayFindexe(new List { "xray" }); if (fileName == "") return -1; @@ -325,44 +326,21 @@ namespace v2rayN.Handler } } - private void SetCore(Config config, VmessItem item) + private int SetCore(Config config, VmessItem item) { if (item == null) { - return; + return -1; } var coreType = LazyConfig.Instance.GetCoreType(item, item.configType); - if (coreType == ECoreType.v2fly) + coreInfo = LazyConfig.Instance.GetCoreInfo(coreType); + + if (coreInfo == null) { - lstCore = new List - { - "wv2ray", - "v2ray" - }; - coreUrl = Global.v2flyCoreUrl; - coreArguments = string.Empty; - } - else if (coreType == ECoreType.Xray) - { - lstCore = new List - { - "xray" - }; - coreUrl = Global.xrayCoreUrl; - coreArguments = string.Empty; - } - else if (coreType == ECoreType.clash) - { - lstCore = new List - { - "clash-windows-amd64", - "clash-windows-386", - "clash" - }; - coreUrl = Global.clashCoreUrl; - coreArguments = "-f config.json"; + return -1; } + return 0; } } } diff --git a/v2rayN/v2rayN/Mode/CoreInfo.cs b/v2rayN/v2rayN/Mode/CoreInfo.cs new file mode 100644 index 00000000..2d66b121 --- /dev/null +++ b/v2rayN/v2rayN/Mode/CoreInfo.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + [Serializable] + public class CoreInfo + { + public ECoreType coreType { get; set; } + + public List coreExes { get; set; } + + public string arguments { get; set; } + + public string coreUrl { get; set; } + } +} diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index 390f008f..2448c96d 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -5,6 +5,7 @@ namespace v2rayN.Mode { v2fly = 1, Xray = 2, - clash = 3 + clash = 3, + v2rayN = 99 } } diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index a6623b5d..5499ccd2 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -208,6 +208,7 @@ + From 70feacd276d6fa77f22f0a74d06591cacb23e35b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 28 Mar 2022 19:08:54 +0800 Subject: [PATCH 139/252] Add hysteria support --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 1 + v2rayN/v2rayN/Global.cs | 3 ++- v2rayN/v2rayN/Handler/ConfigHandler.cs | 9 +++++++++ v2rayN/v2rayN/Handler/LazyConfig.cs | 8 ++++++++ v2rayN/v2rayN/Mode/ECoreType.cs | 3 ++- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index adc881a4..2f8821b5 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -19,6 +19,7 @@ namespace v2rayN.Forms { cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); cmbCoreType.Items.Add("clash"); + cmbCoreType.Items.Add("hysteria"); cmbCoreType.Items.Add(string.Empty); txtAddress.ReadOnly = true; diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 774ee12f..710649d8 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -15,8 +15,9 @@ namespace v2rayN public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases"; + public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases"; + - /// diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 8556eb2c..bc99a314 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -940,6 +940,15 @@ namespace v2rayN.Handler vmessItem.coreType = ECoreType.clash; vmessItem.address = fileName; vmessItem.remarks = "clash_custom"; + } + //Is Other configuration + else + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.address = fileName; + vmessItem.remarks = "other_custom"; } if (!Utils.IsNullOrEmpty(subid)) diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 9303a1af..ceccc7f3 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -90,6 +90,14 @@ namespace v2rayN.Handler arguments = "-f config.json", coreUrl = Global.clashCoreUrl }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.hysteria, + coreExes = new List { "hysteria-tun-windows-6.0-amd64", "hysteria-tun-windows-6.0-386", "hysteria" }, + arguments = "", + coreUrl = Global.hysteriaCoreUrl + }); } } diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index 2448c96d..be245303 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -5,7 +5,8 @@ namespace v2rayN.Mode { v2fly = 1, Xray = 2, - clash = 3, + clash = 11, + hysteria = 21, v2rayN = 99 } } From cdc83bc9d752c54c43be93a56f331f2dd79b547c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 28 Mar 2022 19:09:27 +0800 Subject: [PATCH 140/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index ad8bc328..11b97447 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.7")] +[assembly: AssemblyFileVersion("5.8")] From 645e6c4ec0d3a193015c05a7aab8e909cec884c5 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 28 Mar 2022 19:21:31 +0800 Subject: [PATCH 141/252] Update ConfigHandler.cs --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index bc99a314..b47a4359 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -747,6 +747,10 @@ namespace v2rayN.Handler { vmessItem.indexId = Utils.GetGUID(false); } + else if (vmessItem.indexId == config.indexId) + { + Global.reloadV2ray = true; + } if (!config.vmess.Exists(it => it.indexId == vmessItem.indexId)) { var maxSort = config.vmess.Any() ? config.vmess.Max(t => t.sort) : 0; @@ -755,11 +759,6 @@ namespace v2rayN.Handler config.vmess.Add(vmessItem); } - //if (config.vmess.Count == 1) - //{ - // config.indexId = config.vmess[0].indexId; - // Global.reloadV2ray = true; - //} return 0; } @@ -940,10 +939,10 @@ namespace v2rayN.Handler vmessItem.coreType = ECoreType.clash; vmessItem.address = fileName; vmessItem.remarks = "clash_custom"; - } + } //Is Other configuration else - { + { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt"); File.WriteAllText(fileName, clipboardData); From 82b6ee5ad256dad6ef9cfb57a2ce3ede5445316c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 31 Mar 2022 19:53:58 +0800 Subject: [PATCH 142/252] Refactor ResUI --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 15 +++-- v2rayN/v2rayN/Forms/AddServerForm.cs | 13 ++-- .../v2rayN/Forms/GlobalHotkeySettingForm.cs | 3 +- v2rayN/v2rayN/Forms/GroupSettingForm.cs | 3 +- v2rayN/v2rayN/Forms/MainForm.cs | 67 ++++++++++--------- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 21 +++--- .../Forms/RoutingRuleSettingDetailsForm.cs | 3 +- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 21 +++--- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 19 +++--- v2rayN/v2rayN/Forms/ServerTransportControl.cs | 27 ++++---- v2rayN/v2rayN/Forms/SubSettingForm.cs | 3 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 5 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 17 ++--- v2rayN/v2rayN/Handler/ShareHandler.cs | 15 +++-- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 5 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 45 +++++++------ v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 67 ++++++++++--------- v2rayN/v2rayN/Handler/V2rayHandler.cs | 11 +-- v2rayN/v2rayN/Tool/UIRes.cs | 26 ------- v2rayN/v2rayN/v2rayN.csproj | 1 - 20 files changed, 189 insertions(+), 198 deletions(-) delete mode 100644 v2rayN/v2rayN/Tool/UIRes.cs diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 2f8821b5..0d65b972 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -4,6 +4,7 @@ using System.IO; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -67,12 +68,12 @@ namespace v2rayN.Forms string remarks = txtRemarks.Text; if (Utils.IsNullOrEmpty(remarks)) { - UI.Show(UIRes.I18N("PleaseFillRemarks")); + UI.Show(ResUI.PleaseFillRemarks); return; } if (Utils.IsNullOrEmpty(txtAddress.Text)) { - UI.Show(UIRes.I18N("FillServerAddressCustom")); + UI.Show(ResUI.FillServerAddressCustom); return; } vmessItem.remarks = remarks; @@ -91,7 +92,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } @@ -109,7 +110,7 @@ namespace v2rayN.Forms private void btnBrowse_Click(object sender, EventArgs e) { - UI.Show(UIRes.I18N("CustomServerTips")); + UI.Show(ResUI.CustomServerTips); OpenFileDialog fileDialog = new OpenFileDialog { @@ -132,11 +133,11 @@ namespace v2rayN.Forms if (ConfigHandler.AddCustomServer(ref config, vmessItem, false) == 0) { BindingServer(); - UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); + UI.Show(ResUI.SuccessfullyImportedCustomServer); } else { - UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); + UI.ShowWarning(ResUI.FailedImportedCustomServer); } } @@ -145,7 +146,7 @@ namespace v2rayN.Forms var address = txtAddress.Text; if (Utils.IsNullOrEmpty(address)) { - UI.Show(UIRes.I18N("FillServerAddressCustom")); + UI.Show(ResUI.FillServerAddressCustom); return; } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index ef8a9d9c..8e731590 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -194,24 +195,24 @@ namespace v2rayN.Forms if (Utils.IsNullOrEmpty(address)) { - UI.Show(UIRes.I18N("FillServerAddress")); + UI.Show(ResUI.FillServerAddress); return; } if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) { - UI.Show(UIRes.I18N("FillCorrectServerPort")); + UI.Show(ResUI.FillCorrectServerPort); return; } if (eConfigType == EConfigType.Shadowsocks) { if (Utils.IsNullOrEmpty(id)) { - UI.Show(UIRes.I18N("FillPassword")); + UI.Show(ResUI.FillPassword); return; } if (Utils.IsNullOrEmpty(security)) { - UI.Show(UIRes.I18N("PleaseSelectEncryption")); + UI.Show(ResUI.PleaseSelectEncryption); return; } } @@ -219,7 +220,7 @@ namespace v2rayN.Forms { if (Utils.IsNullOrEmpty(id)) { - UI.Show(UIRes.I18N("FillUUID")); + UI.Show(ResUI.FillUUID); return; } } @@ -270,7 +271,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs index 66799af0..ce9ca023 100644 --- a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -104,7 +105,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs index 7856256c..6eabd74a 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingForm.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -73,7 +74,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 2d8b22d3..c5797a95 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -12,6 +12,7 @@ using v2rayN.Handler; using v2rayN.Mode; using v2rayN.Tool; using System.Linq; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -228,22 +229,22 @@ namespace v2rayN.Forms lvServers.RegisterDragEvent(UpdateDragEventHandler); 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"), 100); - lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 120); - lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 120); - lvServers.Columns.Add(UIRes.I18N("LvTLS"), 100); - lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 100); - lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 120, HorizontalAlignment.Right); + lvServers.Columns.Add(ResUI.LvServiceType, 80); + lvServers.Columns.Add(ResUI.LvAlias, 100); + lvServers.Columns.Add(ResUI.LvAddress, 120); + lvServers.Columns.Add(ResUI.LvPort, 100); + lvServers.Columns.Add(ResUI.LvEncryptionMethod, 120); + lvServers.Columns.Add(ResUI.LvTransportProtocol, 120); + lvServers.Columns.Add(ResUI.LvTLS, 100); + lvServers.Columns.Add(ResUI.LvSubscription, 100); + lvServers.Columns.Add(ResUI.LvTestResults, 120, 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.Columns.Add(ResUI.LvTodayDownloadDataAmount, 70); + lvServers.Columns.Add(ResUI.LvTodayUploadDataAmount, 70); + lvServers.Columns.Add(ResUI.LvTotalDownloadDataAmount, 70); + lvServers.Columns.Add(ResUI.LvTotalUploadDataAmount, 70); } lvServers.EndUpdate(); } @@ -485,7 +486,7 @@ namespace v2rayN.Forms { tabGroup.TabPages.Clear(); - string title = $" {UIRes.I18N("AllGroupServers")} "; + string title = $" {ResUI.AllGroupServers} "; var tabPage = new TabPage(title); tabPage.Name = ""; tabGroup.TabPages.Add(tabPage); @@ -727,7 +728,7 @@ namespace v2rayN.Forms { return; } - if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) + if (UI.ShowYesNo(ResUI.RemoveServer) == DialogResult.No) { return; } @@ -744,7 +745,7 @@ namespace v2rayN.Forms int newCount = ConfigHandler.DedupServerList(ref config, ref lstVmess); RefreshServers(); _ = LoadV2ray(); - UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); + UI.Show(string.Format(ResUI.RemoveDuplicateServerResult, oldCount, newCount)); } private void menuCopyServer_Click(object sender, EventArgs e) @@ -784,11 +785,11 @@ namespace v2rayN.Forms { //if (!config.sysAgentEnabled) //{ - // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + // UI.Show(ResUI.NeedHttpGlobalProxy")); // return; //} - //UI.Show(UIRes.I18N("SpeedServerTips")); + //UI.Show(ResUI.SpeedServerTips")); Speedtest(ESpeedActionType.Realping); } @@ -797,11 +798,11 @@ namespace v2rayN.Forms { //if (!config.sysAgentEnabled) //{ - // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + // UI.Show(ResUI.NeedHttpGlobalProxy")); // return; //} - //UI.Show(UIRes.I18N("SpeedServerTips")); + //UI.Show(ResUI.SpeedServerTips")); Speedtest(ESpeedActionType.Speedtest); } @@ -816,7 +817,7 @@ namespace v2rayN.Forms { SpeedtestHandler statistics = new SpeedtestHandler(ref config); string result = statistics.RunAvailabilityCheck() + "ms"; - AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); + AppendText(false, string.Format(ResUI.TestMeOutput, result)); } private void menuClearStatistic_Click(object sender, EventArgs e) @@ -857,8 +858,8 @@ namespace v2rayN.Forms if (sb.Length > 0) { Utils.SetClipboardData(sb.ToString()); - AppendText(false, UIRes.I18N("BatchExportURLSuccessfully")); - //UI.Show(UIRes.I18N("BatchExportURLSuccessfully")); + AppendText(false, ResUI.BatchExportURLSuccessfully); + //UI.Show(ResUI.BatchExportURLSuccessfully")); } } @@ -880,7 +881,7 @@ namespace v2rayN.Forms if (sb.Length > 0) { Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); - UI.Show(UIRes.I18N("BatchExportSubscriptionSuccessfully")); + UI.Show(ResUI.BatchExportSubscriptionSuccessfully); } } @@ -950,7 +951,7 @@ namespace v2rayN.Forms { if (index < 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); + UI.Show(ResUI.PleaseSelectServer); return -1; } if (ConfigHandler.SetDefaultServer(ref config, lstVmess[index]) == 0) @@ -973,7 +974,7 @@ namespace v2rayN.Forms { if (lvServers.SelectedIndices.Count <= 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); + UI.Show(ResUI.PleaseSelectServer); return index; } @@ -1020,7 +1021,7 @@ namespace v2rayN.Forms if (ret > 0) { RefreshServers(); - UI.Show(string.Format(UIRes.I18N("SuccessfullyImportedServerViaClipboard"), ret)); + UI.Show(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret)); } } @@ -1042,7 +1043,7 @@ namespace v2rayN.Forms if (Utils.IsNullOrEmpty(result)) { - UI.ShowWarning(UIRes.I18N("NoValidQRcodeFound")); + UI.ShowWarning(ResUI.NoValidQRcodeFound); } else { @@ -1050,7 +1051,7 @@ namespace v2rayN.Forms if (ret > 0) { RefreshServers(); - UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); + UI.Show(ResUI.SuccessfullyImportedServerViaScan); } } } @@ -1316,7 +1317,7 @@ namespace v2rayN.Forms int index = GetLvSelectedIndex(); if (index < 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); + UI.Show(ResUI.PleaseSelectServer); return; } if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, eMove) == 0) @@ -1412,12 +1413,12 @@ namespace v2rayN.Forms string fileName = Utils.GetPath(Utils.GetDownloadFileName(msg)); FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : ""); - AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); + AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); Global.reloadV2ray = true; _ = LoadV2ray(); - AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); + AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfully); } }; (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); @@ -1659,7 +1660,7 @@ namespace v2rayN.Forms if (fm.ShowDialog() == DialogResult.OK) { MsgFilter = fm.MsgFilter; - gbMsgTitle.Text = string.Format(UIRes.I18N("MsgInformationTitle"), MsgFilter); + gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, MsgFilter); } } #endregion diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 6268daf7..fc53d7f9 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -5,6 +5,7 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -101,9 +102,9 @@ namespace v2rayN.Forms 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")}, - new ComboItem{ID = (int)Global.StatisticsFreshRate.slow, Text = UIRes.I18N("SlowFresh")}, + new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = ResUI.QuickFresh}, + new ComboItem{ID = (int)Global.StatisticsFreshRate.medium, Text = ResUI.MediumFresh}, + new ComboItem{ID = (int)Global.StatisticsFreshRate.slow, Text = ResUI.SlowFresh}, }; cbFreshrate.DataSource = cbSource; @@ -187,7 +188,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } @@ -211,12 +212,12 @@ namespace v2rayN.Forms bool sniffingEnabled = chksniffingEnabled.Checked; if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort)) { - UI.Show(UIRes.I18N("FillLocalListeningPort")); + UI.Show(ResUI.FillLocalListeningPort); return -1; } if (Utils.IsNullOrEmpty(protocol)) { - UI.Show(UIRes.I18N("PleaseSelectProtocol")); + UI.Show(ResUI.PleaseSelectProtocol); return -1; } @@ -229,7 +230,7 @@ namespace v2rayN.Forms { if (remoteDNS.Contains("{") || remoteDNS.Contains("}")) { - UI.Show(UIRes.I18N("FillCorrectDNSText")); + UI.Show(ResUI.FillCorrectDNSText); return -1; } } @@ -248,12 +249,12 @@ namespace v2rayN.Forms { if (Utils.IsNullOrEmpty(localPort2) || !Utils.IsNumberic(localPort2)) { - UI.Show(UIRes.I18N("FillLocalListeningPort")); + UI.Show(ResUI.FillLocalListeningPort); return -1; } if (Utils.IsNullOrEmpty(protocol2)) { - UI.Show(UIRes.I18N("PleaseSelectProtocol")); + UI.Show(ResUI.PleaseSelectProtocol); return -1; } if (config.inbound.Count < 2) @@ -312,7 +313,7 @@ namespace v2rayN.Forms || Utils.IsNullOrEmpty(readBufferSize) || !Utils.IsNumberic(readBufferSize) || Utils.IsNullOrEmpty(writeBufferSize) || !Utils.IsNumberic(writeBufferSize)) { - UI.Show(UIRes.I18N("FillKcpParameters")); + UI.Show(ResUI.FillKcpParameters); return -1; } config.kcpItem.mtu = Utils.ToInt(mtu); diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index a08e872b..1d269af7 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -125,7 +126,7 @@ namespace v2rayN.Forms } if (!hasRule) { - UI.ShowWarning(string.Format(UIRes.I18N("RoutingRuleDetailRequiredTips"), "Port/Protocol/Domain/IP")); + UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP")); return; } this.DialogResult = DialogResult.OK; diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index 3ae9359f..4db5d2fe 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -114,7 +115,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } @@ -154,7 +155,7 @@ namespace v2rayN.Forms { if (lvRoutings.SelectedIndices.Count <= 0) { - UI.Show(UIRes.I18N("PleaseSelectRules")); + UI.Show(ResUI.PleaseSelectRules); return index; } @@ -198,7 +199,7 @@ namespace v2rayN.Forms int index = GetLvSelectedIndex(); if (index < 0) { - UI.Show(UIRes.I18N("PleaseSelectRules")); + UI.Show(ResUI.PleaseSelectRules); return; } if (ConfigHandler.MoveRoutingRule(ref routingItem, index, eMove) == 0) @@ -232,7 +233,7 @@ namespace v2rayN.Forms { return; } - if (UI.ShowYesNo(UIRes.I18N("RemoveRules")) == DialogResult.No) + if (UI.ShowYesNo(ResUI.RemoveRules) == DialogResult.No) { return; } @@ -253,7 +254,7 @@ namespace v2rayN.Forms if (lst.Count > 0) { Utils.SetClipboardData(Utils.ToJson(lst)); - //UI.Show(UIRes.I18N("OperationSuccess")); + //UI.Show(ResUI.OperationSuccess")); } } @@ -323,7 +324,7 @@ namespace v2rayN.Forms if (AddBatchRoutingRules(ref routingItem, result) == 0) { RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); + UI.Show(ResUI.OperationSuccess); } } @@ -333,7 +334,7 @@ namespace v2rayN.Forms if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0) { RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); + UI.Show(ResUI.OperationSuccess); } } private void menuImportRulesFromUrl_Click(object sender, EventArgs e) @@ -341,7 +342,7 @@ namespace v2rayN.Forms var url = txtUrl.Text.Trim(); if (Utils.IsNullOrEmpty(url)) { - UI.Show(UIRes.I18N("MsgNeedUrl")); + UI.Show(ResUI.MsgNeedUrl); return; } DownloadHandle downloadHandle = new DownloadHandle(); @@ -349,13 +350,13 @@ namespace v2rayN.Forms if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0) { RefreshRoutingsView(); - UI.Show(UIRes.I18N("OperationSuccess")); + UI.Show(ResUI.OperationSuccess); } } private int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) { bool blReplace = false; - if (UI.ShowYesNo(UIRes.I18N("AddBatchRoutingRulesYesNo")) == DialogResult.No) + if (UI.ShowYesNo(ResUI.AddBatchRoutingRulesYesNo) == DialogResult.No) { blReplace = true; } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index b1c6755a..b8f21dd7 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -61,7 +62,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } @@ -144,10 +145,10 @@ namespace v2rayN.Forms lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; lvRoutings.Columns.Add("", 30); - lvRoutings.Columns.Add(UIRes.I18N("LvAlias"), 200); - lvRoutings.Columns.Add(UIRes.I18N("LvCount"), 60); - lvRoutings.Columns.Add(UIRes.I18N("LvUrl"), 240); - lvRoutings.Columns.Add(UIRes.I18N("LvCustomIcon"), 240); + lvRoutings.Columns.Add(ResUI.LvAlias, 200); + lvRoutings.Columns.Add(ResUI.LvCount, 60); + lvRoutings.Columns.Add(ResUI.LvUrl, 240); + lvRoutings.Columns.Add(ResUI.LvCustomIcon, 240); lvRoutings.EndUpdate(); } @@ -211,7 +212,7 @@ namespace v2rayN.Forms { if (lvRoutings.SelectedIndices.Count <= 0) { - UI.Show(UIRes.I18N("PleaseSelectRules")); + UI.Show(ResUI.PleaseSelectRules); return index; } @@ -259,7 +260,7 @@ namespace v2rayN.Forms { return; } - if (UI.ShowYesNo(UIRes.I18N("RemoveRules")) == DialogResult.No) + if (UI.ShowYesNo(ResUI.RemoveRules) == DialogResult.No) { return; } @@ -282,7 +283,7 @@ namespace v2rayN.Forms { if (index < 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); + UI.Show(ResUI.PleaseSelectServer); return -1; } if (ConfigHandler.SetDefaultRouting(ref config, index) == 0) @@ -301,7 +302,7 @@ namespace v2rayN.Forms txtBlockDomain.Text = "geosite:category-ads-all"; - UI.Show(UIRes.I18N("OperationSuccess")); + UI.Show(ResUI.OperationSuccess); } private void menuImportAdvancedRules_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs index dc4da30b..3b29ddd4 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -156,34 +157,34 @@ namespace v2rayN.Forms if (network.Equals(Global.DefaultNetwork)) { - tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip1"); - tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip1"); + tipRequestHost.Text = ResUI.TransportRequestHostTip1; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip1; } else if (network.Equals("kcp")) { - tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip2"); - tipPath.Text = UIRes.I18N("TransportPathTip5"); + tipHeaderType.Text = ResUI.TransportHeaderTypeTip2; + tipPath.Text = ResUI.TransportPathTip5; } else if (network.Equals("ws")) { - tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip2"); - tipPath.Text = UIRes.I18N("TransportPathTip1"); + tipRequestHost.Text = ResUI.TransportRequestHostTip2; + tipPath.Text = ResUI.TransportPathTip1; } else if (network.Equals("h2")) { - tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip3"); - tipPath.Text = UIRes.I18N("TransportPathTip2"); + tipRequestHost.Text = ResUI.TransportRequestHostTip3; + tipPath.Text = ResUI.TransportPathTip2; } else if (network.Equals("quic")) { - tipRequestHost.Text = UIRes.I18N("TransportRequestHostTip4"); - tipPath.Text = UIRes.I18N("TransportPathTip3"); - tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip3"); + tipRequestHost.Text = ResUI.TransportRequestHostTip4; + tipPath.Text = ResUI.TransportPathTip3; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip3; } else if (network.Equals("grpc")) { - tipPath.Text = UIRes.I18N("TransportPathTip4"); - tipHeaderType.Text = UIRes.I18N("TransportHeaderTypeTip4"); + tipPath.Text = ResUI.TransportPathTip4; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip4; labHeaderType.Visible = false; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index e7ba4dd3..ac8266e2 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -74,7 +75,7 @@ namespace v2rayN.Forms } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 0bc47214..5b84224f 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -3,6 +3,7 @@ using System.IO; using System.Net; using System.Text; using v2rayN.Base; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -39,7 +40,7 @@ namespace v2rayN.Handler try { Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); - UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); progressPercentage = -1; totalBytesToReceive = 0; @@ -215,7 +216,7 @@ namespace v2rayN.Handler try { Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); - UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); progressPercentage = -1; totalBytesToReceive = 0; diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index c7dc4337..b30cf274 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Mode; using System.Linq; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -88,7 +89,7 @@ namespace v2rayN.Handler if (item.configType != EConfigType.Vmess && item.configType != EConfigType.VLESS) { - UI.Show(UIRes.I18N("NonVmessService")); + UI.Show(ResUI.NonVmessService); return; } @@ -115,7 +116,7 @@ namespace v2rayN.Handler } else { - UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(ResUI.SaveClientConfigurationIn, fileName)); } } @@ -128,7 +129,7 @@ namespace v2rayN.Handler if (item.configType != EConfigType.Vmess && item.configType != EConfigType.VLESS) { - UI.Show(UIRes.I18N("NonVmessService")); + UI.Show(ResUI.NonVmessService); return; } @@ -155,7 +156,7 @@ namespace v2rayN.Handler } else { - UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(ResUI.SaveServerConfigurationIn, fileName)); } } @@ -191,11 +192,11 @@ namespace v2rayN.Handler if (ret == 0) { - UI.Show(UIRes.I18N("OperationSuccess")); + UI.Show(ResUI.OperationSuccess); } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } } @@ -268,12 +269,12 @@ namespace v2rayN.Handler try { HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), keys, handler); - var msg = string.Format(UIRes.I18N("RegisterGlobalHotkeySuccessfully"), $"{item.eGlobalHotkey.ToString()} = {keys}"); + var msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{item.eGlobalHotkey.ToString()} = {keys}"); update(false, msg); } catch (Exception ex) { - var msg = string.Format(UIRes.I18N("RegisterGlobalHotkeyFailed"), $"{item.eGlobalHotkey.ToString()} = {keys}", ex.Message); + var msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{item.eGlobalHotkey.ToString()} = {keys}", ex.Message); update(false, msg); Utils.SaveLog(msg); } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index fb755af5..56746da7 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Web; using v2rayN.Base; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -318,7 +319,7 @@ namespace v2rayN.Handler string result = clipboardData.TrimEx();// Utils.GetClipboardData(); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedReadConfiguration"); + msg = ResUI.FailedReadConfiguration; return null; } @@ -338,7 +339,7 @@ namespace v2rayN.Handler } else if (result.StartsWith(Global.ssProtocol)) { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); + msg = ResUI.ConfigurationFormatIncorrect; vmessItem = ResolveSSLegacy(result); if (vmessItem == null) @@ -358,7 +359,7 @@ namespace v2rayN.Handler } else if (result.StartsWith(Global.socksProtocol)) { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); + msg = ResUI.ConfigurationFormatIncorrect; vmessItem = ResolveSocksNew(result); if (vmessItem == null) @@ -378,7 +379,7 @@ namespace v2rayN.Handler } else if (result.StartsWith(Global.trojanProtocol)) { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); + msg = ResUI.ConfigurationFormatIncorrect; vmessItem = ResolveTrojan(result); } @@ -390,13 +391,13 @@ namespace v2rayN.Handler } else { - msg = UIRes.I18N("NonvmessOrssProtocol"); + msg = ResUI.NonvmessOrssProtocol; return null; } } catch { - msg = UIRes.I18N("Incorrectconfiguration"); + msg = ResUI.Incorrectconfiguration; return null; } @@ -416,7 +417,7 @@ namespace v2rayN.Handler VmessQRCode vmessQRCode = Utils.FromJson(result); if (vmessQRCode == null) { - msg = UIRes.I18N("FailedConversionConfiguration"); + msg = ResUI.FailedConversionConfiguration; return null; } diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index df0eee21..1b299216 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -6,6 +6,7 @@ using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -117,7 +118,7 @@ namespace v2rayN.Handler pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0].indexId, UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].indexId, ResUI.OperationFailed); return; } @@ -203,7 +204,7 @@ namespace v2rayN.Handler pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0].indexId, UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].indexId, ResUI.OperationFailed); return; } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 1ab00e3b..894a6acf 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -8,6 +8,7 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using v2rayN.Base; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -53,7 +54,7 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + _updateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully); try { @@ -93,7 +94,7 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayN")); + _updateFunc(false, string.Format(ResUI.MsgParsingSuccessfully, "v2rayN")); url = args.Msg; askToDownload(downloadHandle, url, true); @@ -103,7 +104,7 @@ namespace v2rayN.Handler _updateFunc(false, args.Msg); } }; - _updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); + _updateFunc(false, string.Format(ResUI.MsgStartUpdating, "v2rayN")); CheckUpdateAsync(ECoreType.v2rayN); } @@ -122,8 +123,8 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); - _updateFunc(false, UIRes.I18N("MsgUnpacking")); + _updateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully); + _updateFunc(false, ResUI.MsgUnpacking); try { @@ -149,7 +150,7 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "Core")); + _updateFunc(false, string.Format(ResUI.MsgParsingSuccessfully, "Core")); url = args.Msg; askToDownload(downloadHandle, url, true); } @@ -158,7 +159,7 @@ namespace v2rayN.Handler _updateFunc(false, args.Msg); } }; - _updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "Core")); + _updateFunc(false, string.Format(ResUI.MsgStartUpdating, "Core")); CheckUpdateAsync(type); } @@ -168,11 +169,11 @@ namespace v2rayN.Handler _config = config; _updateFunc = update; - _updateFunc(false, UIRes.I18N("MsgUpdateSubscriptionStart")); + _updateFunc(false, ResUI.MsgUpdateSubscriptionStart); if (config.subItem == null || config.subItem.Count <= 0) { - _updateFunc(false, UIRes.I18N("MsgNoValidSubscription")); + _updateFunc(false, ResUI.MsgNoValidSubscription); return; } @@ -189,7 +190,7 @@ namespace v2rayN.Handler } if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) { - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); + _updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); continue; } @@ -198,17 +199,17 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); //string result = Utils.Base64Decode(args.Msg); string result = args.Msg; if (Utils.IsNullOrEmpty(result)) { - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); + _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); return; } //ConfigHandler.RemoveServerViaSubid(ref config, id); - //_updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + //_updateFunc(false, $"{hashCode}{ResUI.MsgClearSubscription")}"); // RefreshServers(); int ret = ConfigHandler.AddBatchServers(ref config, result, id, groupId); if (ret > 0) @@ -217,9 +218,9 @@ namespace v2rayN.Handler } else { - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); + _updateFunc(false, $"{hashCode}{ResUI.MsgFailedImportSubscription}"); } - _updateFunc(true, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); + _updateFunc(true, $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}"); } else { @@ -234,7 +235,7 @@ namespace v2rayN.Handler WebProxy webProxy = blProxy ? new WebProxy(Global.Loopback, _config.GetLocalPort(Global.InboundHttp)) : null; downloadHandle3.WebDownloadString(url, webProxy, userAgent); - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); + _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); } } @@ -255,7 +256,7 @@ namespace v2rayN.Handler { if (args.Success) { - _updateFunc(false, string.Format(UIRes.I18N("MsgDownloadGeoFileSuccessfully"), geoName)); + _updateFunc(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, geoName)); try { @@ -366,7 +367,7 @@ namespace v2rayN.Handler string filePath = Utils.GetPath(core); if (!File.Exists(filePath)) { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @""); + string msg = string.Format(ResUI.NotFoundCore, @""); //ShowMsg(true, msg); return ""; } @@ -404,21 +405,21 @@ namespace v2rayN.Handler if (type == ECoreType.v2fly) { curVersion = "v" + getCoreVersion(type); - message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + message = string.Format(ResUI.IsLatestCore, curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; url = string.Format(v2flyCoreUrl, version, osBit); } else if (type == ECoreType.Xray) { curVersion = "v" + getCoreVersion(type); - message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + message = string.Format(ResUI.IsLatestCore, curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; url = string.Format(xrayCoreUrl, version, osBit); } else if (type == ECoreType.v2rayN) { curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); - message = string.Format(UIRes.I18N("IsLatestN"), curVersion); + message = string.Format(ResUI.IsLatestN, curVersion); url = string.Format(nUrl, version); } else @@ -446,7 +447,7 @@ namespace v2rayN.Handler bool blDownload = false; if (blAsk) { - if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) + if (UI.ShowYesNo(string.Format(ResUI.DownloadYesNo, url)) == DialogResult.Yes) { blDownload = true; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 24887606..ca31c4ec 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -6,6 +6,7 @@ using System.Net; using System.Net.NetworkInformation; using v2rayN.Base; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -32,11 +33,11 @@ namespace v2rayN.Handler { if (node == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return -1; } - msg = UIRes.I18N("InitialConfiguration"); + msg = ResUI.InitialConfiguration; if (node.configType == EConfigType.Custom) { return GenerateClientCustomConfig(node, fileName, out msg); @@ -46,7 +47,7 @@ namespace v2rayN.Handler string result = Utils.GetEmbedText(SampleClient); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedGetDefaultConfiguration"); + msg = ResUI.FailedGetDefaultConfiguration; return -1; } @@ -54,7 +55,7 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } @@ -80,11 +81,11 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{config.GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); + msg = string.Format(ResUI.SuccessfulConfiguration, $"[{config.GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } catch { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } return 0; @@ -901,7 +902,7 @@ namespace v2rayN.Handler //检查GUI设置 if (node == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return -1; } @@ -917,7 +918,7 @@ namespace v2rayN.Handler } if (!File.Exists(addressFileName)) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } File.Copy(addressFileName, fileName); @@ -925,7 +926,7 @@ namespace v2rayN.Handler //check again if (!File.Exists(fileName)) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } @@ -944,12 +945,12 @@ namespace v2rayN.Handler } File.WriteAllLines(fileName, fileContent); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); + msg = string.Format(ResUI.SuccessfulConfiguration, $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } catch (Exception ex) { Utils.SaveLog("GenerateClientCustomConfig", ex); - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } return 0; @@ -973,17 +974,17 @@ namespace v2rayN.Handler //检查GUI设置 if (node == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return -1; } - msg = UIRes.I18N("InitialConfiguration"); + msg = ResUI.InitialConfiguration; //取得默认配置 string result = Utils.GetEmbedText(SampleServer); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedGetDefaultConfiguration"); + msg = ResUI.FailedGetDefaultConfiguration; return -1; } @@ -991,7 +992,7 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } @@ -1008,11 +1009,11 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.GetSummary()); + msg = string.Format(ResUI.SuccessfulConfiguration, node.GetSummary()); } catch { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } return 0; @@ -1110,7 +1111,7 @@ namespace v2rayN.Handler string result = Utils.LoadResource(fileName); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedReadConfiguration"); + msg = ResUI.FailedReadConfiguration; return null; } @@ -1118,14 +1119,14 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedConversionConfiguration"); + msg = ResUI.FailedConversionConfiguration; return null; } if (v2rayConfig.outbounds == null || v2rayConfig.outbounds.Count <= 0) { - msg = UIRes.I18N("IncorrectClientConfiguration"); + msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1139,7 +1140,7 @@ namespace v2rayN.Handler || outbound.settings.vnext[0].users == null || outbound.settings.vnext[0].users.Count <= 0) { - msg = UIRes.I18N("IncorrectClientConfiguration"); + msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1232,7 +1233,7 @@ namespace v2rayN.Handler } catch { - msg = UIRes.I18N("IncorrectClientConfiguration"); + msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1256,7 +1257,7 @@ namespace v2rayN.Handler string result = Utils.LoadResource(fileName); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedReadConfiguration"); + msg = ResUI.FailedReadConfiguration; return null; } @@ -1264,14 +1265,14 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedConversionConfiguration"); + msg = ResUI.FailedConversionConfiguration; return null; } if (v2rayConfig.inbounds == null || v2rayConfig.inbounds.Count <= 0) { - msg = UIRes.I18N("IncorrectServerConfiguration"); + msg = ResUI.IncorrectServerConfiguration; return null; } @@ -1283,7 +1284,7 @@ namespace v2rayN.Handler || inbound.settings.clients == null || inbound.settings.clients.Count <= 0) { - msg = UIRes.I18N("IncorrectServerConfiguration"); + msg = ResUI.IncorrectServerConfiguration; return null; } @@ -1377,7 +1378,7 @@ namespace v2rayN.Handler } catch { - msg = UIRes.I18N("IncorrectClientConfiguration"); + msg = ResUI.IncorrectClientConfiguration; return null; } return vmessItem; @@ -1418,25 +1419,25 @@ namespace v2rayN.Handler { if (config == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return ""; } - msg = UIRes.I18N("InitialConfiguration"); + msg = ResUI.InitialConfiguration; Config configCopy = Utils.DeepCopy(config); string result = Utils.GetEmbedText(SampleClient); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedGetDefaultConfiguration"); + msg = ResUI.FailedGetDefaultConfiguration; return ""; } V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return ""; } List lstIpEndPoints = null; @@ -1517,12 +1518,12 @@ namespace v2rayN.Handler v2rayConfig.routing.rules.Add(rule); } - //msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.getSummary()); + //msg = string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); return Utils.ToJson(v2rayConfig); } catch { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return ""; } } diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index e6796d34..ba7dfb09 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.IO; using System.Text; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -40,13 +41,13 @@ namespace v2rayN.Handler var item = ConfigHandler.GetDefaultServer(ref config); if (item == null) { - ShowMsg(false, UIRes.I18N("CheckServerSettings")); + ShowMsg(false, ResUI.CheckServerSettings); return; } if (SetCore(config, item) != 0) { - ShowMsg(false, UIRes.I18N("CheckServerSettings")); + ShowMsg(false, ResUI.CheckServerSettings); return; } string fileName = Utils.GetPath(v2rayConfigRes); @@ -180,7 +181,7 @@ namespace v2rayN.Handler } if (Utils.IsNullOrEmpty(fileName)) { - string msg = string.Format(UIRes.I18N("NotFoundCore"), coreInfo.coreUrl); + string msg = string.Format(ResUI.NotFoundCore, coreInfo.coreUrl); ShowMsg(false, msg); } return fileName; @@ -191,7 +192,7 @@ namespace v2rayN.Handler /// private void V2rayStart() { - ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString())); try { @@ -245,7 +246,7 @@ namespace v2rayN.Handler /// private int V2rayStartNew(string configStr) { - ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString())); try { diff --git a/v2rayN/v2rayN/Tool/UIRes.cs b/v2rayN/v2rayN/Tool/UIRes.cs deleted file mode 100644 index f0660435..00000000 --- a/v2rayN/v2rayN/Tool/UIRes.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using System.Reflection; -using System.Resources; - -namespace v2rayN -{ - public class UIRes - { - static ResourceManager res = new ResourceManager("v2rayN.Resx.ResUI", Assembly.GetExecutingAssembly()); - - static string LoadString(ResourceManager resMgr, string key) - { - string value = resMgr.GetString(key); - if (value == null) - { - throw new KeyNotFoundException($"key: {key}"); - } - return value; - } - - public static string I18N(string key) - { - return LoadString(res, key); - } - } -} diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 5499ccd2..403a5db0 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -262,7 +262,6 @@ - From 354fc618b0cc78cc06184337cf6bb22cabc317dc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 31 Mar 2022 20:19:15 +0800 Subject: [PATCH 143/252] fix encode issue --- v2rayN/v2rayN/Handler/ShareHandler.cs | 12 ++++++------ v2rayN/v2rayN/Tool/Utils.cs | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 56746da7..9550729a 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -508,7 +508,7 @@ namespace v2rayN.Handler i.address = u.IdnHost; i.port = u.Port; - i.remarks = Utils.UrlDecode(u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)); + i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); var q = HttpUtility.ParseQueryString(u.Query); var m = StdVmessUserInfo.Match(u.UserInfo); @@ -590,13 +590,13 @@ namespace v2rayN.Handler } VmessItem server = new VmessItem { - remarks = Utils.UrlDecode(parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)), + 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 rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.UriEscaped); string userInfo = Utils.Base64Decode(rawUserInfo); string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); if (userInfoParts.Length != 2) @@ -712,7 +712,7 @@ namespace v2rayN.Handler } VmessItem server = new VmessItem { - remarks = Utils.UrlDecode(parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)), + remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), address = parsedUrl.IdnHost, port = parsedUrl.Port, }; @@ -741,7 +741,7 @@ namespace v2rayN.Handler item.address = url.IdnHost; item.port = url.Port; - item.remarks = Utils.UrlDecode(url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)); + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); item.id = url.UserInfo; var query = HttpUtility.ParseQueryString(url.Query); @@ -761,7 +761,7 @@ namespace v2rayN.Handler item.address = url.IdnHost; item.port = url.Port; - item.remarks = Utils.UrlDecode(url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped)); + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); item.id = url.UserInfo; var query = HttpUtility.ParseQueryString(url.Query); diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 49384694..52a183ee 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -370,7 +370,8 @@ namespace v2rayN public static string UrlEncode(string url) { - return HttpUtility.UrlEncode(url); + return Uri.EscapeDataString(url); + //return HttpUtility.UrlEncode(url); } public static string UrlDecode(string url) { From fd4d7126880923e9fd834a2c2f1436d42f1381bd Mon Sep 17 00:00:00 2001 From: uniceguy Date: Fri, 1 Apr 2022 13:21:22 +0800 Subject: [PATCH 144/252] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=B7=AF=E7=94=B1=E4=BF=A1=E6=81=AF=E6=97=B6=E5=85=88?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=90=8E=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Forms/RoutingRuleSettingDetailsForm.cs | 4 ++-- v2rayN/v2rayN/Tool/Utils.cs | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index 1d269af7..38f683cd 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -48,8 +48,8 @@ namespace v2rayN.Forms } rulesItem.inboundTag = inboundTag; rulesItem.outboundTag = cmbOutboundTag.Text; - rulesItem.domain = Utils.String2List(txtDomain.Text); - rulesItem.ip = Utils.String2List(txtIP.Text); + rulesItem.domain = Utils.String2ListSorted(txtDomain.Text); + rulesItem.ip = Utils.String2ListSorted(txtIP.Text); var protocol = new List(); for (int i = 0; i < clbProtocol.Items.Count; i++) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 52a183ee..a3c11f79 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -219,6 +219,26 @@ namespace v2rayN } } + /// + /// 逗号分隔的字符串,先排序后转List + /// + /// + /// + public static List String2ListSorted(string str) + { + try + { + str = str.Replace(Environment.NewLine, ""); + List list = new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); + return list.OrderBy(x => x).ToList(); + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + return new List(); + } + } + /// /// Base64编码 /// From 0801c3db645adcc7406f2df9f83c130a8a17d08e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 1 Apr 2022 18:09:58 +0800 Subject: [PATCH 145/252] Refactor stat update --- v2rayN/v2rayN/Forms/MainForm.cs | 30 +++++++++++++++++++++++++- v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 ++ v2rayN/v2rayN/Mode/Config.cs | 6 ++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index c5797a95..0bcd9fea 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -150,12 +150,17 @@ namespace v2rayN.Forms { scMain.Panel2Collapsed = true; + if (!config.uiItem.mainLocation.IsEmpty) + { + this.Location = config.uiItem.mainLocation; + } 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); @@ -165,6 +170,8 @@ namespace v2rayN.Forms private void StorageUI() { + config.uiItem.mainLocation = this.Location; + config.uiItem.mainSize = new Size(this.Width, this.Height); for (int k = 0; k < lvServers.Columns.Count; k++) @@ -1253,7 +1260,28 @@ namespace v2rayN.Forms down /= (ulong)(config.statisticsFreshRate / 1000f); toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); - List datas = new List(); + foreach (var it in statistics) + { + int index = lstVmess.FindIndex(item => item.indexId == it.itemId); + if (index < 0) + { + continue; + } + lvServers.Invoke((MethodInvoker)delegate + { + lvServers.BeginUpdate(); + + lvServers.Items[index].SubItems["todayDown"].Text = Utils.HumanFy(it.todayDown); + lvServers.Items[index].SubItems["todayUp"].Text = Utils.HumanFy(it.todayUp); + lvServers.Items[index].SubItems["totalDown"].Text = Utils.HumanFy(it.totalDown); + lvServers.Items[index].SubItems["totalUp"].Text = Utils.HumanFy(it.totalUp); + + lvServers.EndUpdate(); + }); + } + + + for (int i = 0; i < lstVmess.Count; i++) { int index = statistics.FindIndex(item_ => item_.itemId == lstVmess[i].indexId); diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index b47a4359..f484daec 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1159,6 +1159,8 @@ namespace v2rayN.Handler { config.uiItem.mainLvColWidth.Add(name, width); } + + ToJsonFile(config); return 0; } public static int GetformMainLvColWidth(ref Config config, string name, int width) diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index f7b00755..596f96b9 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Base; using System.Linq; - +using System.Drawing; namespace v2rayN.Mode { @@ -692,7 +692,9 @@ namespace v2rayN.Mode get; set; } - public System.Drawing.Size mainSize + public Point mainLocation { get; set; } + + public Size mainSize { get; set; } From 606da79372518c43e3d807d2bc6308118450f730 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 1 Apr 2022 18:10:48 +0800 Subject: [PATCH 146/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 11b97447..f1625448 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.8")] +[assembly: AssemblyFileVersion("5.9")] From cb462ab944e99962acb98cbd92b16de9f7a7efb0 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 1 Apr 2022 19:27:44 +0800 Subject: [PATCH 147/252] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fab1f55a..3bae8c6b 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,6 @@ A V2Ray client for Windows, support [Xray core](https://github.com/XTLS/Xray-cor - Run v2rayN.exe ### Requirements -- Microsoft [.NET Framework 4.8](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) +- Microsoft [.NET Framework 4.8](https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/thank-you/net48-web-installer) - v2fly core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) - Xray core [https://github.com/XTLS/Xray-core/releases](https://github.com/XTLS/Xray-core/releases) From 372ee346dc1f95b24e3e3be587b038734a177fd9 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 1 Apr 2022 19:33:31 +0800 Subject: [PATCH 148/252] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3bae8c6b..1856b4d8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ # v2rayN A V2Ray client for Windows, support [Xray core](https://github.com/XTLS/Xray-core) and [v2fly core](https://github.com/v2fly/v2ray-core) + +[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/2dust/v2rayN)](https://github.com/2dust/v2rayN/commits/master) +[![CodeFactor](https://www.codefactor.io/repository/github/2dust/v2rayn/badge)](https://www.codefactor.io/repository/github/2dust/v2rayn) +[![GitHub Releases](https://img.shields.io/github/downloads/2dust/v2rayN/latest/total?logo=github)](https://github.com/2dust/v2rayN/releases) +[![Chat on Telegram](https://img.shields.io/badge/Chat%20on-Telegram-brightgreen.svg)](https://t.me/v2rayn) + ### How to use - 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) From 0d315f0dc34a3320c0ef21502232853901ff5a8d Mon Sep 17 00:00:00 2001 From: uniceguy Date: Fri, 1 Apr 2022 19:55:16 +0800 Subject: [PATCH 149/252] =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=BF=AB=E6=8D=B7=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2rayN/Forms/MsgFilterSetForm.Designer.cs | 26 +- v2rayN/v2rayN/Forms/MsgFilterSetForm.cs | 10 + v2rayN/v2rayN/Forms/MsgFilterSetForm.resx | 279 +++++++++++------- .../Forms/MsgFilterSetForm.zh-Hans.resx | 6 + 4 files changed, 216 insertions(+), 105 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs index 616c5634..96e61724 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs @@ -34,14 +34,18 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnClose = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); + this.btnFilterDirect = new System.Windows.Forms.Button(); + this.btnFilderProxy = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.btnFilderProxy); + this.groupBox1.Controls.Add(this.btnFilterDirect); this.groupBox1.Controls.Add(this.txtMsgFilter); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -52,15 +56,15 @@ // // 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"; // // btnClose // - resources.ApplyResources(this.btnClose, "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); @@ -72,6 +76,20 @@ this.btnOK.UseVisualStyleBackColor = true; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // + // btnFilterDirect + // + resources.ApplyResources(this.btnFilterDirect, "btnFilterDirect"); + this.btnFilterDirect.Name = "btnFilterDirect"; + this.btnFilterDirect.UseVisualStyleBackColor = true; + this.btnFilterDirect.Click += new System.EventHandler(this.btnFilterDirect_Click); + // + // btnFilderProxy + // + resources.ApplyResources(this.btnFilderProxy, "btnFilderProxy"); + this.btnFilderProxy.Name = "btnFilderProxy"; + this.btnFilderProxy.UseVisualStyleBackColor = true; + this.btnFilderProxy.Click += new System.EventHandler(this.btnFilderProxy_Click); + // // MsgFilterSetForm // resources.ApplyResources(this, "$this"); @@ -94,5 +112,7 @@ private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnFilderProxy; + private System.Windows.Forms.Button btnFilterDirect; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs index cbfdd0cd..debeb482 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs @@ -34,5 +34,15 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } + + private void btnFilderProxy_Click(object sender, EventArgs e) + { + txtMsgFilter.Text = "^(?!.*proxy).*$"; + } + + private void btnFilterDirect_Click(object sender, EventArgs e) + { + txtMsgFilter.Text = "^(?!.*direct).*$"; + } } } diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx index 7a65393f..e154ee94 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx @@ -117,151 +117,226 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 0 - - - txtMsgFilter - - - &OK - - - NoControl - - - &Cancel - - - groupBox1 - - - 41, 29 + + 157, 47 - - 490, 60 + + 95, 23 - - 11 + + 13 - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + Filter Proxy - - panel2 + + btnFilderProxy - - $this - - - 1 - - - 396, 17 - - - 0 - - - 1 - - - 0 - - - 75, 23 - - - 9 - - - 5 - - - groupBox1 - - - 8 - - + System.Windows.Forms.Button, 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 + + groupBox1 - + + 0 + + + NoControl - - panel2 + + 41, 47 - - 4 + + 95, 23 - - MsgFilterSetForm + + 12 + + + Filter Direct + + + btnFilterDirect + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 41, 20 409, 21 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 11 - - 0, 0 - - - 0, 76 + + txtMsgFilter System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Bottom + + groupBox1 + + + 2 + + + Fill + + + 0, 0 490, 76 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnClose - - - panel2 + + 8 Filter + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + btnOK - - 490, 136 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 75, 23 + + panel2 - - 303, 17 + + 1 - - 6, 12 + + Bottom + + + 0, 76 + + + 490, 60 + + + 9 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this - - MsgFilterSetForm + + 1 + + + NoControl + + + 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 + + + NoControl + + + 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 True + + 6, 12 + + + 490, 136 + + + MsgFilterSetForm + + + MsgFilterSetForm + + + 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/MsgFilterSetForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx index 351a04cb..67a72ead 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx @@ -129,4 +129,10 @@ 设置过滤器 + + 过滤Proxy + + + 过滤Direct + \ No newline at end of file From bb828a4e06df0c17982dd639547c6617823db5fc Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Apr 2022 17:00:47 +0800 Subject: [PATCH 150/252] modify some text --- v2rayN/v2rayN/Forms/MainForm.resx | 6 +++--- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index e9c6dd11..c096011a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -798,7 +798,7 @@ 264, 22 - Update subscriptions + Update subscription without proxy 264, 22 @@ -870,13 +870,13 @@ 182, 22 - Updates + Update subscription without proxy 182, 22 - Updates via proxy + Update subscription with proxy Magenta diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 593d0710..16c98a29 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -421,7 +421,7 @@ 260, 22 - 更新订阅 + 更新订阅(不通过代理) 260, 22 @@ -451,7 +451,7 @@ 180, 22 - 更新订阅 + 更新订阅(不通过代理) 180, 22 From 82924278b5a0c9069f495a7184473db7673b9e42 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Apr 2022 17:01:45 +0800 Subject: [PATCH 151/252] Delete log files older than one month --- v2rayN/v2rayN/Program.cs | 3 ++- v2rayN/v2rayN/Tool/Logging.cs | 31 ++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index a6dc5246..ace9a3c6 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -35,6 +35,7 @@ namespace v2rayN { Logging.Setup(); Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); + Logging.ClearLogs(); //设置语言环境 string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); @@ -42,7 +43,7 @@ namespace v2rayN Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); + Application.Run(new MainForm()); } else { diff --git a/v2rayN/v2rayN/Tool/Logging.cs b/v2rayN/v2rayN/Tool/Logging.cs index 39b6dd02..ea931456 100644 --- a/v2rayN/v2rayN/Tool/Logging.cs +++ b/v2rayN/v2rayN/Tool/Logging.cs @@ -3,6 +3,9 @@ using log4net.Appender; using log4net.Core; using log4net.Layout; using log4net.Repository.Hierarchy; +using System; +using System.IO; +using System.Threading.Tasks; namespace v2rayN.Tool { @@ -15,7 +18,7 @@ namespace v2rayN.Tool PatternLayout patternLayout = new PatternLayout(); patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; patternLayout.ActivateOptions(); - + RollingFileAppender roller = new RollingFileAppender(); roller.AppendToFile = true; roller.RollingStyle = RollingFileAppender.RollingMode.Date; @@ -33,5 +36,31 @@ namespace v2rayN.Tool hierarchy.Root.Level = Level.Info; hierarchy.Configured = true; } + + public static void ClearLogs() + { + Task.Run(() => + { + try + { + var now = DateTime.Now.AddMonths(-1); + var dir = Utils.GetPath(@"guiLogs\"); + var files = Directory.GetFiles(dir, "*.txt"); + foreach (var filePath in files) + { + var file = new FileInfo(filePath); + if (file.CreationTime < now) + { + try + { + file.Delete(); + } + catch { } + } + } + } + catch { } + }); + } } } From e2f399eeb1bdf8585b4e95e460ffd4bed4bcb0f8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Apr 2022 17:03:21 +0800 Subject: [PATCH 152/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index f1625448..b352a260 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -9,7 +9,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("v2rayN")] -[assembly: AssemblyCopyright("Copyright © 2019-2020 (GPLv3)")] +[assembly: AssemblyCopyright("Copyright © 2019-2022 (GPLv3)")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.9")] +[assembly: AssemblyFileVersion("5.10")] From a8bc9ce605a51913af7a7238e4b9b073c9e63d5a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Apr 2022 19:32:16 +0800 Subject: [PATCH 153/252] Refactor local listening port --- v2rayN/v2rayN/Forms/MainForm.cs | 24 +- .../Forms/OptionSettingForm.Designer.cs | 101 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 72 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 1251 +++++++++++------ .../Forms/OptionSettingForm.zh-Hans.resx | 84 +- v2rayN/v2rayN/Global.cs | 26 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 2 +- v2rayN/v2rayN/Handler/SysProxyHandle.cs | 3 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 6 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 20 +- v2rayN/v2rayN/Mode/Config.cs | 20 +- v2rayN/v2rayN/Mode/V2rayConfig.cs | 12 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 + v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + v2rayN/v2rayN/Sample/SampleClientConfig.txt | 18 +- 16 files changed, 1067 insertions(+), 587 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 0bcd9fea..2af2b554 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -435,13 +435,6 @@ namespace v2rayN.Forms //qrCodeControl.showQRCode(index, config); } - private void DisplayToolStatus() - { - toolSslInboundInfo.Text = $"{Global.InboundSocks} {Global.Loopback}:{config.inbound[0].localPort} | " - + $"{ Global.InboundHttp} { Global.Loopback}:{Global.httpPort}"; - - notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); - } private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) @@ -1401,6 +1394,23 @@ namespace v2rayN.Forms DisplayToolStatus(); } + private void DisplayToolStatus() + { + StringBuilder sb = new StringBuilder(); + sb.Append($"{Global.InboundSocks} {Global.Loopback}:{config.GetLocalPort(Global.InboundSocks)}"); + sb.Append(" | "); + sb.Append($"{Global.InboundHttp} {Global.Loopback}:{config.GetLocalPort(Global.InboundHttp)}"); + + if (config.sysProxyType == ESysProxyType.ForcedChange) + { + sb.Append(" | "); + sb.Append($"{ResUI.SystemProxy} {Global.Loopback}:{config.GetLocalPort(Global.InboundHttp2)}"); + } + + toolSslInboundInfo.Text = sb.ToString(); + + notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); + } #endregion diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index cba25aca..ce14fcc0 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -33,15 +33,14 @@ this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label16 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txtpass = new System.Windows.Forms.TextBox(); + this.txtuser = new System.Windows.Forms.TextBox(); this.chkdefAllowInsecure = new System.Windows.Forms.CheckBox(); - this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox(); + this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); this.chksniffingEnabled = new System.Windows.Forms.CheckBox(); this.chkmuxEnabled = new System.Windows.Forms.CheckBox(); - this.chkAllowIn2 = new System.Windows.Forms.CheckBox(); - this.chkudpEnabled2 = new System.Windows.Forms.CheckBox(); - this.cmbprotocol2 = new System.Windows.Forms.ComboBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtlocalPort2 = new System.Windows.Forms.TextBox(); this.cmbprotocol = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.chkudpEnabled = new System.Windows.Forms.CheckBox(); @@ -79,7 +78,6 @@ this.cbFreshrate = new System.Windows.Forms.ComboBox(); this.lbFreshrate = new System.Windows.Forms.Label(); this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); - this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); this.tabPageCoreType = new System.Windows.Forms.TabPage(); this.cmbCoreType6 = new System.Windows.Forms.ComboBox(); @@ -143,15 +141,14 @@ // // groupBox1 // + this.groupBox1.Controls.Add(this.label16); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.txtpass); + this.groupBox1.Controls.Add(this.txtuser); this.groupBox1.Controls.Add(this.chkdefAllowInsecure); - this.groupBox1.Controls.Add(this.chksniffingEnabled2); + this.groupBox1.Controls.Add(this.chkAllowLANConn); this.groupBox1.Controls.Add(this.chksniffingEnabled); this.groupBox1.Controls.Add(this.chkmuxEnabled); - this.groupBox1.Controls.Add(this.chkAllowIn2); - this.groupBox1.Controls.Add(this.chkudpEnabled2); - this.groupBox1.Controls.Add(this.cmbprotocol2); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.txtlocalPort2); this.groupBox1.Controls.Add(this.cmbprotocol); this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.chkudpEnabled); @@ -164,17 +161,37 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtpass + // + resources.ApplyResources(this.txtpass, "txtpass"); + this.txtpass.Name = "txtpass"; + // + // txtuser + // + resources.ApplyResources(this.txtuser, "txtuser"); + this.txtuser.Name = "txtuser"; + // // chkdefAllowInsecure // resources.ApplyResources(this.chkdefAllowInsecure, "chkdefAllowInsecure"); this.chkdefAllowInsecure.Name = "chkdefAllowInsecure"; this.chkdefAllowInsecure.UseVisualStyleBackColor = true; // - // chksniffingEnabled2 + // chkAllowLANConn // - resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2"); - this.chksniffingEnabled2.Name = "chksniffingEnabled2"; - this.chksniffingEnabled2.UseVisualStyleBackColor = true; + resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn"); + this.chkAllowLANConn.Name = "chkAllowLANConn"; + this.chkAllowLANConn.UseVisualStyleBackColor = true; // // chksniffingEnabled // @@ -188,39 +205,6 @@ this.chkmuxEnabled.Name = "chkmuxEnabled"; this.chkmuxEnabled.UseVisualStyleBackColor = true; // - // chkAllowIn2 - // - resources.ApplyResources(this.chkAllowIn2, "chkAllowIn2"); - this.chkAllowIn2.Name = "chkAllowIn2"; - this.chkAllowIn2.UseVisualStyleBackColor = true; - this.chkAllowIn2.CheckedChanged += new System.EventHandler(this.chkAllowIn2_CheckedChanged); - // - // chkudpEnabled2 - // - resources.ApplyResources(this.chkudpEnabled2, "chkudpEnabled2"); - this.chkudpEnabled2.Name = "chkudpEnabled2"; - this.chkudpEnabled2.UseVisualStyleBackColor = true; - // - // 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 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtlocalPort2 - // - resources.ApplyResources(this.txtlocalPort2, "txtlocalPort2"); - this.txtlocalPort2.Name = "txtlocalPort2"; - // // cmbprotocol // this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -399,7 +383,6 @@ this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); - this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabPage7.Controls.Add(this.chkAutoRun); resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; @@ -464,12 +447,6 @@ this.chkEnableStatistics.Name = "chkEnableStatistics"; this.chkEnableStatistics.UseVisualStyleBackColor = true; // - // chkAllowLANConn - // - resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn"); - this.chkAllowLANConn.Name = "chkAllowLANConn"; - this.chkAllowLANConn.UseVisualStyleBackColor = true; - // // chkAutoRun // resources.ApplyResources(this.chkAutoRun, "chkAutoRun"); @@ -664,11 +641,6 @@ private System.Windows.Forms.Panel panel2; private System.Windows.Forms.ComboBox cmbprotocol; private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox cmbprotocol2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtlocalPort2; - private System.Windows.Forms.CheckBox chkudpEnabled2; - private System.Windows.Forms.CheckBox chkAllowIn2; private System.Windows.Forms.CheckBox chkmuxEnabled; private System.Windows.Forms.TabPage tabPage6; private System.Windows.Forms.TextBox txtKcpmtu; @@ -688,7 +660,6 @@ private System.Windows.Forms.CheckBox chkAutoRun; private System.Windows.Forms.CheckBox chkAllowLANConn; private System.Windows.Forms.CheckBox chksniffingEnabled; - private System.Windows.Forms.CheckBox chksniffingEnabled2; private System.Windows.Forms.CheckBox chkEnableStatistics; private System.Windows.Forms.ComboBox cbFreshrate; private System.Windows.Forms.Label lbFreshrate; @@ -722,5 +693,9 @@ private System.Windows.Forms.Label labCoreType3; private System.Windows.Forms.ComboBox cmbCoreType2; private System.Windows.Forms.Label labCoreType2; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtpass; + private System.Windows.Forms.TextBox txtuser; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index fc53d7f9..c3ec5c6b 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -46,23 +46,10 @@ namespace v2rayN.Forms cmbprotocol.Text = config.inbound[0].protocol.ToString(); chkudpEnabled.Checked = config.inbound[0].udpEnabled; chksniffingEnabled.Checked = config.inbound[0].sniffingEnabled; + chkAllowLANConn.Checked = config.inbound[0].allowLANConn; + txtuser.Text = config.inbound[0].user; + txtpass.Text = config.inbound[0].pass; - txtlocalPort2.Text = $"{config.inbound[0].localPort + 1}"; - cmbprotocol2.Text = Global.InboundHttp; - - if (config.inbound.Count > 1) - { - txtlocalPort2.Text = config.inbound[1].localPort.ToString(); - cmbprotocol2.Text = config.inbound[1].protocol.ToString(); - chkudpEnabled2.Checked = config.inbound[1].udpEnabled; - chksniffingEnabled2.Checked = config.inbound[1].sniffingEnabled; - chkAllowIn2.Checked = true; - } - else - { - chkAllowIn2.Checked = false; - } - chkAllowIn2State(); } //remoteDNS @@ -96,7 +83,6 @@ namespace v2rayN.Forms //开机自动启动 chkAutoRun.Checked = Utils.IsAutoRun(); - chkAllowLANConn.Checked = config.allowLANConn; chkEnableStatistics.Checked = config.enableStatistics; chkKeepOlderDedupl.Checked = config.keepOlderDedupl; @@ -210,6 +196,7 @@ namespace v2rayN.Forms string protocol = cmbprotocol.Text.TrimEx(); bool udpEnabled = chkudpEnabled.Checked; bool sniffingEnabled = chksniffingEnabled.Checked; + bool allowLANConn = chkAllowLANConn.Checked; if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort)) { UI.Show(ResUI.FillLocalListeningPort); @@ -239,41 +226,16 @@ namespace v2rayN.Forms config.inbound[0].protocol = protocol; config.inbound[0].udpEnabled = udpEnabled; config.inbound[0].sniffingEnabled = sniffingEnabled; + config.inbound[0].allowLANConn = allowLANConn; + config.inbound[0].user = txtuser.Text; + config.inbound[0].pass = txtpass.Text; - //本地监听2 - string localPort2 = txtlocalPort2.Text.TrimEx(); - string protocol2 = cmbprotocol2.Text.TrimEx(); - bool udpEnabled2 = chkudpEnabled2.Checked; - bool sniffingEnabled2 = chksniffingEnabled2.Checked; - if (chkAllowIn2.Checked) + if (config.inbound.Count > 1) { - if (Utils.IsNullOrEmpty(localPort2) || !Utils.IsNumberic(localPort2)) - { - UI.Show(ResUI.FillLocalListeningPort); - return -1; - } - if (Utils.IsNullOrEmpty(protocol2)) - { - UI.Show(ResUI.PleaseSelectProtocol); - return -1; - } - if (config.inbound.Count < 2) - { - config.inbound.Add(new Mode.InItem()); - } - config.inbound[1].localPort = Utils.ToInt(localPort2); - config.inbound[1].protocol = protocol2; - config.inbound[1].udpEnabled = udpEnabled2; - config.inbound[1].sniffingEnabled = sniffingEnabled2; - } - else - { - if (config.inbound.Count > 1) - { - config.inbound.RemoveAt(1); - } + config.inbound.RemoveAt(1); } + //日志 config.logEnabled = logEnabled; config.loglevel = loglevel; @@ -336,8 +298,6 @@ namespace v2rayN.Forms //开机自动启动 Utils.SetAutoRun(chkAutoRun.Checked); - config.allowLANConn = chkAllowLANConn.Checked; - bool lastEnableStatistics = config.enableStatistics; config.enableStatistics = chkEnableStatistics.Checked; config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; @@ -367,17 +327,6 @@ namespace v2rayN.Forms this.DialogResult = DialogResult.Cancel; } - private void chkAllowIn2_CheckedChanged(object sender, EventArgs e) - { - chkAllowIn2State(); - } - private void chkAllowIn2State() - { - bool blAllow2 = chkAllowIn2.Checked; - txtlocalPort2.Enabled = - cmbprotocol2.Enabled = - chkudpEnabled2.Enabled = blAllow2; - } private void linkDnsObjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { @@ -388,5 +337,6 @@ namespace v2rayN.Forms { Process.Start(Utils.GetPath("EnableLoopback.exe")); } + } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index ae888117..f9f9c72d 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -143,10 +143,112 @@ 0 - + True + + NoControl + + + 397, 65 + + + 59, 12 + + + 39 + + + Auth pass + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + NoControl + + + 224, 65 + + + 59, 12 + + + 38 + + + Auth user + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 496, 61 + + + 120, 21 + + + 37 + + + txtpass + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + 285, 61 + + + 97, 21 + + + 36 + + + txtuser + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + NoControl @@ -172,40 +274,34 @@ groupBox1 - 0 + 4 - + True - - NoControl + + 15, 63 - - 468, 60 + + 204, 16 - - 120, 16 + + 29 - - 32 + + Allow connections from the LAN - - Turn on Sniffing + + chkAllowLANConn - - False - - - chksniffingEnabled2 - - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + groupBox1 - - 1 + + 5 True @@ -214,7 +310,7 @@ NoControl - 468, 27 + 496, 27 120, 16 @@ -235,7 +331,7 @@ groupBox1 - 2 + 6 True @@ -262,152 +358,8 @@ groupBox1 - 3 - - - 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 - - - 4 - - - 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 - - - 5 - - - 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 - - - 6 - - - 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 - - 7 - - 124, 60 - - - 78, 21 - - - 14 - - - False - - - txtlocalPort2 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - False @@ -418,7 +370,7 @@ http - 257, 25 + 285, 25 97, 20 @@ -436,13 +388,13 @@ groupBox1 - 9 + 8 True - 206, 29 + 224, 29 53, 12 @@ -463,13 +415,13 @@ groupBox1 - 10 + 9 True - 369, 27 + 397, 27 84, 16 @@ -490,7 +442,7 @@ groupBox1 - 11 + 10 True @@ -517,7 +469,7 @@ groupBox1 - 12 + 11 debug @@ -553,7 +505,7 @@ groupBox1 - 13 + 12 True @@ -580,7 +532,7 @@ groupBox1 - 14 + 13 124, 25 @@ -601,7 +553,7 @@ groupBox1 - 15 + 14 True @@ -628,7 +580,7 @@ groupBox1 - 16 + 15 Fill @@ -681,6 +633,639 @@ 0 + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 728, 427 + + + 4 + + + Core: DNS settings + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + chkKcpcongestion + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 0 + + + txtKcpwriteBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 1 + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 3 + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 4 + + + txtKcpdownlinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 5 + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + + txtKcpuplinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 7 + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 8 + + + txtKcptti + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 9 + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 10 + + + txtKcpmtu + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 11 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 12 + + + 4, 22 + + + 3, 3, 3, 3 + + + 728, 427 + + + 2 + + + Core: KCP settings + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + chkEnableSecurityProtocolTls13 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + chkEnableAutoAdjustMainLvColWidth + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + btnSetLoopback + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + txtautoUpdateInterval + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + chkIgnoreGeoUpdateCore + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 5 + + + chkKeepOlderDedupl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 6 + + + cbFreshrate + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 7 + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 8 + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 9 + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 10 + + + 4, 22 + + + 3, 3, 3, 3 + + + 728, 427 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + cmbCoreType6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 0 + + + labCoreType6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 1 + + + cmbCoreType5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 2 + + + labCoreType5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 3 + + + cmbCoreType4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 4 + + + labCoreType4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 5 + + + cmbCoreType3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 6 + + + labCoreType3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 7 + + + cmbCoreType2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 8 + + + labCoreType2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 9 + + + cmbCoreType1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 10 + + + labCoreType1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 11 + + + 4, 22 + + + 3, 3, 3, 3 + + + 728, 427 + + + 6 + + + CoreType settings + + + tabPageCoreType + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 4 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + 4, 22 + + + 728, 427 + + + 5 + + + System proxy settings + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 5 + + + Fill + + + 0, 10 + + + 736, 453 + + + 10 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + True @@ -771,30 +1356,6 @@ 2 - - 4, 22 - - - 728, 427 - - - 4 - - - Core: DNS settings - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 1 - True @@ -1110,35 +1671,8 @@ 12 - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - 15, 211 + 15, 187 506, 16 @@ -1168,7 +1702,7 @@ NoControl - 15, 189 + 15, 165 390, 16 @@ -1219,7 +1753,7 @@ 2 - 325, 156 + 325, 132 97, 21 @@ -1246,7 +1780,7 @@ NoControl - 30, 162 + 30, 138 239, 12 @@ -1276,7 +1810,7 @@ NoControl - 15, 132 + 15, 108 234, 16 @@ -1306,7 +1840,7 @@ NoControl - 15, 108 + 15, 84 198, 16 @@ -1330,7 +1864,7 @@ 6 - 161, 84 + 161, 60 58, 20 @@ -1357,7 +1891,7 @@ NoControl - 30, 88 + 30, 64 125, 12 @@ -1387,7 +1921,7 @@ NoControl - 15, 64 + 15, 40 576, 16 @@ -1410,33 +1944,6 @@ 9 - - True - - - 15, 40 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 10 - True @@ -1462,34 +1969,7 @@ tabPage7 - 11 - - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 3 - - - v2rayN settings - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 3 + 10 117, 172 @@ -1797,32 +2277,68 @@ 11 - - 4, 22 + + label13 - - 3, 3, 3, 3 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox2 + + + 0 + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + txtsystemProxyExceptions + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + Fill + + + 0, 0 + + 728, 427 - - 6 + + 42 - - CoreType settings + + Exception - - tabPageCoreType + + groupBox2 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabControl1 + + tabPage3 - - 4 + + 0 True @@ -1911,93 +2427,6 @@ 2 - - Fill - - - 0, 0 - - - 728, 427 - - - 42 - - - Exception - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage3 - - - 0 - - - 4, 22 - - - 728, 427 - - - 5 - - - System proxy settings - - - tabPage3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 5 - - - Fill - - - 0, 10 - - - 736, 453 - - - 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 @@ -2034,6 +2463,30 @@ 1 + + 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 + Top diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 2d09cab8..e2b9ac60 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,48 +121,96 @@ 取消(&C) + + 53, 12 + + + 认证密码 + + + 219, 65 + + + 65, 12 + + + 认证用户名 + + + 15, 208 + 324, 16 传输层安全选tls时,默认跳过证书验证(allowInsecure) + + 468, 117 + 96, 16 开启流量探测 + + 144, 16 + + + 允许来自局域网的连接 + 96, 16 开启流量探测 + + 15, 145 + 114, 16 开启Mux多路复用 + + 15, 120 + 102, 16 本地监听端口2 + + 369, 119 + 66, 16 开启UDP + + 257, 117 + + + 206, 121 + 29, 12 协议 + + 124, 117 + + + 219, 29 + 29, 12 @@ -175,12 +223,21 @@ 开启UDP + + 15, 176 + 156, 16 记录本地日志(默认关闭) + + 257, 174 + + + 193, 178 + 53, 12 @@ -253,12 +310,6 @@ 更新Core时忽略Geo文件 - - 53, 12 - - - Core类型 - 156, 16 @@ -277,12 +328,6 @@ 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) - - 144, 16 - - - 允许来自局域网的连接 - 180, 16 @@ -295,6 +340,12 @@ v2rayN设置 + + 654, 443 + + + Core类型设置 + 95, 12 @@ -328,13 +379,16 @@ 0, 479 + + 662, 60 + + + 662, 10 + 662, 539 参数设置 - - Core类型设置 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 710649d8..ea3e6803 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -111,6 +111,7 @@ namespace v2rayN public const string InboundSocks = "socks"; public const string InboundHttp = "http"; + public const string InboundHttp2 = "http2"; public const string Loopback = "127.0.0.1"; public const string InboundAPITagName = "api"; public const string InboundAPIProtocal = "dokodemo-door"; @@ -219,31 +220,6 @@ namespace v2rayN get; set; } - /// - /// 是否开启全局代理(http) - /// - public static bool sysAgent - { - get; set; - } - - /// - /// socks端口 - /// - public static int socksPort - { - get; set; - } - - /// - /// http端口 - /// - public static int httpPort - { - get; set; - } - - /// /// /// diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 1b299216..c1ea28cf 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -169,7 +169,7 @@ namespace v2rayN.Handler { try { - int httpPort = _config.GetLocalPort(Global.InboundHttp); + int httpPort = _config.GetLocalPort(Global.InboundHttp2); Task t = Task.Run(() => { diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs index 0dc19e72..326b2f78 100644 --- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -59,8 +59,7 @@ namespace v2rayN.Handler try { - Global.httpPort = config.GetLocalPort(Global.InboundHttp); - int port = Global.httpPort; + int port = config.GetLocalPort(Global.InboundHttp2); if (port <= 0) { return false; diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 894a6acf..8e318d04 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -232,7 +232,7 @@ namespace v2rayN.Handler _updateFunc(false, args.GetException().Message); }; - WebProxy webProxy = blProxy ? new WebProxy(Global.Loopback, _config.GetLocalPort(Global.InboundHttp)) : null; + WebProxy webProxy = blProxy ? new WebProxy(Global.Loopback, _config.GetLocalPort(Global.InboundHttp2)) : null; downloadHandle3.WebDownloadString(url, webProxy, userAgent); _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); @@ -304,7 +304,7 @@ namespace v2rayN.Handler }; if (httpProxyTest() > 0) { - int httpPort = _config.GetLocalPort(Global.InboundHttp); + int httpPort = _config.GetLocalPort(Global.InboundHttp2); WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); webRequestHandler.Proxy = webProxy; } @@ -460,7 +460,7 @@ namespace v2rayN.Handler { if (httpProxyTest() > 0) { - int httpPort = _config.GetLocalPort(Global.InboundHttp); + int httpPort = _config.GetLocalPort(Global.InboundHttp2); WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); downloadHandle.DownloadFileAsync(url, webProxy, 600); } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index ca31c4ec..74610cf3 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -150,7 +150,7 @@ namespace v2rayN.Handler inbound.tag = Global.InboundSocks; inbound.port = config.inbound[0].localPort; inbound.protocol = config.inbound[0].protocol; - if (config.allowLANConn) + if (config.inbound[0].allowLANConn) { inbound.listen = "0.0.0.0"; } @@ -170,6 +170,24 @@ namespace v2rayN.Handler inbound2.listen = inbound.listen; inbound2.settings.allowTransparent = false; inbound2.sniffing.enabled = inbound.sniffing.enabled; + + //auth + if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass)) + { + inbound.settings.auth = "password"; + inbound.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; + inbound2.settings.auth = "password"; + inbound2.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; + } + + //http Loopback + Inbounds inbound3 = v2rayConfig.inbounds[2]; + inbound3.tag = Global.InboundHttp2; + inbound3.port = config.GetLocalPort(Global.InboundHttp2); + inbound3.protocol = Global.InboundHttp; + inbound3.listen = Global.Loopback; + inbound3.settings.allowTransparent = false; + inbound3.sniffing.enabled = inbound.sniffing.enabled; } catch { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 596f96b9..40236fcf 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -52,14 +52,6 @@ namespace v2rayN.Mode get; set; } - /// - /// 允许来自局域网的连接 - /// - public bool allowLANConn - { - get; set; - } - /// /// 启用实时网速和流量统计 /// @@ -220,7 +212,10 @@ namespace v2rayN.Mode { return GetLocalPort(Global.InboundSocks) + 1; } - + else if (protocol == Global.InboundHttp2) + { + return GetLocalPort(Global.InboundSocks) + 2; + } else if (protocol == "speedtest") { return GetLocalPort(Global.InboundSocks) + 103; @@ -581,6 +576,13 @@ namespace v2rayN.Mode /// 开启流量探测 /// public bool sniffingEnabled { get; set; } = true; + + public bool allowLANConn { get; set; } + + public string user { get; set; } + + public string pass { get; set; } + } [Serializable] diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 4703ec21..1ce64c3c 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -141,6 +141,7 @@ namespace v2rayN.Mode public bool allowTransparent { get; set; } + public List accounts { get; set; } } public class UsersItem @@ -540,4 +541,15 @@ namespace v2rayN.Mode public bool multiMode { get; set; } } + public class AccountsItem + { + /// + /// + /// + public string user { get; set; } + /// + /// + /// + public string pass { get; set; } + } } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index e202e71b..21b9cfe5 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -934,6 +934,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 System proxy 的本地化字符串。 + /// + internal static string SystemProxy { + get { + return ResourceManager.GetString("SystemProxy", resourceCulture); + } + } + /// /// 查找类似 The ping of current service: {0} 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 6077e7eb..66b70aee 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -454,4 +454,7 @@ Please browse to import server configuration + + System proxy + \ 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 6ad22fc8..80229395 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -454,4 +454,7 @@ 请浏览导入服务器配置 + + 系统代理 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt index 0d2b2537..a33d9bd6 100644 --- a/v2rayN/v2rayN/Sample/SampleClientConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -24,7 +24,23 @@ { "tag": "tag2", "port": 10809, - "protocol": "socks", + "protocol": "http", + "listen": "127.0.0.1", + "settings": { + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } + }, + { + "tag": "tag3", + "port": 10809, + "protocol": "http", "listen": "127.0.0.1", "settings": { "allowTransparent": false From b919422ec428afbdc2330bbe734be900e08832a8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Apr 2022 19:34:32 +0800 Subject: [PATCH 154/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index b352a260..412faa1a 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.10")] +[assembly: AssemblyFileVersion("5.11")] From e824d8e91d69dc105669224dd116bf0841eb95e9 Mon Sep 17 00:00:00 2001 From: Lemonawa Date: Tue, 5 Apr 2022 23:06:42 +0800 Subject: [PATCH 155/252] Create config.yaml --- .github/ISSUE_TEMPLATE/config.yaml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yaml diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1 @@ + From ec8aa0df1828c37c726a4a82ae983aea253ef9e1 Mon Sep 17 00:00:00 2001 From: Lemonawa Date: Tue, 5 Apr 2022 23:09:30 +0800 Subject: [PATCH 156/252] Update issue templates --- .github/ISSUE_TEMPLATE/bug---.md | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug---.md diff --git a/.github/ISSUE_TEMPLATE/bug---.md b/.github/ISSUE_TEMPLATE/bug---.md new file mode 100644 index 00000000..9599ee10 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug---.md @@ -0,0 +1,33 @@ +--- +name: Bug 报告 +about: 在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。 +title: "[BUG]" +labels: bug +assignees: '' + +--- + +在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。 + +### 预期行为 +描述你认为应该发生什么 + +### 实际行为 +描述实际发生了什么 + +### 复现方法 +1. +2. +3. + +### 日志信息,位置在当前目录下的guiLogs +
+ +``` +在这里粘贴日志 +``` +
+ +### 环境信息(客户端请升级至最新正式版) + +### 额外信息(可选) From 8d66c0d180c41f77872dba6d87b617eb0e26b704 Mon Sep 17 00:00:00 2001 From: Lemonawa Date: Tue, 5 Apr 2022 23:10:08 +0800 Subject: [PATCH 157/252] Delete issue_template.md --- .github/issue_template.md | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .github/issue_template.md diff --git a/.github/issue_template.md b/.github/issue_template.md deleted file mode 100644 index 79efbbc9..00000000 --- a/.github/issue_template.md +++ /dev/null @@ -1,25 +0,0 @@ -在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。 - -### 预期行为 -描述你认为应该发生什么 - -### 实际行为 -描述实际发生了什么 - -### 复现方法 -1. -2. -3. - -### 日志信息,位置在当前目录下的guiLogs -
- -``` -在这里粘贴日志 -``` -
- -### 环境信息(客户端请升级至最新正式版) - -### 额外信息(可选) - From b21ad28d5b5b34a5fab4c4af33c9e629116a8886 Mon Sep 17 00:00:00 2001 From: Lemonawa Date: Tue, 5 Apr 2022 23:10:16 +0800 Subject: [PATCH 158/252] Delete config.yaml --- .github/ISSUE_TEMPLATE/config.yaml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/ISSUE_TEMPLATE/config.yaml diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml deleted file mode 100644 index 8b137891..00000000 --- a/.github/ISSUE_TEMPLATE/config.yaml +++ /dev/null @@ -1 +0,0 @@ - From b62f1786a935b11662cb19c330e889de09ab275f Mon Sep 17 00:00:00 2001 From: Lemonawa Date: Tue, 5 Apr 2022 23:19:37 +0800 Subject: [PATCH 159/252] Update issue templates --- .github/ISSUE_TEMPLATE/feature---.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature---.md diff --git a/.github/ISSUE_TEMPLATE/feature---.md b/.github/ISSUE_TEMPLATE/feature---.md new file mode 100644 index 00000000..a93f12ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature---.md @@ -0,0 +1,20 @@ +--- +name: Feature 请求 +about: 为这个项目提出一个建议 +title: "[Feature request]" +labels: enhancement +assignees: '' + +--- + +**你的功能请求是否与一个问题有关?请描述。** +清楚而简洁地描述问题是什么。例如。我总是感到沮丧,当 [...] + +**描述你希望的解决方案** +对你希望发生的事情进行清晰、简明的描述。 + +**描述你所考虑的替代方案** +对你考虑过的任何替代解决方案或功能进行清晰、简洁的描述。 + +**Additional context** +Add any other context or screenshots about the feature request here. From 09702b9bde8a826a9335f3f51cb990af69c6f81b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 7 Apr 2022 17:05:56 +0800 Subject: [PATCH 160/252] fix bugs --- v2rayN/v2rayN/Forms/MainForm.cs | 106 ++++++++----------------- v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 4 + v2rayN/v2rayN/Tool/Logging.cs | 2 +- 4 files changed, 37 insertions(+), 77 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 2af2b554..ddb014c7 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -273,7 +273,7 @@ namespace v2rayN.Forms /// private void RefreshServersView() { - int index = lvServers.SelectedIndices.Count > 0 ? lvServers.SelectedIndices[0] : -1; + int index = GetLvSelectedIndex(false); lvServers.BeginUpdate(); lvServers.Items.Clear(); @@ -281,29 +281,12 @@ namespace v2rayN.Forms for (int k = 0; k < lstVmess.Count; k++) { string def = string.Empty; - string totalUp = string.Empty, - totalDown = string.Empty, - todayUp = string.Empty, - todayDown = string.Empty; - VmessItem item = lstVmess[k]; if (config.IsActiveNode(item)) { def = "√"; } - bool stats = statistics != null && statistics.Enable; - if (stats) - { - ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.indexId); - 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); Utils.AddSubItem(lvItem, EServerColName.configType.ToString(), (item.configType).ToString()); Utils.AddSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); @@ -314,8 +297,22 @@ namespace v2rayN.Forms Utils.AddSubItem(lvItem, EServerColName.streamSecurity.ToString(), item.streamSecurity); Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.GetSubRemarks(config)); Utils.AddSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); - if (stats) + + if (statistics != null && statistics.Enable) { + string totalUp = string.Empty, + totalDown = string.Empty, + todayUp = string.Empty, + todayDown = string.Empty; + ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.indexId); + if (sItem != null) + { + totalUp = Utils.HumanFy(sItem.totalUp); + totalDown = Utils.HumanFy(sItem.totalDown); + todayUp = Utils.HumanFy(sItem.todayUp); + todayDown = Utils.HumanFy(sItem.todayDown); + } + Utils.AddSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown); Utils.AddSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp); Utils.AddSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown); @@ -416,23 +413,7 @@ namespace v2rayN.Forms } 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 ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) @@ -603,17 +584,7 @@ namespace v2rayN.Forms private void lvServers_Click(object sender, EventArgs e) { - int index = -1; - try - { - if (lvServers.SelectedIndices.Count > 0) - { - index = lvServers.SelectedIndices[0]; - } - } - catch - { - } + int index = GetLvSelectedIndex(false); if (index < 0) { return; @@ -966,7 +937,7 @@ namespace v2rayN.Forms /// 取得ListView选中的行 /// /// - private int GetLvSelectedIndex() + private int GetLvSelectedIndex(bool show = true) { int index = -1; lstSelecteds.Clear(); @@ -974,7 +945,10 @@ namespace v2rayN.Forms { if (lvServers.SelectedIndices.Count <= 0) { - UI.Show(ResUI.PleaseSelectServer); + if (show) + { + UI.Show(ResUI.PleaseSelectServer); + } return index; } @@ -1190,11 +1164,13 @@ namespace v2rayN.Forms this.ShowInTaskbar = true; //this.notifyIcon1.Visible = false; this.txtMsgBox.ScrollToCaret(); - //if (config.index >= 0 && config.index < lvServers.Items.Count) - //{ - // lvServers.Items[config.index].Selected = true; - // lvServers.EnsureVisible(config.index); // workaround - //} + + int index = GetLvSelectedIndex(false); + if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0) + { + lvServers.Items[index].Selected = true; + lvServers.EnsureVisible(index); // workaround + } SetVisibleCore(true); } @@ -1272,27 +1248,7 @@ namespace v2rayN.Forms lvServers.EndUpdate(); }); } - - - - for (int i = 0; i < lstVmess.Count; i++) - { - int index = statistics.FindIndex(item_ => item_.itemId == lstVmess[i].indexId); - 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) { diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index f484daec..86afad5e 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -15,7 +15,7 @@ namespace v2rayN.Handler class ConfigHandler { private static string configRes = Global.ConfigFileName; - private static object objLock = new object(); + private static readonly object objLock = new object(); #region ConfigHandler diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index ba7dfb09..fbccd16b 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -109,6 +109,10 @@ namespace v2rayN.Handler } else { + if (coreInfo == null || coreInfo.coreExes == null) + { + return; + } foreach (string vName in coreInfo.coreExes) { Process[] existing = Process.GetProcessesByName(vName); diff --git a/v2rayN/v2rayN/Tool/Logging.cs b/v2rayN/v2rayN/Tool/Logging.cs index ea931456..aa5cb956 100644 --- a/v2rayN/v2rayN/Tool/Logging.cs +++ b/v2rayN/v2rayN/Tool/Logging.cs @@ -33,7 +33,7 @@ namespace v2rayN.Tool memory.ActivateOptions(); hierarchy.Root.AddAppender(memory); - hierarchy.Root.Level = Level.Info; + hierarchy.Root.Level = Level.Debug; hierarchy.Configured = true; } From 3aa48a9a3e5dcca6dd8eccbe3cfdd05837d584d3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 7 Apr 2022 20:36:10 +0800 Subject: [PATCH 161/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 412faa1a..992d47ca 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.11")] +[assembly: AssemblyFileVersion("5.12")] From 50b109ca712cf6be0ca81b40fcc242a47845d55f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 11 Apr 2022 15:24:24 +0800 Subject: [PATCH 162/252] Auto update subscription --- .../Forms/OptionSettingForm.Designer.cs | 40 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3812 +++++++---------- .../Forms/OptionSettingForm.zh-Hans.resx | 120 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 11 +- 4 files changed, 1710 insertions(+), 2273 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index ce14fcc0..d9384320 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -114,33 +114,34 @@ // // 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); this.tabControl1.Controls.Add(this.tabPageCoreType); this.tabControl1.Controls.Add(this.tabPage3); - resources.ApplyResources(this.tabControl1, "tabControl1"); 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.label16); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtpass); @@ -157,7 +158,6 @@ 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; // @@ -207,8 +207,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"), @@ -234,6 +234,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[] { @@ -242,7 +243,6 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -262,10 +262,10 @@ // // tabPage2 // + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -288,6 +288,7 @@ // // tabPage6 // + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -301,7 +302,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; // @@ -373,6 +373,7 @@ // // tabPage7 // + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13); this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth); this.tabPage7.Controls.Add(this.btnSetLoopback); @@ -384,7 +385,6 @@ this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // @@ -431,9 +431,9 @@ // // 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 @@ -455,6 +455,7 @@ // // tabPageCoreType // + resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); this.tabPageCoreType.Controls.Add(this.cmbCoreType6); this.tabPageCoreType.Controls.Add(this.labCoreType6); this.tabPageCoreType.Controls.Add(this.cmbCoreType5); @@ -467,15 +468,14 @@ this.tabPageCoreType.Controls.Add(this.labCoreType2); this.tabPageCoreType.Controls.Add(this.cmbCoreType1); this.tabPageCoreType.Controls.Add(this.labCoreType1); - resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); this.tabPageCoreType.Name = "tabPageCoreType"; this.tabPageCoreType.UseVisualStyleBackColor = true; // // cmbCoreType6 // + resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); this.cmbCoreType6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType6.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); this.cmbCoreType6.Name = "cmbCoreType6"; // // labCoreType6 @@ -485,9 +485,9 @@ // // cmbCoreType5 // + resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); this.cmbCoreType5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType5.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); this.cmbCoreType5.Name = "cmbCoreType5"; // // labCoreType5 @@ -497,9 +497,9 @@ // // cmbCoreType4 // + resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); this.cmbCoreType4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType4.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); this.cmbCoreType4.Name = "cmbCoreType4"; // // labCoreType4 @@ -509,9 +509,9 @@ // // cmbCoreType3 // + resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); this.cmbCoreType3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType3.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); this.cmbCoreType3.Name = "cmbCoreType3"; // // labCoreType3 @@ -521,9 +521,9 @@ // // cmbCoreType2 // + resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); this.cmbCoreType2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType2.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); this.cmbCoreType2.Name = "cmbCoreType2"; // // labCoreType2 @@ -533,9 +533,9 @@ // // cmbCoreType1 // + resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); this.cmbCoreType1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType1.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); this.cmbCoreType1.Name = "cmbCoreType1"; // // labCoreType1 @@ -545,17 +545,17 @@ // // tabPage3 // - this.tabPage3.Controls.Add(this.groupBox2); resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Controls.Add(this.groupBox2); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -576,9 +576,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 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index f9f9c72d..bad14b8b 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,2419 +117,1891 @@ 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 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + NoControl - - 397, 65 + + + 11 - - 59, 12 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 39 - - - Auth pass - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - NoControl - - - 224, 65 - - - 59, 12 - - - 38 - - - Auth user - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 + + Keep older when deduplication 1 - - 496, 61 - - - 120, 21 - - - 37 - - - txtpass - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - 285, 61 - - - 97, 21 - - - 36 - - - txtuser - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - NoControl - - - 15, 192 - - - 102, 16 - - - 35 - - - allowInsecure - - - chkdefAllowInsecure - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - True - - - 15, 63 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - NoControl - - - 496, 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 - - - 6 - - - 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 - - - 7 - - - False - - - socks - - - http - - - 285, 25 - - - 97, 20 - - - 12 - - - cmbprotocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - True - - - 224, 29 - - - 53, 12 - - - 11 - - - protocol - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - - - 397, 27 - - - 84, 16 - - - 10 - - - Enable UDP - - - chkudpEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - True - - - 15, 160 - - - 126, 16 - - - 9 + + + 6, 283 Record local logs - - chklogEnabled + + tabPage7 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - 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 - - + 12 - - True + + txtpass - - 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 - - - 13 - - - 124, 25 - - - 78, 21 - - - 3 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 9 groupBox1 - + + 8 + + + tti + + + 13 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + label10 + + + True + + + 9 + + + groupBox1 + + + label15 + + + txtautoUpdateInterval + + + 38 + + + label16 + + + Top + + + 102, 16 + + + 4, 22 + + + txtKcptti + + + tabPage3 + + + btnSetLoopback + + + 5 + + + 7 + + + 30, 64 + + + 111, 100 + + + True + + + System.Windows.Forms.Label, 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 + + + 84, 16 + + + 40 + + + labCoreType2 + + + True + + + 120, 16 + + + 285, 61 + + + tabPage6 + + + tabPage6 + + + 2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 59, 12 + + + 7 + + + tabPage7 + + + 12 + + + chkEnableSecurityProtocolTls13 + + + Core Type + + + Fill + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkdefAllowInsecure + + + 722, 421 + + + Custom DNS (multiple, separated by commas (,)) + + + 95, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 14 - + + 39 + + + 317, 12 + + + 30, 138 + + + 59, 12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 37 + + + groupBox1 + + + 18, 28 + + + &Cancel + + + 111, 62 + + + 728, 427 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + Set Windows10 UWP Loopback + + + tabPage7 + + + groupBox1 + + + 728, 427 + + + 15, 165 + + + txtKcpreadBufferSize + + + cmbloglevel + + + label4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Allow connections from the LAN + + + 2 + + + 42 + + + txtKcpmtu + + + lbFreshrate + + + 11 + + + $this + + + label11 + + + 29 + + + True + + + NoControl + + + tabPage6 + + + 0, 10 + + + cmbCoreType2 + + + Support DnsObject + + + 43 + + + tabPage6 + + + 58, 20 + + + tabControl1 + + + $this + + + 7 + + + NoControl + + + 5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 117, 42 + + + 0 + + + tabPage6 + + + Fill + + + 576, 16 + + + groupBox1 + + + True + + + System.Windows.Forms.ComboBox, 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 + + + congestion + + + 45, 176 + + + 15, 16 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + 89, 12 + + + info + + + 0 + + + 0 + + + 97, 20 + + + v2rayN settings + + + 15 + + + 117, 94 + + + 9 + + + Use semicolon (;) + + + True + + + 6, 12 + + + 1 + + + True + + + 8 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Security Protocol TLS v1.3 (subscription/update/speedtest) + + + Automatically start at system startup + + + 728, 427 + + + 1 + + + 36 + + + 6 + + + tabPage6 + + + 45, 150 + + + 281, 12 + + + Ignore Geo files when updating core + + + 355, 16 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True 33, 29 - - 89, 12 + + True - - 2 - - - Listening port - - - label2 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + 78, 21 - - 15 - - - Fill - - - 3, 3 - - - 722, 421 - - - 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 - - - 728, 427 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Core Type tabControl1 - - 0 + + 59, 12 - - linkDnsObjectDoc + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 1 - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + warning tabPage2 - - 2 - - - 4, 22 - - - 728, 427 - - - 4 - - - Core: DNS settings - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 1 - - - chkKcpcongestion - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 0 - - - txtKcpwriteBufferSize - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 1 - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 2 - - - txtKcpreadBufferSize - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 3 - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 4 - - - txtKcpdownlinkCapacity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - + 5 - - label8 + + tabPageCoreType - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Statistics freshrate - - tabPage6 + + True - - 6 + + 89, 12 - - txtKcpuplinkCapacity + + 59, 12 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + + + Core Type + + + 18, 66 + + + 20, 143 + + + 11 + + + 4, 4, 4, 4 tabPage6 - - 7 + + 5 + + + Turn on Sniffing + + + 4 + + + groupBox1 + + + tabPageCoreType + + + System.Windows.Forms.Label, 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 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 39 + + + 20 + + + 29 + + + tabPage6 + + + tabPageCoreType + + + True + + + 47 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + label12 + + + label2 + + + Auth user + + + True + + + 8, 28 + + + chksniffingEnabled + + + 2 + + + 174, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + groupBox1 + + + 5 + + + 18, 104 + + + tabPage2 + + + True + + + 282, 23 + + + 728, 427 + + + tabPage1 + + + System.Windows.Forms.GroupBox, 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 + + + 59, 12 + + + 10 + + + panel1 + + + 30 + + + 53, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 12 + + + label8 + + + 496, 27 + + + labCoreType4 + + + chkAutoRun + + + groupBox1 + + + 94, 21 + + + 4 + + + 10 + + + Core Type + + + 15, 129 + + + chkudpEnabled + + + 46 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 8, 17 label9 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 - + tabPage6 - - 8 + + 2 - - txtKcptti + + 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 + + 1 - - tabPage6 + + 12 - - 9 + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 84, 16 + + + 15 + + + True + + + Auth pass label7 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtlocalPort - + + 41 + + + tabPage7 + + + tabPage7 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + tabPage6 - + + True + + + btnClose + + + 124, 25 + + + protocol + + + 15, 192 + + + Turn on Mux Multiplexing + + + tabPageCoreType + + + 23, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 97, 20 + + + 638, 356 + + + socks + + + 3, 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkAllowLANConn + + + True + + + 117, 68 + + + 36 + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 63 + + + tabPage6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 - - txtKcpmtu + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 8 + + + System proxy settings + + + True + + + 89, 12 + + + NoControl + + + 5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkEnableStatistics + + + 97, 21 + + + 353, 12 + + + groupBox1 + + + cmbCoreType4 + + + 45, 46 + + + 193, 162 + + + tabPageCoreType + + + 2 + + + 107, 12 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage6 - - 11 + + 0, 0 - - label6 + + 234, 16 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 728, 427 + + + 728, 427 + + + 9 + + + groupBox1 + + + 0 + + + 101, 12 + + + 9 + + + groupBox1 + + + 143, 20 + + + 20 + + + cmbprotocol + + + groupBox2 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + 107, 12 + + + 0, 0, 0, 0 + + + 736, 453 tabPage6 - - 12 + + txtremoteDNS - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - - chkEnableSecurityProtocolTls13 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - chkEnableAutoAdjustMainLvColWidth - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 1 - - - btnSetLoopback - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - txtautoUpdateInterval - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - + 4 - - chkIgnoreGeoUpdateCore + + True - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 5 - - - chkKeepOlderDedupl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 6 - - - cbFreshrate + + txtsystemProxyExceptions System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 11 + + + System.Windows.Forms.Label, 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 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + System.Windows.Forms.Panel, 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 + + + True + + + 345, 62 + + + chkKeepOlderDedupl + + + True + + + 2 + + + Automatically adjust column width after updating subscription + + + True + + + True + + + 45 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 0 + + + 285, 25 + + + tabPage2 + + + tabPageCoreType + + + 117, 146 + + + 30, 376 + + + 11 + + + CoreType settings + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 40 + + + 15, 160 + + + Vertical + + + 38 + + + 33 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label1 + + + Core: KCP settings + + + cmbCoreType5 + + + error + + + True + + + 59, 12 + + + NoControl + + + 38 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 728, 427 + + + downlinkCapacity + + + tabControl1 + + + 736, 10 + + + 45, 124 + + + True + + + Core Type + + + True + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 345, 100 + + + 42 + + + 10 + + + 45, 98 + + + 44 + + + 224, 29 + + + 2 + + + tabPage6 + + + labCoreType3 + + + chkIgnoreGeoUpdateCore + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 40 + + + 161, 60 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkEnableAutoAdjustMainLvColWidth + + + True + + + 6 + + + groupBox2 + + + tabPageCoreType + + + panel2 + + + 39 + + + 8 + + + 35 + + + linkDnsObjectDoc + + tabPage7 - - 7 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - lbFreshrate - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPage7 - - 8 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - chkEnableStatistics + + Log level - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl1 - - tabPage7 + + 638, 219 - - 9 + + 7 - - chkAutoRun + + OptionSettingForm - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 14 - - tabPage7 + + txtuser + + + Core: basic settings + + + 120, 21 10 - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 3 - - - v2rayN settings - - - tabPage7 + + groupBox2 System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabControl1 - - - 3 - cmbCoreType6 - - System.Windows.Forms.ComboBox, 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 - - tabPageCoreType + + True - - 0 - - - labCoreType6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - + 1 - - cmbCoreType5 + + 397, 65 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 13 - - tabPageCoreType + + NoControl - - 2 + + 198, 16 - - labCoreType5 + + 8, 52 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 3 - - - cmbCoreType4 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 4 - - - labCoreType4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 5 - - - cmbCoreType3 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 6 - - - labCoreType3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 7 - - - cmbCoreType2 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 8 - - - labCoreType2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - + 9 - - cmbCoreType1 + + True - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage7 - - tabPageCoreType + + True - - 10 + + allowInsecure - - labCoreType1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 11 - - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 6 - - - CoreType settings - - - tabPageCoreType - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 4 - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage3 - - - 0 - - - 4, 22 - - - 728, 427 - - - 5 - - - System proxy settings - - - tabPage3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 5 - - - Fill - - - 0, 10 - - - 736, 453 - - - 10 - - - tabControl1 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - + True NoControl - - 342, 17 - - - 0, 0, 0, 0 - - - 107, 12 - - - 40 - - - Support DnsObject - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - 8, 41 - - - True - - - Vertical - - - 638, 356 - - - 39 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - + 1 - - True - - - NoControl - - - 8, 17 - - - 281, 12 - - - 38 - - - Custom DNS (multiple, separated by commas (,)) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 2 - - - 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 - - - 1 - - - True - - - 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 - - - 94, 21 - - - 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 + + True - - tti + + 4 - - label7 + + 8 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 41 - - tabPage6 + + Exception - - 10 + + 3, 3, 3, 3 - - 111, 24 + + 0 + + + chklogEnabled + + + 4, 22 + + + groupBox1 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 - - - 12 - - - 15, 187 - - - 506, 16 - - - 41 - - - Enable Security Protocol TLS v1.3 (subscription/update/speedtest) - - - chkEnableSecurityProtocolTls13 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - True - - - NoControl - - - 15, 165 - - - 390, 16 - - - 40 - - - Automatically adjust column width after updating subscription - - - chkEnableAutoAdjustMainLvColWidth - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 1 + + 3 NoControl - - 30, 376 - - - 282, 23 - - - 39 - - - Set Windows10 UWP Loopback - - - btnSetLoopback - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - 325, 132 - - - 97, 21 - - - 38 - - - txtautoUpdateInterval - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - True - - - NoControl - - - 30, 138 - - - 239, 12 - - - 37 - - - Automatic update interval of Geo(hours) - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 4 - - - True - - - NoControl - - - 15, 108 - - - 234, 16 - - - 36 - - - Ignore Geo files when updating core - - - chkIgnoreGeoUpdateCore - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 5 - - - True - - - NoControl - - - 15, 84 - - - 198, 16 - - - 33 - - - Keep older when deduplication - - - chkKeepOlderDedupl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 6 - - - 161, 60 - - - 58, 20 - - - 32 - - - cbFreshrate - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 7 - - - True - - - NoControl - - - 30, 64 - - - 125, 12 - - - 30 - - - Statistics freshrate - - - lbFreshrate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 8 - - - True - - - NoControl - - - 15, 40 - - - 576, 16 - - - 29 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - chkEnableStatistics - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 9 - - - True - - - 15, 16 - - - 246, 16 - - - 23 - - - Automatically start at system startup - - - chkAutoRun - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 10 - - - 117, 172 - - - 143, 20 - - - 46 - - - cmbCoreType6 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 0 - - - True - - - NoControl - - - 45, 176 - - - 59, 12 - - - 47 - - - Core Type - - - labCoreType6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 1 - - - 117, 146 - - - 143, 20 - - - 44 - - - cmbCoreType5 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 2 - - - True + + 117, 120 NoControl - - 45, 150 + + 204, 16 - - 59, 12 + + 4, 22 - - 45 + + 41 - - Core Type + + 94, 21 - - labCoreType5 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPageCoreType - - - 3 - - - 117, 120 - - - 143, 20 - - - 42 - - - cmbCoreType4 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 4 - - - True + + 0 NoControl - - 45, 124 - - - 59, 12 - - - 43 - - - Core Type - - - labCoreType4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 5 - - - 117, 94 - - - 143, 20 - - - 40 - cmbCoreType3 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 8, 41 - + + 143, 20 + + + tabPage1 + + + 3, 3, 3, 3 + + tabPageCoreType - - 6 - - - True - - - NoControl - - - 45, 98 - - - 59, 12 - - - 41 - - - Core Type - - - labCoreType3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 7 - - - 117, 68 - 143, 20 - - 38 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - cmbCoreType2 + + 0 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - tabPageCoreType + + mtu - - 8 + + 4, 22 - - True + + Listening port - + + 7 + + + False + + NoControl - - 45, 72 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + &OK + + + 10 + + + 1 + + + 94, 21 + + + txtKcpuplinkCapacity + + + tabPage2 + + 59, 12 - - 39 + + tabControl1 - - Core Type + + tabPage7 - - labCoreType2 + + labCoreType1 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + + + 4, 22 + + + $this + tabPageCoreType - - 9 + + 40 - - 117, 42 + + Automatic update interval of subscriptions and Geo (hours) - - 143, 20 + + 42 - - 36 + + http - - cmbCoreType1 + + 23 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + labCoreType6 - - tabPageCoreType + + 6 - - 10 + + 236, 66 - - True + + groupBox1 NoControl - - 45, 46 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + label13 + + + 1 + + + 6 + + + 8 + + + 59, 12 + + + tabPageCoreType + + + tabPageCoreType + + + 0, 463 + + + True + + + True + + + 3 + + + 117, 172 + + + 11 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 39 + + + 97, 21 + + + 31 + + + 397, 27 + + + 36 + + + 45, 72 + + + Fill + + + groupBox1 + + + 32 + + + 15, 108 + + + Core: DNS settings + + + 345, 24 + + + 143, 20 + + + cbFreshrate + + + 257, 158 + + + tabPageCoreType + + + 2 + + + 236, 104 + + + tabPage7 + + + 8 + + + 125, 12 + + + NoControl + + + cmbCoreType1 + + + 75, 23 + + + writeBufferSize + + + 10 + + + 4 + + + uplinkCapacity + + + 736, 523 + + + 143, 20 + + + txtKcpdownlinkCapacity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + Vertical + + + 6 + + + 7 + + + 2 + + + 390, 132 + + + Settings + + + 3 + + + tabPage7 + + + 6 + + + NoControl + + + label5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15, 187 + + + btnOK + + + 6 + + + NoControl + + + debug + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + chkmuxEnabled + + + none + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + 15, 84 + + + chkKcpcongestion + + + 224, 65 + + + labCoreType5 + + + 0, 0 + + + Enable UDP + + + 15, 40 + + 59, 12 37 - - Core Type + + 3, 3, 3, 3 - - labCoreType1 + + 9 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 126, 16 - - tabPageCoreType - - - 11 - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - txtsystemProxyExceptions - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - Fill - - - 0, 0 - - - 728, 427 - - - 42 - - - Exception - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage3 - - - 0 - - - True - - - NoControl - - - 6, 283 - - - 107, 12 - - - 42 - - - Use semicolon (;) - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 8, 28 - - - 317, 12 - - - 40 - - - Do not use proxy server for addresses beginning with - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - 8, 52 - - - True - - - Vertical - - - 638, 219 - - - 41 - - - txtsystemProxyExceptions - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 463 - - - 736, 60 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 + + 496, 61 267, 16 - + + groupBox1 + + 75, 23 - - 8 + + Do not use proxy server for addresses beginning with - - &OK + + 390, 16 - - btnOK + + 94, 21 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + readBufferSize + + + 2 + + + 0 + + + True + + + 342, 17 + + + 94, 21 + + + 3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 38 + + + 236, 28 + + + Bottom + + + 3 + + + 6 + + + 4 + + + 143, 20 + + + 3, 3, 3, 3 + + + panel2 + + + System.Windows.Forms.CheckBox, 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 + + + Core Type + + + label6 + + + 246, 16 + + + 506, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtKcpwriteBufferSize + + + 111, 24 panel2 - - 1 + + 4 - - Top + + NoControl - - 0, 0 + + 37 - - 736, 10 + + NoControl - - 9 + + 736, 60 - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 + + label14 True - - 6, 12 - - - 736, 523 - - - 4, 4, 4, 4 - - - Settings - - - OptionSettingForm - - - 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/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index e2b9ac60..f9cf4aea 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,6 +121,18 @@ 取消(&C) + + 662, 469 + + + 654, 443 + + + Core:基础设置 + + + 648, 437 + 53, 12 @@ -145,15 +157,6 @@ 传输层安全选tls时,默认跳过证书验证(allowInsecure) - - 468, 117 - - - 96, 16 - - - 开启流量探测 - 144, 16 @@ -175,39 +178,6 @@ 开启Mux多路复用 - - 15, 120 - - - 102, 16 - - - 本地监听端口2 - - - 369, 119 - - - 66, 16 - - - 开启UDP - - - 257, 117 - - - 206, 121 - - - 29, 12 - - - 协议 - - - 124, 117 - 219, 29 @@ -250,14 +220,11 @@ 本地监听端口 - - 648, 437 - - + 654, 443 - - Core:基础设置 + + Core:DNS设置 161, 12 @@ -271,18 +238,18 @@ 自定义DNS(可多个,用逗号(,)隔开) - - 654, 443 - - - Core:DNS设置 - 654, 443 Core:KCP设置 + + 654, 443 + + + v2rayN设置 + 启用安全协议TLS v1.3 (订阅/检查更新/测速) @@ -296,13 +263,13 @@ 解除Windows10 UWP应用回环代理限制 - 255, 156 + 274, 134 - 191, 12 + 227, 12 - 自动更新Geo文件的间隔(单位小时) + 自动更新订阅和Geo文件的间隔(单位小时) 150, 16 @@ -334,18 +301,24 @@ 开机自动启动(可能会不成功) - - 654, 443 - - - v2rayN设置 - 654, 443 Core类型设置 + + 654, 443 + + + 系统代理设置 + + + 654, 443 + + + 例外 + 95, 12 @@ -358,30 +331,15 @@ 对于下列字符开头的地址不使用代理服务器: - - 654, 443 - - - 例外 - - - 654, 443 - - - 系统代理设置 - - - 662, 469 - - - 确定(&O) - 0, 479 662, 60 + + 确定(&O) + 662, 10 diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index b30cf274..64df0711 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -218,6 +218,15 @@ namespace v2rayN.Handler } Utils.SaveLog("UpdateTaskRun"); + updateHandle.UpdateSubscriptionProcess(config, true, (bool success, string msg) => + { + update(success, msg); + if (success) + Utils.SaveLog("subscription" + msg); + }); + + Thread.Sleep(60000); + updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => { update(false, msg); @@ -225,8 +234,6 @@ namespace v2rayN.Handler Utils.SaveLog("geosite" + msg); }); - Thread.Sleep(60000); - updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) => { update(false, msg); From 1c5cc190c564b178c5af99a8c57d0c13c813947e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 11 Apr 2022 15:24:59 +0800 Subject: [PATCH 163/252] modify res --- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.resx | 2 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 21b9cfe5..6ef6f690 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -619,7 +619,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to get subscription content 的本地化字符串。 + /// 查找类似 Invalid subscription content 的本地化字符串。 /// internal static string MsgSubscriptionDecodingFailed { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 66b70aee..b2663072 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -268,7 +268,7 @@ Start updating PAC... - Failed to get subscription content + Invalid subscription content is unpacking... diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 80229395..e2898392 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -268,7 +268,7 @@ 开始更新 PAC... - 订阅内容获取失败 + 无效的订阅内容 正在解压...... From 815826c85688b0e8fdafc151ff176ba1c0a388f6 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 11 Apr 2022 15:26:32 +0800 Subject: [PATCH 164/252] Refactor download/update/speedtest --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 226 ++++++++++++++++ v2rayN/v2rayN/Base/WebClientEx.cs | 37 --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 23 +- v2rayN/v2rayN/Forms/MainForm.cs | 38 +-- v2rayN/v2rayN/Forms/MainForm.resx | 54 ++-- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 19 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 253 +++++++++--------- v2rayN/v2rayN/Handler/LazyConfig.cs | 7 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 89 +----- v2rayN/v2rayN/Handler/UpdateHandle.cs | 149 ++++------- v2rayN/v2rayN/Mode/CoreInfo.cs | 2 + v2rayN/v2rayN/v2rayN.csproj | 4 +- 12 files changed, 478 insertions(+), 423 deletions(-) create mode 100644 v2rayN/v2rayN/Base/HttpClientHelper.cs delete mode 100644 v2rayN/v2rayN/Base/WebClientEx.cs diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs new file mode 100644 index 00000000..2fa75a24 --- /dev/null +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace v2rayN.Base +{ + /// + /// + public class HttpClientHelper + { + private static HttpClientHelper httpClientHelper = null; + private HttpClient httpClient; + private int progressPercentage = -1; + + /// + /// + private HttpClientHelper() { } + + /// + /// + /// + public static HttpClientHelper GetInstance() + { + if (httpClientHelper != null) + { + return httpClientHelper; + } + else + { + HttpClientHelper httpClientHelper = new HttpClientHelper(); + + HttpClientHandler handler = new HttpClientHandler() { UseCookies = false }; + httpClientHelper.httpClient = new HttpClient(handler); + return httpClientHelper; + } + } + public async Task GetAsync(string url) + { + if (string.IsNullOrEmpty(url)) + { + return null; + } + try + { + HttpResponseMessage response = await httpClient.GetAsync(url); + + return await response.Content.ReadAsStringAsync(); + } + catch + { + } + return null; + } + public async Task GetAsync(HttpClient client, string url) + { + if (string.IsNullOrEmpty(url)) + { + return null; + } + try + { + var cts = new CancellationTokenSource(); + cts.CancelAfter(5000); + + HttpResponseMessage response = await client.GetAsync(url, cts.Token); + return await response.Content.ReadAsStringAsync(); + } + catch (Exception ex) + { + Utils.SaveLog("GetAsync", ex); + } + return null; + } + + public async Task PutAsync(string url, Dictionary headers) + { + var myContent = Utils.ToJson(headers); + var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); + var byteContent = new ByteArrayContent(buffer); + byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + + var result = await httpClient.PutAsync(url, byteContent); + } + + public async Task DownloadFileAsync(HttpClient client, string url, string fileName, IProgress progress, CancellationToken token) + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + if (string.IsNullOrEmpty(fileName)) + { + throw new ArgumentNullException("fileName"); + } + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + + var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); + + if (!response.IsSuccessStatusCode) + { + throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); + } + + var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; + var canReportProgress = total != -1 && progress != null; + + using (var stream = await response.Content.ReadAsStreamAsync()) + { + using (var file = File.Create(fileName)) + { + var totalRead = 0L; + var buffer = new byte[1024 * 1024]; + var isMoreToRead = true; + progressPercentage = -1; + + do + { + token.ThrowIfCancellationRequested(); + + var read = await stream.ReadAsync(buffer, 0, buffer.Length, token); + + if (read == 0) + { + isMoreToRead = false; + } + else + { + var data = new byte[read]; + buffer.ToList().CopyTo(0, data, 0, read); + + // TODO: put here the code to write the file to disk + file.Write(data, 0, read); + + totalRead += read; + + if (canReportProgress) + { + var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); + if (progressPercentage != percent && percent % 10 == 0) + { + progressPercentage = percent; + progress.Report(percent); + } + } + } + } while (isMoreToRead); + file.Close(); + if (canReportProgress) + { + progress.Report(101); + + } + } + } + } + + public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress progress, CancellationToken token) + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + + var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); + + if (!response.IsSuccessStatusCode) + { + throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); + } + + var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; + var canReportProgress = total != -1 && progress != null; + + using (var stream = await response.Content.ReadAsStreamAsync()) + { + var totalRead = 0L; + var buffer = new byte[1024 * 1024]; + var isMoreToRead = true; + progressPercentage = -1; + DateTime totalDatetime = DateTime.Now; + + do + { + token.ThrowIfCancellationRequested(); + + var read = await stream.ReadAsync(buffer, 0, buffer.Length, token); + + if (read == 0) + { + isMoreToRead = false; + } + else + { + var data = new byte[read]; + buffer.ToList().CopyTo(0, data, 0, read); + + // TODO: + totalRead += read; + + if (canReportProgress) + { + TimeSpan ts = (DateTime.Now - totalDatetime); + var speed = totalRead * 1d / ts.TotalMilliseconds / 1000; + var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); + if (progressPercentage != percent && percent % 5 == 0) + { + progressPercentage = percent; + progress.Report(speed); + } + } + } + } while (isMoreToRead); + } + } + + } +} diff --git a/v2rayN/v2rayN/Base/WebClientEx.cs b/v2rayN/v2rayN/Base/WebClientEx.cs deleted file mode 100644 index 096826cc..00000000 --- a/v2rayN/v2rayN/Base/WebClientEx.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Net; - -namespace v2rayN.Base -{ - class WebClientEx : WebClient - { - public int Timeout - { - get; set; - } - public WebClientEx(int timeout = 3000) - { - Timeout = timeout; - } - - protected override WebRequest GetWebRequest(Uri address) - { - HttpWebRequest request; - request = (HttpWebRequest)base.GetWebRequest(address); - request.Timeout = Timeout; - request.ReadWriteTimeout = Timeout; - //request.AllowAutoRedirect = false; - //request.AllowWriteStreamBuffering = true; - - request.ServicePoint.BindIPEndPointDelegate = (servicePoint, remoteEndPoint, retryCount) => - { - if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) - return new IPEndPoint(IPAddress.IPv6Any, 0); - else - return new IPEndPoint(IPAddress.Any, 0); - }; - - return request; - } - } -} diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 39988104..846d1ea9 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -126,8 +126,7 @@ this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateXrayCore = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.tsbCheckUpdateGeoSite = new System.Windows.Forms.ToolStripMenuItem(); - this.tsbCheckUpdateGeoIP = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateGeo = 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(); @@ -831,8 +830,7 @@ this.tsbCheckUpdateCore, this.tsbCheckUpdateXrayCore, this.toolStripSeparator15, - this.tsbCheckUpdateGeoSite, - this.tsbCheckUpdateGeoIP}); + this.tsbCheckUpdateGeo}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; @@ -860,17 +858,11 @@ this.toolStripSeparator15.Name = "toolStripSeparator15"; resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); // - // tsbCheckUpdateGeoSite + // tsbCheckUpdateGeo // - this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; - resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); - this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); - // - // tsbCheckUpdateGeoIP - // - this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; - resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); - this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); + this.tsbCheckUpdateGeo.Name = "tsbCheckUpdateGeo"; + resources.ApplyResources(this.tsbCheckUpdateGeo, "tsbCheckUpdateGeo"); + this.tsbCheckUpdateGeo.Click += new System.EventHandler(this.tsbCheckUpdateGeo_Click); // // toolStripSeparator10 // @@ -1071,8 +1063,7 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig; private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; - private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoSite; - private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeoIP; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeo; private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter; private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index ddb014c7..cee1f2aa 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -413,7 +413,7 @@ namespace v2rayN.Forms } private void lvServers_SelectedIndexChanged(object sender, EventArgs e) - { + { } private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) @@ -781,13 +781,12 @@ namespace v2rayN.Forms { if (GetLvSelectedIndex() < 0) return; ClearTestResult(); - SpeedtestHandler statistics = new SpeedtestHandler(ref config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); + SpeedtestHandler statistics = new SpeedtestHandler(config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); } private void tsbTestMe_Click(object sender, EventArgs e) { - SpeedtestHandler statistics = new SpeedtestHandler(ref config); - string result = statistics.RunAvailabilityCheck() + "ms"; + string result = (new DownloadHandle()).RunAvailabilityCheck(null) + "ms"; AppendText(false, string.Format(ResUI.TestMeOutput, result)); } @@ -1197,6 +1196,10 @@ namespace v2rayN.Forms lstVmess[k].testResult = txt; lvServers.Items[k].SubItems["testResult"].Text = txt; } + else + { + AppendText(false, txt); + } } private void SetTestResult(int k, string txt) { @@ -1248,7 +1251,7 @@ namespace v2rayN.Forms lvServers.EndUpdate(); }); } - + } catch (Exception ex) { @@ -1418,31 +1421,16 @@ namespace v2rayN.Forms (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); } - private void tsbCheckUpdateGeoSite_Click(object sender, EventArgs e) + private void tsbCheckUpdateGeo_Click(object sender, EventArgs e) { - (new UpdateHandle()).UpdateGeoFile("geosite", config, (bool success, string msg) => + Task.Run(() => { - AppendText(false, msg); - if (success) - { - Global.reloadV2ray = true; - _ = LoadV2ray(); - } + var updateHandle = new UpdateHandle(); + updateHandle.UpdateGeoFile("geosite", config, UpdateTaskHandler); + updateHandle.UpdateGeoFile("geoip", config, UpdateTaskHandler); }); } - private void tsbCheckUpdateGeoIP_Click(object sender, EventArgs e) - { - (new UpdateHandle()).UpdateGeoFile("geoip", config, (bool success, string msg) => - { - AppendText(false, msg); - if (success) - { - Global.reloadV2ray = true; - _ = LoadV2ray(); - } - }); - } #endregion #region Help diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index c096011a..d952d26b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -321,7 +321,7 @@ ImageAboveText - 356, 666 + 356, 644 cmsLv @@ -750,19 +750,19 @@ Do not change system proxy - 264, 22 + 277, 22 System proxy - 264, 22 + 277, 22 Routing - 264, 22 + 277, 22 Server @@ -780,43 +780,43 @@ Server - 261, 6 + 274, 6 - 264, 22 + 277, 22 Import bulk URL from clipboard - 264, 22 + 277, 22 Scan QR code on the screen - 264, 22 + 277, 22 Update subscription without proxy - 264, 22 + 277, 22 Update subscriptions via proxy - 261, 6 + 274, 6 - 264, 22 + 277, 22 Exit - 265, 221 + 278, 221 cmsMain @@ -861,19 +861,19 @@ 6, 56 - 182, 22 + 277, 22 Settings - 182, 22 + 277, 22 Update subscription without proxy - 182, 22 + 277, 22 Update subscription with proxy @@ -995,17 +995,11 @@ 200, 6 - + 203, 22 - - Update GeoSite - - - 203, 22 - - - Update GeoIP + + Update Geo files Magenta @@ -1619,16 +1613,10 @@ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbCheckUpdateGeoSite + + tsbCheckUpdateGeo - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateGeoIP - - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index 4db5d2fe..d7a7dc37 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; @@ -345,13 +346,17 @@ namespace v2rayN.Forms UI.Show(ResUI.MsgNeedUrl); return; } - DownloadHandle downloadHandle = new DownloadHandle(); - string clipboardData = downloadHandle.WebDownloadStringSync(url); - if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0) + + Task.Run(async () => { - RefreshRoutingsView(); - UI.Show(ResUI.OperationSuccess); - } + DownloadHandle downloadHandle = new DownloadHandle(); + string result = await downloadHandle.DownloadStringAsync(url, false, ""); + if (AddBatchRoutingRules(ref routingItem, result) == 0) + { + RefreshRoutingsView(); + UI.Show(ResUI.OperationSuccess); + } + }); } private int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) { @@ -363,8 +368,6 @@ namespace v2rayN.Forms return ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData, blReplace); } - - #endregion } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 5b84224f..398b2773 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -1,7 +1,12 @@ using System; +using System.Diagnostics; using System.IO; using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; using System.Text; +using System.Threading; +using System.Threading.Tasks; using v2rayN.Base; using v2rayN.Resx; @@ -29,97 +34,71 @@ namespace v2rayN.Handler } } - private int progressPercentage = -1; - private long totalBytesToReceive = 0; - private DateTime totalDatetime = new DateTime(); - private int DownloadTimeout = -1; - - public WebClientEx DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout) + public async Task DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout) { - WebClientEx ws = new WebClientEx(); try { Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); - progressPercentage = -1; - totalBytesToReceive = 0; - - //WebClientEx ws = new WebClientEx(); - DownloadTimeout = downloadTimeout; - if (webProxy != null) + var client = new HttpClient(new WebRequestHandler() { - ws.Proxy = webProxy;// new WebProxy(Global.Loopback, Global.httpPort); - } + Proxy = webProxy + }); - ws.DownloadFileCompleted += ws_DownloadFileCompleted; - ws.DownloadProgressChanged += ws_DownloadProgressChanged; - ws.DownloadFileAsync(new Uri(url), Utils.GetPath(Utils.GetDownloadFileName(url))); + var progress = new Progress(); + progress.ProgressChanged += (sender, value) => + { + if (UpdateCompleted != null) + { + string msg = string.Format("{0} M/s", value.ToString("#0.0")); + UpdateCompleted(this, new ResultEventArgs(false, msg)); + } + }; + + var cancellationToken = new CancellationTokenSource(); + cancellationToken.CancelAfter(downloadTimeout * 1000); + await HttpClientHelper.GetInstance().DownloadDataAsync4Speed(client, + url, + progress, + cancellationToken.Token); } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); - + //Utils.SaveLog(ex.Message, ex); Error?.Invoke(this, new ErrorEventArgs(ex)); } - return ws; + return 0; } - void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) - { - if (UpdateCompleted != null) - { - if (totalBytesToReceive == 0) - { - totalDatetime = DateTime.Now; - totalBytesToReceive = e.BytesReceived; - return; - } - totalBytesToReceive = e.BytesReceived; - - if (DownloadTimeout != -1) - { - if ((DateTime.Now - totalDatetime).TotalSeconds > DownloadTimeout) - { - ((WebClientEx)sender).CancelAsync(); - } - } - if (progressPercentage != e.ProgressPercentage && e.ProgressPercentage % 10 == 0) - { - progressPercentage = e.ProgressPercentage; - string msg = string.Format("...{0}%", e.ProgressPercentage); - UpdateCompleted(this, new ResultEventArgs(false, msg)); - } - } - } - void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) + public void DownloadFileAsync(string url, bool blProxy, int downloadTimeout) { try { - if (UpdateCompleted != null) - { - if (e.Cancelled) - { - ((WebClientEx)sender).Dispose(); - TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.0")); - UpdateCompleted(this, new ResultEventArgs(true, speed.PadLeft(8, ' '))); - return; - } + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); - if (e.Error == null - || Utils.IsNullOrEmpty(e.Error.ToString())) + var client = new HttpClient(new WebRequestHandler() + { + Proxy = GetWebProxy(blProxy) + }); + + var progress = new Progress(); + progress.ProgressChanged += (sender, value) => + { + if (UpdateCompleted != null) { - ((WebClientEx)sender).Dispose(); - TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.0")); - UpdateCompleted(this, new ResultEventArgs(true, speed.PadLeft(8, ' '))); + string msg = string.Format("...{0}%", value); + UpdateCompleted(this, new ResultEventArgs(value > 100 ? true : false, msg)); } - else - { - throw e.Error; - } - } + }; + + var cancellationToken = new CancellationTokenSource(); + _ = HttpClientHelper.GetInstance().DownloadFileAsync(client, + url, + Utils.GetPath(Utils.GetDownloadFileName(url)), + progress, + cancellationToken.Token); } catch (Exception ex) { @@ -129,115 +108,143 @@ namespace v2rayN.Handler } } + public async Task UrlRedirectAsync(string url, bool blProxy) + { + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); + WebRequestHandler webRequestHandler = new WebRequestHandler + { + AllowAutoRedirect = false, + Proxy = GetWebProxy(blProxy) + }; + HttpClient client = new HttpClient(webRequestHandler); + + HttpResponseMessage response = await client.GetAsync(url); + if (response.StatusCode.ToString() == "Redirect") + { + return response.Headers.Location.ToString(); + } + else + { + Utils.SaveLog("StatusCode error: " + url); + return null; + } + } + /// /// DownloadString /// /// - public void WebDownloadString(string url, WebProxy webProxy, string userAgent) + public async Task DownloadStringAsync(string url, bool blProxy, string userAgent) { - string source = string.Empty; try { Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); - - WebClientEx ws = new WebClientEx(); - ws.Encoding = Encoding.UTF8; - if (webProxy != null) + var client = new HttpClient(new WebRequestHandler() { - ws.Proxy = webProxy; - } + Proxy = GetWebProxy(blProxy) + }); if (Utils.IsNullOrEmpty(userAgent)) { userAgent = $"{Utils.GetVersion(false)}"; } - ws.Headers.Add("user-agent", userAgent); + client.DefaultRequestHeaders.UserAgent.TryParseAdd(userAgent); Uri uri = new Uri(url); //Authorization Header if (!Utils.IsNullOrEmpty(uri.UserInfo)) { - ws.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo)); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo)); } - - ws.DownloadStringCompleted += Ws_DownloadStringCompleted; - ws.DownloadStringAsync(uri); + var result = await HttpClientHelper.GetInstance().GetAsync(client, url); + return result; } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); } + return null; } - private void Ws_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + public int RunAvailabilityCheck(WebProxy webProxy) { try { - if (e.Error == null - || Utils.IsNullOrEmpty(e.Error.ToString())) + if (webProxy == null) { - string source = e.Result; - UpdateCompleted?.Invoke(this, new ResultEventArgs(true, source)); + var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2); + webProxy = new WebProxy(Global.Loopback, httpPort); } - else + + Task t = Task.Run(() => { - throw e.Error; - } + try + { + string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out int 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); - - Error?.Invoke(this, new ErrorEventArgs(ex)); + return -1; } } - public string WebDownloadStringSync(string url) + public string GetRealPingTime(string url, WebProxy webProxy, out int responseTime) { - string source = string.Empty; + string msg = string.Empty; + responseTime = -1; try { - Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); + HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); + myHttpWebRequest.Timeout = 5000; + myHttpWebRequest.Proxy = webProxy; - WebClientEx ws = new WebClientEx(); - ws.Encoding = Encoding.UTF8; - return ws.DownloadString(new Uri(url)); + Stopwatch timer = new Stopwatch(); + timer.Start(); + + HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); + if (myHttpWebResponse.StatusCode != HttpStatusCode.OK + && myHttpWebResponse.StatusCode != HttpStatusCode.NoContent) + { + msg = myHttpWebResponse.StatusDescription; + } + timer.Stop(); + responseTime = timer.Elapsed.Milliseconds; + + myHttpWebResponse.Close(); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - return string.Empty; + msg = ex.Message; } + return msg; } - public WebClientEx DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout) + private WebProxy GetWebProxy(bool blProxy) { - WebClientEx ws = new WebClientEx(); - try + if (!blProxy) { - Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); - UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); - - progressPercentage = -1; - totalBytesToReceive = 0; - - DownloadTimeout = downloadTimeout; - if (webProxy != null) - { - ws.Proxy = webProxy; - } - - ws.DownloadProgressChanged += ws_DownloadProgressChanged; - ws.DownloadDataCompleted += ws_DownloadFileCompleted; - ws.DownloadDataAsync(new Uri(url)); + return null; } - catch (Exception ex) + var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2); + var webProxy = new WebProxy(Global.Loopback, httpPort); + if (RunAvailabilityCheck(webProxy) > 0) { - Utils.SaveLog(ex.Message, ex); - - Error?.Invoke(this, new ErrorEventArgs(ex)); + return webProxy; } - return ws; + + return null; } } } diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index ceccc7f3..98b65c51 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -71,8 +71,8 @@ namespace v2rayN.Handler coreType = ECoreType.v2fly, coreExes = new List { "wv2ray", "v2ray" }, arguments = "", - coreUrl = Global.v2flyCoreUrl - + coreUrl = Global.v2flyCoreUrl, + match = "V2Ray" }); coreInfos.Add(new CoreInfo @@ -80,7 +80,8 @@ namespace v2rayN.Handler coreType = ECoreType.Xray, coreExes = new List { "xray" }, arguments = "", - coreUrl = Global.xrayCoreUrl + coreUrl = Global.xrayCoreUrl, + match = "Xray" }); coreInfos.Add(new CoreInfo diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index c1ea28cf..39199ef8 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -17,12 +17,12 @@ namespace v2rayN.Handler private List _selecteds; Action _updateFunc; - public SpeedtestHandler(ref Config config) + public SpeedtestHandler(Config config) { _config = config; } - public SpeedtestHandler(ref Config config, V2rayHandler v2rayHandler, List selecteds, ESpeedActionType actionType, Action update) + public SpeedtestHandler(Config config, V2rayHandler v2rayHandler, List selecteds, ESpeedActionType actionType, Action update) { _config = config; _v2rayHandler = v2rayHandler; @@ -55,7 +55,7 @@ namespace v2rayN.Handler } else if (actionType == ESpeedActionType.Speedtest) { - Task.Run(() => RunSpeedTest()); + Task.Run(() => RunSpeedTestAsync()); } } @@ -71,7 +71,7 @@ namespace v2rayN.Handler } try { - updateFun(it); + Task.Run(() => updateFun(it)); } catch (Exception ex) { @@ -122,6 +122,7 @@ namespace v2rayN.Handler return; } + DownloadHandle downloadHandle = new DownloadHandle(); //Thread.Sleep(5000); List tasks = new List(); foreach (var it in _selecteds) @@ -140,7 +141,7 @@ namespace v2rayN.Handler { WebProxy webProxy = new WebProxy(Global.Loopback, it.port); int responseTime = -1; - string status = GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); + string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; _config.GetVmessItem(it.indexId)?.SetTestResult(output); @@ -165,38 +166,7 @@ namespace v2rayN.Handler } } - public int RunAvailabilityCheck() // alias: isLive - { - try - { - int httpPort = _config.GetLocalPort(Global.InboundHttp2); - - Task t = Task.Run(() => - { - try - { - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); - int responseTime = -1; - string status = GetRealPingTime(Global.SpeedPingTestUrl, 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() + private async Task RunSpeedTestAsync() { string testIndexId = string.Empty; int pid = -1; @@ -217,10 +187,10 @@ namespace v2rayN.Handler }; downloadHandle2.Error += (sender2, args) => { - _updateFunc(testIndexId, args.GetException().Message); + _updateFunc("", args.GetException().Message); }; - var timeout = 10; + var timeout = 8; foreach (var it in _selecteds) { if (!it.allowTest) @@ -235,15 +205,9 @@ namespace v2rayN.Handler if (_config.FindIndexId(it.indexId) < 0) continue; WebProxy webProxy = new WebProxy(Global.Loopback, it.port); - var ws = downloadHandle2.DownloadDataAsync(url, webProxy, timeout - 2); - - Thread.Sleep(1000 * timeout); - - ws.CancelAsync(); - ws.Dispose(); - - Thread.Sleep(1000 * 2); + await downloadHandle2.DownloadDataAsync(url, webProxy, timeout); } + if (pid > 0) _v2rayHandler.V2rayStopPid(pid); } @@ -282,37 +246,6 @@ namespace v2rayN.Handler return responseTime; } - private string GetRealPingTime(string url, WebProxy webProxy, out int responseTime) - { - 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); - - Stopwatch timer = new Stopwatch(); - timer.Start(); - - HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); - if (myHttpWebResponse.StatusCode != HttpStatusCode.OK - && myHttpWebResponse.StatusCode != HttpStatusCode.NoContent) - { - msg = myHttpWebResponse.StatusDescription; - } - timer.Stop(); - responseTime = timer.Elapsed.Milliseconds; - - myHttpWebResponse.Close(); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - msg = ex.Message; - } - return msg; - } private string FormatOut(object time, string unit) { if (time.ToString().Equals("-1")) diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 8e318d04..7eefe540 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -1,10 +1,9 @@ using System; 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 System.Windows.Forms; using v2rayN.Base; using v2rayN.Mode; @@ -177,67 +176,49 @@ namespace v2rayN.Handler return; } - for (int k = 1; k <= config.subItem.Count; k++) + Task.Run(async () => { - string id = config.subItem[k - 1].id.TrimEx(); - string url = config.subItem[k - 1].url.TrimEx(); - string userAgent = config.subItem[k - 1].userAgent.TrimEx(); - string groupId = config.subItem[k - 1].groupId.TrimEx(); - string hashCode = $"{k}){config.subItem[k - 1].remarks}->"; - if (config.subItem[k - 1].enabled == false) + foreach (var item in config.subItem) { - continue; - } - if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) - { - _updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); - continue; - } - - DownloadHandle downloadHandle3 = new DownloadHandle(); - downloadHandle3.UpdateCompleted += (sender2, args) => - { - if (args.Success) + if (item.enabled == false) { - _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); - //string result = Utils.Base64Decode(args.Msg); - string result = args.Msg; - if (Utils.IsNullOrEmpty(result)) - { - _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); - return; - } + continue; + } + string id = item.id.TrimEx(); + string url = item.url.TrimEx(); + string userAgent = item.userAgent.TrimEx(); + string groupId = item.groupId.TrimEx(); + string hashCode = $"{item.remarks}->"; + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) + { + //_updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); + continue; + } - //ConfigHandler.RemoveServerViaSubid(ref config, id); - //_updateFunc(false, $"{hashCode}{ResUI.MsgClearSubscription")}"); - // RefreshServers(); + _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); + var result = await (new DownloadHandle()).DownloadStringAsync(url, blProxy, userAgent); + + _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); + if (Utils.IsNullOrEmpty(result)) + { + _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); + } + else + { int ret = ConfigHandler.AddBatchServers(ref config, result, id, groupId); if (ret > 0) { - // RefreshServers(); + _updateFunc(false, $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}"); } else { _updateFunc(false, $"{hashCode}{ResUI.MsgFailedImportSubscription}"); } - _updateFunc(true, $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}"); } - else - { - _updateFunc(false, args.Msg); - } - }; - downloadHandle3.Error += (sender2, args) => - { - _updateFunc(false, args.GetException().Message); - }; - - WebProxy webProxy = blProxy ? new WebProxy(Global.Loopback, _config.GetLocalPort(Global.InboundHttp2)) : null; - downloadHandle3.WebDownloadString(url, webProxy, userAgent); - - _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); - } - + _updateFunc(false, $"-------------------------------------------------------"); + } + _updateFunc(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); + }); } @@ -269,8 +250,8 @@ namespace v2rayN.Handler File.Delete(targetPath); } File.Move(fileName, targetPath); - _updateFunc(true, ""); - } + //_updateFunc(true, ""); + } } catch (Exception ex) { @@ -287,8 +268,8 @@ namespace v2rayN.Handler _updateFunc(false, args.GetException().Message); }; } - askToDownload(downloadHandle, url, false); + } #region private @@ -297,19 +278,6 @@ namespace v2rayN.Handler { try { - Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); - WebRequestHandler webRequestHandler = new WebRequestHandler - { - AllowAutoRedirect = false - }; - if (httpProxyTest() > 0) - { - int httpPort = _config.GetLocalPort(Global.InboundHttp2); - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); - webRequestHandler.Proxy = webProxy; - } - HttpClient httpClient = new HttpClient(webRequestHandler); - string url; if (type == ECoreType.v2fly) { @@ -327,10 +295,11 @@ namespace v2rayN.Handler { throw new ArgumentException("Type"); } - HttpResponseMessage response = await httpClient.GetAsync(url); - if (response.StatusCode.ToString() == "Redirect") + + var result = await (new DownloadHandle()).UrlRedirectAsync(url, true); + if (!Utils.IsNullOrEmpty(result)) { - responseHandler(type, response.Headers.Location.ToString()); + responseHandler(type, result); } else { @@ -352,19 +321,20 @@ namespace v2rayN.Handler { try { - var core = string.Empty; - var match = string.Empty; - if (type == ECoreType.v2fly) + + var coreInfo = LazyConfig.Instance.GetCoreInfo(type); + string filePath = string.Empty; + foreach (string name in coreInfo.coreExes) { - core = "v2ray.exe"; - match = "V2Ray"; + string vName = string.Format("{0}.exe", name); + vName = Utils.GetPath(vName); + if (File.Exists(vName)) + { + filePath = vName; + break; + } } - else if (type == ECoreType.Xray) - { - core = "xray.exe"; - match = "Xray"; - } - string filePath = Utils.GetPath(core); + if (!File.Exists(filePath)) { string msg = string.Format(ResUI.NotFoundCore, @""); @@ -383,7 +353,7 @@ namespace v2rayN.Handler p.Start(); p.WaitForExit(5000); string echo = p.StandardOutput.ReadToEnd(); - string version = Regex.Match(echo, $"{match} ([0-9.]+) \\(").Groups[1].Value; + string version = Regex.Match(echo, $"{coreInfo.match} ([0-9.]+) \\(").Groups[1].Value; return version; } catch (Exception ex) @@ -458,24 +428,9 @@ namespace v2rayN.Handler } if (blDownload) { - if (httpProxyTest() > 0) - { - int httpPort = _config.GetLocalPort(Global.InboundHttp2); - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); - downloadHandle.DownloadFileAsync(url, webProxy, 600); - } - else - { - downloadHandle.DownloadFileAsync(url, null, 600); - } + downloadHandle.DownloadFileAsync(url, true, 600); } } - - private int httpProxyTest() - { - SpeedtestHandler statistics = new SpeedtestHandler(ref _config); - return statistics.RunAvailabilityCheck(); - } #endregion } } diff --git a/v2rayN/v2rayN/Mode/CoreInfo.cs b/v2rayN/v2rayN/Mode/CoreInfo.cs index 2d66b121..8b2726b2 100644 --- a/v2rayN/v2rayN/Mode/CoreInfo.cs +++ b/v2rayN/v2rayN/Mode/CoreInfo.cs @@ -13,5 +13,7 @@ namespace v2rayN.Mode public string arguments { get; set; } public string coreUrl { get; set; } + + public string match { get; set; } } } diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 403a5db0..9cd35aed 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -99,6 +99,7 @@ + Component @@ -195,9 +196,6 @@ - - Component - From e95b5e04c026d01fe1b7058f16445daeff903a1e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 11 Apr 2022 19:16:35 +0800 Subject: [PATCH 165/252] remove expired tls --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 6 +++--- v2rayN/v2rayN/Tool/Utils.cs | 9 ++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index 2fa75a24..e5de5ad2 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -183,7 +183,7 @@ namespace v2rayN.Base using (var stream = await response.Content.ReadAsStreamAsync()) { var totalRead = 0L; - var buffer = new byte[1024 * 1024]; + var buffer = new byte[1024 * 128]; var isMoreToRead = true; progressPercentage = -1; DateTime totalDatetime = DateTime.Now; @@ -211,14 +211,14 @@ namespace v2rayN.Base TimeSpan ts = (DateTime.Now - totalDatetime); var speed = totalRead * 1d / ts.TotalMilliseconds / 1000; var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); - if (progressPercentage != percent && percent % 5 == 0) + if (progressPercentage != percent && percent % 2 == 1) { progressPercentage = percent; progress.Report(speed); } } } - } while (isMoreToRead); + } while (isMoreToRead); } } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index a3c11f79..76922378 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -753,16 +753,11 @@ namespace v2rayN { if (enableSecurityProtocolTls13) { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls - | SecurityProtocolType.Tls11 - | SecurityProtocolType.Tls12 - | SecurityProtocolType.Tls13; + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; } else { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls - | SecurityProtocolType.Tls11 - | SecurityProtocolType.Tls12; + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; } ServicePointManager.DefaultConnectionLimit = 256; } From 024040163aab9b079f789525d47e3b357e681597 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 11 Apr 2022 19:16:52 +0800 Subject: [PATCH 166/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 992d47ca..649fa241 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.12")] +[assembly: AssemblyFileVersion("5.13")] From fde1c98dddb663499f1df8dab1127dc9dea19d82 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 13:37:41 +0800 Subject: [PATCH 167/252] add group sort --- .../Forms/GroupSettingControl.Designer.cs | 21 +- v2rayN/v2rayN/Forms/GroupSettingControl.cs | 2 + v2rayN/v2rayN/Forms/GroupSettingControl.resx | 203 +++++++++++------- .../Forms/GroupSettingControl.zh-Hans.resx | 3 + v2rayN/v2rayN/Forms/MainForm.cs | 27 ++- v2rayN/v2rayN/Mode/Config.cs | 34 ++- 6 files changed, 193 insertions(+), 97 deletions(-) diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs index 239057e5..9dfcc635 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs @@ -33,15 +33,20 @@ this.btnRemove = new System.Windows.Forms.Button(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); + this.numSort = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); this.grbMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numSort)).BeginInit(); this.SuspendLayout(); // // grbMain // - resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.label1); + this.grbMain.Controls.Add(this.numSort); this.grbMain.Controls.Add(this.btnRemove); this.grbMain.Controls.Add(this.txtRemarks); this.grbMain.Controls.Add(this.label2); + resources.ApplyResources(this.grbMain, "grbMain"); this.grbMain.Name = "grbMain"; this.grbMain.TabStop = false; // @@ -63,6 +68,17 @@ resources.ApplyResources(this.label2, "label2"); this.label2.Name = "label2"; // + // numSort + // + resources.ApplyResources(this.numSort, "numSort"); + this.numSort.Name = "numSort"; + this.numSort.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // // GroupSettingControl // resources.ApplyResources(this, "$this"); @@ -72,6 +88,7 @@ this.Load += new System.EventHandler(this.GroupSettingControl_Load); this.grbMain.ResumeLayout(false); this.grbMain.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numSort)).EndInit(); this.ResumeLayout(false); } @@ -82,5 +99,7 @@ private System.Windows.Forms.TextBox txtRemarks; private System.Windows.Forms.Label label2; private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown numSort; } } diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.cs index ac10087a..a3fcbf27 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingControl.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.cs @@ -32,6 +32,7 @@ namespace v2rayN.Forms if (groupItem != null) { txtRemarks.Text = groupItem.remarks.ToString(); + numSort.Value = groupItem.sort; } } private void EndBindingSub() @@ -39,6 +40,7 @@ namespace v2rayN.Forms if (groupItem != null) { groupItem.remarks = txtRemarks.Text.TrimEx(); + groupItem.sort = Convert.ToInt32(numSort.Value); } } private void txtRemarks_Leave(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.resx index c8761f6e..75f7057e 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingControl.resx +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.resx @@ -118,126 +118,177 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 10 + + True + + + + NoControl - - 6, 12 + + 12, 61 - + + 71, 12 + + + 26 + + + Sort number + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + 0 - - 292, 21 + + 127, 57 + + + 120, 21 + + + 25 + + + numSort + + + System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 1 + + + NoControl 525, 21 - - 127, 21 - - - grbMain - - - 12, 25 + + 75, 23 24 - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Remove - - GroupSettingControl - - - grbMain + + btnRemove System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + grbMain - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 2 + + 127, 21 + + + 292, 21 + + + 1 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 3 + + + True + + + NoControl + + + 12, 25 + + + 47, 12 + + + 10 + + + Remarks + label2 - - 75, 23 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 4 + + + Fill 0, 0 - 619, 61 + 619, 91 - - Remarks - - - grbMain + + 10 Group details - - - NoControl - - - 1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 47, 12 - - - txtRemarks - - - 0 - - - btnRemove - - - Fill - - - 10 - - - True - - - NoControl + + grbMain System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 - $this - - 619, 61 - - - Remove + + 0 True + + 6, 12 + + + 619, 91 + + + GroupSettingControl + + + 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/GroupSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx index c68bf863..34dd0092 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx @@ -130,4 +130,7 @@ 分组详情 + + 排序编号 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index cee1f2aa..c62c5956 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -83,12 +83,12 @@ namespace v2rayN.Forms RefreshRoutingsMenu(); RestoreUI(); - _ = LoadV2ray(); - HideForm(); MainFormHandler.Instance.UpdateTask(config, UpdateTaskHandler); MainFormHandler.Instance.RegisterGlobalHotkey(config, OnHotkeyHandler, UpdateTaskHandler); + + _ = LoadV2ray(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) @@ -472,7 +472,7 @@ namespace v2rayN.Forms tabPage.Name = ""; tabGroup.TabPages.Add(tabPage); - foreach (var item in config.groupItem) + foreach (var item in config.groupItem.OrderBy(t => t.sort)) { var tabPage2 = new TabPage($" {item.remarks} "); tabPage2.Name = item.id; @@ -539,13 +539,15 @@ namespace v2rayN.Forms #endregion #region v2ray 操作 - /// /// 载入V2ray /// async Task LoadV2ray() { - tsbReload.Enabled = false; + this.BeginInvoke(new Action(() => + { + tsbReload.Enabled = false; + })); if (Global.reloadV2ray) { @@ -562,7 +564,10 @@ namespace v2rayN.Forms ChangePACButtonStatus(config.sysProxyType); - tsbReload.Enabled = true; + this.BeginInvoke(new Action(() => + { + tsbReload.Enabled = true; + })); } /// @@ -881,9 +886,9 @@ namespace v2rayN.Forms var fm = new GlobalHotkeySettingForm(); if (fm.ShowDialog() == DialogResult.OK) { - RefreshRoutingsMenu(); - RefreshServers(); - _ = LoadV2ray(); + //RefreshRoutingsMenu(); + //RefreshServers(); + //_ = LoadV2ray(); } } @@ -1259,13 +1264,13 @@ namespace v2rayN.Forms } } - private void UpdateTaskHandler(bool success, string msg) + private async void UpdateTaskHandler(bool success, string msg) { AppendText(false, msg); if (success) { Global.reloadV2ray = true; - _ = LoadV2ray(); + await LoadV2ray(); } } #endregion diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 40236fcf..e99e7be3 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -341,19 +341,31 @@ namespace v2rayN.Mode { return subRemarks; } - foreach (SubItem sub in config.subItem) - { - if (sub.id.EndsWith(subid)) - { - return sub.remarks; - } - } if (subid.Length <= 4) { return subid; } + var sub = config.subItem.FirstOrDefault(t => t.id == subid); + if (sub != null) + { + return sub.remarks; + } return subid.Substring(0, 4); } + public string GetGroupRemarks(Config config) + { + string subRemarks = string.Empty; + if (Utils.IsNullOrEmpty(groupId)) + { + return subRemarks; + } + var group = config.groupItem.FirstOrDefault(t => t.id == groupId); + if (group != null) + { + return group.remarks; + } + return groupId.Substring(0, 4); + } public List GetAlpn() { @@ -578,9 +590,9 @@ namespace v2rayN.Mode public bool sniffingEnabled { get; set; } = true; public bool allowLANConn { get; set; } - + public string user { get; set; } - + public string pass { get; set; } } @@ -763,6 +775,10 @@ namespace v2rayN.Mode { get; set; } + public int sort + { + get; set; + } } From 785ebc49fc410583a588e510cce2a53fb6995564 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 13:38:10 +0800 Subject: [PATCH 168/252] fix clash port --- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 74610cf3..2f1eb59a 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -957,7 +957,7 @@ namespace v2rayN.Handler case ECoreType.Xray: break; case ECoreType.clash: - fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}"); + fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2)}"); fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}"); break; } From a3aa6c045f5b344c8e8b731348fa65c2646eeb92 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 13:38:42 +0800 Subject: [PATCH 169/252] Improve speed test --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 21 +++++++++++++++------ v2rayN/v2rayN/Handler/DownloadHandle.cs | 2 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 +++++++++ v2rayN/v2rayN/Resx/ResUI.resx | 3 +++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 +++ 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index e5de5ad2..0e17d5ca 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -16,7 +16,6 @@ namespace v2rayN.Base { private static HttpClientHelper httpClientHelper = null; private HttpClient httpClient; - private int progressPercentage = -1; /// /// @@ -120,7 +119,7 @@ namespace v2rayN.Base var totalRead = 0L; var buffer = new byte[1024 * 1024]; var isMoreToRead = true; - progressPercentage = -1; + var progressPercentage = 0; do { @@ -183,14 +182,24 @@ namespace v2rayN.Base using (var stream = await response.Content.ReadAsStreamAsync()) { var totalRead = 0L; - var buffer = new byte[1024 * 128]; + var buffer = new byte[1024 * 64]; var isMoreToRead = true; - progressPercentage = -1; + var progressPercentage = 0; DateTime totalDatetime = DateTime.Now; do { - token.ThrowIfCancellationRequested(); + if (token.IsCancellationRequested) + { + if (totalRead > 0) + { + return; + } + else + { + token.ThrowIfCancellationRequested(); + } + } var read = await stream.ReadAsync(buffer, 0, buffer.Length, token); @@ -211,7 +220,7 @@ namespace v2rayN.Base TimeSpan ts = (DateTime.Now - totalDatetime); var speed = totalRead * 1d / ts.TotalMilliseconds / 1000; var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); - if (progressPercentage != percent && percent % 2 == 1) + if (progressPercentage != percent) { progressPercentage = percent; progress.Report(speed); diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 398b2773..131fadf5 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -39,7 +39,7 @@ namespace v2rayN.Handler try { Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); - UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Speedtesting)); var client = new HttpClient(new WebRequestHandler() { diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 39199ef8..23e3f370 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -187,7 +187,7 @@ namespace v2rayN.Handler }; downloadHandle2.Error += (sender2, args) => { - _updateFunc("", args.GetException().Message); + _updateFunc(testIndexId, args.GetException().Message); }; var timeout = 8; diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 6ef6f690..f3fcaace 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -879,6 +879,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Speed Test... 的本地化字符串。 + /// + internal static string Speedtesting { + get { + return ResourceManager.GetString("Speedtesting", resourceCulture); + } + } + /// /// 查找类似 PAC failed to start. Run it with Admin right. 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index b2663072..9a4c256f 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -457,4 +457,7 @@ System proxy + + Speed Test... + \ 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 e2898392..38e342e9 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -457,4 +457,7 @@ 系统代理 + + 测速中... + \ No newline at end of file From d7dc0dff507dfae720ae1665af40acf3640c02b7 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 14:49:57 +0800 Subject: [PATCH 170/252] Adjusting the tray server display --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 11 ----- v2rayN/v2rayN/Forms/MainForm.cs | 62 ++++++++---------------- v2rayN/v2rayN/Forms/MainForm.resx | 20 +------- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 ++++ v2rayN/v2rayN/Resx/ResUI.resx | 3 ++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 ++ 6 files changed, 35 insertions(+), 73 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 846d1ea9..dec8f338 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -94,7 +94,6 @@ this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); this.menuRoutings = new System.Windows.Forms.ToolStripMenuItem(); this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); - this.menuServers2 = new System.Windows.Forms.ToolStripComboBox(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); @@ -585,7 +584,6 @@ this.menuSysAgentMode, this.menuRoutings, this.menuServers, - this.menuServers2, this.toolStripSeparator13, this.menuAddServers2, this.menuScanScreen2, @@ -635,14 +633,6 @@ this.menuServers.Name = "menuServers"; resources.ApplyResources(this.menuServers, "menuServers"); // - // menuServers2 - // - this.menuServers2.BackColor = System.Drawing.SystemColors.Window; - this.menuServers2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.menuServers2.DropDownWidth = 500; - resources.ApplyResources(this.menuServers2, "menuServers2"); - this.menuServers2.Name = "menuServers2"; - // // toolStripSeparator13 // this.toolStripSeparator13.Name = "toolStripSeparator13"; @@ -1069,7 +1059,6 @@ private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; - private System.Windows.Forms.ToolStripComboBox menuServers2; private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy; private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index c62c5956..7be1edfb 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -347,56 +347,32 @@ namespace v2rayN.Forms private void RefreshServersMenu() { menuServers.DropDownItems.Clear(); - menuServers2.SelectedIndexChanged -= MenuServers2_SelectedIndexChanged; - menuServers2.Items.Clear(); - menuServers.Visible = false; - menuServers2.Visible = false; - if (lstVmess.Count > 20) + if (lstVmess.Count > 30) { - for (int k = 0; k < lstVmess.Count; k++) - { - VmessItem item = lstVmess[k]; - string name = item.GetSummary(); - - if (config.IsActiveNode(item)) - { - name = $"√ {name}"; - } - menuServers2.Items.Add(name); - - } - menuServers2.SelectedIndex = lstVmess.FindIndex(it => it.indexId == config.indexId); - menuServers2.SelectedIndexChanged += MenuServers2_SelectedIndexChanged; - menuServers2.Visible = true; + menuServers.DropDownItems.Add(new ToolStripMenuItem(ResUI.TooManyServersTip)); + return; } - else + + List lst = new List(); + for (int k = 0; k < lstVmess.Count; k++) { - List lst = new List(); - for (int k = 0; k < lstVmess.Count; k++) + VmessItem item = lstVmess[k]; + string name = item.GetSummary(); + + ToolStripMenuItem ts = new ToolStripMenuItem(name) { - VmessItem item = lstVmess[k]; - string name = item.GetSummary(); - - ToolStripMenuItem ts = new ToolStripMenuItem(name) - { - Tag = k - }; - if (config.IsActiveNode(item)) - { - ts.Checked = true; - } - ts.Click += new EventHandler(ts_Click); - lst.Add(ts); + Tag = k + }; + if (config.IsActiveNode(item)) + { + ts.Checked = true; } - menuServers.DropDownItems.AddRange(lst.ToArray()); - menuServers.Visible = true; + ts.Click += new EventHandler(ts_Click); + lst.Add(ts); } - } - - private void MenuServers2_SelectedIndexChanged(object sender, EventArgs e) - { - SetDefaultServer(((ToolStripComboBox)sender).SelectedIndex); + menuServers.DropDownItems.AddRange(lst.ToArray()); + menuServers.Visible = true; } private void ts_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index d952d26b..4e86cc37 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -767,18 +767,6 @@ Server - - Standard - - - 50 - - - 200, 25 - - - Server - 274, 6 @@ -816,7 +804,7 @@ Exit - 278, 221 + 278, 192 cmsMain @@ -1433,12 +1421,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuServers2 - - - System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - toolStripSeparator13 diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index f3fcaace..f437c794 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -961,6 +961,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Too many servers, please open the main interface 的本地化字符串。 + /// + internal static string TooManyServersTip { + get { + return ResourceManager.GetString("TooManyServersTip", resourceCulture); + } + } + /// /// 查找类似 *tcp camouflage type 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 9a4c256f..26122beb 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -460,4 +460,7 @@ Speed Test... + + Too many servers, please open the main interface + \ 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 38e342e9..aa5b8dd2 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -460,4 +460,7 @@ 测速中... + + 服务器太多,请打开主界面操作 + \ No newline at end of file From 978975ee2d9bdc820e131afd0d2df1675f2482cd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 16:58:09 +0800 Subject: [PATCH 171/252] update package --- v2rayN/v2rayN/Handler/DownloadHandle.cs | 2 +- v2rayN/v2rayN/v2rayN.csproj | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 131fadf5..686f42a6 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -51,7 +51,7 @@ namespace v2rayN.Handler { if (UpdateCompleted != null) { - string msg = string.Format("{0} M/s", value.ToString("#0.0")); + string msg = string.Format("{0} M/s", value.ToString("#0.0")).PadLeft(9, ' '); UpdateCompleted(this, new ResultEventArgs(false, msg)); } }; diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 9cd35aed..7d6cb61b 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -472,13 +472,13 @@ - 3.19.4 + 3.20.0 - 2.44.0 + 2.45.0 - 2.44.0 + 2.45.0 runtime; build; native; contentfiles; analyzers; buildtransitive all From 73c79ca7bff4d6634ccd6c84103aa2acba24264f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 16:58:31 +0800 Subject: [PATCH 172/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 649fa241..f56536ef 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.13")] +[assembly: AssemblyFileVersion("5.14")] From 38c739c45dd40d598c2a2f639f53a3f7298f4c27 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 12 Apr 2022 20:24:48 +0800 Subject: [PATCH 173/252] Improve test --- v2rayN/v2rayN/Forms/MainForm.cs | 14 ++++++++++---- v2rayN/v2rayN/Handler/DownloadHandle.cs | 24 ++++++++++-------------- v2rayN/v2rayN/Handler/UpdateHandle.cs | 14 ++++++++++++-- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.resx | 2 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 2 +- 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 7be1edfb..0b632ec2 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -767,8 +767,8 @@ namespace v2rayN.Forms private void tsbTestMe_Click(object sender, EventArgs e) { - string result = (new DownloadHandle()).RunAvailabilityCheck(null) + "ms"; - AppendText(false, string.Format(ResUI.TestMeOutput, result)); + var updateHandle = new UpdateHandle(); + updateHandle.RunAvailabilityCheck(UpdateTaskHandler); } private void menuClearStatistic_Click(object sender, EventArgs e) @@ -1366,7 +1366,10 @@ namespace v2rayN.Forms menuExit_Click(null, null); } }; - (new UpdateHandle()).CheckUpdateGuiN(config, _updateUI); + Task.Run(() => + { + (new UpdateHandle()).CheckUpdateGuiN(config, _updateUI); + }); } private void tsbCheckUpdateCore_Click(object sender, EventArgs e) @@ -1399,7 +1402,10 @@ namespace v2rayN.Forms AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfully); } }; - (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); + Task.Run(() => + { + (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); + }); } private void tsbCheckUpdateGeo_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 686f42a6..0e4c8fd7 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -176,21 +176,17 @@ namespace v2rayN.Handler webProxy = new WebProxy(Global.Loopback, httpPort); } - Task t = Task.Run(() => + try { - try - { - string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out int responseTime); - bool noError = Utils.IsNullOrEmpty(status); - return noError ? responseTime : -1; - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - return -1; - } - }); - return t.Result; + string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out int responseTime); + bool noError = Utils.IsNullOrEmpty(status); + return noError ? responseTime : -1; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return -1; + } } catch (Exception ex) { diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 7eefe540..50584ebb 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -250,8 +250,8 @@ namespace v2rayN.Handler File.Delete(targetPath); } File.Move(fileName, targetPath); - //_updateFunc(true, ""); - } + //_updateFunc(true, ""); + } } catch (Exception ex) { @@ -272,6 +272,16 @@ namespace v2rayN.Handler } + public void RunAvailabilityCheck(Action update) + { + Task.Run(() => + { + var time = (new DownloadHandle()).RunAvailabilityCheck(null); + + update(false, string.Format(ResUI.TestMeOutput, time)); + }); + } + #region private private async void CheckUpdateAsync(ECoreType type) diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index f437c794..83635795 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -953,7 +953,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 The ping of current service: {0} 的本地化字符串。 + /// 查找类似 The ping of current service: {0} ms 的本地化字符串。 /// internal static string TestMeOutput { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 26122beb..a3224bdd 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -356,7 +356,7 @@ Scan import URL successfully - The ping of current service: {0} + The ping of current service: {0} ms Operation success diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index aa5b8dd2..a5b92d97 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -356,7 +356,7 @@ 扫描导入URL成功 - 当前服务的真连接延迟: {0} + 当前服务的真连接延迟: {0} ms 操作成功 From 688f206555e2510a4d2de6165c9fece3b4696298 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:21:17 +0800 Subject: [PATCH 174/252] Refactor main message control --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 160 +------- v2rayN/v2rayN/Forms/MainForm.cs | 139 +------ v2rayN/v2rayN/Forms/MainForm.resx | 280 ++----------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 21 - .../v2rayN/Forms/MainMsgControl.Designer.cs | 202 +++++++++ v2rayN/v2rayN/Forms/MainMsgControl.cs | 169 ++++++++ v2rayN/v2rayN/Forms/MainMsgControl.resx | 387 ++++++++++++++++++ .../v2rayN/Forms/MainMsgControl.zh-Hans.resx | 141 +++++++ v2rayN/v2rayN/v2rayN.csproj | 12 + 9 files changed, 956 insertions(+), 555 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/MainMsgControl.cs create mode 100644 v2rayN/v2rayN/Forms/MainMsgControl.resx create mode 100644 v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index dec8f338..6a834343 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -70,22 +70,7 @@ this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.gbMsgTitle = new System.Windows.Forms.GroupBox(); - this.txtMsgBox = new System.Windows.Forms.TextBox(); - this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components); - this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxClear = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); - this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.ssMain = new System.Windows.Forms.StatusStrip(); - this.toolSslInboundInfo = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.mainMsgControl = new v2rayN.Forms.MainMsgControl(); 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(); @@ -146,9 +131,6 @@ this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); this.groupBox1.SuspendLayout(); - this.gbMsgTitle.SuspendLayout(); - this.cmsMsgBox.SuspendLayout(); - this.ssMain.SuspendLayout(); this.cmsMain.SuspendLayout(); this.tsMain.SuspendLayout(); this.SuspendLayout(); @@ -226,7 +208,6 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -447,7 +428,7 @@ // // splitContainer1.Panel2 // - this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); + this.splitContainer1.Panel2.Controls.Add(this.mainMsgControl); // // groupBox1 // @@ -456,119 +437,10 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // - // gbMsgTitle + // mainMsgControl // - this.gbMsgTitle.Controls.Add(this.txtMsgBox); - this.gbMsgTitle.Controls.Add(this.ssMain); - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); - this.gbMsgTitle.Name = "gbMsgTitle"; - this.gbMsgTitle.TabStop = false; - // - // 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; - this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; - 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; - this.txtMsgBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtMsgBox_KeyDown); - // - // cmsMsgBox - // - this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuMsgBoxSelectAll, - this.menuMsgBoxCopy, - this.menuMsgBoxCopyAll, - this.menuMsgBoxClear, - this.menuMsgBoxAddRoutingRule, - this.menuMsgBoxFilter}); - this.cmsMsgBox.Name = "cmsMsgBox"; - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); - // - // menuMsgBoxSelectAll - // - this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; - resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); - this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); - // - // menuMsgBoxCopy - // - this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; - resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); - this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); - // - // menuMsgBoxCopyAll - // - this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; - resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); - this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); - // - // menuMsgBoxClear - // - this.menuMsgBoxClear.Name = "menuMsgBoxClear"; - resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); - this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); - // - // menuMsgBoxAddRoutingRule - // - this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; - resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); - this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); - // - // menuMsgBoxFilter - // - this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; - resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); - this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); - // - // ssMain - // - this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); - this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolSslInboundInfo, - this.toolSslBlank1, - this.toolSslRoutingRule, - this.toolSslBlank2, - this.toolSslServerSpeed, - this.toolSslBlank4}); - resources.ApplyResources(this.ssMain, "ssMain"); - this.ssMain.Name = "ssMain"; - this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); - // - // toolSslInboundInfo - // - this.toolSslInboundInfo.Name = "toolSslInboundInfo"; - resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); - // - // toolSslBlank1 - // - resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); - this.toolSslBlank1.Name = "toolSslBlank1"; - this.toolSslBlank1.Spring = true; - // - // toolSslRoutingRule - // - this.toolSslRoutingRule.Name = "toolSslRoutingRule"; - resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); - // - // toolSslBlank2 - // - this.toolSslBlank2.Name = "toolSslBlank2"; - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); - this.toolSslBlank2.Spring = true; - // - // toolSslServerSpeed - // - resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); - this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslServerSpeed.Name = "toolSslServerSpeed"; - // - // toolSslBlank4 - // - this.toolSslBlank4.Name = "toolSslBlank4"; - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + resources.ApplyResources(this.mainMsgControl, "mainMsgControl"); + this.mainMsgControl.Name = "mainMsgControl"; // // notifyMain // @@ -945,11 +817,6 @@ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); this.splitContainer1.ResumeLayout(false); this.groupBox1.ResumeLayout(false); - this.gbMsgTitle.ResumeLayout(false); - this.gbMsgTitle.PerformLayout(); - this.cmsMsgBox.ResumeLayout(false); - this.ssMain.ResumeLayout(false); - this.ssMain.PerformLayout(); this.cmsMain.ResumeLayout(false); this.tsMain.ResumeLayout(false); this.tsMain.PerformLayout(); @@ -961,8 +828,6 @@ #endregion private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.GroupBox gbMsgTitle; - private System.Windows.Forms.TextBox txtMsgBox; private v2rayN.Base.ListViewFlickerFree lvServers; private System.Windows.Forms.NotifyIcon notifyMain; private System.Windows.Forms.ContextMenuStrip cmsMain; @@ -1023,10 +888,6 @@ private System.Windows.Forms.ToolStripMenuItem tsbLanguageZhHans; private System.Windows.Forms.ToolStripButton tsbPromotion; private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer; - private System.Windows.Forms.StatusStrip ssMain; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; - private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer; private System.Windows.Forms.ToolStripMenuItem menuTcpingServer; private System.Windows.Forms.ToolStripMenuItem menuRealPingServer; @@ -1045,27 +906,18 @@ private System.Windows.Forms.ToolStripMenuItem menuClearServerStatistics; private System.Windows.Forms.ToolStripMenuItem menuRoutings; private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private System.Windows.Forms.ContextMenuStrip cmsMsgBox; - private System.Windows.Forms.ToolStripMenuItem menuMsgBoxSelectAll; - private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopy; - private System.Windows.Forms.ToolStripMenuItem menuMsgBoxAddRoutingRule; - private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig; private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeo; private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter; - private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; - private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy; private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; - private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; private System.Windows.Forms.TabControl tabGroup; private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; private System.Windows.Forms.ToolStripMenuItem menuMoveToGroup; + private MainMsgControl mainMsgControl; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 0b632ec2..9dcf9ef9 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -3,16 +3,14 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; +using System.Linq; using System.Text; -using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; -using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; -using v2rayN.Tool; -using System.Linq; using v2rayN.Resx; +using v2rayN.Tool; namespace v2rayN.Forms { @@ -21,7 +19,6 @@ namespace v2rayN.Forms private V2rayHandler v2rayHandler; private List lstSelecteds = new List(); private StatisticsHandler statistics = null; - private string MsgFilter = string.Empty; private List lstVmess = null; private string groupId = string.Empty; @@ -527,7 +524,7 @@ namespace v2rayN.Forms if (Global.reloadV2ray) { - ClearMsg(); + mainMsgControl.ClearMsg(); } await Task.Run(() => { @@ -1038,68 +1035,17 @@ namespace v2rayN.Forms AppendText(notify, msg); } - delegate void AppendTextDelegate(string text); void AppendText(bool notify, string msg) { try { - AppendText(msg); + mainMsgControl.AppendText(msg); if (notify) { notifyMsg(msg); } } - catch - { - } - } - - void AppendText(string text) - { - if (this.txtMsgBox.InvokeRequired) - { - Invoke(new AppendTextDelegate(AppendText), new object[] { text }); - } - else - { - if (!Utils.IsNullOrEmpty(MsgFilter)) - { - if (!Regex.IsMatch(text, MsgFilter)) - { - return; - } - } - //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() - { - txtMsgBox.Invoke((Action)delegate - { - txtMsgBox.Clear(); - }); + catch { } } /// @@ -1143,7 +1089,7 @@ namespace v2rayN.Forms this.Activate(); this.ShowInTaskbar = true; //this.notifyIcon1.Visible = false; - this.txtMsgBox.ScrollToCaret(); + mainMsgControl.ScrollToCaret(); int index = GetLvSelectedIndex(false); if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0) @@ -1211,7 +1157,7 @@ namespace v2rayN.Forms { up /= (ulong)(config.statisticsFreshRate / 1000f); down /= (ulong)(config.statisticsFreshRate / 1000f); - toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); + mainMsgControl.SetToolSslInfo("speed", string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down))); foreach (var it in statistics) { @@ -1347,7 +1293,7 @@ namespace v2rayN.Forms sb.Append($"{ResUI.SystemProxy} {Global.Loopback}:{config.GetLocalPort(Global.InboundHttp2)}"); } - toolSslInboundInfo.Text = sb.ToString(); + mainMsgControl.SetToolSslInfo("inbound", sb.ToString()); notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } @@ -1507,10 +1453,6 @@ namespace v2rayN.Forms //Application.Restart(); } - - - - #endregion @@ -1524,7 +1466,7 @@ namespace v2rayN.Forms menuRoutings.Visible = config.enableRoutingAdvanced; if (!config.enableRoutingAdvanced) { - toolSslRoutingRule.Text = string.Empty; + mainMsgControl.SetToolSslInfo("routing", string.Empty); return; } @@ -1547,7 +1489,7 @@ namespace v2rayN.Forms if (config.routingIndex.Equals(k)) { ts.Checked = true; - toolSslRoutingRule.Text = item.remarks; + mainMsgControl.SetToolSslInfo("routing", item.remarks); } ts.Click += new EventHandler(ts_Routing_Click); lst.Add(ts); @@ -1573,66 +1515,5 @@ namespace v2rayN.Forms } } #endregion - - #region MsgBoxMenu - private void menuMsgBoxSelectAll_Click(object sender, EventArgs e) - { - this.txtMsgBox.Focus(); - this.txtMsgBox.SelectAll(); - } - - private void menuMsgBoxCopy_Click(object sender, EventArgs e) - { - var data = this.txtMsgBox.SelectedText.TrimEx(); - Utils.SetClipboardData(data); - } - - private void menuMsgBoxCopyAll_Click(object sender, EventArgs e) - { - var data = this.txtMsgBox.Text; - Utils.SetClipboardData(data); - } - private void menuMsgBoxClear_Click(object sender, EventArgs e) - { - this.txtMsgBox.Clear(); - } - private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e) - { - menuMsgBoxCopy_Click(null, null); - tsbRoutingSetting_Click(null, null); - } - - private void txtMsgBox_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control) - { - switch (e.KeyCode) - { - case Keys.A: - menuMsgBoxSelectAll_Click(null, null); - break; - case Keys.C: - menuMsgBoxCopy_Click(null, null); - break; - case Keys.V: - menuMsgBoxAddRoutingRule_Click(null, null); - break; - - } - } - - } - private void menuMsgBoxFilter_Click(object sender, EventArgs e) - { - var fm = new MsgFilterSetForm(); - fm.MsgFilter = MsgFilter; - if (fm.ShowDialog() == DialogResult.OK) - { - MsgFilter = fm.MsgFilter; - gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, MsgFilter); - } - } - #endregion - } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 4e86cc37..afec6ce6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -126,7 +126,7 @@ 3, 17 - 327, 17 + 226, 19 355, 22 @@ -308,20 +308,8 @@ Export subscription (base64) share to clipboard - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - - 356, 644 + 356, 666 cmsLv @@ -470,6 +458,18 @@ 0 + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + Fill @@ -515,178 +515,28 @@ 0 - - 493, 20 - - - 227, 22 - - - Select All (Ctrl+A) - - - 227, 22 - - - Copy (Ctrl+C) - - - 227, 22 - - - Copy All - - - 227, 22 - - - Clear All - - - 227, 22 - - - Add Routing Rule (Ctrl+V) - - - 227, 22 - - - Set message filters - - - 228, 136 - - - cmsMsgBox - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + Fill - - 3, 17 - - - 0 - - - True - - - Vertical - - - 946, 177 - - - 3 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 0 - - - 228, 18 - - - 80, 21 - - - InboundInfo - - - 微软雅黑, 8pt - - - 300, 21 - - - 0, 21 - - - 300, 21 - - - False - - - 微软雅黑, 8pt - - - No - - - 250, 21 - - - SPEED Disabled - - - MiddleRight - - - 0, 21 - - - 3, 194 - - - 946, 26 - - - 0 - - - statusStrip1 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 1 - - - Fill - - + 0, 0 - + 952, 223 - - 3 + + 0 - - Informations + + mainMsgControl - - gbMsgTitle + + v2rayN.Forms.MainMsgControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + splitContainer1.Panel2 - + 0 @@ -720,7 +570,7 @@ $this - 3 + 2 17, 17 @@ -840,10 +690,10 @@ $this - 4 + 3 - 409, 17 + 315, 17 6, 56 @@ -1089,7 +939,7 @@ $this - 5 + 4 True @@ -1307,78 +1157,6 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuMsgBoxSelectAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopyAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxClear - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxAddRoutingRule - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxFilter - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslInboundInfo - - - 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 - - - toolSslRoutingRule - - - 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 - - - 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 - notifyMain diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 16c98a29..e4efd702 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -321,48 +321,27 @@ 221, 22 - - 全选 (Ctrl+A) - 221, 22 - - 复制 (Ctrl+C) - 221, 22 - - 复制所有 - 221, 22 - - 清除所有 - 221, 22 - - 快速添加路由规则 (Ctrl+V) - 221, 22 - - 设置信息过滤器 - 222, 136 网速显示未启用 - - 信息 - 172, 22 diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs new file mode 100644 index 00000000..9af4bc0f --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs @@ -0,0 +1,202 @@ + +namespace v2rayN.Forms +{ + partial class MainMsgControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainMsgControl)); + this.txtMsgBox = new System.Windows.Forms.TextBox(); + this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxClear = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem(); + this.gbMsgTitle = new System.Windows.Forms.GroupBox(); + this.ssMain = new System.Windows.Forms.StatusStrip(); + this.toolSslInboundInfo = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.cmsMsgBox.SuspendLayout(); + this.gbMsgTitle.SuspendLayout(); + this.ssMain.SuspendLayout(); + this.SuspendLayout(); + // + // 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; + this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); + this.txtMsgBox.Name = "txtMsgBox"; + this.txtMsgBox.ReadOnly = true; + // + // cmsMsgBox + // + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); + this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuMsgBoxSelectAll, + this.menuMsgBoxCopy, + this.menuMsgBoxCopyAll, + this.menuMsgBoxClear, + this.menuMsgBoxAddRoutingRule, + this.menuMsgBoxFilter}); + this.cmsMsgBox.Name = "cmsMsgBox"; + // + // menuMsgBoxSelectAll + // + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); + this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); + // + // menuMsgBoxCopy + // + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); + this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); + // + // menuMsgBoxCopyAll + // + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); + this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); + // + // menuMsgBoxClear + // + resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); + this.menuMsgBoxClear.Name = "menuMsgBoxClear"; + this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); + // + // menuMsgBoxAddRoutingRule + // + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); + this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); + // + // menuMsgBoxFilter + // + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); + this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); + // + // gbMsgTitle + // + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); + this.gbMsgTitle.Controls.Add(this.txtMsgBox); + this.gbMsgTitle.Controls.Add(this.ssMain); + this.gbMsgTitle.Name = "gbMsgTitle"; + this.gbMsgTitle.TabStop = false; + // + // ssMain + // + resources.ApplyResources(this.ssMain, "ssMain"); + this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); + this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolSslInboundInfo, + this.toolSslBlank1, + this.toolSslRoutingRule, + this.toolSslBlank2, + this.toolSslServerSpeed, + this.toolSslBlank4}); + this.ssMain.Name = "ssMain"; + // + // toolSslInboundInfo + // + resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); + this.toolSslInboundInfo.Name = "toolSslInboundInfo"; + // + // toolSslBlank1 + // + resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); + this.toolSslBlank1.Name = "toolSslBlank1"; + this.toolSslBlank1.Spring = true; + // + // toolSslRoutingRule + // + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); + this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + // + // toolSslBlank2 + // + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Name = "toolSslBlank2"; + this.toolSslBlank2.Spring = true; + // + // toolSslServerSpeed + // + resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); + this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolSslServerSpeed.Name = "toolSslServerSpeed"; + // + // toolSslBlank4 + // + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; + // + // MainMsgControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.gbMsgTitle); + this.Name = "MainMsgControl"; + this.Load += new System.EventHandler(this.MainMsgControl_Load); + this.cmsMsgBox.ResumeLayout(false); + this.gbMsgTitle.ResumeLayout(false); + this.gbMsgTitle.PerformLayout(); + this.ssMain.ResumeLayout(false); + this.ssMain.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox txtMsgBox; + private System.Windows.Forms.ContextMenuStrip cmsMsgBox; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopy; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxAddRoutingRule; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter; + private System.Windows.Forms.GroupBox gbMsgTitle; + private System.Windows.Forms.StatusStrip ssMain; + private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; + private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; + private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; + } +} diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs new file mode 100644 index 00000000..1f948751 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class MainMsgControl : UserControl + { + private string MsgFilter = string.Empty; + delegate void AppendTextDelegate(string text); + + public MainMsgControl() + { + InitializeComponent(); + } + + private void MainMsgControl_Load(object sender, EventArgs e) + { + + } + + #region 提示信息 + + public void AppendText(string text) + { + if (this.txtMsgBox.InvokeRequired) + { + Invoke(new AppendTextDelegate(AppendText), new object[] { text }); + } + else + { + if (!Utils.IsNullOrEmpty(MsgFilter)) + { + if (!Regex.IsMatch(text, MsgFilter)) + { + return; + } + } + //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); + } + } + + /// + /// 清除信息 + /// + public void ClearMsg() + { + txtMsgBox.Invoke((Action)delegate + { + txtMsgBox.Clear(); + }); + } + + public void SetToolSslInfo(string type, string value) + { + switch (type) + { + case "speed": + toolSslServerSpeed.Text = value; + break; + case "inbound": + toolSslInboundInfo.Text = value; + break; + case "routing": + toolSslRoutingRule.Text = value; + break; + } + + } + + public void ScrollToCaret() + { + this.txtMsgBox.ScrollToCaret(); + } + #endregion + + + #region MsgBoxMenu + private void menuMsgBoxSelectAll_Click(object sender, EventArgs e) + { + this.txtMsgBox.Focus(); + this.txtMsgBox.SelectAll(); + } + + private void menuMsgBoxCopy_Click(object sender, EventArgs e) + { + var data = this.txtMsgBox.SelectedText.TrimEx(); + Utils.SetClipboardData(data); + } + + private void menuMsgBoxCopyAll_Click(object sender, EventArgs e) + { + var data = this.txtMsgBox.Text; + Utils.SetClipboardData(data); + } + private void menuMsgBoxClear_Click(object sender, EventArgs e) + { + this.txtMsgBox.Clear(); + } + private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e) + { + menuMsgBoxCopy_Click(null, null); + var fm = new RoutingSettingForm(); + fm.ShowDialog(); + + } + + private void txtMsgBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuMsgBoxSelectAll_Click(null, null); + break; + case Keys.C: + menuMsgBoxCopy_Click(null, null); + break; + case Keys.V: + menuMsgBoxAddRoutingRule_Click(null, null); + break; + + } + } + + } + private void menuMsgBoxFilter_Click(object sender, EventArgs e) + { + var fm = new MsgFilterSetForm(); + fm.MsgFilter = MsgFilter; + if (fm.ShowDialog() == DialogResult.OK) + { + MsgFilter = fm.MsgFilter; + gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, MsgFilter); + } + } + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.resx b/v2rayN/v2rayN/Forms/MainMsgControl.resx new file mode 100644 index 00000000..8a16d9b2 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.resx @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + toolSslRoutingRule + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + menuMsgBoxSelectAll + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + False + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslServerSpeed + + + + 227, 22 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopyAll + + + 0 + + + 1 + + + 3, 221 + + + 227, 22 + + + 227, 22 + + + System.Windows.Forms.ToolStripStatusLabel, 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 + + + 6, 12 + + + 0, 17 + + + 80, 17 + + + toolSslInboundInfo + + + txtMsgBox + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 微软雅黑, 8pt + + + 227, 22 + + + gbMsgTitle + + + 227, 22 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add Routing Rule (Ctrl+V) + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MiddleRight + + + 微软雅黑, 8pt + + + 696, 246 + + + InboundInfo + + + 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxClear + + + 5 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 17 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank4 + + + gbMsgTitle + + + Informations + + + 0 + + + 172, 17 + + + menuMsgBoxAddRoutingRule + + + True + + + Clear All + + + + Vertical + + + $this + + + 690, 22 + + + cmsMsgBox + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 690, 204 + + + 227, 22 + + + 172, 17 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Copy All + + + 0, 0 + + + 696, 246 + + + toolSslBlank1 + + + No + + + Copy (Ctrl+C) + + + statusStrip1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + SPEED Disabled + + + 4 + + + gbMsgTitle + + + menuMsgBoxFilter + + + 1 + + + MainMsgControl + + + Fill + + + menuMsgBoxCopy + + + 0, 17 + + + ssMain + + + Set message filters + + + 228, 136 + + + 250, 17 + + + 17, 17 + + + zh-Hans + + + True + + + 131, 18 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx new file mode 100644 index 00000000..d9673dca --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 信息 + + + 快速添加路由规则 (Ctrl+V) + + + 清除所有 + + + 复制 (Ctrl+C) + + + 复制所有 + + + 设置信息过滤器 + + + 全选 (Ctrl+A) + + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 7d6cb61b..8b20ff90 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -109,6 +109,12 @@ BaseServerForm.cs + + UserControl + + + MainMsgControl.cs + Form @@ -286,6 +292,12 @@ MainForm.cs Designer + + MainMsgControl.cs + + + MainMsgControl.cs + MsgFilterSetForm.cs From 90289120d37c24e2fd678d08e08535562481a000 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:21:40 +0800 Subject: [PATCH 175/252] add clash.meta core --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 1 + v2rayN/v2rayN/Global.cs | 1 + v2rayN/v2rayN/Handler/LazyConfig.cs | 9 +++++++++ v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 1 + v2rayN/v2rayN/Mode/ECoreType.cs | 1 + 5 files changed, 13 insertions(+) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 0d65b972..9ca7e2ff 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -20,6 +20,7 @@ namespace v2rayN.Forms { cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); cmbCoreType.Items.Add("clash"); + cmbCoreType.Items.Add("clash_meta"); cmbCoreType.Items.Add("hysteria"); cmbCoreType.Items.Add(string.Empty); diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index ea3e6803..a7fa67ae 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -15,6 +15,7 @@ namespace v2rayN public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases"; + public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases"; public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases"; diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 98b65c51..7b523757 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -92,6 +92,15 @@ namespace v2rayN.Handler coreUrl = Global.clashCoreUrl }); + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.clash_meta, + coreExes = new List { "Clash.Meta-windows-amd64v1", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, + arguments = "-f config.yaml", + coreUrl = Global.clashMetaCoreUrl, + match = "Clash Meta" + }); + coreInfos.Add(new CoreInfo { coreType = ECoreType.hysteria, diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 2f1eb59a..45b214d3 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -957,6 +957,7 @@ namespace v2rayN.Handler case ECoreType.Xray: break; case ECoreType.clash: + case ECoreType.clash_meta: fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2)}"); fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}"); break; diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index be245303..c714876d 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -6,6 +6,7 @@ namespace v2rayN.Mode v2fly = 1, Xray = 2, clash = 11, + clash_meta = 12, hysteria = 21, v2rayN = 99 } From f110446738fc955543ad5bed4afb095cb56f103b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 13 Apr 2022 19:36:41 +0800 Subject: [PATCH 176/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index f56536ef..0eace496 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.14")] +[assembly: AssemblyFileVersion("5.15")] From 977f0428e2a6401f4ac898a3180c380b7af2e019 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 14 Apr 2022 09:56:11 +0800 Subject: [PATCH 177/252] Refactor Inbound --- v2rayN/v2rayN/Forms/MainForm.cs | 18 +---- v2rayN/v2rayN/Forms/MainMsgControl.cs | 27 +++++++ v2rayN/v2rayN/Global.cs | 4 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 4 +- v2rayN/v2rayN/Handler/SysProxyHandle.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 85 ++++++++++++--------- v2rayN/v2rayN/Mode/Config.cs | 28 +++---- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 18 +++++ v2rayN/v2rayN/Resx/ResUI.resx | 6 ++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 6 ++ v2rayN/v2rayN/Sample/SampleInbound.txt | 18 +++++ v2rayN/v2rayN/v2rayN.csproj | 1 + 12 files changed, 145 insertions(+), 72 deletions(-) create mode 100644 v2rayN/v2rayN/Sample/SampleInbound.txt diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 9dcf9ef9..065f9051 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1277,26 +1277,12 @@ namespace v2rayN.Forms } ConfigHandler.SaveConfig(ref config, false); - DisplayToolStatus(); - } - private void DisplayToolStatus() - { - StringBuilder sb = new StringBuilder(); - sb.Append($"{Global.InboundSocks} {Global.Loopback}:{config.GetLocalPort(Global.InboundSocks)}"); - sb.Append(" | "); - sb.Append($"{Global.InboundHttp} {Global.Loopback}:{config.GetLocalPort(Global.InboundHttp)}"); - - if (config.sysProxyType == ESysProxyType.ForcedChange) - { - sb.Append(" | "); - sb.Append($"{ResUI.SystemProxy} {Global.Loopback}:{config.GetLocalPort(Global.InboundHttp2)}"); - } - - mainMsgControl.SetToolSslInfo("inbound", sb.ToString()); + mainMsgControl.DisplayToolStatus(config); notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } + #endregion diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs index 1f948751..85a4bdde 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.cs +++ b/v2rayN/v2rayN/Forms/MainMsgControl.cs @@ -9,6 +9,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Base; +using v2rayN.Mode; using v2rayN.Resx; namespace v2rayN.Forms @@ -78,6 +79,32 @@ namespace v2rayN.Forms }); } + public void DisplayToolStatus(Config config) + { + StringBuilder sb = new StringBuilder(); + sb.Append($"{ResUI.LabLocal}:"); + sb.Append($"[{Global.InboundSocks}:{config.GetLocalPort(Global.InboundSocks)}]"); + sb.Append(" | "); + if (config.sysProxyType == ESysProxyType.ForcedChange) + { + sb.Append($"[{Global.InboundHttp}({ResUI.SystemProxy}):{config.GetLocalPort(Global.InboundHttp)}]"); + } + else + { + sb.Append($"[{Global.InboundHttp}:{config.GetLocalPort(Global.InboundHttp)}]"); + } + + if (config.inbound[0].allowLANConn) + { + sb.Append($" {ResUI.LabLAN}:"); + sb.Append($"[{Global.InboundSocks}:{config.GetLocalPort(Global.InboundSocks2)}]"); + sb.Append(" | "); + sb.Append($"[{Global.InboundHttp}:{config.GetLocalPort(Global.InboundHttp2)}]"); + } + + SetToolSslInfo("inbound", sb.ToString()); + } + public void SetToolSslInfo(string type, string value) { switch (type) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index a7fa67ae..42cbca68 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -65,9 +65,10 @@ namespace v2rayN /// public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt"; - public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_"; + public const string v2raySampleInbound = "v2rayN.Sample.SampleInbound.txt"; + /// /// 默认加密方式 @@ -112,6 +113,7 @@ namespace v2rayN public const string InboundSocks = "socks"; public const string InboundHttp = "http"; + public const string InboundSocks2 = "socks2"; public const string InboundHttp2 = "http2"; public const string Loopback = "127.0.0.1"; public const string InboundAPITagName = "api"; diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 0e4c8fd7..50ea02c1 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -172,7 +172,7 @@ namespace v2rayN.Handler { if (webProxy == null) { - var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2); + var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp); webProxy = new WebProxy(Global.Loopback, httpPort); } @@ -233,7 +233,7 @@ namespace v2rayN.Handler { return null; } - var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2); + var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp); var webProxy = new WebProxy(Global.Loopback, httpPort); if (RunAvailabilityCheck(webProxy) > 0) { diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs index 326b2f78..ba752ca1 100644 --- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -59,7 +59,7 @@ namespace v2rayN.Handler try { - int port = config.GetLocalPort(Global.InboundHttp2); + int port = config.GetLocalPort(Global.InboundHttp); if (port <= 0) { return false; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 45b214d3..fdf8f000 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -146,48 +146,35 @@ namespace v2rayN.Handler { try { - Inbounds inbound = v2rayConfig.inbounds[0]; - inbound.tag = Global.InboundSocks; - inbound.port = config.inbound[0].localPort; - inbound.protocol = config.inbound[0].protocol; - if (config.inbound[0].allowLANConn) - { - inbound.listen = "0.0.0.0"; - } - else - { - inbound.listen = Global.Loopback; - } - //udp - inbound.settings.udp = config.inbound[0].udpEnabled; - inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; + v2rayConfig.inbounds = new List(); + + Inbounds inbound = GetInbound(config.inbound[0], Global.InboundSocks, 0, true); + v2rayConfig.inbounds.Add(inbound); //http - Inbounds inbound2 = v2rayConfig.inbounds[1]; - inbound2.tag = Global.InboundHttp; - inbound2.port = config.GetLocalPort(Global.InboundHttp); - inbound2.protocol = Global.InboundHttp; - inbound2.listen = inbound.listen; - inbound2.settings.allowTransparent = false; - inbound2.sniffing.enabled = inbound.sniffing.enabled; + Inbounds inbound2 = GetInbound(config.inbound[0], Global.InboundHttp, 1, false); + v2rayConfig.inbounds.Add(inbound2); - //auth - if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass)) + if (config.inbound[0].allowLANConn) { - inbound.settings.auth = "password"; - inbound.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; - inbound2.settings.auth = "password"; - inbound2.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; - } + Inbounds inbound3 = GetInbound(config.inbound[0], Global.InboundSocks2, 2, true); + v2rayConfig.inbounds.Add(inbound3); - //http Loopback - Inbounds inbound3 = v2rayConfig.inbounds[2]; - inbound3.tag = Global.InboundHttp2; - inbound3.port = config.GetLocalPort(Global.InboundHttp2); - inbound3.protocol = Global.InboundHttp; - inbound3.listen = Global.Loopback; - inbound3.settings.allowTransparent = false; - inbound3.sniffing.enabled = inbound.sniffing.enabled; + Inbounds inbound4 = GetInbound(config.inbound[0], Global.InboundHttp2, 3, false); + v2rayConfig.inbounds.Add(inbound4); + + //auth + if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass)) + { + inbound3.listen = "0.0.0.0"; + inbound3.settings.auth = "password"; + inbound3.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; + + inbound4.listen = "0.0.0.0"; + inbound4.settings.auth = "password"; + inbound4.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; + } + } } catch { @@ -195,6 +182,28 @@ namespace v2rayN.Handler return 0; } + private static Inbounds GetInbound(InItem inItem, string tag, int offset, bool bSocks) + { + string result = Utils.GetEmbedText(Global.v2raySampleInbound); + if (Utils.IsNullOrEmpty(result)) + { + return null; + } + + var inbound = Utils.FromJson(result); + if (inbound == null) + { + return null; + } + inbound.tag = tag; + inbound.port = inItem.localPort + offset; + inbound.protocol = bSocks ? Global.InboundSocks : Global.InboundHttp; + inbound.settings.udp = inItem.udpEnabled; + inbound.sniffing.enabled = inItem.sniffingEnabled; + + return inbound; + } + /// /// 路由 /// @@ -958,7 +967,7 @@ namespace v2rayN.Handler break; case ECoreType.clash: case ECoreType.clash_meta: - fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp2)}"); + fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}"); fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}"); break; } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index e99e7be3..20913046 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -208,27 +208,27 @@ namespace v2rayN.Mode public int GetLocalPort(string protocol) { - if (protocol == Global.InboundHttp) + int localPort = inbound.FirstOrDefault(t => t.protocol == Global.InboundSocks).localPort; + + if (protocol == Global.InboundSocks) { - return GetLocalPort(Global.InboundSocks) + 1; + return localPort; + } + else if (protocol == Global.InboundHttp) + { + return localPort + 1; + } + else if (protocol == Global.InboundSocks2) + { + return localPort + 2; } else if (protocol == Global.InboundHttp2) { - return GetLocalPort(Global.InboundSocks) + 2; + return localPort + 3; } else if (protocol == "speedtest") { - return GetLocalPort(Global.InboundSocks) + 103; - } - - int localPort = 0; - foreach (InItem inItem in inbound) - { - if (inItem.protocol.Equals(protocol)) - { - localPort = inItem.localPort; - break; - } + return localPort + 103; } return localPort; } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 83635795..431ec5ea 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -321,6 +321,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 LAN 的本地化字符串。 + /// + internal static string LabLAN { + get { + return ResourceManager.GetString("LabLAN", resourceCulture); + } + } + + /// + /// 查找类似 Local 的本地化字符串。 + /// + internal static string LabLocal { + get { + return ResourceManager.GetString("LabLocal", resourceCulture); + } + } + /// /// 查找类似 Address 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index a3224bdd..e6178559 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -463,4 +463,10 @@ Too many servers, please open the main interface + + LAN + + + Local + \ 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 a5b92d97..0f3a4ac1 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -463,4 +463,10 @@ 服务器太多,请打开主界面操作 + + 局域网 + + + 本地 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleInbound.txt b/v2rayN/v2rayN/Sample/SampleInbound.txt new file mode 100644 index 00000000..a21452dd --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleInbound.txt @@ -0,0 +1,18 @@ +{ + "tag": "tag1", + "port": 10808, + "protocol": "socks", + "listen": "127.0.0.1", + "settings": { + "auth": "noauth", + "udp": true, + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 8b20ff90..e5c58aef 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -474,6 +474,7 @@ + From c2ea14151e7cbaf0f49da1177d9acf2bd3e7af1e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:10:06 +0800 Subject: [PATCH 178/252] add naiveproxy --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 1 + v2rayN/v2rayN/Global.cs | 1 + v2rayN/v2rayN/Handler/LazyConfig.cs | 13 ++++++++++--- v2rayN/v2rayN/Mode/ECoreType.cs | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 9ca7e2ff..089f82e1 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -22,6 +22,7 @@ namespace v2rayN.Forms cmbCoreType.Items.Add("clash"); cmbCoreType.Items.Add("clash_meta"); cmbCoreType.Items.Add("hysteria"); + cmbCoreType.Items.Add("naiveproxy"); cmbCoreType.Items.Add(string.Empty); txtAddress.ReadOnly = true; diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 42cbca68..c0547e46 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -17,6 +17,7 @@ namespace v2rayN public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases"; public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases"; public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases"; + public const string naiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases"; diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 7b523757..57488ef2 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -96,9 +96,8 @@ namespace v2rayN.Handler { coreType = ECoreType.clash_meta, coreExes = new List { "Clash.Meta-windows-amd64v1", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, - arguments = "-f config.yaml", - coreUrl = Global.clashMetaCoreUrl, - match = "Clash Meta" + arguments = "-f config.json", + coreUrl = Global.clashMetaCoreUrl }); coreInfos.Add(new CoreInfo @@ -108,6 +107,14 @@ namespace v2rayN.Handler arguments = "", coreUrl = Global.hysteriaCoreUrl }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.naiveproxy, + coreExes = new List { "naiveproxy", "naive" }, + arguments = "config.json", + coreUrl = Global.naiveproxyCoreUrl + }); } } diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs index c714876d..511663f3 100644 --- a/v2rayN/v2rayN/Mode/ECoreType.cs +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -8,6 +8,7 @@ namespace v2rayN.Mode clash = 11, clash_meta = 12, hysteria = 21, + naiveproxy = 22, v2rayN = 99 } } From 15f8db64e71325c30214b2151d398c60ed1c9939 Mon Sep 17 00:00:00 2001 From: FrzMtrsprt Date: Thu, 14 Apr 2022 12:13:22 +0800 Subject: [PATCH 179/252] Add support for Clash's modern CPU executable Add support for clash-windows-amd64-v3.exe --- v2rayN/v2rayN/Handler/LazyConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 7b523757..0a18c235 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -87,7 +87,7 @@ namespace v2rayN.Handler coreInfos.Add(new CoreInfo { coreType = ECoreType.clash, - coreExes = new List { "clash-windows-amd64", "clash-windows-386", "clash" }, + coreExes = new List { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" }, arguments = "-f config.json", coreUrl = Global.clashCoreUrl }); From fcc5f298827595a1ccf09e74f83f33864dc8c565 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 14 Apr 2022 16:49:12 +0800 Subject: [PATCH 180/252] add auto update sub setting --- .../Forms/OptionSettingForm.Designer.cs | 16 + v2rayN/v2rayN/Forms/OptionSettingForm.cs | 2 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 937 +++++++++--------- .../Forms/OptionSettingForm.zh-Hans.resx | 15 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 64 +- v2rayN/v2rayN/Mode/Config.cs | 7 +- 6 files changed, 566 insertions(+), 475 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index d9384320..e790664b 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -68,6 +68,8 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.txtautoUpdateSubInterval = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this.chkEnableSecurityProtocolTls13 = new System.Windows.Forms.CheckBox(); this.chkEnableAutoAdjustMainLvColWidth = new System.Windows.Forms.CheckBox(); this.btnSetLoopback = new System.Windows.Forms.Button(); @@ -374,6 +376,8 @@ // tabPage7 // resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.txtautoUpdateSubInterval); + this.tabPage7.Controls.Add(this.label3); this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13); this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth); this.tabPage7.Controls.Add(this.btnSetLoopback); @@ -388,6 +392,16 @@ this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // txtautoUpdateSubInterval + // + resources.ApplyResources(this.txtautoUpdateSubInterval, "txtautoUpdateSubInterval"); + this.txtautoUpdateSubInterval.Name = "txtautoUpdateSubInterval"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // // chkEnableSecurityProtocolTls13 // resources.ApplyResources(this.chkEnableSecurityProtocolTls13, "chkEnableSecurityProtocolTls13"); @@ -697,5 +711,7 @@ private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox txtpass; private System.Windows.Forms.TextBox txtuser; + private System.Windows.Forms.TextBox txtautoUpdateSubInterval; + private System.Windows.Forms.Label label3; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index c3ec5c6b..1c713df8 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -112,6 +112,7 @@ namespace v2rayN.Forms chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); + txtautoUpdateSubInterval.Text = config.autoUpdateSubInterval.ToString(); chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13; } @@ -305,6 +306,7 @@ namespace v2rayN.Forms config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); + config.autoUpdateSubInterval = Utils.ToInt(txtautoUpdateSubInterval.Text); config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked; config.enableSecurityProtocolTls13 = chkEnableSecurityProtocolTls13.Checked; diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index bad14b8b..d9adddf4 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -150,8 +150,8 @@ 12 - - txtpass + + 4, 22 9 @@ -160,7 +160,7 @@ groupBox1 - 8 + 10 tti @@ -177,8 +177,17 @@ label10 - - True + + 10 + + + tabPage7 + + + 5 + + + 94, 21 9 @@ -192,29 +201,29 @@ txtautoUpdateInterval + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 38 - - label16 - Top 102, 16 - - 4, 22 + + 0 - - txtKcptti + + 14 tabPage3 - - btnSetLoopback + + Core Type 5 @@ -228,6 +237,9 @@ 111, 100 + + 30 + True @@ -255,14 +267,20 @@ 285, 61 - - tabPage6 + + True + + + readBufferSize + + + 234, 16 tabPage6 - 2 + 4 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -279,11 +297,17 @@ 12 + + 736, 60 + + + 0, 0 + chkEnableSecurityProtocolTls13 - - Core Type + + NoControl Fill @@ -297,8 +321,11 @@ 722, 421 - - Custom DNS (multiple, separated by commas (,)) + + NoControl + + + 30, 165 95, 12 @@ -306,8 +333,11 @@ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 14 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 45, 98 39 @@ -315,30 +345,30 @@ 317, 12 - - 30, 138 - 59, 12 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 37 + + 354, 159 groupBox1 + + 8 + + + tabPage7 + 18, 28 &Cancel + + 36 + 111, 62 @@ -351,35 +381,29 @@ groupBox1 - - Set Windows10 UWP Loopback + + NoControl + + + tabPageCoreType tabPage7 - - groupBox1 + + 736, 10 728, 427 - 15, 165 + 15, 193 - - txtKcpreadBufferSize + + 15, 108 - - cmbloglevel - - - label4 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Allow connections from the LAN + + txtKcpuplinkCapacity 2 @@ -396,9 +420,6 @@ 11 - - $this - label11 @@ -411,12 +432,12 @@ NoControl - - tabPage6 - 0, 10 + + 143, 20 + cmbCoreType2 @@ -426,6 +447,9 @@ 43 + + labCoreType1 + tabPage6 @@ -435,17 +459,23 @@ tabControl1 + + Automatic update interval of and Geo (hours) + $this 7 + + 736, 523 + NoControl - - 5 + + none System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -456,8 +486,14 @@ 117, 42 - - 0 + + 6 + + + tabPage7 + + + 43 tabPage6 @@ -465,9 +501,6 @@ Fill - - 576, 16 - groupBox1 @@ -486,14 +519,14 @@ 45, 176 - - 15, 16 - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 15, 215 + - 1 + 3 89, 12 @@ -507,14 +540,17 @@ 0 - - 97, 20 + + 97, 21 v2rayN settings - - 15 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 117, 94 @@ -540,6 +576,9 @@ 8 + + txtKcpdownlinkCapacity + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -549,23 +588,14 @@ Automatically start at system startup - - 728, 427 - 1 - - 36 + + txtKcptti - - 6 - - - tabPage6 - - - 45, 150 + + Vertical 281, 12 @@ -600,12 +630,15 @@ 78, 21 - - Core Type + + Log level tabControl1 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 59, 12 @@ -624,23 +657,29 @@ tabPageCoreType + + True + Statistics freshrate - - True + + 5 + + + 107, 12 + + + 75, 23 89, 12 - - 59, 12 + + btnOK - - NoControl - - - Core Type + + chkKcpcongestion 18, 66 @@ -651,14 +690,17 @@ 11 + + 8, 17 + 4, 4, 4, 4 tabPage6 - - 5 + + 37 Turn on Sniffing @@ -669,14 +711,17 @@ groupBox1 + + txtpass + tabPageCoreType - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 59, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 97, 21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -690,9 +735,6 @@ 29 - - tabPage6 - tabPageCoreType @@ -714,8 +756,8 @@ label12 - - label2 + + NoControl Auth user @@ -738,14 +780,14 @@ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - 5 + 7 18, 104 @@ -762,11 +804,11 @@ 728, 427 - - tabPage1 + + 36 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 576, 16 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -774,21 +816,21 @@ 59, 12 - - 10 + + True + + + Listening port panel1 - - 30 + + NoControl 53, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 12 @@ -804,14 +846,11 @@ chkAutoRun - - groupBox1 - 94, 21 - - 4 + + 345, 62 10 @@ -819,26 +858,29 @@ Core Type - - 15, 129 + + 143, 20 + + + 3, 3, 3, 3 chkudpEnabled - - 46 - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - 8, 17 + + tabPage6 - - label9 + + tabPage1 + + + Core Type tabPage7 @@ -855,9 +897,6 @@ 1 - - 12 - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -870,18 +909,21 @@ True - - Auth pass - label7 + + allowInsecure + txtlocalPort 41 + + 236, 28 + tabPage7 @@ -909,23 +951,14 @@ protocol - - 15, 192 - - - Turn on Mux Multiplexing - - - tabPageCoreType + + True 23, 12 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 97, 20 + + http 638, 356 @@ -933,6 +966,9 @@ socks + + 8 + 3, 3 @@ -978,11 +1014,11 @@ System proxy settings - - True + + groupBox1 - - 89, 12 + + tabControl1 NoControl @@ -990,38 +1026,26 @@ 5 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 2 chkEnableStatistics - - 97, 21 - - - 353, 12 - - - groupBox1 - cmbCoreType4 - - 45, 46 + + 305, 12 193, 162 - - tabPageCoreType + + True - - 2 - - - 107, 12 + + 46 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1029,17 +1053,11 @@ tabPage6 - - 0, 0 + + label2 - - 234, 16 - - - 728, 427 - - - 728, 427 + + Set Windows10 UWP Loopback 9 @@ -1054,13 +1072,13 @@ 101, 12 - 9 + 11 - - groupBox1 + + tabPage7 - - 143, 20 + + 12 20 @@ -1071,23 +1089,20 @@ groupBox2 + + 6 + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) 107, 12 - - 0, 0, 0, 0 - 736, 453 - - tabPage6 - - - txtremoteDNS + + tabPageCoreType 4 @@ -1095,21 +1110,21 @@ True - - txtsystemProxyExceptions + + Automatic update interval of subscriptions (hours) - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 246, 16 + + + txtautoUpdateSubInterval + + + Do not use proxy server for addresses beginning with 11 - - System.Windows.Forms.Label, 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 - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1119,26 +1134,23 @@ System.Windows.Forms.Panel, 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 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - 345, 62 + + 37 chkKeepOlderDedupl - - True + + 15, 129 - - 2 + + 42 - - Automatically adjust column width after updating subscription + + 5 True @@ -1170,29 +1182,35 @@ 117, 146 + + Automatically adjust column width after updating subscription + + + 0 + 30, 376 - - 11 + + 97, 20 CoreType settings - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tabPage3 + + 2 + 40 15, 160 - - Vertical + + 45, 46 38 @@ -1203,12 +1221,18 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 9 + label1 Core: KCP settings + + NoControl + cmbCoreType5 @@ -1218,8 +1242,8 @@ True - - 59, 12 + + 0, 0 NoControl @@ -1239,8 +1263,8 @@ tabControl1 - - 736, 10 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 45, 124 @@ -1251,23 +1275,26 @@ Core Type + + btnSetLoopback + True + + 506, 16 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 345, 100 - 42 10 - - 45, 98 + + label16 44 @@ -1275,11 +1302,8 @@ 224, 29 - - 2 - - - tabPage6 + + chkEnableAutoAdjustMainLvColWidth labCoreType3 @@ -1287,11 +1311,8 @@ chkIgnoreGeoUpdateCore - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 40 + + Allow connections from the LAN 161, 60 @@ -1299,8 +1320,8 @@ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - chkEnableAutoAdjustMainLvColWidth + + tabPage6 True @@ -1320,8 +1341,8 @@ 39 - - 8 + + tabPageCoreType 35 @@ -1335,20 +1356,29 @@ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + labCoreType6 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage7 + + txtKcpreadBufferSize + + + 143, 20 System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Log level + + groupBox1 - - tabControl1 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill 638, 219 @@ -1359,36 +1389,27 @@ OptionSettingForm - - 14 + + 2 txtuser - - Core: basic settings - 120, 21 - 10 + 12 groupBox2 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbCoreType6 + + 39 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - 1 @@ -1398,38 +1419,38 @@ 13 - - NoControl - 198, 16 + + 6 + 8, 52 - - 9 - - + True + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + tabPage7 True - - allowInsecure + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - NoControl + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + 3, 3, 3, 3 23, 12 @@ -1449,48 +1470,42 @@ Exception + + 117, 172 + 3, 3, 3, 3 0 - - chklogEnabled - 4, 22 - - groupBox1 + + 345, 100 94, 21 - - 3 - - + NoControl - - 117, 120 + + 728, 427 NoControl - - 204, 16 - - - 4, 22 - 41 94, 21 + + debug + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1509,18 +1524,24 @@ 143, 20 + + True + tabPage1 + + 3 + 3, 3, 3, 3 + + 9 + tabPageCoreType - - 143, 20 - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1536,8 +1557,8 @@ 4, 22 - - Listening port + + tabPage6 7 @@ -1560,17 +1581,17 @@ 1 - - 94, 21 + + Core: basic settings - - txtKcpuplinkCapacity + + Core Type tabPage2 - - 59, 12 + + chklogEnabled tabControl1 @@ -1578,8 +1599,8 @@ tabPage7 - - labCoreType1 + + txtsystemProxyExceptions System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1599,20 +1620,23 @@ 40 - - Automatic update interval of subscriptions and Geo (hours) + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 42 - - http + + 4, 22 23 - - labCoreType6 + + NoControl + + + label3 6 @@ -1623,20 +1647,20 @@ groupBox1 - - NoControl + + 15, 16 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - label13 + + True 1 - - 6 + + $this 8 @@ -1644,17 +1668,17 @@ 59, 12 - - tabPageCoreType + + txtremoteDNS - - tabPageCoreType + + Vertical 0, 463 - - True + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True @@ -1662,8 +1686,8 @@ 3 - - 117, 172 + + 1 11 @@ -1671,8 +1695,14 @@ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 39 + + 89, 12 + + + 15 + + + 6 97, 21 @@ -1683,23 +1713,20 @@ 397, 27 - - 36 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 45, 72 - - - Fill - - + groupBox1 + + tabPage6 + 32 - - 15, 108 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Core: DNS settings @@ -1707,8 +1734,8 @@ 345, 24 - - 143, 20 + + 45, 72 cbFreshrate @@ -1728,41 +1755,53 @@ tabPage7 + + tabPageCoreType + 8 - - 125, 12 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl + + 204, 16 cmbCoreType1 - - 75, 23 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 writeBufferSize - + + uplinkCapacity + + + 59, 12 + + 10 4 - - uplinkCapacity + + 0, 0, 0, 0 - - 736, 523 + + 40 143, 20 - - txtKcpdownlinkCapacity + + label4 + + + Bottom System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1770,20 +1809,20 @@ NoControl - - Vertical + + True - - 6 + + 30, 138 - - 7 + + 59, 12 2 - 390, 132 + 354, 132 Settings @@ -1791,14 +1830,14 @@ 3 - - tabPage7 + + cmbCoreType6 - - 6 + + 143, 20 - - NoControl + + cmbloglevel label5 @@ -1806,38 +1845,44 @@ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 390, 16 + groupBox2 - - 15, 187 + + 15, 192 - - btnOK + + tabPage6 6 - - NoControl + + 6 - - debug + + label13 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 + + Auth pass chkmuxEnabled - - none + + panel2 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 728, 427 + + + tabPage6 3 @@ -1845,17 +1890,17 @@ 15, 84 - - chkKcpcongestion + + 117, 120 224, 65 - - labCoreType5 + + 342, 17 - - 0, 0 + + Core Type Enable UDP @@ -1869,12 +1914,15 @@ 37 - - 3, 3, 3, 3 + + True 9 + + 14 + 126, 16 @@ -1890,35 +1938,35 @@ 75, 23 - - Do not use proxy server for addresses beginning with + + 269, 12 - - 390, 16 + + NoControl 94, 21 - - readBufferSize + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 2 + + 45, 150 0 - - True + + groupBox1 - - 342, 17 + + 0 94, 21 - - 3 + + 97, 20 System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1929,29 +1977,32 @@ 38 - - 236, 28 + + Custom DNS (multiple, separated by commas (,)) - - Bottom + + 728, 427 - - 3 + + 11 - - 6 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 4 - - 143, 20 + + groupBox1 - - 3, 3, 3, 3 + + 125, 12 - - panel2 + + labCoreType5 + + + 1 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1959,20 +2010,20 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Core Type + + 2 + + + Turn on Mux Multiplexing + + + True label6 - - 246, 16 - - - 506, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 3 txtKcpwriteBufferSize @@ -1989,14 +2040,14 @@ NoControl - - 37 + + label9 NoControl - - 736, 60 + + 2 label14 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index f9cf4aea..5104d229 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -250,6 +250,15 @@ v2rayN设置 + + 248, 159 + + + 173, 12 + + + 自动更新订阅的间隔(单位小时) + 启用安全协议TLS v1.3 (订阅/检查更新/测速) @@ -263,13 +272,13 @@ 解除Windows10 UWP应用回环代理限制 - 274, 134 + 248, 134 - 227, 12 + 191, 12 - 自动更新订阅和Geo文件的间隔(单位小时) + 自动更新Geo文件的间隔(单位小时) 150, 16 diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 64df0711..54154e19 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -208,40 +208,54 @@ namespace v2rayN.Handler private void UpdateTaskRun(Config config, Action update) { + var autoUpdateSubTime = DateTime.Now; + var autoUpdateGeoTime = DateTime.Now; + + Thread.Sleep(60000); + Utils.SaveLog("UpdateTaskRun"); + var updateHandle = new UpdateHandle(); while (true) { - Thread.Sleep(60000); - if (config.autoUpdateInterval <= 0) + var dtNow = DateTime.Now; + + if (config.autoUpdateSubInterval > 0) { - continue; + if ((dtNow - autoUpdateSubTime).Hours % config.autoUpdateSubInterval == 0) + { + updateHandle.UpdateSubscriptionProcess(config, true, (bool success, string msg) => + { + update(success, msg); + if (success) + Utils.SaveLog("subscription" + msg); + }); + autoUpdateSubTime = dtNow; + } + Thread.Sleep(60000); } - Utils.SaveLog("UpdateTaskRun"); - updateHandle.UpdateSubscriptionProcess(config, true, (bool success, string msg) => + if (config.autoUpdateInterval > 0) { - update(success, msg); - if (success) - Utils.SaveLog("subscription" + msg); - }); + if ((dtNow - autoUpdateGeoTime).Hours % config.autoUpdateInterval == 0) + { + updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => + { + update(false, msg); + if (success) + Utils.SaveLog("geosite" + msg); + }); - Thread.Sleep(60000); + updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) => + { + update(false, msg); + if (success) + Utils.SaveLog("geoip" + msg); + }); + autoUpdateGeoTime = dtNow; + } + } - updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => - { - update(false, msg); - if (success) - Utils.SaveLog("geosite" + msg); - }); - - updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) => - { - update(false, msg); - if (success) - Utils.SaveLog("geoip" + msg); - }); - - Thread.Sleep(1000 * 3600 * config.autoUpdateInterval); + Thread.Sleep(1000 * 3600); } } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 20913046..612d6a1a 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -125,10 +125,9 @@ namespace v2rayN.Mode get; set; } - public int autoUpdateInterval - { - get; set; - } = 0; + public int autoUpdateInterval { get; set; } = 0; + + public int autoUpdateSubInterval { get; set; } = 0; public bool enableSecurityProtocolTls13 { From 0b1ec520f4a7ba73b987073c93303f81d4178303 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 14 Apr 2022 17:01:51 +0800 Subject: [PATCH 181/252] fix --- v2rayN/v2rayN/Forms/MainForm.cs | 7 -- .../v2rayN/Forms/MainMsgControl.Designer.cs | 1 + v2rayN/v2rayN/Forms/MainMsgControl.cs | 8 ++ v2rayN/v2rayN/Forms/MainMsgControl.resx | 92 +++++++++---------- .../v2rayN/Forms/MainMsgControl.zh-Hans.resx | 62 +++++++++---- 5 files changed, 100 insertions(+), 70 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 065f9051..8ff27652 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -389,13 +389,6 @@ namespace v2rayN.Forms { } - 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) { diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs index 9af4bc0f..785a4329 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs @@ -130,6 +130,7 @@ namespace v2rayN.Forms this.toolSslServerSpeed, this.toolSslBlank4}); this.ssMain.Name = "ssMain"; + this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslInboundInfo // diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs index 85a4bdde..660aa2f4 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.cs +++ b/v2rayN/v2rayN/Forms/MainMsgControl.cs @@ -189,6 +189,14 @@ namespace v2rayN.Forms gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, MsgFilter); } } + + private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) + { + Utils.SetClipboardData(e.ClickedItem.Text); + } + } #endregion diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.resx b/v2rayN/v2rayN/Forms/MainMsgControl.resx index 8a16d9b2..a4461339 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.resx +++ b/v2rayN/v2rayN/Forms/MainMsgControl.resx @@ -126,12 +126,12 @@ Select All (Ctrl+A) + + ssMain + menuMsgBoxSelectAll - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False @@ -146,9 +146,6 @@ 227, 22 - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - menuMsgBoxCopyAll @@ -173,8 +170,8 @@ System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6, 12 + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 0, 17 @@ -188,6 +185,9 @@ txtMsgBox + + 0, 17 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -209,9 +209,6 @@ Add Routing Rule (Ctrl+V) - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - MiddleRight @@ -224,15 +221,15 @@ InboundInfo - - 0 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 menuMsgBoxClear + + 4 + 5 @@ -242,9 +239,6 @@ 3, 17 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - toolSslBlank4 @@ -260,15 +254,15 @@ 172, 17 - - menuMsgBoxAddRoutingRule - True Clear All + + 6, 12 + Vertical @@ -282,6 +276,9 @@ cmsMsgBox + + Fill + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -303,8 +300,8 @@ System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Copy All + + MainMsgControl 0, 0 @@ -318,26 +315,29 @@ No - - Copy (Ctrl+C) + + Copy All + + + 250, 17 statusStrip1 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuMsgBoxAddRoutingRule toolSslBlank2 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Set message filters SPEED Disabled - - 4 + + 0 gbMsgTitle @@ -348,32 +348,32 @@ 1 - - MainMsgControl + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 menuMsgBoxCopy - - 0, 17 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ssMain + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Set message filters + + Copy (Ctrl+C) 228, 136 - - 250, 17 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 + + 131, 18 zh-Hans @@ -381,7 +381,7 @@ True - - 131, 18 + + 17, 17 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx index d9673dca..950b302b 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx @@ -117,25 +117,53 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 信息 - - - 快速添加路由规则 (Ctrl+V) - - - 清除所有 - - - 复制 (Ctrl+C) - - - 复制所有 - - - 设置信息过滤器 + + + 221, 22 全选 (Ctrl+A) + + 221, 22 + + + 复制 (Ctrl+C) + + + 221, 22 + + + 复制所有 + + + 221, 22 + + + 清除所有 + + + 221, 22 + + + 快速添加路由规则 (Ctrl+V) + + + 221, 22 + + + 设置信息过滤器 + + + 222, 136 + + + 157, 17 + + + 157, 17 + + + 信息 + \ No newline at end of file From 0e55a859ea6d8b64f9af413ee274914463f4fb9a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 14 Apr 2022 18:30:15 +0800 Subject: [PATCH 182/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 0eace496..b6178c00 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.15")] +[assembly: AssemblyFileVersion("5.16")] From 2d8a707beddef96fd0287d45adccf55195287988 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 14 Apr 2022 20:08:35 +0800 Subject: [PATCH 183/252] fix bug --- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index fdf8f000..8fbeeb7c 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -158,19 +158,19 @@ namespace v2rayN.Handler if (config.inbound[0].allowLANConn) { Inbounds inbound3 = GetInbound(config.inbound[0], Global.InboundSocks2, 2, true); + inbound3.listen = "0.0.0.0"; v2rayConfig.inbounds.Add(inbound3); Inbounds inbound4 = GetInbound(config.inbound[0], Global.InboundHttp2, 3, false); + inbound4.listen = "0.0.0.0"; v2rayConfig.inbounds.Add(inbound4); //auth if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass)) { - inbound3.listen = "0.0.0.0"; inbound3.settings.auth = "password"; inbound3.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; - inbound4.listen = "0.0.0.0"; inbound4.settings.auth = "password"; inbound4.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; } From 4d013a206b768e91328712cebc59682bebc1380b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 15 Apr 2022 20:49:14 +0800 Subject: [PATCH 184/252] Update MainMsgControl.zh-Hans.resx --- v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx index 950b302b..d54a14f8 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx @@ -166,4 +166,7 @@ 信息 + + 网速显示未启用 + \ No newline at end of file From 4ada8fea2759e965604e2f1bb44c2cd5d12f74b6 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 17 Apr 2022 19:01:18 +0800 Subject: [PATCH 185/252] add tray menu servers limit --- v2rayN/v2rayN/Forms/MainForm.cs | 2 +- .../v2rayN/Forms/MainMsgControl.Designer.cs | 1 + .../Forms/OptionSettingForm.Designer.cs | 16 + v2rayN/v2rayN/Forms/OptionSettingForm.cs | 13 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3654 +++++++++-------- .../Forms/OptionSettingForm.zh-Hans.resx | 201 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 4 + v2rayN/v2rayN/Mode/Config.cs | 2 + 8 files changed, 1994 insertions(+), 1899 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 8ff27652..7537ba71 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -345,7 +345,7 @@ namespace v2rayN.Forms { menuServers.DropDownItems.Clear(); - if (lstVmess.Count > 30) + if (lstVmess.Count > config.trayMenuServersLimit) { menuServers.DropDownItems.Add(new ToolStripMenuItem(ResUI.TooManyServersTip)); return; diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs index 785a4329..d23bd9f9 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs @@ -61,6 +61,7 @@ namespace v2rayN.Forms this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); this.txtMsgBox.Name = "txtMsgBox"; this.txtMsgBox.ReadOnly = true; + this.txtMsgBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtMsgBox_KeyDown); // // cmsMsgBox // diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index e790664b..f2d0fb9d 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -68,6 +68,8 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.txttrayMenuServersLimit = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); this.txtautoUpdateSubInterval = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); this.chkEnableSecurityProtocolTls13 = new System.Windows.Forms.CheckBox(); @@ -376,6 +378,8 @@ // tabPage7 // resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.txttrayMenuServersLimit); + this.tabPage7.Controls.Add(this.label17); this.tabPage7.Controls.Add(this.txtautoUpdateSubInterval); this.tabPage7.Controls.Add(this.label3); this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13); @@ -392,6 +396,16 @@ this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // txttrayMenuServersLimit + // + resources.ApplyResources(this.txttrayMenuServersLimit, "txttrayMenuServersLimit"); + this.txttrayMenuServersLimit.Name = "txttrayMenuServersLimit"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // // txtautoUpdateSubInterval // resources.ApplyResources(this.txtautoUpdateSubInterval, "txtautoUpdateSubInterval"); @@ -713,5 +727,7 @@ private System.Windows.Forms.TextBox txtuser; private System.Windows.Forms.TextBox txtautoUpdateSubInterval; private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txttrayMenuServersLimit; + private System.Windows.Forms.Label label17; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 1c713df8..755344f5 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -111,10 +111,12 @@ namespace v2rayN.Forms } chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; - txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); - txtautoUpdateSubInterval.Text = config.autoUpdateSubInterval.ToString(); chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13; + + txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); + txtautoUpdateSubInterval.Text = config.autoUpdateSubInterval.ToString(); + txttrayMenuServersLimit.Text = config.trayMenuServersLimit.ToString(); } private void InitCoreType() @@ -305,11 +307,12 @@ namespace v2rayN.Forms config.keepOlderDedupl = chkKeepOlderDedupl.Checked; config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; - config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); - config.autoUpdateSubInterval = Utils.ToInt(txtautoUpdateSubInterval.Text); config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked; config.enableSecurityProtocolTls13 = chkEnableSecurityProtocolTls13.Checked; + config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); + config.autoUpdateSubInterval = Utils.ToInt(txtautoUpdateSubInterval.Text); + config.trayMenuServersLimit = Utils.ToInt(txttrayMenuServersLimit.Text); return 0; } @@ -339,6 +342,6 @@ namespace v2rayN.Forms { Process.Start(Utils.GetPath("EnableLoopback.exe")); } - + } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index d9adddf4..b1ee7ec9 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1577 +117,128 @@ System.Resources.ResXResourceWriter, 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 - - - - NoControl - - - - 11 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Keep older when deduplication - - - 1 + + tabPage6 - - 6, 283 - - - Record local logs - - - tabPage7 - - - 12 - - - 4, 22 - - - 9 - - - groupBox1 - - - 10 - - - tti - - - 13 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - label10 - - - 10 - - - tabPage7 - - - 5 - - - 94, 21 - - - 9 - - - groupBox1 - - - label15 - - - txtautoUpdateInterval - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 38 - - - Top - - - 102, 16 - - - 0 - - - 14 - - - tabPage3 - - - Core Type - - - 5 - - - 7 - - - 30, 64 - - - 111, 100 - - - 30 - - - True - - - System.Windows.Forms.Label, 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 - - - 84, 16 - - - 40 - - - labCoreType2 - - - True - - - 120, 16 - - - 285, 61 - - - True - - - readBufferSize - - - 234, 16 - - - tabPage6 - - - 4 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 59, 12 - - - 7 - - - tabPage7 - - - 12 - - - 736, 60 - - - 0, 0 - - - chkEnableSecurityProtocolTls13 - - - NoControl - - - Fill - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - chkdefAllowInsecure - - - 722, 421 - - - NoControl - - - 30, 165 - - - 95, 12 - - - System.Windows.Forms.ComboBox, 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 - - - 45, 98 - - - 39 - - - 317, 12 - - - 59, 12 - - - 354, 159 - - - groupBox1 - - - 8 - - - tabPage7 - - - 18, 28 - - - &Cancel - - - 36 - - - 111, 62 - - - 728, 427 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - NoControl - - - tabPageCoreType - - - tabPage7 - - - 736, 10 - - - 728, 427 - - - 15, 193 - - - 15, 108 - - - txtKcpuplinkCapacity - - - 2 - - - 42 - - - txtKcpmtu - - - lbFreshrate - - - 11 - - - label11 - - - 29 - - - True - - - NoControl - - - 0, 10 - - - 143, 20 - - - cmbCoreType2 - - - Support DnsObject - - - 43 - - - labCoreType1 - - - tabPage6 - - - 58, 20 - - - tabControl1 - - - Automatic update interval of and Geo (hours) - - - $this - - - 7 - - - 736, 523 - - - NoControl - - - none - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - 117, 42 - - - 6 - - - tabPage7 - - - 43 - - - tabPage6 - - - Fill + + 351, 211 groupBox1 - - True - - - System.Windows.Forms.ComboBox, 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 - - - congestion - - - 45, 176 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 215 - - - 3 - - - 89, 12 - - - info - - - 0 - - - 0 - - - 97, 21 - - - v2rayN settings - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 117, 94 - - - 9 - - - Use semicolon (;) - - - True - - - 6, 12 - - - 1 - - - True - - - 8 - - - txtKcpdownlinkCapacity - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Enable Security Protocol TLS v1.3 (subscription/update/speedtest) - - - Automatically start at system startup - - - 1 - - - txtKcptti - - - Vertical - - - 281, 12 - - - Ignore Geo files when updating core - - - 355, 16 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 33, 29 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 78, 21 - - - Log level - - - tabControl1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 59, 12 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - warning - - - tabPage2 - - - 5 - - - tabPageCoreType - - - True - - - Statistics freshrate - - - 5 - - - 107, 12 - - - 75, 23 - - - 89, 12 - - - btnOK - - - chkKcpcongestion - - - 18, 66 - - - 20, 143 - - - 11 - - - 8, 17 - - - 4, 4, 4, 4 - - - tabPage6 - - - 37 - - - Turn on Sniffing - - - 4 - - - groupBox1 - - - txtpass - - - tabPageCoreType - - - 59, 12 - - - 97, 21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 39 - - - 20 - - - 29 - - - tabPageCoreType - - - True - - - 47 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - label12 - - - NoControl - - - Auth user - - - True - - - 8, 28 - - - chksniffingEnabled - - - 2 - - - 174, 16 - - - 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 - - - groupBox1 - - - 7 - - - 18, 104 - - - tabPage2 - - - True - - - 282, 23 - - - 728, 427 - - - 36 - - - 576, 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 59, 12 - - - True + + + 6 Listening port - - panel1 - - - NoControl - - - 53, 12 - - - 12 - - - label8 - - - 496, 27 - - - labCoreType4 - - - chkAutoRun - - - 94, 21 - - - 345, 62 - - - 10 - - - Core Type - - - 143, 20 - - - 3, 3, 3, 3 - - - chkudpEnabled - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - tabPage6 - - - tabPage1 - - - Core Type - - - tabPage7 - - - tabPage6 - - - 2 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 84, 16 - - - 15 - - - True - - - label7 - - - allowInsecure - - - txtlocalPort - - - 41 - - - 236, 28 - - - tabPage7 - - - tabPage7 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - tabPage6 - - - True - - - btnClose - - - 124, 25 - - - protocol - - - True - - - 23, 12 - - - http - - - 638, 356 - - - socks - - + 8 - - 3, 3 + + 317, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - chkAllowLANConn - - - True - - - 117, 68 - - - 36 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 63 - - - tabPage6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 8 - - - System proxy settings - - - groupBox1 - - - tabControl1 - - - NoControl - - - 5 - - - 2 - - - chkEnableStatistics - - - cmbCoreType4 - - - 305, 12 - - - 193, 162 - - - True - - - 46 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - label2 - - - Set Windows10 UWP Loopback - - - 9 - - - groupBox1 - - - 0 - - - 101, 12 - - - 11 - - - tabPage7 - - - 12 - - - 20 - - - cmbprotocol - - - groupBox2 - - - 6 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - 107, 12 - - - 736, 453 - - - tabPageCoreType - - - 4 - - - True - - - Automatic update interval of subscriptions (hours) - - - 246, 16 - - - txtautoUpdateSubInterval - - - Do not use proxy server for addresses beginning with - - - 11 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 37 - - - chkKeepOlderDedupl - - - 15, 129 - - - 42 - - - 5 - - - True - - - True - - - 45 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 0 - - - 285, 25 - - - tabPage2 - - - tabPageCoreType - - - 117, 146 - - - Automatically adjust column width after updating subscription - - - 0 - - - 30, 376 - - - 97, 20 - - - CoreType settings - - - tabPage3 - - - 2 - - - 40 - - - 15, 160 - - - 45, 46 - - - 38 - - - 33 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - - - label1 - - - Core: KCP settings - - - NoControl - - - cmbCoreType5 - - - error - - - True - - - 0, 0 - - - NoControl - - - 38 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 728, 427 - - - downlinkCapacity - - - tabControl1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 45, 124 - - - True - - - Core Type - - - btnSetLoopback - - - True - - - 506, 16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 42 - - - 10 - - - label16 - - - 44 - - - 224, 29 - - - chkEnableAutoAdjustMainLvColWidth - - - labCoreType3 - - - chkIgnoreGeoUpdateCore - - - Allow connections from the LAN - - - 161, 60 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - True - - - 6 - - - groupBox2 - - - tabPageCoreType - - + panel2 - - 39 - - - tabPageCoreType - - - 35 - - - linkDnsObjectDoc - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - labCoreType6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtKcpreadBufferSize - - - 143, 20 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 638, 219 - - - 7 - - - OptionSettingForm - - - 2 - - - txtuser - - - 120, 21 - - - 12 - - - groupBox2 - - - 39 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 397, 65 - - - 13 - - - 198, 16 - - - 6 - - - 8, 52 - - - True - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - True - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - 23, 12 - - - True - - - 4 - - - 8 - - - 41 - - - Exception - - - 117, 172 - - - 3, 3, 3, 3 - - - 0 - - - 4, 22 - - - 345, 100 - - - 94, 21 - - - NoControl - - - 728, 427 - - - NoControl - - - 41 - - - 94, 21 - - - debug - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - NoControl - - - cmbCoreType3 - - - 8, 41 - - - 143, 20 - - - True - - - tabPage1 - - - 3 - - - 3, 3, 3, 3 - - - 9 - - - tabPageCoreType - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - groupBox1 - - - mtu - - - 4, 22 - - - tabPage6 - - - 7 - - - False - - - NoControl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &OK - - - 10 - - - 1 - - - Core: basic settings - - - Core Type - - - tabPage2 - - - chklogEnabled - - - tabControl1 - tabPage7 - - txtsystemProxyExceptions + + tabPage7 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 355, 16 - + + tabPage7 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 97, 21 + + + error + + + 15, 129 + + + readBufferSize + + + NoControl - - 4, 22 + + chkudpEnabled - - $this + + 45 - - tabPageCoreType + + txtpass - - 40 + + 282, 23 - + + downlinkCapacity + + + mtu + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + labCoreType4 + + + 506, 16 + + + 41 + + + 36 + + + 10 + + + 120, 21 + + + True + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 42 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 4, 22 + + Log level - - 23 + + 351, 157 - - NoControl - - - label3 - - - 6 - - - 236, 66 - - + groupBox1 - - 15, 16 + + panel1 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage6 - - True - - - 1 - - - $this - - - 8 - - - 59, 12 - - - txtremoteDNS - - - Vertical - - - 0, 463 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 3 - - - 1 + + 620, 37 11 @@ -1695,364 +246,1867 @@ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 89, 12 + + 35 - - 15 - - + 6 - - 97, 21 + + 45, 150 - - 31 + + Enable UDP - - 397, 27 + + System.Windows.Forms.CheckBox, 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 + + 15, 131 - + + tabPage7 + + + 8, 41 + + + 45, 46 + + + 94, 21 + + + 390, 16 + + groupBox1 - - tabPage6 - - - 32 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Core: DNS settings - - - 345, 24 - - - 45, 72 - - - cbFreshrate - - - 257, 158 - - - tabPageCoreType - 2 - - 236, 104 - - + tabPage7 - - tabPageCoreType + + 285, 25 - + + 15, 16 + + + 125, 12 + + + 97, 21 + + + cbFreshrate + + + Statistics freshrate + + + warning + + + 0 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + Keep older when deduplication + + + txtlocalPort + + + 84, 16 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + True + + + 15 + + + 193, 162 + + + 342, 17 + + + 95, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 27, 188 + + 8 + + tabPage7 + + + 236, 66 + + + 1 + + + groupBox1 + + + 13 + + + 2 + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 204, 16 + + 15, 39 - - cmbCoreType1 + + 124, 25 - + + True + + + 10 + + + 0 + + + 9 + + + protocol + + + True + + + tabPage6 + + + 3, 3, 3, 3 + + + True + + + chkEnableStatistics + + + OptionSettingForm + + + 8 + + + 12 + + + label14 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + Record local logs + + + Automatically adjust column width after updating subscription + + + Auth user + + + label15 + + + 43 + + + labCoreType3 + + + 5 + + + True + + + 117, 68 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33, 29 + + + 11 + + + 117, 172 + + + Use semicolon (;) + + + 75, 23 + + + tabControl1 + + + tabPage2 + + + 12 + + + 3, 3, 3, 3 + + + groupBox1 + + + lbFreshrate + + + labCoreType1 + + + 44 + + + 10 + + + 9 + + + 14 + + + 4, 4, 4, 4 + + + NoControl + + + 4, 22 + + + Core Type + + + 736, 453 + + + 59, 12 + + + 15, 108 + + + True + + + 2 + + + True + + + uplinkCapacity + + + 0 + + + 36 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + none + + + 7 + + + 45, 98 + + + label10 + + + 94, 21 + + + 4 + + + True + + + 78, 21 + + + txtsystemProxyExceptions + + + 236, 104 + + + 42 + + + True + + + label11 + + + 1 + + + 12 + + + True + + + chkEnableAutoAdjustMainLvColWidth + + + 0 + + + 7 + + + NoControl + + + btnSetLoopback + + + chkEnableSecurityProtocolTls13 + + + 10 + + + 15, 160 + + + 97, 20 + + + 143, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 23 + + + cmbloglevel + + + 496, 61 + + + label16 + + + 20 + + + v2rayN settings + + + groupBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + tabPage7 + + + 3 + + + 120, 16 + + + $this + + + groupBox1 + + + NoControl + + + cmbCoreType6 + + + True + + + 58, 20 + + + label17 + + + 97, 21 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageCoreType + + + tabPageCoreType + + + 496, 27 + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + cmbCoreType5 + + + tabPageCoreType + + + tabPageCoreType + + + 0, 463 + + + 143, 20 + + + 4, 22 + + + True + + + Bottom + + + tti + + + 468, 16 + + + Enable Security Protocol TLS v1.3 (subscription/update/speedtest) + + + 94, 21 + + + 0 + + + NoControl + + + groupBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + True + + + 6 + + + groupBox2 + + + 1 + + + 9 + + + 94, 21 + + + tabPage6 + + + Settings + + + True + + + 11 + + + 89, 12 + + + label12 + + + 1 + + + chkmuxEnabled + + + 0 + + + Automatic update interval of and Geo (hours) + + + label2 + + + 1 + + + groupBox1 + + + label6 + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 13 + + + label13 + + + 46 + + + tabControl1 + + + 111, 100 + + + 0 + + + 37 + + + 0 + + + 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 + + + True + + + 7 + + + Automatic update interval of subscriptions (hours) + + + Custom DNS (multiple, separated by commas (,)) + + + 1 + + + 30, 376 + + + chklogEnabled + + + True + + + 345, 62 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 59, 12 + + + 4 + + + 5 + + + 8, 17 + + + 41 + + + 39 + + + 111, 24 + + + 97, 21 + + + &OK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + txtKcpmtu + + + 6 + + + Fill + + + 3, 3 + + + NoControl + + + 8, 52 + + + 4 + + + 102, 16 + + + cmbCoreType4 + + + groupBox2 + + + Fill + + + groupBox1 + + + 6 + + + 736, 523 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + txtKcpwriteBufferSize + + + 18, 28 + + + 101, 12 + + + 736, 10 + + + 236, 28 + + + groupBox2 + + + groupBox1 + + + NoControl + + + 8 + + + 75, 23 + + + 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 345, 100 + + + 39 + + + 2 + + + 15, 63 + + + Exception + + + tabPage7 + + + 38 + + + chkIgnoreGeoUpdateCore + + + NoControl + + + chksniffingEnabled + + + tabPage7 + + + 5 + + + labCoreType6 + + + 198, 16 + + + 0, 0, 0, 0 + + + 15, 62 + + + 0, 10 + + + NoControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 42 + + + 397, 65 + + + tabPageCoreType + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 11 + + + 53, 12 + + + 2 + + + tabPageCoreType + + + Core Type + + + True + + + 5 + + + 728, 427 + + + labCoreType2 + + + 7 + + + Tray right-click menu servers display limit + + + NoControl + + + 8, 28 + + + 9 + + + 59, 12 + + + chkKeepOlderDedupl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 84, 16 + + + txtautoUpdateSubInterval + + + NoControl + + + label5 + + + 59, 12 + + + 728, 427 + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 728, 427 + + + True + + + 489, 41 + + + tabControl1 + + + 1 + + + tabPage1 + + + 45, 176 + + + 10 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9 + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 43 + + + 47 + + + 59, 12 + + + allowInsecure + + + 36 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + tabPage7 + + + Core Type + + + 728, 427 + + + True + + + btnOK + + + True + + + 8 + + + cmbCoreType3 + + + 397, 27 + + + 42 + + + System.Windows.Forms.Label, 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 + + + 41 + + + 42 + + + 45, 124 + + + tabPage7 + + + tabControl1 + + + 59, 12 + + + 10 + + + tabControl1 + + + Core: basic settings + + + 6 + + + CoreType settings + + + 6 + + + 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 + + + tabPage3 + + + 263, 12 + + + panel2 + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + chkAutoRun + + + 143, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 192 + + + tabPage2 + + + btnClose + + + 638, 356 + + + chkdefAllowInsecure + + + 0 + + + 638, 219 + + + System.Windows.Forms.TextBox, 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 + + + 4 + + + tabPage3 + + + 40 + + + 143, 20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtKcptti + + + 23, 12 + + + 3, 3, 3, 3 + + + 23, 12 + + + 4, 22 + + + True + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 30 + + + 285, 61 + + + 45, 72 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 143, 20 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 writeBufferSize - - uplinkCapacity + + 117, 146 - - 59, 12 + + Ignore Geo files when updating core - - 10 + + 736, 60 - - 4 + + 39 - - 0, 0, 0, 0 + + 38 - - 40 + + txtKcpdownlinkCapacity - - 143, 20 + + 117, 42 label4 - - Bottom + + 29 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + label8 - + + 257, 158 + + + txtKcpreadBufferSize + + NoControl - + True - - 30, 138 + + &Cancel - - 59, 12 + + 15, 85 - - 2 + + 3, 3, 3, 3 - - 354, 132 + + 351, 184 - - Settings + + NoControl - - 3 + + groupBox1 - - cmbCoreType6 + + chkAllowLANConn - - 143, 20 + + 32 - - cmbloglevel - - - label5 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 390, 16 - - - groupBox2 - - - 15, 192 - - + tabPage6 - - 6 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 + + 27, 215 - - label13 + + 89, 12 - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Auth pass + + True - - chkmuxEnabled + + 234, 16 - - panel2 + + 89, 12 - - 728, 427 + + 12 - + + Automatically start at system startup + + + congestion + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 107, 12 + + + groupBox1 + + + False + + + 97, 20 + + + 4 + + + 11 + + tabPage6 - - 3 + + txtuser - - 15, 84 + + tabControl1 + + + 107, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 20 117, 120 - - 224, 65 + + True - - 342, 17 + + 143, 20 - - Core Type + + 345, 24 - - Enable UDP + + Top - - 15, 40 + + 11 - + + True + + + NoControl + + + 4, 22 + + + NoControl + + + 8 + + 59, 12 + + 39 + + + 18, 66 + + + Allow connections from the LAN + + + True + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 18, 104 + + + Set Windows10 UWP Loopback + + + txtautoUpdateInterval + + + 9 + + + 246, 16 + + + tabPage1 + + + 2 + + + 94, 21 + + + Fill + + + True + + + 13 + + + System.Windows.Forms.CheckBox, 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 + + + True + + + 5 + + + Turn on Mux Multiplexing + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + 6 + + + tabPageCoreType + + + tabPageCoreType + + + groupBox1 + + + 7 + + + 94, 21 + + + Turn on Sniffing + + + socks + + + tabPageCoreType + + + 117, 94 + + + 14 + + + 29 + + + http + + + True + + + NoControl + + + Vertical + + + 8 + + + True + + + 37 + + + label1 + + + 31 + + + groupBox1 + 37 + + $this + + + 728, 427 + + + 3 + + + label9 + True - + + tabPage7 + + + txttrayMenuServersLimit + + + Support DnsObject + + + True + + + 267, 16 + + + NoControl + + + txtKcpuplinkCapacity + + + 3 + + + tabPage6 + + + 40 + + + 174, 16 + + + 224, 29 + + + 40 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 722, 421 + + + 2 + + + True + + + 224, 65 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + cmbCoreType2 + + + 38 + + + 281, 12 + + + NoControl + + + 20, 143 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Core Type + + + 44 + + + True + + + System proxy settings + + + 15 + + + 126, 16 + + + cmbCoreType1 + + + label3 + + + 5 + + + tabPage6 + + + 2 + + + label7 + + + NoControl + + + 59, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtremoteDNS + + + Auth pass + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 40 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 204, 16 + + + 6, 12 + + + 12 + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Core: DNS settings + + + 45 + + + 59, 12 + + + 27, 161 + + + 0, 0 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart) + + + $this + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + debug + + + info + + + Core: KCP settings + + + 5 + + + tabControl1 + + + labCoreType5 + + + 111, 62 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 305, 12 + + + 38 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + chkKcpcongestion + + + 1 + + + 0 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33 + + + 7 + + + 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 + + + 269, 12 + + + 728, 427 + + + NoControl + + + tabPageCoreType + + + tabPage6 + + + 728, 427 + + + System.Windows.Forms.Button, 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 + + + tabPageCoreType + + + True + + + 6, 283 + + + 11 + + + cmbprotocol + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 4 + + + 3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + tabPage2 + + + tabPageCoreType + + + True + + + Do not use proxy server for addresses beginning with + + + 0, 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 3 + + 9 14 - - 126, 16 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 496, 61 - - - 267, 16 - - - groupBox1 - - - 75, 23 - - - 269, 12 - - - NoControl - - - 94, 21 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 45, 150 - - - 0 - - - groupBox1 - - - 0 - - - 94, 21 - - - 97, 20 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 38 - - - Custom DNS (multiple, separated by commas (,)) - - - 728, 427 - - - 11 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - groupBox1 - - - 125, 12 - - - labCoreType5 - - - 1 - - - System.Windows.Forms.CheckBox, 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 - - 2 + + tabPage6 - - Turn on Mux Multiplexing + + 1 - - True - - - label6 - - - 3 - - - txtKcpwriteBufferSize - - - 111, 24 - - - panel2 - - - 4 - - - NoControl - - - label9 - - - NoControl - - - 2 - - - label14 + + 0 True + + zh-Hans + \ 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 5104d229..10e4a4a0 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,15 +121,120 @@ 取消(&C) - - 662, 469 - 654, 443 Core:基础设置 + + 654, 443 + + + Core:DNS设置 + + + 654, 443 + + + Core:KCP设置 + + + 248, 211 + + + 185, 12 + + + 托盘右键菜单服务器展示数量限制 + + + 248, 184 + + + 173, 12 + + + 自动更新订阅的间隔(单位小时) + + + 启用安全协议TLS v1.3 (订阅/检查更新/测速) + + + 204, 16 + + + 自动调整服务器列宽在更新订阅后 + + + 解除Windows10 UWP应用回环代理限制 + + + 248, 157 + + + 191, 12 + + + 自动更新Geo文件的间隔(单位小时) + + + 150, 16 + + + 更新Core时忽略Geo文件 + + + 156, 16 + + + 去重时保留序号较小的项 + + + 431, 37 + + + 339, 41 + + + 77, 12 + + + 统计刷新频率 + + + 300, 16 + + + 启用统计(实时网速显示和使用流量显示,需要重启) + + + 180, 16 + + + 开机自动启动(可能会不成功) + + + 654, 443 + + + v2rayN设置 + + + 654, 443 + + + Core类型设置 + + + 654, 443 + + + 系统代理设置 + + + 662, 469 + 648, 437 @@ -220,12 +325,6 @@ 本地监听端口 - - 654, 443 - - - Core:DNS设置 - 161, 12 @@ -238,90 +337,6 @@ 自定义DNS(可多个,用逗号(,)隔开) - - 654, 443 - - - Core:KCP设置 - - - 654, 443 - - - v2rayN设置 - - - 248, 159 - - - 173, 12 - - - 自动更新订阅的间隔(单位小时) - - - 启用安全协议TLS v1.3 (订阅/检查更新/测速) - - - 204, 16 - - - 自动调整服务器列宽在更新订阅后 - - - 解除Windows10 UWP应用回环代理限制 - - - 248, 134 - - - 191, 12 - - - 自动更新Geo文件的间隔(单位小时) - - - 150, 16 - - - 更新Core时忽略Geo文件 - - - 156, 16 - - - 去重时保留序号较小的项 - - - 77, 12 - - - 统计刷新频率 - - - 372, 16 - - - 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) - - - 180, 16 - - - 开机自动启动(可能会不成功) - - - 654, 443 - - - Core类型设置 - - - 654, 443 - - - 系统代理设置 - 654, 443 diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 86afad5e..a9c2e040 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1206,6 +1206,10 @@ namespace v2rayN.Handler { config.routingIndex = 0; } + if (config.trayMenuServersLimit <= 0) + { + config.trayMenuServersLimit = 30; + } Global.reloadV2ray = true; diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 612d6a1a..699448e9 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -134,6 +134,8 @@ namespace v2rayN.Mode get; set; } + public int trayMenuServersLimit { get; set; } + #endregion #region other entities From 9894aa053fa4ed6ff6d2a502e24ea119c2c44f2a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 17 Apr 2022 19:05:11 +0800 Subject: [PATCH 186/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index b6178c00..0135e7b8 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.16")] +[assembly: AssemblyFileVersion("5.17")] From 1d4e5baafb9a1b92b5baa038cb9ab3f01177ad62 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 18 Apr 2022 18:57:56 +0800 Subject: [PATCH 187/252] Domain and IP are automatically sorted when saving --- .../RoutingRuleSettingDetailsForm.Designer.cs | 30 +- .../Forms/RoutingRuleSettingDetailsForm.cs | 12 +- .../Forms/RoutingRuleSettingDetailsForm.resx | 1048 +++++++++-------- ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 3 + 4 files changed, 572 insertions(+), 521 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs index 3f0f1e40..ee32e22e 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -42,6 +42,7 @@ this.label4 = new System.Windows.Forms.Label(); this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); this.panel4 = new System.Windows.Forms.Panel(); + this.chkAutoSort = new System.Windows.Forms.CheckBox(); this.btnClose = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); this.panel2 = new System.Windows.Forms.Panel(); @@ -63,7 +64,6 @@ // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.chkEnabled); this.panel3.Controls.Add(this.clbInboundTag); this.panel3.Controls.Add(this.label2); @@ -74,6 +74,7 @@ this.panel3.Controls.Add(this.labRoutingTips); this.panel3.Controls.Add(this.label4); this.panel3.Controls.Add(this.cmbOutboundTag); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // chkEnabled @@ -84,8 +85,8 @@ // // clbInboundTag // - resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); this.clbInboundTag.CheckOnClick = true; + resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); this.clbInboundTag.FormattingEnabled = true; this.clbInboundTag.Items.AddRange(new object[] { resources.GetString("clbInboundTag.Items"), @@ -100,8 +101,8 @@ // // clbProtocol // - resources.ApplyResources(this.clbProtocol, "clbProtocol"); this.clbProtocol.CheckOnClick = true; + resources.ApplyResources(this.clbProtocol, "clbProtocol"); this.clbProtocol.FormattingEnabled = true; this.clbProtocol.Items.AddRange(new object[] { resources.GetString("clbProtocol.Items"), @@ -127,8 +128,8 @@ // // labRoutingTips // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.Name = "labRoutingTips"; // // label4 @@ -138,26 +139,33 @@ // // cmbOutboundTag // - resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbOutboundTag.FormattingEnabled = true; this.cmbOutboundTag.Items.AddRange(new object[] { resources.GetString("cmbOutboundTag.Items"), resources.GetString("cmbOutboundTag.Items1"), resources.GetString("cmbOutboundTag.Items2")}); + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); this.cmbOutboundTag.Name = "cmbOutboundTag"; // // panel4 // - resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Controls.Add(this.chkAutoSort); this.panel4.Controls.Add(this.btnClose); this.panel4.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // + // chkAutoSort + // + resources.ApplyResources(this.chkAutoSort, "chkAutoSort"); + this.chkAutoSort.Name = "chkAutoSort"; + this.chkAutoSort.UseVisualStyleBackColor = true; + // // btnClose // - resources.ApplyResources(this.btnClose, "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); @@ -171,15 +179,15 @@ // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.groupBox2); this.panel2.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtIP); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -190,8 +198,8 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -214,6 +222,7 @@ this.panel3.ResumeLayout(false); this.panel3.PerformLayout(); this.panel4.ResumeLayout(false); + this.panel4.PerformLayout(); this.panel2.ResumeLayout(false); this.groupBox2.ResumeLayout(false); this.groupBox2.PerformLayout(); @@ -245,5 +254,6 @@ private System.Windows.Forms.CheckedListBox clbInboundTag; private System.Windows.Forms.Label label2; private System.Windows.Forms.CheckBox chkEnabled; + private System.Windows.Forms.CheckBox chkAutoSort; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index 38f683cd..ef1e950e 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -48,8 +48,16 @@ namespace v2rayN.Forms } rulesItem.inboundTag = inboundTag; rulesItem.outboundTag = cmbOutboundTag.Text; - rulesItem.domain = Utils.String2ListSorted(txtDomain.Text); - rulesItem.ip = Utils.String2ListSorted(txtIP.Text); + if (chkAutoSort.Checked) + { + rulesItem.domain = Utils.String2ListSorted(txtDomain.Text); + rulesItem.ip = Utils.String2ListSorted(txtIP.Text); + } + else + { + rulesItem.domain = Utils.String2List(txtDomain.Text); + rulesItem.ip = Utils.String2List(txtIP.Text); + } var protocol = new List(); for (int i = 0; i < clbProtocol.Items.Count; i++) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index fe5c1095..bbd5dbf2 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -117,577 +117,607 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 53, 12 - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 32 - - - 245, 20 - - - 80 - - - 31 - - - proxy - - - 4, 4, 4, 4 - - - Fill - - - panel1 - - - 3 - - - clbProtocol - - - Protocol - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 7 - - - NoControl - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 3 - - - Left - - - 80 - - - NoControl - - - 0 - - - 29, 12 - - - 1 - - - http - - - panel2 - - - tls - - - RoutingSettingDetailsForm - - - NoControl - - - System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - - - Fill - - - 411, 15 - - - 119, 20 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 36 - - - Bottom - - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 344, 375 - - - $this - - - 598, 16 - - - groupBox1 - - - NoControl - - - 2 - - - 5 - - - label1 - - - 742, 395 - - - 0, 0 - - - 9 - - - True - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - True - - - 3 - - - panel4 - - - 5 - - - bittorrent - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - socks - - - panel3 - - - 19, 82 - - - 25 - - - 347, 16 - - - 3, 17 - - - panel3 - - - 19, 20 - - - labRoutingTips - - - 19, 47 - - - 39 - - - groupBox1 - - - 1 - - - RoutingRuleSettingDetailsForm - - - panel2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 107, 43 - - - groupBox2 - - - 8 - - - 1 - - - 386, 375 - - - panel3 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - Fill - - - panel4 - - - NoControl - - + Top - - $this - - - 42 - - - groupBox2 - - - panel3 - - - panel3 - - - System.Windows.Forms.Panel, 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 - - - http - - - txtPort - - - 3, 17 - - - 1 + + + 0, 0 742, 10 - - 0, 0 - - - 24 - - - Port - - - Enable - - - label4 - - - &OK - - - 75, 23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - 34 - - - 274, 47 - - - 40 - - - block - - - 33 - - - 347, 43 - - - 0 - - - panel3 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnOK - - - 2 - - - 119, 21 - - - 4 - + 7 - - 0 + + panel1 - - 11 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - - - panel3 - - - 8 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - label3 - - - inboundTag - - - Top - - - 742, 60 - - - 0, 121 - - + $this - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - 245, 20 - - - 65, 12 - - - btnClose - - - 392, 0 - - - 742, 111 - - - True - - - 6, 12 - - - 0 - - - 617, 19 - - - 0, 10 - - - 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 + + 3 True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl - - txtIP - - - direct - - - label2 + + 617, 19 60, 16 - - cmbOutboundTag + + 42 + + + Enable chkEnabled - - True + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 274, 20 + + panel3 - - NoControl + + 0 - - 742, 576 + + 80 - - 10 + + socks - - $this + + http - - 392, 395 + + 347, 16 - - 75, 23 - - - clbInboundTag - - - 4 - - - &Cancel - - - NoControl - - - NoControl - - - True - - - 4 - - - txtDomain + + 245, 20 41 - - IP + + clbInboundTag + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 panel3 + + 1 + + + True + + + NoControl + + + 274, 20 + + + 65, 12 + + + 40 + + + inboundTag + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + 80 + + + http + + + tls + + + bittorrent + + + 347, 43 + + + 245, 20 + + + 39 + + + clbProtocol + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + True + + + NoControl + + + 274, 47 + + + 53, 12 + + + 36 + + + Protocol + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 4 + + + 107, 43 + + + 119, 21 + + + 35 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + True + + + NoControl + + + 19, 47 + + + 29, 12 + + + 34 + + + Port + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 6 + + + NoControl + + + 19, 82 + + + 598, 16 + + + 33 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 7 + + + True + + + NoControl + + + 19, 20 + + + 71, 12 + + + 32 + + + outboundTag + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 8 + + + proxy + + + direct + + + block + + + 107, 16 + + + 119, 20 + + + 31 + + + cmbOutboundTag + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 9 + + + Top + + + 0, 10 + + + 742, 111 + + + 8 + + + panel3 + 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 + + $this - - 0, 516 + + 2 - - 71, 12 + + True - - 350, 395 + + NoControl - - panel3 + + 41, 18 - - Domain + + 270, 16 - - Fill + + 41 + + + Domain and ip are auto sorted when saving + + + chkAutoSort + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + NoControl 504, 15 - - 107, 16 + + 75, 23 - - outboundTag + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + NoControl + + + 411, 15 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 2 + + + Bottom + + + 0, 516 + + + 742, 60 + + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Fill + + + 3, 17 + + + True + + + 344, 375 + + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 350, 395 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 386, 375 + + + 24 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 395 + + + 3 + + + Domain + + + groupBox1 System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 35 + + panel2 + + + 1 + + + Fill + + + 0, 121 + + + 742, 395 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 True + + 6, 12 + + + 742, 576 + + + 4, 4, 4, 4 + + + RoutingSettingDetailsForm + + + RoutingRuleSettingDetailsForm + + + 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/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index f050d4f5..0059a7ff 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -170,4 +170,7 @@ 路由规则详情设置 + + 保存时Domain和IP自动排序 + \ No newline at end of file From 7eafae98d4ca01f11ee6c7859823411a929d9efd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 18 Apr 2022 18:59:01 +0800 Subject: [PATCH 188/252] Turn off system proxy when not using proxy to update subscriptions --- v2rayN/v2rayN/Handler/UpdateHandle.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 50584ebb..bf3aacb7 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -178,6 +178,15 @@ namespace v2rayN.Handler Task.Run(async () => { + //Turn off system proxy + bool bSysProxyType = false; + if (!blProxy && config.sysProxyType == ESysProxyType.ForcedChange) + { + bSysProxyType = true; + config.sysProxyType = ESysProxyType.ForcedClear; + SysProxyHandle.UpdateSysProxy(config, false); + } + foreach (var item in config.subItem) { if (item.enabled == false) @@ -217,7 +226,14 @@ namespace v2rayN.Handler } _updateFunc(false, $"-------------------------------------------------------"); } + //restore system proxy + if (bSysProxyType) + { + config.sysProxyType = ESysProxyType.ForcedChange; + SysProxyHandle.UpdateSysProxy(config, false); + } _updateFunc(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); + }); } From 8f5bb3591ba7ab3aae36fe52584465ea0aeb59a5 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 18 Apr 2022 18:59:41 +0800 Subject: [PATCH 189/252] Improve clone custom configuration --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 2 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 14 ++++++++++++-- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 089f82e1..78503fdd 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -152,7 +152,7 @@ namespace v2rayN.Forms return; } - address = Path.Combine(Utils.GetConfigPath(), address); + address = Utils.GetConfigPath(address); Process.Start(address); } } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index a9c2e040..13053fe5 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -284,7 +284,17 @@ namespace v2rayN.Handler vmessItem.indexId = string.Empty; vmessItem.remarks = string.Format("{0}-clone", item.remarks); - AddServerCommon(ref config, vmessItem); + if (vmessItem.configType == EConfigType.Custom) + { + vmessItem.address = Utils.GetConfigPath(vmessItem.address); + if (AddCustomServer(ref config, vmessItem, false) == 0) + { + } + } + else + { + AddServerCommon(ref config, vmessItem); + } } ToJsonFile(config); @@ -442,7 +452,7 @@ namespace v2rayN.Handler try { - File.Copy(fileName, Path.Combine(Utils.GetConfigPath(), newFileName)); + File.Copy(fileName, Utils.GetConfigPath(newFileName)); if (blDelete) { File.Delete(fileName); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 8fbeeb7c..5c48c630 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -941,7 +941,7 @@ namespace v2rayN.Handler string addressFileName = node.address; if (!File.Exists(addressFileName)) { - addressFileName = Path.Combine(Utils.GetConfigPath(), addressFileName); + addressFileName = Utils.GetConfigPath(addressFileName); } if (!File.Exists(addressFileName)) { From af820bb0f2b994d3b18883a9bba728e327b0627e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 18 Apr 2022 19:01:17 +0800 Subject: [PATCH 190/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 0135e7b8..0edde2f0 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.17")] +[assembly: AssemblyFileVersion("5.18")] From 62e796cf5ac2e31c1893e7d6d93e340ec5d8ef79 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 19 Apr 2022 15:54:51 +0800 Subject: [PATCH 191/252] Update UpdateHandle.cs --- v2rayN/v2rayN/Handler/UpdateHandle.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index bf3aacb7..630225d2 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using System.Text; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Base; @@ -185,6 +186,7 @@ namespace v2rayN.Handler bSysProxyType = true; config.sysProxyType = ESysProxyType.ForcedClear; SysProxyHandle.UpdateSysProxy(config, false); + Thread.Sleep(3000); } foreach (var item in config.subItem) From 965400965030888bc55e3359c4217bd3af31fdd3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 25 Apr 2022 13:24:10 +0800 Subject: [PATCH 192/252] Update HttpClientHelper.cs --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index 0e17d5ca..a8a777dc 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -215,10 +215,10 @@ namespace v2rayN.Base // TODO: totalRead += read; + TimeSpan ts = (DateTime.Now - totalDatetime); + var speed = totalRead * 1d / ts.TotalMilliseconds / 1000; if (canReportProgress) { - TimeSpan ts = (DateTime.Now - totalDatetime); - var speed = totalRead * 1d / ts.TotalMilliseconds / 1000; var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); if (progressPercentage != percent) { @@ -226,6 +226,14 @@ namespace v2rayN.Base progress.Report(speed); } } + else if (progress != null) + { + if (progressPercentage != Convert.ToInt32(speed * 10)) + { + progressPercentage = Convert.ToInt32(speed * 10); + progress.Report(speed); + } + } } } while (isMoreToRead); } From 6259539c8704ecf70acc4134cd74de3dbb38a698 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 25 Apr 2022 18:56:09 +0800 Subject: [PATCH 193/252] Enable system agent advanced settings --- v2rayN/v2rayN/Forms/MainMsgControl.resx | 3 - .../Forms/OptionSettingForm.Designer.cs | 49 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 4 + v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3732 +++++++++-------- .../Forms/OptionSettingForm.zh-Hans.resx | 3 + v2rayN/v2rayN/Handler/SysProxyHandle.cs | 48 +- v2rayN/v2rayN/Mode/Config.cs | 1 + 7 files changed, 1927 insertions(+), 1913 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.resx b/v2rayN/v2rayN/Forms/MainMsgControl.resx index a4461339..80eab070 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.resx +++ b/v2rayN/v2rayN/Forms/MainMsgControl.resx @@ -375,9 +375,6 @@ 131, 18 - - zh-Hans - True diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index f2d0fb9d..7ccbdfe3 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -104,6 +104,7 @@ this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); + this.chkEnableSystemProxyAdvanced = new System.Windows.Forms.CheckBox(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -118,34 +119,33 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "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); // // 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); this.tabControl1.Controls.Add(this.tabPageCoreType); this.tabControl1.Controls.Add(this.tabPage3); + resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Name = "tabPage1"; this.tabPage1.UseVisualStyleBackColor = true; // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.label16); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtpass); @@ -162,6 +162,7 @@ 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; // @@ -211,8 +212,8 @@ // // cmbprotocol // - resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -238,7 +239,6 @@ // // cmbloglevel // - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -247,6 +247,7 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -266,10 +267,10 @@ // // tabPage2 // - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -292,7 +293,6 @@ // // tabPage6 // - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -306,6 +306,7 @@ 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; // @@ -377,7 +378,6 @@ // // tabPage7 // - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Controls.Add(this.txttrayMenuServersLimit); this.tabPage7.Controls.Add(this.label17); this.tabPage7.Controls.Add(this.txtautoUpdateSubInterval); @@ -393,6 +393,7 @@ this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // @@ -459,9 +460,9 @@ // // 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 @@ -483,7 +484,6 @@ // // tabPageCoreType // - resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); this.tabPageCoreType.Controls.Add(this.cmbCoreType6); this.tabPageCoreType.Controls.Add(this.labCoreType6); this.tabPageCoreType.Controls.Add(this.cmbCoreType5); @@ -496,14 +496,15 @@ this.tabPageCoreType.Controls.Add(this.labCoreType2); this.tabPageCoreType.Controls.Add(this.cmbCoreType1); this.tabPageCoreType.Controls.Add(this.labCoreType1); + resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); this.tabPageCoreType.Name = "tabPageCoreType"; this.tabPageCoreType.UseVisualStyleBackColor = true; // // cmbCoreType6 // - resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); this.cmbCoreType6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType6.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); this.cmbCoreType6.Name = "cmbCoreType6"; // // labCoreType6 @@ -513,9 +514,9 @@ // // cmbCoreType5 // - resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); this.cmbCoreType5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType5.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); this.cmbCoreType5.Name = "cmbCoreType5"; // // labCoreType5 @@ -525,9 +526,9 @@ // // cmbCoreType4 // - resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); this.cmbCoreType4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType4.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); this.cmbCoreType4.Name = "cmbCoreType4"; // // labCoreType4 @@ -537,9 +538,9 @@ // // cmbCoreType3 // - resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); this.cmbCoreType3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType3.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); this.cmbCoreType3.Name = "cmbCoreType3"; // // labCoreType3 @@ -549,9 +550,9 @@ // // cmbCoreType2 // - resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); this.cmbCoreType2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType2.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); this.cmbCoreType2.Name = "cmbCoreType2"; // // labCoreType2 @@ -561,9 +562,9 @@ // // cmbCoreType1 // - resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); this.cmbCoreType1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType1.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); this.cmbCoreType1.Name = "cmbCoreType1"; // // labCoreType1 @@ -573,17 +574,18 @@ // // tabPage3 // - resources.ApplyResources(this.tabPage3, "tabPage3"); this.tabPage3.Controls.Add(this.groupBox2); + resources.ApplyResources(this.tabPage3, "tabPage3"); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.chkEnableSystemProxyAdvanced); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -604,9 +606,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 @@ -621,6 +623,12 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // + // chkEnableSystemProxyAdvanced + // + resources.ApplyResources(this.chkEnableSystemProxyAdvanced, "chkEnableSystemProxyAdvanced"); + this.chkEnableSystemProxyAdvanced.Name = "chkEnableSystemProxyAdvanced"; + this.chkEnableSystemProxyAdvanced.UseVisualStyleBackColor = true; + // // OptionSettingForm // resources.ApplyResources(this, "$this"); @@ -729,5 +737,6 @@ private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txttrayMenuServersLimit; private System.Windows.Forms.Label label17; + private System.Windows.Forms.CheckBox chkEnableSystemProxyAdvanced; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 755344f5..e9b3a19e 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -58,6 +58,8 @@ namespace v2rayN.Forms chkdefAllowInsecure.Checked = config.defAllowInsecure; txtsystemProxyExceptions.Text = config.systemProxyExceptions; + + chkEnableSystemProxyAdvanced.Checked = config.enableSystemProxyAdvanced; } @@ -253,6 +255,8 @@ namespace v2rayN.Forms config.systemProxyExceptions = txtsystemProxyExceptions.Text.TrimEx(); + config.enableSystemProxyAdvanced = chkEnableSystemProxyAdvanced.Checked; + return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index b1ee7ec9..0d8cdf99 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1826 +117,359 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage6 - - - 351, 211 - - - groupBox1 - - - - 6 - - - Listening port - - - 8 - - - 317, 12 - - - panel2 - - - tabPage7 - - - tabPage7 - 355, 16 - - tabPage7 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 97, 21 - - - error - - - 15, 129 - - - readBufferSize - - - - NoControl - - - chkudpEnabled - - - 45 - - - txtpass - - - 282, 23 - - - downlinkCapacity - - - mtu - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - labCoreType4 - - - 506, 16 - - - 41 - - - 36 - - - 10 - - - 120, 21 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Log level - - - 351, 157 - - - groupBox1 - - - panel1 - - - tabPage6 - - - 620, 37 - - - 11 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 35 - - - 6 - - - 45, 150 - - - Enable UDP - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 131 - - - tabPage7 - - - 8, 41 - - - 45, 46 - - - 94, 21 - - - 390, 16 - - - groupBox1 - - - 2 - - - tabPage7 - - - 285, 25 - - - 15, 16 - - - 125, 12 - - - 97, 21 - - - cbFreshrate - - - Statistics freshrate - - - warning - - - 0 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - Keep older when deduplication - - - txtlocalPort - - - 84, 16 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - True - - - 15 - - - 193, 162 - - - 342, 17 - - - 95, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 27, 188 - - - 8 - - - tabPage7 - - - 236, 66 - - - 1 - - - groupBox1 - - - 13 - - - 2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 39 - - - 124, 25 - - - True - - - 10 - - - 0 - - - 9 - - - protocol - - - True - - - tabPage6 - - - 3, 3, 3, 3 - - - True - - - chkEnableStatistics - - - OptionSettingForm - - - 8 - - - 12 - - - label14 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Record local logs - - - Automatically adjust column width after updating subscription - - - Auth user - - - label15 - - - 43 - - - labCoreType3 - - - 5 - - - True - - - 117, 68 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 33, 29 - - - 11 - - - 117, 172 - - - Use semicolon (;) - - - 75, 23 - - - tabControl1 - - - tabPage2 - - - 12 - - - 3, 3, 3, 3 - - - groupBox1 - - - lbFreshrate - - - labCoreType1 - - - 44 - - - 10 - - - 9 - - - 14 - - - 4, 4, 4, 4 - - - NoControl - - - 4, 22 - - - Core Type - - - 736, 453 - - - 59, 12 - - - 15, 108 - - - True - - - 2 - - - True - - - uplinkCapacity - - - 0 - - - 36 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - none - - - 7 - - - 45, 98 - - - label10 - - - 94, 21 - - - 4 - - - True - - - 78, 21 - - - txtsystemProxyExceptions - - - 236, 104 - - - 42 - - - True - - - label11 - - - 1 - - - 12 - - - True - - - chkEnableAutoAdjustMainLvColWidth - - - 0 - - - 7 - - - NoControl - - - btnSetLoopback - - - chkEnableSecurityProtocolTls13 - - - 10 - - - 15, 160 - - - 97, 20 - - - 143, 20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - 23 - - - cmbloglevel - - - 496, 61 - - - label16 - - - 20 - - - v2rayN settings - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - tabPage7 - - - 3 - - - 120, 16 - - - $this - - - groupBox1 - - - NoControl - - - cmbCoreType6 - - - True - - - 58, 20 - - - label17 - - - 97, 21 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tabPageCoreType - - - tabPageCoreType - - - 496, 27 - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cmbCoreType5 - - - tabPageCoreType - - - tabPageCoreType - - - 0, 463 - - - 143, 20 - - - 4, 22 - - - True - - - Bottom - - - tti - - - 468, 16 - - - Enable Security Protocol TLS v1.3 (subscription/update/speedtest) - - - 94, 21 - - - 0 - - - NoControl - - - groupBox1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - True - - - 6 - - - groupBox2 - - - 1 - - - 9 - - - 94, 21 - - - tabPage6 - - - Settings - - - True - - - 11 - - - 89, 12 - - - label12 - - - 1 - - - chkmuxEnabled - - - 0 - - - Automatic update interval of and Geo (hours) - - - label2 - - - 1 - - - groupBox1 - - - label6 - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 13 - - - label13 - - - 46 - - - tabControl1 - - - 111, 100 - - - 0 - - - 37 - - - 0 - - - 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 - - - True - - - 7 - - - Automatic update interval of subscriptions (hours) - - - Custom DNS (multiple, separated by commas (,)) - - - 1 - - - 30, 376 - - - chklogEnabled - - - True - - - 345, 62 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 59, 12 - - - 4 - - - 5 - - - 8, 17 - - - 41 - - - 39 - - - 111, 24 - - - 97, 21 - - - &OK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - txtKcpmtu - - - 6 - - - Fill - - - 3, 3 - - - NoControl - - - 8, 52 - - - 4 - - - 102, 16 - - - cmbCoreType4 - - - groupBox2 - - - Fill - - - groupBox1 - - - 6 - - - 736, 523 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - txtKcpwriteBufferSize - - - 18, 28 - - - 101, 12 - - - 736, 10 - - - 236, 28 - - - groupBox2 - - - groupBox1 - - - NoControl - - - 8 - 75, 23 - - 0 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 345, 100 - - - 39 - - - 2 - - - 15, 63 - - - Exception - - - tabPage7 - - - 38 - - - chkIgnoreGeoUpdateCore - - - NoControl - - - chksniffingEnabled - - - tabPage7 - - - 5 - - - labCoreType6 - - - 198, 16 - - - 0, 0, 0, 0 - - - 15, 62 - - - 0, 10 - - - NoControl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 42 - - - 397, 65 - - - tabPageCoreType - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 11 - - - 53, 12 - - - 2 - - - tabPageCoreType - - - Core Type - - - True - - - 5 - - - 728, 427 - - - labCoreType2 - - + + 7 - - Tray right-click menu servers display limit - - - NoControl - - - 8, 28 - - - 9 - - - 59, 12 - - - chkKeepOlderDedupl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 84, 16 - - - txtautoUpdateSubInterval - - - NoControl - - - label5 - - - 59, 12 - - - 728, 427 - - - Core Type - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 728, 427 - - - True - - - 489, 41 - - - tabControl1 - - - 1 - - - tabPage1 - - - 45, 176 - - - 10 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - - - 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 43 - - - 47 - - - 59, 12 - - - allowInsecure - - - 36 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - - - tabPage7 - - - Core Type - - - 728, 427 - - - True - - - btnOK - - - True - - - 8 - - - cmbCoreType3 - - - 397, 27 - - - 42 - - - System.Windows.Forms.Label, 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 - - - 41 - - - 42 - - - 45, 124 - - - tabPage7 - - - tabControl1 - - - 59, 12 - - - 10 - - - tabControl1 - - - Core: basic settings - - - 6 - - - CoreType settings - - - 6 - - - 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 - - - tabPage3 - - - 263, 12 - - - panel2 - - - tabPage7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - chkAutoRun - - - 143, 20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 192 - - - tabPage2 - - - btnClose - - - 638, 356 - - - chkdefAllowInsecure - - - 0 - - - 638, 219 - - - System.Windows.Forms.TextBox, 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 - - - 4 - - - tabPage3 - - - 40 - - - 143, 20 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtKcptti - - - 23, 12 - - - 3, 3, 3, 3 - - - 23, 12 - - - 4, 22 - - - True - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 30 - - - 285, 61 - - - 45, 72 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 143, 20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - writeBufferSize - - - 117, 146 - - - Ignore Geo files when updating core - - - 736, 60 - - - 39 - - - 38 - - - txtKcpdownlinkCapacity - - - 117, 42 - - - label4 - - - 29 - - - label8 - - - 257, 158 - - - txtKcpreadBufferSize - - - NoControl - - - True - &Cancel - - 15, 85 + + btnClose - - 3, 3, 3, 3 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 351, 184 + + panel2 - - NoControl - - - groupBox1 - - - chkAllowLANConn - - - 32 - - - tabPage6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 27, 215 - - - 89, 12 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 234, 16 - - - 89, 12 - - - 12 - - - Automatically start at system startup - - - congestion - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 107, 12 - - - groupBox1 - - - False - - - 97, 20 - - - 4 - - - 11 - - - tabPage6 - - - txtuser - - - tabControl1 - - - 107, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 20 - - - 117, 120 - - - True - - - 143, 20 - - - 345, 24 - - - Top - - - 11 - - - True - - - NoControl - - - 4, 22 - - - NoControl - - - 8 - - - 59, 12 - - - 39 - - - 18, 66 - - - Allow connections from the LAN - - - True - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - 18, 104 - - - Set Windows10 UWP Loopback - - - txtautoUpdateInterval - - - 9 - - - 246, 16 - - - tabPage1 - - - 2 - - - 94, 21 - - - Fill - - - True - - - 13 - - - System.Windows.Forms.CheckBox, 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 - - - True - - - 5 - - - Turn on Mux Multiplexing - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - 6 - - - tabPageCoreType - - - tabPageCoreType - - - groupBox1 - - - 7 - - - 94, 21 - - - Turn on Sniffing - - - socks - - - tabPageCoreType - - - 117, 94 - - - 14 - - - 29 - - - http - - - True - - - NoControl - - - Vertical - - - 8 - - - True - - - 37 - - - label1 - - - 31 - - - groupBox1 - - - 37 - - - $this - - - 728, 427 - - - 3 - - - label9 - - - True - - - tabPage7 - - - txttrayMenuServersLimit - - - Support DnsObject - - - True - - - 267, 16 - - - NoControl - - - txtKcpuplinkCapacity - - - 3 - - - tabPage6 - - - 40 - - - 174, 16 - - - 224, 29 - - - 40 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 722, 421 - - - 2 + + 0 True - - 224, 65 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - Core Type - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - cmbCoreType2 - - - 38 - - - 281, 12 - - + + NoControl - - 20, 143 + + 397, 65 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Core Type - - - 44 - - - True - - - System proxy settings - - - 15 - - - 126, 16 - - - cmbCoreType1 - - - label3 - - - 5 - - - tabPage6 - - - 2 - - - label7 - - - NoControl - - + 59, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtremoteDNS + + 39 Auth pass - - tabPage7 + + label16 - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - 40 + + 0 - + + True + + + NoControl + + + 224, 65 + + + 59, 12 + + + 38 + + + Auth user + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 496, 61 + + + 120, 21 + + + 37 + + + txtpass + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + 285, 61 + + + 97, 21 + + + 36 + + + txtuser + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + NoControl + + + 15, 192 + + + 102, 16 + + + 35 + + + allowInsecure + + + chkdefAllowInsecure + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 + + + 4 + + + True + + + 15, 63 + 204, 16 - - 6, 12 + + 29 - + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + NoControl + + + 496, 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 + + + 6 + + + 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 + + + 7 + + + False + + + socks + + + http + + + 285, 25 + + + 97, 20 + + 12 - - 2 + + cmbprotocol - + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + True + + + 224, 29 + + + 53, 12 + + + 11 + + + protocol + + + label1 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Core: DNS settings + + groupBox1 - - 45 + + 9 - - 59, 12 + + True - - 27, 161 + + 397, 27 - - 0, 0 + + 84, 16 - - Enable Statistics (Realtime netspeed and traffic records. Require restart) + + 10 - - $this + + Enable UDP - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + chkudpEnabled - - panel2 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + 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 + + + 11 debug @@ -1944,169 +477,1660 @@ info - - Core: KCP settings + + warning - - 5 + + error - - tabControl1 + + none - - labCoreType5 + + 257, 158 - - 111, 62 + + 97, 20 - + + 6 + + + cmbloglevel + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 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 + + + 13 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 305, 12 + + groupBox1 + + + 14 + + + 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 + + + 15 + + + Fill + + + 3, 3 + + + 722, 421 + + + 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 + + + 728, 427 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + True + + + NoControl + + + 342, 17 + + + 0, 0, 0, 0 + + + 107, 12 + + + 40 + + + Support DnsObject + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 8, 41 + + + True + + + Vertical + + + 638, 356 + + + 39 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + True + + + NoControl + + + 8, 17 + + + 281, 12 38 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Custom DNS (multiple, separated by commas (,)) - + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 728, 427 + + 4 - - chkKcpcongestion + + Core: DNS 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 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 345, 100 - - 33 + + 94, 21 - + + 15 + + + txtKcpwriteBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 1 + + + True + + + 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 + + + 94, 21 + + + 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 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 18, 66 - - 269, 12 + + 89, 12 - - 728, 427 + + 8 - - NoControl + + uplinkCapacity - - tabPageCoreType + + 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 + + + 12 + + + 4, 22 + + + 3, 3, 3, 3 + + 728, 427 - + + 2 + + + Core: KCP settings + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + 351, 211 + + + 97, 21 + + + 45 + + + txttrayMenuServersLimit + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + True + + + NoControl + + + 27, 215 + + + 263, 12 + + + 44 + + + Tray right-click menu servers display limit + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + 351, 184 + + + 97, 21 + + + 43 + + + txtautoUpdateSubInterval + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + NoControl + + + 27, 188 + + + 305, 12 + + + 42 + + + Automatic update interval of subscriptions (hours) + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + 15, 131 + + + 506, 16 + + + 41 + + + Enable Security Protocol TLS v1.3 (subscription/update/speedtest) + + + chkEnableSecurityProtocolTls13 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + NoControl + + + 15, 108 + + + 390, 16 + + + 40 + + + Automatically adjust column width after updating subscription + + + chkEnableAutoAdjustMainLvColWidth + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 5 + + + NoControl + + + 30, 376 + + + 282, 23 + + + 39 + + + Set Windows10 UWP Loopback + + + btnSetLoopback + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + tabPage7 + + + 6 + + + 351, 157 + + + 97, 21 + + + 38 + + + txtautoUpdateInterval + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 7 + + + True + + + NoControl + + + 27, 161 + + + 269, 12 + + + 37 + + + Automatic update interval of and Geo (hours) + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 8 + + + True + + + NoControl + + + 15, 85 + + + 234, 16 + + + 36 + + + Ignore Geo files when updating core + + + chkIgnoreGeoUpdateCore + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 9 + + + True + + + NoControl + + + 15, 62 + + + 198, 16 + + + 33 + + + Keep older when deduplication + + + chkKeepOlderDedupl + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 10 + + + 620, 37 + + + 58, 20 + + + 32 + + + cbFreshrate + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 11 + + + True + + + NoControl + + + 489, 41 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 12 + + + True + + + NoControl + + + 15, 39 + + + 468, 16 + + + 29 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 13 + + + True + + + 15, 16 + + + 246, 16 + + + 23 + + + Automatically start at system startup + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 14 + + + 4, 22 + + + 3, 3, 3, 3 + + + 728, 427 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + 117, 172 + + + 143, 20 + + + 46 + + + cmbCoreType6 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 0 + + + True + + + NoControl + + + 45, 176 + + + 59, 12 + + + 47 + + + Core Type + + + labCoreType6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 1 + + + 117, 146 + + + 143, 20 + + + 44 + + + cmbCoreType5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 2 + + + True + + + NoControl + + + 45, 150 + + + 59, 12 + + + 45 + + + Core Type + + + labCoreType5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 3 + + + 117, 120 + + + 143, 20 + + + 42 + + + cmbCoreType4 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 4 + + + True + + + NoControl + + + 45, 124 + + + 59, 12 + + + 43 + + + Core Type + + + labCoreType4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 5 + + + 117, 94 + + + 143, 20 + + + 40 + + + cmbCoreType3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 6 + + + True + + + NoControl + + + 45, 98 + + + 59, 12 + + + 41 + + + Core Type + + + labCoreType3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 7 + + + 117, 68 + + + 143, 20 + + + 38 + + + cmbCoreType2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 8 + + + True + + + NoControl + + + 45, 72 + + + 59, 12 + + + 39 + + + Core Type + + + labCoreType2 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tabPageCoreType - + + 9 + + + 117, 42 + + + 143, 20 + + + 36 + + + cmbCoreType1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 10 + + True - - 6, 283 + + NoControl - - 11 + + 45, 46 - - cmbprotocol + + 59, 12 - - 2 + + 37 - + + Core Type + + + labCoreType1 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tabPageCoreType + + 11 + + + 4, 22 + + + 3, 3, 3, 3 + + + 728, 427 + + + 6 + + + CoreType settings + + + tabPageCoreType + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + 4 - - 3 + + NoControl - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 8, 328 - - tabPage6 + + 502, 16 - - tabPage2 + + 43 - - tabPageCoreType + + Enable system proxy advanced settings (http/https/ftp/socks) - + + chkEnableSystemProxyAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + True + + NoControl + + + 6, 283 + + + 107, 12 + + + 42 + + + Use semicolon (;) + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + True + + + NoControl + + + 8, 28 + + + 317, 12 + + + 40 + Do not use proxy server for addresses beginning with + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + 8, 52 + + + True + + + Vertical + + + 638, 219 + + + 41 + + + txtsystemProxyExceptions + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + Fill + + + 0, 0 + + + 728, 427 + + + 42 + + + Exception + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + 4, 22 + + + 728, 427 + + + 5 + + + System proxy settings + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 5 + + + Fill + + + 0, 10 + + + 736, 453 + + + 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, 463 + + + 736, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + 0, 0 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 736, 10 - - NoControl - - - 3 - - + 9 - - 14 + + panel1 - - System.Windows.Forms.ComboBox, 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 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - tabPage6 - - - 1 - - - 0 + + 2 True - - zh-Hans - + + 6, 12 + + + 736, 523 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + 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/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 10e4a4a0..23abe7be 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -373,4 +373,7 @@ 参数设置 + + 开启系统代理高级设置 (http/https/ftp/socks) + \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs index ba752ca1..da183a85 100644 --- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -60,6 +60,7 @@ namespace v2rayN.Handler try { int port = config.GetLocalPort(Global.InboundHttp); + int portSocks = config.GetLocalPort(Global.InboundSocks); if (port <= 0) { return false; @@ -67,7 +68,17 @@ namespace v2rayN.Handler if (type == ESysProxyType.ForcedChange) { var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; - SetIEProxy(true, $"{Global.Loopback}:{port}", strExceptions); + + var strProxy = string.Empty; + if (config.enableSystemProxyAdvanced) + { + strProxy = string.Format("http={0}:{1};https={0}:{1};ftp={0}:{1};socks={0}:{2}", Global.Loopback, port, portSocks); + } + else + { + strProxy = $"{Global.Loopback}:{port}"; + } + SetIEProxy(true, strProxy, strExceptions); } else if (type == ESysProxyType.ForcedClear) { @@ -96,41 +107,6 @@ namespace v2rayN.Handler } } - public static void SetIEProxy(bool enable, bool global, string strProxy) - { - //Read(); - - //if (!_userSettings.UserSettingsRecorded) - //{ - // // record user settings - // ExecSysproxy("query"); - // //ParseQueryStr(_queryStr); - //} - - string arguments; - if (enable) - { - arguments = global - ? $"global {strProxy} {Global.IEProxyExceptions}" - : $"pac {strProxy}"; - } - else - { - // restore user settings - 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; - } - - //Save(); - ExecSysproxy(arguments); - } - public static void SetIEProxy(bool global, string strProxy, string strExceptions) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 699448e9..07f51647 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -124,6 +124,7 @@ namespace v2rayN.Mode { get; set; } + public bool enableSystemProxyAdvanced { get; set; } public int autoUpdateInterval { get; set; } = 0; From 3be93df63f15660186787598f92379f4199c2602 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 25 Apr 2022 19:07:09 +0800 Subject: [PATCH 194/252] bug fix --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 25 ++++++++----------------- v2rayN/v2rayN/Handler/DownloadHandle.cs | 4 ++-- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index a8a777dc..7ae914f7 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -162,7 +162,7 @@ namespace v2rayN.Base } } - public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress progress, CancellationToken token) + public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress progress, CancellationToken token) { if (string.IsNullOrEmpty(url)) { @@ -176,15 +176,15 @@ namespace v2rayN.Base throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); } - var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; - var canReportProgress = total != -1 && progress != null; + //var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; + //var canReportProgress = total != -1 && progress != null; using (var stream = await response.Content.ReadAsStreamAsync()) { var totalRead = 0L; var buffer = new byte[1024 * 64]; var isMoreToRead = true; - var progressPercentage = 0; + string progressSpeed = string.Empty; DateTime totalDatetime = DateTime.Now; do @@ -216,21 +216,12 @@ namespace v2rayN.Base totalRead += read; TimeSpan ts = (DateTime.Now - totalDatetime); - var speed = totalRead * 1d / ts.TotalMilliseconds / 1000; - if (canReportProgress) + var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0"); + if (progress != null) { - var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); - if (progressPercentage != percent) + if (progressSpeed != speed) { - progressPercentage = percent; - progress.Report(speed); - } - } - else if (progress != null) - { - if (progressPercentage != Convert.ToInt32(speed * 10)) - { - progressPercentage = Convert.ToInt32(speed * 10); + progressSpeed = speed; progress.Report(speed); } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 50ea02c1..b7fb00d5 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -46,12 +46,12 @@ namespace v2rayN.Handler Proxy = webProxy }); - var progress = new Progress(); + var progress = new Progress(); progress.ProgressChanged += (sender, value) => { if (UpdateCompleted != null) { - string msg = string.Format("{0} M/s", value.ToString("#0.0")).PadLeft(9, ' '); + string msg = string.Format("{0} M/s", value).PadLeft(9, ' '); UpdateCompleted(this, new ResultEventArgs(false, msg)); } }; From 6f3fbdfe17fb68a4992f86dbf45b072c50a721a1 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 25 Apr 2022 20:27:22 +0800 Subject: [PATCH 195/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 0edde2f0..203d1d64 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.18")] +[assembly: AssemblyFileVersion("5.19")] From a7741a0b7d21e0dd3388dd5d876a4e22fb58a948 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 26 Apr 2022 14:51:06 +0800 Subject: [PATCH 196/252] Improve notify icon --- v2rayN/v2rayN/Forms/BaseForm.cs | 15 +- v2rayN/v2rayN/Forms/BaseForm.resx | 1133 ----------------- v2rayN/v2rayN/Forms/MainForm.cs | 2 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 71 +- .../v2rayN/Properties/Resources.Designer.cs | 30 + v2rayN/v2rayN/Properties/Resources.resx | 9 + v2rayN/v2rayN/Resources/NotifyIcon1.ico | Bin 0 -> 61439 bytes v2rayN/v2rayN/Resources/NotifyIcon2.ico | Bin 0 -> 56851 bytes v2rayN/v2rayN/Resources/NotifyIcon3.ico | Bin 0 -> 57065 bytes v2rayN/v2rayN/v2rayN.csproj | 3 + v2rayN/v2rayN/v2rayN.ico | Bin 67646 -> 61439 bytes 11 files changed, 100 insertions(+), 1163 deletions(-) create mode 100644 v2rayN/v2rayN/Resources/NotifyIcon1.ico create mode 100644 v2rayN/v2rayN/Resources/NotifyIcon2.ico create mode 100644 v2rayN/v2rayN/Resources/NotifyIcon3.ico diff --git a/v2rayN/v2rayN/Forms/BaseForm.cs b/v2rayN/v2rayN/Forms/BaseForm.cs index 4ea789b1..edac4bdd 100644 --- a/v2rayN/v2rayN/Forms/BaseForm.cs +++ b/v2rayN/v2rayN/Forms/BaseForm.cs @@ -7,7 +7,6 @@ namespace v2rayN.Forms public partial class BaseForm : Form { protected static Config config; - protected static System.Drawing.Icon icon; public BaseForm() { @@ -19,16 +18,14 @@ namespace v2rayN.Forms { try { - if (icon == null) + string file = Utils.GetPath(Global.CustomIconName); + if (System.IO.File.Exists(file)) { - string file = Utils.GetPath(Global.CustomIconName); - if (!System.IO.File.Exists(file)) - { - return; - } - icon = new System.Drawing.Icon(file); + this.Icon = new System.Drawing.Icon(file); + return; } - this.Icon = icon; + + this.Icon = Properties.Resources.NotifyIcon1; } catch (Exception e) { diff --git a/v2rayN/v2rayN/Forms/BaseForm.resx b/v2rayN/v2rayN/Forms/BaseForm.resx index 61360d3d..1af7de15 100644 --- a/v2rayN/v2rayN/Forms/BaseForm.resx +++ b/v2rayN/v2rayN/Forms/BaseForm.resx @@ -117,1137 +117,4 @@ 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.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 7537ba71..b0335833 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1273,7 +1273,7 @@ namespace v2rayN.Forms mainMsgControl.DisplayToolStatus(config); - notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); + notifyMain.Icon = this.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } #endregion diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 54154e19..37fd7c9c 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -32,12 +32,59 @@ namespace v2rayN.Handler { try { + int index = (int)config.sysProxyType; + + //Load from routing setting + var createdIcon = GetNotifyIcon4Routing(config); + if (createdIcon != null) + { + return createdIcon; + } + + //Load from local file + var fileName = Utils.GetPath($"NotifyIcon{index + 1}.ico"); + if (File.Exists(fileName)) + { + return new Icon(fileName); + } + switch (index) + { + case 0: + return Properties.Resources.NotifyIcon1; + case 1: + return Properties.Resources.NotifyIcon2; + case 2: + return Properties.Resources.NotifyIcon3; + } + + return Properties.Resources.NotifyIcon1; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return def; + } + } + private Icon GetNotifyIcon4Routing(Config config) + { + try + { + if (!config.enableRoutingAdvanced) + { + return null; + } + + var item = config.routings[config.routingIndex]; + if (Utils.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon)) + { + return null; + } + Color color = ColorTranslator.FromHtml("#3399CC"); int index = (int)config.sysProxyType; if (index > 0) { 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]); } int width = 128; @@ -47,24 +94,8 @@ namespace v2rayN.Handler Graphics graphics = Graphics.FromImage(bitmap); SolidBrush drawBrush = new SolidBrush(color); - var customIcon = false; - if (config.enableRoutingAdvanced) - { - var item = config.routings[config.routingIndex]; - if (!Utils.IsNullOrEmpty(item.customIcon) && File.Exists(item.customIcon)) - { - graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); - graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height); - customIcon = true; - } - } - if (!customIcon) - { - graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); - int zoom = 16; - graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); - } - + graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); + graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height); Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); drawBrush.Dispose(); @@ -76,7 +107,7 @@ namespace v2rayN.Handler catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - return def; + return null; } } diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index a1c0e06f..aa68f66d 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -110,6 +110,36 @@ namespace v2rayN.Properties { } } + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon1 { + get { + object obj = ResourceManager.GetObject("NotifyIcon1", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon2 { + get { + object obj = ResourceManager.GetObject("NotifyIcon2", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon3 { + get { + object obj = ResourceManager.GetObject("NotifyIcon3", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index c5d8319b..20e420b5 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -157,4 +157,13 @@ ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\NotifyIcon1.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\NotifyIcon2.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\NotifyIcon3.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resources/NotifyIcon1.ico b/v2rayN/v2rayN/Resources/NotifyIcon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..a978e0a899c972fcdaa2da4dd1449fbe700bb927 GIT binary patch literal 61439 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 literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN/Resources/NotifyIcon2.ico b/v2rayN/v2rayN/Resources/NotifyIcon2.ico new file mode 100644 index 0000000000000000000000000000000000000000..b625aa8e80542ca770ff1bdfb49eea3755d36d81 GIT binary patch literal 56851 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 literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index e5c58aef..d920419f 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -474,6 +474,9 @@ + + + diff --git a/v2rayN/v2rayN/v2rayN.ico b/v2rayN/v2rayN/v2rayN.ico index 2a2f85a92ab846518d590b2ca8aa5fb0a1afe904..a978e0a899c972fcdaa2da4dd1449fbe700bb927 100644 GIT binary patch literal 61439 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 literal 67646 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 From 47c843bf09e869aeb8085decddd8f57e84d40818 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 26 Apr 2022 20:06:21 +0800 Subject: [PATCH 197/252] Enable system proxy advanced settings, use socks protocol --- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 2 +- v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx | 2 +- v2rayN/v2rayN/Handler/SysProxyHandle.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 0d8cdf99..90bb3562 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -1864,7 +1864,7 @@ 43 - Enable system proxy advanced settings (http/https/ftp/socks) + Enable system proxy advanced settings, use socks protocol chkEnableSystemProxyAdvanced diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 23abe7be..55784aa4 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -374,6 +374,6 @@ 参数设置 - 开启系统代理高级设置 (http/https/ftp/socks) + 开启系统代理高级设置, 使用socks协议 \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs index da183a85..2ade5267 100644 --- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -72,7 +72,7 @@ namespace v2rayN.Handler var strProxy = string.Empty; if (config.enableSystemProxyAdvanced) { - strProxy = string.Format("http={0}:{1};https={0}:{1};ftp={0}:{1};socks={0}:{2}", Global.Loopback, port, portSocks); + strProxy = $"socks={Global.Loopback}:{portSocks}"; } else { From 4e65732a4e93e3230e020d204425924adc4ae7b6 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 26 Apr 2022 20:06:46 +0800 Subject: [PATCH 198/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 203d1d64..4a47069f 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.19")] +[assembly: AssemblyFileVersion("5.20")] From 19f9bff6feb8d475e047d41204e10940d5dbc437 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 27 Apr 2022 09:31:38 +0800 Subject: [PATCH 199/252] Support hysteria and naiveproxy subscription --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 33 ++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 13053fe5..2445e384 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -950,14 +950,39 @@ namespace v2rayN.Handler vmessItem.address = fileName; vmessItem.remarks = "clash_custom"; } + //Is hysteria configuration + else if (clipboardData.IndexOf("server") >= 0 + && clipboardData.IndexOf("up") >= 0 + && clipboardData.IndexOf("down") >= 0 + && clipboardData.IndexOf("listen") >= 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.hysteria; + vmessItem.address = fileName; + vmessItem.remarks = "hysteria_custom"; + } + //Is naiveproxy configuration + else if (clipboardData.IndexOf("listen") >= 0 + && clipboardData.IndexOf("proxy") >= 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.naiveproxy; + vmessItem.address = fileName; + vmessItem.remarks = "naiveproxy_custom"; + } //Is Other configuration else { - var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt"); - File.WriteAllText(fileName, clipboardData); + return -1; + //var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt"); + //File.WriteAllText(fileName, clipboardData); - vmessItem.address = fileName; - vmessItem.remarks = "other_custom"; + //vmessItem.address = fileName; + //vmessItem.remarks = "other_custom"; } if (!Utils.IsNullOrEmpty(subid)) From aa41a8675e0a0551462730954d1cab7dcb6fa878 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 27 Apr 2022 20:46:07 +0800 Subject: [PATCH 200/252] Advanced proxy settings, protocol selection (optional) --- .../Forms/OptionSettingForm.Designer.cs | 26 +++++--- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 6 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 60 +++++++++++++------ .../Forms/OptionSettingForm.zh-Hans.resx | 4 +- v2rayN/v2rayN/Global.cs | 7 +++ v2rayN/v2rayN/Handler/SysProxyHandle.cs | 9 ++- v2rayN/v2rayN/Mode/Config.cs | 4 +- 7 files changed, 80 insertions(+), 36 deletions(-) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 7ccbdfe3..052f42fe 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -98,13 +98,14 @@ this.labCoreType1 = new System.Windows.Forms.Label(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label18 = new System.Windows.Forms.Label(); + this.cmbSystemProxyAdvancedProtocol = new System.Windows.Forms.ComboBox(); this.label13 = new System.Windows.Forms.Label(); this.label12 = new System.Windows.Forms.Label(); this.txtsystemProxyExceptions = new System.Windows.Forms.TextBox(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.chkEnableSystemProxyAdvanced = new System.Windows.Forms.CheckBox(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -581,7 +582,8 @@ // // groupBox2 // - this.groupBox2.Controls.Add(this.chkEnableSystemProxyAdvanced); + this.groupBox2.Controls.Add(this.label18); + this.groupBox2.Controls.Add(this.cmbSystemProxyAdvancedProtocol); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); @@ -589,6 +591,17 @@ this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // cmbSystemProxyAdvancedProtocol + // + this.cmbSystemProxyAdvancedProtocol.FormattingEnabled = true; + resources.ApplyResources(this.cmbSystemProxyAdvancedProtocol, "cmbSystemProxyAdvancedProtocol"); + this.cmbSystemProxyAdvancedProtocol.Name = "cmbSystemProxyAdvancedProtocol"; + // // label13 // resources.ApplyResources(this.label13, "label13"); @@ -623,12 +636,6 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // - // chkEnableSystemProxyAdvanced - // - resources.ApplyResources(this.chkEnableSystemProxyAdvanced, "chkEnableSystemProxyAdvanced"); - this.chkEnableSystemProxyAdvanced.Name = "chkEnableSystemProxyAdvanced"; - this.chkEnableSystemProxyAdvanced.UseVisualStyleBackColor = true; - // // OptionSettingForm // resources.ApplyResources(this, "$this"); @@ -737,6 +744,7 @@ private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txttrayMenuServersLimit; private System.Windows.Forms.Label label17; - private System.Windows.Forms.CheckBox chkEnableSystemProxyAdvanced; + private System.Windows.Forms.ComboBox cmbSystemProxyAdvancedProtocol; + private System.Windows.Forms.Label label18; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index e9b3a19e..70ae449d 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -18,6 +18,8 @@ namespace v2rayN.Forms private void OptionSettingForm_Load(object sender, EventArgs e) { + cmbSystemProxyAdvancedProtocol.Items.AddRange(Global.IEProxyProtocols.ToArray()); + InitBase(); InitKCP(); @@ -59,7 +61,7 @@ namespace v2rayN.Forms txtsystemProxyExceptions.Text = config.systemProxyExceptions; - chkEnableSystemProxyAdvanced.Checked = config.enableSystemProxyAdvanced; + cmbSystemProxyAdvancedProtocol.Text = config.systemProxyAdvancedProtocol; } @@ -255,7 +257,7 @@ namespace v2rayN.Forms config.systemProxyExceptions = txtsystemProxyExceptions.Text.TrimEx(); - config.enableSystemProxyAdvanced = chkEnableSystemProxyAdvanced.Checked; + config.systemProxyAdvancedProtocol = cmbSystemProxyAdvancedProtocol.Text.TrimEx(); return 0; } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 90bb3562..deaae1d2 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -1851,33 +1851,57 @@ 4 - + + True + + NoControl - - 8, 328 + + 8, 346 - - 502, 16 + + 329, 12 - - 43 + + 45 - - Enable system proxy advanced settings, use socks protocol + + Advanced proxy settings, protocol selection (optional) - - chkEnableSystemProxyAdvanced + + label18 - - System.Windows.Forms.CheckBox, 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 - + groupBox2 - + 0 + + 8, 371 + + + 638, 20 + + + 44 + + + cmbSystemProxyAdvancedProtocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + True @@ -1906,7 +1930,7 @@ groupBox2 - 1 + 2 True @@ -1936,7 +1960,7 @@ groupBox2 - 2 + 3 8, 52 @@ -1963,7 +1987,7 @@ groupBox2 - 3 + 4 Fill diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 55784aa4..5f82648b 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -373,7 +373,7 @@ 参数设置 - - 开启系统代理高级设置, 使用socks协议 + + 高级代理设置, 协议选择(可选) \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index c0547e46..470412ed 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -199,6 +199,13 @@ 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.*"; + public static readonly List IEProxyProtocols = new List { + "{ip}:{http_port}", + "socks={ip}:{socks_port}", + "http={ip}:{http_port};https={ip}:{http_port};ftp={ip}:{http_port};socks={ip}:{socks_port}", + "http=http://{ip}:{http_port};https=http://{ip}:{http_port}", + "" + }; public const string RoutingRuleComma = ""; diff --git a/v2rayN/v2rayN/Handler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs index 2ade5267..815580ae 100644 --- a/v2rayN/v2rayN/Handler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -70,13 +70,16 @@ namespace v2rayN.Handler var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; var strProxy = string.Empty; - if (config.enableSystemProxyAdvanced) + if (Utils.IsNullOrEmpty(config.systemProxyAdvancedProtocol)) { - strProxy = $"socks={Global.Loopback}:{portSocks}"; + strProxy = $"{Global.Loopback}:{port}"; } else { - strProxy = $"{Global.Loopback}:{port}"; + strProxy = config.systemProxyAdvancedProtocol + .Replace("{ip}", Global.Loopback) + .Replace("{http_port}", port.ToString()) + .Replace("{socks_port}", portSocks.ToString()); } SetIEProxy(true, strProxy, strExceptions); } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 07f51647..4b913a89 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -124,8 +124,8 @@ namespace v2rayN.Mode { get; set; } - public bool enableSystemProxyAdvanced { get; set; } - + public string systemProxyAdvancedProtocol { get; set; } + public int autoUpdateInterval { get; set; } = 0; public int autoUpdateSubInterval { get; set; } = 0; From 7ec0607fecc5c18a9e9b1ebdd783547b19dd5378 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 27 Apr 2022 20:47:38 +0800 Subject: [PATCH 201/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 4a47069f..bd68cf52 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.20")] +[assembly: AssemblyFileVersion("5.21")] From 2a11fe11e8957052666cddb156aed3bbdafd5bc9 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 29 Apr 2022 10:58:51 +0800 Subject: [PATCH 202/252] Fix issue when saving gui config --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2445e384..9c138ca1 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -6,6 +6,7 @@ using v2rayN.Mode; using v2rayN.Base; using System.Linq; using v2rayN.Tool; +using System.Threading.Tasks; namespace v2rayN.Handler { @@ -207,7 +208,25 @@ namespace v2rayN.Handler { lock (objLock) { - Utils.ToJsonFile(config, Utils.GetPath(configRes)); + try + { + Task.Run(() => + { + //save temp file + var temp = $"{configRes}_temp"; + if (Utils.ToJsonFile(config, Utils.GetPath(temp)) != 0) + { + return; + } + + //rename + File.Move(temp, configRes); + }); + } + catch (Exception ex) + { + Utils.SaveLog("ToJsonFile", ex); + } } } From bcda8bd602db6c5a6abfafee240d4274dd6bfc1f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 30 Apr 2022 08:32:26 +0800 Subject: [PATCH 203/252] Update subscription timeout is set to 30 seconds --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 7 ++----- v2rayN/v2rayN/Handler/DownloadHandle.cs | 6 +++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index 7ae914f7..a2405adf 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -56,7 +56,7 @@ namespace v2rayN.Base } return null; } - public async Task GetAsync(HttpClient client, string url) + public async Task GetAsync(HttpClient client, string url, CancellationToken token) { if (string.IsNullOrEmpty(url)) { @@ -64,10 +64,7 @@ namespace v2rayN.Base } try { - var cts = new CancellationTokenSource(); - cts.CancelAfter(5000); - - HttpResponseMessage response = await client.GetAsync(url, cts.Token); + HttpResponseMessage response = await client.GetAsync(url, token); return await response.Content.ReadAsStringAsync(); } catch (Exception ex) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index b7fb00d5..19840eee 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -156,7 +156,11 @@ namespace v2rayN.Handler { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo)); } - var result = await HttpClientHelper.GetInstance().GetAsync(client, url); + + var cts = new CancellationTokenSource(); + cts.CancelAfter(1000 * 30); + + var result = await HttpClientHelper.GetInstance().GetAsync(client, url, cts.Token); return result; } catch (Exception ex) From 52b8f480f640ce1f55e42ec890ceac8043c65d0c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 30 Apr 2022 08:32:42 +0800 Subject: [PATCH 204/252] Fix issue when saving gui config --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 9c138ca1..2feba3ac 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -210,18 +210,20 @@ namespace v2rayN.Handler { try { - Task.Run(() => - { - //save temp file - var temp = $"{configRes}_temp"; - if (Utils.ToJsonFile(config, Utils.GetPath(temp)) != 0) - { - return; - } - //rename - File.Move(temp, configRes); - }); + //save temp file + var temp = $"{configRes}_temp"; + if (Utils.ToJsonFile(config, Utils.GetPath(temp)) != 0) + { + return; + } + + if (File.Exists(configRes)) + { + File.Delete(configRes); + } + //rename + File.Move(temp, configRes); } catch (Exception ex) { From 48928613bf68a88cf2bd2460f26c1b24a8cf575b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 1 May 2022 09:08:16 +0800 Subject: [PATCH 205/252] bug fix --- v2rayN/v2rayN/Forms/MainForm.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index b0335833..6fbcf91e 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1273,7 +1273,10 @@ namespace v2rayN.Forms mainMsgControl.DisplayToolStatus(config); - notifyMain.Icon = this.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); + this.BeginInvoke(new Action(() => + { + notifyMain.Icon = this.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); + })); } #endregion From d5aa307efb303dab312b68eb37315a813e716b02 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 1 May 2022 16:22:54 +0800 Subject: [PATCH 206/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index bd68cf52..bcc8c6ae 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.21")] +[assembly: AssemblyFileVersion("5.22")] From b29fb1e2a3767411b4645bbde6c3b4f88147adb5 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 2 May 2022 20:15:19 +0800 Subject: [PATCH 207/252] add shadowsocks SIP008 https://shadowsocks.org/en/wiki/SIP008-Online-Configuration-Delivery.html --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 55 ++++++++++++++++++++++++++ v2rayN/v2rayN/Mode/SsSIP008.cs | 22 +++++++++++ v2rayN/v2rayN/v2rayN.csproj | 1 + 3 files changed, 78 insertions(+) create mode 100644 v2rayN/v2rayN/Mode/SsSIP008.cs diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 2feba3ac..21cecfd3 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -1033,6 +1033,56 @@ namespace v2rayN.Handler } } + private static int AddBatchServers4SsSIP008(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + + if (!Utils.IsNullOrEmpty(subid)) + { + RemoveServerViaSubid(ref config, subid); + } + + //SsSIP008 + var lstSsServer = Utils.FromJson>(clipboardData); + if (lstSsServer == null || lstSsServer.Count <= 0) + { + var ssSIP008 = Utils.FromJson(clipboardData); + if (ssSIP008 != null && ssSIP008.servers != null && ssSIP008.servers.Count > 0) + { + lstSsServer = ssSIP008.servers; + } + } + + if (lstSsServer != null && lstSsServer.Count > 0) + { + int counter = 0; + foreach (var it in lstSsServer) + { + var ssItem = new VmessItem() + { + subid = subid, + groupId = groupId, + remarks = it.remarks, + security = it.method, + id = it.password, + address = it.server, + port = Utils.ToInt(it.server_port) + }; + if (AddShadowsocksServer(ref config, ssItem, false) == 0) + { + counter++; + } + } + ToJsonFile(config); + return counter; + } + + return -1; + } + public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId) { List lstOriSub = null; @@ -1047,6 +1097,11 @@ namespace v2rayN.Handler counter = AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, lstOriSub, groupId); } + if (counter < 1) + { + counter = AddBatchServers4SsSIP008(ref config, clipboardData, subid, lstOriSub, groupId); + } + //maybe other sub if (counter < 1) { diff --git a/v2rayN/v2rayN/Mode/SsSIP008.cs b/v2rayN/v2rayN/Mode/SsSIP008.cs new file mode 100644 index 00000000..6b3bbc24 --- /dev/null +++ b/v2rayN/v2rayN/Mode/SsSIP008.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + public class SsSIP008 + { + public List servers { get; set; } + } + + [Serializable] + public class SsServer + { + public string remarks { get; set; } + public string server { get; set; } + public string server_port { get; set; } + public string method { get; set; } + public string password { get; set; } + public string plugin { get; set; } + } + +} diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index d920419f..f912feb1 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -216,6 +216,7 @@ + True True From 36aad4424e10909cd942ceab19b5f967e5682804 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 6 May 2022 10:54:10 +0800 Subject: [PATCH 208/252] Fix issue when saving gui config --- v2rayN/v2rayN/Forms/MainForm.cs | 10 +++++++--- v2rayN/v2rayN/Handler/ConfigHandler.cs | 14 ++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 6fbcf91e..73af80ad 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -123,7 +123,10 @@ namespace v2rayN.Forms { try { - v2rayHandler.V2rayStop(); + Utils.SaveLog("MyAppExit Begin"); + + StorageUI(); + ConfigHandler.SaveConfig(ref config); //HttpProxyHandle.CloseHttpAgent(config); if (blWindowsShutDown) @@ -135,10 +138,11 @@ namespace v2rayN.Forms SysProxyHandle.UpdateSysProxy(config, true); } - StorageUI(); - ConfigHandler.SaveConfig(ref config); statistics?.SaveToFile(); statistics?.Close(); + + v2rayHandler.V2rayStop(); + Utils.SaveLog("MyAppExit End"); } catch { } } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 21cecfd3..a22204cf 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -15,8 +15,9 @@ namespace v2rayN.Handler /// class ConfigHandler { - private static string configRes = Global.ConfigFileName; + //private static string configRes = Global.ConfigFileName; private static readonly object objLock = new object(); + private string configResPath = Utils.GetPath(Global.ConfigFileName); #region ConfigHandler @@ -212,18 +213,19 @@ namespace v2rayN.Handler { //save temp file - var temp = $"{configRes}_temp"; - if (Utils.ToJsonFile(config, Utils.GetPath(temp)) != 0) + var tempPath = Utils.GetPath($"{configRes}_temp"); + var resPath = Utils.GetPath(configRes); + if (Utils.ToJsonFile(config, tempPath) != 0) { return; } - if (File.Exists(configRes)) + if (File.Exists(resPath)) { - File.Delete(configRes); + File.Delete(resPath); } //rename - File.Move(temp, configRes); + File.Move(tempPath, resPath); } catch (Exception ex) { From c201d986c5417f428bc53f5c981817a72de33eb8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 6 May 2022 13:33:29 +0800 Subject: [PATCH 209/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index bcc8c6ae..d5ef33b8 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.22")] +[assembly: AssemblyFileVersion("5.23")] From 3defba629004ebfa298de5200c9e1728b2c809a3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 6 May 2022 13:35:30 +0800 Subject: [PATCH 210/252] Update ConfigHandler.cs --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index a22204cf..f9c5e5fa 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -15,9 +15,8 @@ namespace v2rayN.Handler /// class ConfigHandler { - //private static string configRes = Global.ConfigFileName; + private static string configRes = Global.ConfigFileName; private static readonly object objLock = new object(); - private string configResPath = Utils.GetPath(Global.ConfigFileName); #region ConfigHandler From e256ec54014faed7012fad3cf7c7e3f9a5ef541b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 6 May 2022 14:37:52 +0800 Subject: [PATCH 211/252] Update ConfigHandler.cs --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index f9c5e5fa..67013eb9 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -212,8 +212,8 @@ namespace v2rayN.Handler { //save temp file - var tempPath = Utils.GetPath($"{configRes}_temp"); var resPath = Utils.GetPath(configRes); + var tempPath = $"{resPath}_temp"; if (Utils.ToJsonFile(config, tempPath) != 0) { return; From 3575291119df80716bd4296e8d02bb544eec0e09 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 12 May 2022 08:52:40 +0800 Subject: [PATCH 212/252] add multiple program auto run --- v2rayN/v2rayN/Tool/Utils.cs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 76922378..afe8d8ff 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -23,6 +23,7 @@ using Newtonsoft.Json.Linq; using System.Web; using log4net; using System.Linq; +using System.Security.Cryptography; namespace v2rayN { @@ -397,6 +398,20 @@ namespace v2rayN { return HttpUtility.UrlDecode(url); } + + public static string GetMD5(string str) + { + var md5 = MD5.Create(); + byte[] byteOld = Encoding.UTF8.GetBytes(str); + byte[] byteNew = md5.ComputeHash(byteOld); + StringBuilder sb = new StringBuilder(); + foreach (byte b in byteNew) + { + sb.Append(b.ToString("x2")); + } + return sb.ToString(); + } + #endregion @@ -529,7 +544,13 @@ namespace v2rayN #region 开机自动启动 - private static string autoRunName = "v2rayNAutoRun"; + private static string autoRunName + { + get + { + return $"v2rayNAutoRun_{GetMD5(StartupPath())}"; + } + } private static string autoRunRegPath { get From 6f485141f08519a5d5d7f49eec5298ba000018b8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 12 May 2022 09:19:03 +0800 Subject: [PATCH 213/252] Improve speed test core support --- v2rayN/v2rayN/Handler/V2rayHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index fbccd16b..c6930890 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -254,7 +254,7 @@ namespace v2rayN.Handler try { - string fileName = V2rayFindexe(new List { "xray" }); + string fileName = V2rayFindexe(new List { "xray", "wv2ray", "v2ray" }); if (fileName == "") return -1; Process p = new Process From 944849a381cf9c4c9acc0ee0528c70ac2369102f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 12 May 2022 09:49:04 +0800 Subject: [PATCH 214/252] v2ray_win_temp 2 guiTemp --- v2rayN/v2rayN/Tool/Utils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index afe8d8ff..825b0069 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -982,7 +982,7 @@ namespace v2rayN // return path to store temporary files public static string GetTempPath(string filename = "") { - string _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); + string _tempPath = Path.Combine(StartupPath(), "guiTemp"); if (!Directory.Exists(_tempPath)) { Directory.CreateDirectory(_tempPath); From 50ad643abef0ace70f3959f8532f0e85fef78562 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 12 May 2022 09:50:48 +0800 Subject: [PATCH 215/252] Update Utils.cs --- v2rayN/v2rayN/Tool/Utils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 825b0069..f1062818 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -982,7 +982,7 @@ namespace v2rayN // return path to store temporary files public static string GetTempPath(string filename = "") { - string _tempPath = Path.Combine(StartupPath(), "guiTemp"); + string _tempPath = Path.Combine(StartupPath(), "guiTemps"); if (!Directory.Exists(_tempPath)) { Directory.CreateDirectory(_tempPath); From ff622e2ef66b983f41a9e7151fa47f1b6faa722e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 08:14:16 +0800 Subject: [PATCH 216/252] Update v2rayN.csproj --- v2rayN/v2rayN/v2rayN.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index f912feb1..b046e5ae 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -489,13 +489,13 @@ - 3.20.0 + 3.21.1 - 2.45.0 + 2.46.3 - 2.45.0 + 2.46.3 runtime; build; native; contentfiles; analyzers; buildtransitive all From 4913f6f37d278eb7f7694a5cb7041c5b78e954da Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 08:33:25 +0800 Subject: [PATCH 217/252] rename --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 111 ++++++++--------- v2rayN/v2rayN/Forms/MainForm.cs | 4 +- v2rayN/v2rayN/Forms/MainForm.resx | 148 +++++++++++------------ 3 files changed, 132 insertions(+), 131 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 6a834343..7c56e5d9 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -30,7 +30,7 @@ { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.scMain = new System.Windows.Forms.SplitContainer(); + this.scServers = 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(); @@ -65,11 +65,11 @@ 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.tabGroup = new System.Windows.Forms.TabControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.scBig = new System.Windows.Forms.SplitContainer(); + this.gbServers = new System.Windows.Forms.GroupBox(); this.mainMsgControl = new v2rayN.Forms.MainMsgControl(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -121,35 +121,35 @@ 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.scMain)).BeginInit(); - this.scMain.Panel1.SuspendLayout(); - this.scMain.Panel2.SuspendLayout(); - this.scMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.scServers)).BeginInit(); + this.scServers.Panel1.SuspendLayout(); + this.scServers.Panel2.SuspendLayout(); + this.scServers.SuspendLayout(); this.cmsLv.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.scBig)).BeginInit(); + this.scBig.Panel1.SuspendLayout(); + this.scBig.Panel2.SuspendLayout(); + this.scBig.SuspendLayout(); + this.gbServers.SuspendLayout(); this.cmsMain.SuspendLayout(); this.tsMain.SuspendLayout(); this.SuspendLayout(); // - // scMain + // scServers // - resources.ApplyResources(this.scMain, "scMain"); - this.scMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; - this.scMain.Name = "scMain"; + resources.ApplyResources(this.scServers, "scServers"); + this.scServers.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.scServers.Name = "scServers"; // - // scMain.Panel1 + // scServers.Panel1 // - this.scMain.Panel1.Controls.Add(this.lvServers); - this.scMain.Panel1.Controls.Add(this.tabGroup); + this.scServers.Panel1.Controls.Add(this.lvServers); + this.scServers.Panel1.Controls.Add(this.tabGroup); // - // scMain.Panel2 + // scServers.Panel2 // - this.scMain.Panel2.Controls.Add(this.qrCodeControl); - this.scMain.TabStop = false; + this.scServers.Panel2.Controls.Add(this.qrCodeControl); + this.scServers.TabStop = false; // // lvServers // @@ -208,6 +208,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -398,13 +399,6 @@ resources.ApplyResources(this.menuExport2SubContent, "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"; - // // tabGroup // resources.ApplyResources(this.tabGroup, "tabGroup"); @@ -417,25 +411,32 @@ resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // - // splitContainer1 + // tsbServer // - resources.ApplyResources(this.splitContainer1, "splitContainer1"); - this.splitContainer1.Name = "splitContainer1"; + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.Name = "tsbServer"; // - // splitContainer1.Panel1 + // scBig // - this.splitContainer1.Panel1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.scBig, "scBig"); + this.scBig.Name = "scBig"; // - // splitContainer1.Panel2 + // scBig.Panel1 // - this.splitContainer1.Panel2.Controls.Add(this.mainMsgControl); + this.scBig.Panel1.Controls.Add(this.gbServers); // - // groupBox1 + // scBig.Panel2 // - this.groupBox1.Controls.Add(this.scMain); - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; + this.scBig.Panel2.Controls.Add(this.mainMsgControl); + // + // gbServers + // + this.gbServers.Controls.Add(this.scServers); + resources.ApplyResources(this.gbServers, "gbServers"); + this.gbServers.Name = "gbServers"; + this.gbServers.TabStop = false; // // mainMsgControl // @@ -796,7 +797,7 @@ // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.scBig); this.Controls.Add(this.panel1); this.Controls.Add(this.tsMain); this.MaximizeBox = true; @@ -807,16 +808,16 @@ 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.scMain.Panel1.ResumeLayout(false); - this.scMain.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.scMain)).EndInit(); - this.scMain.ResumeLayout(false); + this.scServers.Panel1.ResumeLayout(false); + this.scServers.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.scServers)).EndInit(); + this.scServers.ResumeLayout(false); this.cmsLv.ResumeLayout(false); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); + this.scBig.Panel1.ResumeLayout(false); + this.scBig.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.scBig)).EndInit(); + this.scBig.ResumeLayout(false); + this.gbServers.ResumeLayout(false); this.cmsMain.ResumeLayout(false); this.tsMain.ResumeLayout(false); this.tsMain.PerformLayout(); @@ -827,7 +828,7 @@ #endregion - private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox gbServers; private v2rayN.Base.ListViewFlickerFree lvServers; private System.Windows.Forms.NotifyIcon notifyMain; private System.Windows.Forms.ContextMenuStrip cmsMain; @@ -862,7 +863,7 @@ private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; - private System.Windows.Forms.SplitContainer scMain; + private System.Windows.Forms.SplitContainer scServers; private QRCodeControl qrCodeControl; private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; @@ -910,7 +911,7 @@ private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig; private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeo; - private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer scBig; private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy; private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 73af80ad..432c1cb6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -149,7 +149,7 @@ namespace v2rayN.Forms private void RestoreUI() { - scMain.Panel2Collapsed = true; + scServers.Panel2Collapsed = true; if (!config.uiItem.mainLocation.IsEmpty) { @@ -1418,7 +1418,7 @@ namespace v2rayN.Forms private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) { bool bShow = tsbQRCodeSwitch.Checked; - scMain.Panel2Collapsed = !bShow; + scServers.Panel2Collapsed = !bShow; } #endregion diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index afec6ce6..29963557 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -118,11 +118,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Fill - + 3, 17 @@ -308,8 +308,20 @@ Export subscription (base64) share to clipboard + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + - 356, 666 + 356, 644 cmsLv @@ -354,7 +366,7 @@ v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - scMain.Panel1 + scServers.Panel1 0 @@ -378,21 +390,21 @@ System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - scMain.Panel1 + scServers.Panel1 1 - - scMain.Panel1 + + scServers.Panel1 - + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - scMain + + scServers - + 0 @@ -417,102 +429,90 @@ v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - scMain.Panel2 + scServers.Panel2 0 - - scMain.Panel2 + + scServers.Panel2 - + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - scMain + + scServers - + 1 - + 100 - + 946, 280 - + 686 - + 0 - - scMain + + scServers - + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + gbServers - + 0 - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - - + Fill - + 0, 66 - + Horizontal - + Fill - + 0, 0 - + 952, 300 - + 0 - - groupBox1 + + gbServers - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - splitContainer1.Panel1 + + scBig.Panel1 - + 0 - - splitContainer1.Panel1 + + scBig.Panel1 - + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - splitContainer1 + + scBig - + 0 @@ -534,42 +534,42 @@ v2rayN.Forms.MainMsgControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - splitContainer1.Panel2 + scBig.Panel2 0 - - splitContainer1.Panel2 + + scBig.Panel2 - + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - splitContainer1 + + scBig - + 1 - + 952, 527 - + 300 - + 5 - - splitContainer1 + + scBig - + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 2 From 51d3df69bbb97fea99d19583dd5ac9f05a351bc3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 08:42:22 +0800 Subject: [PATCH 218/252] refactor Move To menu --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 41 +++++++++------- v2rayN/v2rayN/Forms/MainForm.resx | 58 ++++++++++++++--------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 3 ++ 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 7c56e5d9..4d43e379 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -48,11 +48,12 @@ this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.menuMoveToGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveEvent = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); - this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); this.menuPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); @@ -190,10 +191,7 @@ this.menuSetDefaultServer, this.toolStripSeparator3, this.menuMoveToGroup, - this.menuMoveTop, - this.menuMoveUp, - this.menuMoveDown, - this.menuMoveBottom, + this.menuMoveEvent, this.menuSelectAll, this.toolStripSeparator9, this.menuPingServer, @@ -208,7 +206,6 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -299,6 +296,22 @@ resources.ApplyResources(this.menuMoveToGroup, "menuMoveToGroup"); this.menuMoveToGroup.Click += new System.EventHandler(this.menuMoveToGroup_Click); // + // menuSelectAll + // + this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // menuMoveEvent + // + this.menuMoveEvent.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom}); + this.menuMoveEvent.Name = "menuMoveEvent"; + resources.ApplyResources(this.menuMoveEvent, "menuMoveEvent"); + // // menuMoveTop // this.menuMoveTop.Name = "menuMoveTop"; @@ -323,12 +336,6 @@ resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // - // menuSelectAll - // - this.menuSelectAll.Name = "menuSelectAll"; - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); - this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); - // // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; @@ -413,7 +420,6 @@ // // tsbServer // - this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; @@ -852,10 +858,6 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private System.Windows.Forms.ToolStripMenuItem menuMoveTop; - private System.Windows.Forms.ToolStripMenuItem menuMoveUp; - private System.Windows.Forms.ToolStripMenuItem menuMoveDown; - private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode; private System.Windows.Forms.ToolStripMenuItem menuGlobal; @@ -919,6 +921,11 @@ private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; private System.Windows.Forms.ToolStripMenuItem menuMoveToGroup; private MainMsgControl mainMsgControl; + private System.Windows.Forms.ToolStripMenuItem menuMoveEvent; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 29963557..d7ea6577 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -213,29 +213,35 @@ Move to Group - 355, 22 + 192, 22 Move to top (T) - 355, 22 + 192, 22 Up (U) - 355, 22 + 192, 22 Down (D) - 355, 22 + 192, 22 Move to bottom (B) + + 355, 22 + + + Move to + 355, 22 @@ -308,20 +314,8 @@ Export subscription (base64) share to clipboard - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - - 356, 644 + 356, 600 cmsLv @@ -470,6 +464,18 @@ 0 + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + Fill @@ -1049,6 +1055,18 @@ 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 + + + menuMoveEvent + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + menuMoveTop @@ -1073,12 +1091,6 @@ 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 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index e4efd702..2bb49b14 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -555,4 +555,7 @@ 移至分组 + + 上下移至 + \ No newline at end of file From bc0e8c17bacc5650eb045f3eda73dd2c1c988f7a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 08:43:05 +0800 Subject: [PATCH 219/252] refactor Move To menu --- v2rayN/v2rayN/Forms/MainForm.resx | 230 +++++++++++++++--------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index d7ea6577..fb97d8b6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -212,30 +212,6 @@ Move to Group - - 192, 22 - - - Move to top (T) - - - 192, 22 - - - Up (U) - - - 192, 22 - - - Down (D) - - - 192, 22 - - - Move to bottom (B) - 355, 22 @@ -464,6 +440,30 @@ 0 + + 192, 22 + + + Move to top (T) + + + 192, 22 + + + Up (U) + + + 192, 22 + + + Down (D) + + + 192, 22 + + + Move to bottom (B) + Magenta @@ -587,6 +587,27 @@ NoControl + + 278, 192 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 277, 22 + + + System proxy + 243, 22 @@ -605,12 +626,6 @@ Do not change system proxy - - 277, 22 - - - System proxy - 277, 22 @@ -659,21 +674,6 @@ Exit - - 278, 192 - - - cmsMain - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - True - Top @@ -701,9 +701,42 @@ 315, 17 + + 0, 0 + + + 952, 56 + + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + 6, 56 + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + 277, 22 @@ -722,18 +755,6 @@ Update subscription with proxy - - Magenta - - - 99, 53 - - - Subscriptions - - - ImageAboveText - Magenta @@ -752,6 +773,18 @@ 6, 56 + + Magenta + + + 67, 53 + + + Settings + + + ImageAboveText + 195, 22 @@ -785,18 +818,6 @@ BackupGuiConfig - - Magenta - - - 67, 53 - - - Settings - - - ImageAboveText - 6, 56 @@ -818,6 +839,18 @@ 6, 56 + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + 203, 22 @@ -845,21 +878,21 @@ Update Geo files - - Magenta - - - 128, 53 - - - Check for updates - - - ImageAboveText - 6, 56 + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + 187, 22 @@ -887,18 +920,6 @@ 语言-[中文简体] - - Magenta - - - 48, 53 - - - Help - - - ImageAboveText - Magenta @@ -926,32 +947,11 @@ ImageAboveText - - 0, 0 - - - 952, 56 - - - 1 - - - tsMain - - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - True - 90 + 25 6, 12 From 277b21dc86eeb60c0377364d7cbcaac8a9c2e65f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 09:32:31 +0800 Subject: [PATCH 220/252] add server filter --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 24 +- v2rayN/v2rayN/Forms/MainForm.cs | 17 ++ v2rayN/v2rayN/Forms/MainForm.resx | 250 +++++++++--------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 3 + v2rayN/v2rayN/Forms/MainMsgControl.cs | 1 + .../v2rayN/Forms/MsgFilterSetForm.Designer.cs | 38 ++- v2rayN/v2rayN/Forms/MsgFilterSetForm.cs | 9 + v2rayN/v2rayN/Forms/MsgFilterSetForm.resx | 171 +++++++----- .../Forms/MsgFilterSetForm.zh-Hans.resx | 3 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 + v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + 12 files changed, 325 insertions(+), 206 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 4d43e379..ac6c9e81 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -46,14 +46,15 @@ this.menuRemoveDuplicateServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuServerFilter = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.menuMoveToGroup = new System.Windows.Forms.ToolStripMenuItem(); - this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveEvent = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); this.menuPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); @@ -189,6 +190,7 @@ this.menuRemoveDuplicateServer, this.menuCopyServer, this.menuSetDefaultServer, + this.menuServerFilter, this.toolStripSeparator3, this.menuMoveToGroup, this.menuMoveEvent, @@ -285,6 +287,12 @@ resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // + // menuServerFilter + // + this.menuServerFilter.Name = "menuServerFilter"; + resources.ApplyResources(this.menuServerFilter, "menuServerFilter"); + this.menuServerFilter.Click += new System.EventHandler(this.menuServerFilter_Click); + // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; @@ -296,12 +304,6 @@ resources.ApplyResources(this.menuMoveToGroup, "menuMoveToGroup"); this.menuMoveToGroup.Click += new System.EventHandler(this.menuMoveToGroup_Click); // - // menuSelectAll - // - this.menuSelectAll.Name = "menuSelectAll"; - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); - this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); - // // menuMoveEvent // this.menuMoveEvent.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -336,6 +338,12 @@ resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // + // menuSelectAll + // + this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; @@ -420,6 +428,7 @@ // // tsbServer // + this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; @@ -926,6 +935,7 @@ private System.Windows.Forms.ToolStripMenuItem menuMoveUp; private System.Windows.Forms.ToolStripMenuItem menuMoveDown; private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripMenuItem menuServerFilter; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 432c1cb6..bbc7b6a5 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -21,6 +21,7 @@ namespace v2rayN.Forms private StatisticsHandler statistics = null; private List lstVmess = null; private string groupId = string.Empty; + private string serverFilter = string.Empty; #region Window 事件 @@ -212,6 +213,7 @@ namespace v2rayN.Forms { lstVmess = config.vmess .Where(it => Utils.IsNullOrEmpty(groupId) ? true : it.groupId == groupId) + .Where(it => Utils.IsNullOrEmpty(serverFilter) ? true : it.remarks.Contains(serverFilter)) .OrderBy(it => it.sort) .ToList(); @@ -628,6 +630,9 @@ namespace v2rayN.Forms case Keys.T: menuSpeedServer_Click(null, null); break; + case Keys.F: + menuServerFilter_Click(null, null); + break; } } else @@ -717,6 +722,17 @@ namespace v2rayN.Forms SetDefaultServer(index); } + private void menuServerFilter_Click(object sender, EventArgs e) + { + var fm = new MsgFilterSetForm(); + fm.MsgFilter = serverFilter; + if (fm.ShowDialog() == DialogResult.OK) + { + serverFilter = fm.MsgFilter; + gbServers.Text = string.Format(ResUI.MsgServerTitle, serverFilter); + RefreshServers(); + } + } private void menuPingServer_Click(object sender, EventArgs e) { @@ -1501,5 +1517,6 @@ namespace v2rayN.Forms } } #endregion + } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index fb97d8b6..553fd572 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -203,6 +203,12 @@ Set as active server (Enter) + + 355, 22 + + + Set server filter (Ctrl+F) + 352, 6 @@ -212,6 +218,30 @@ Move to Group + + 192, 22 + + + Move to top (T) + + + 192, 22 + + + Up (U) + + + 192, 22 + + + Down (D) + + + 192, 22 + + + Move to bottom (B) + 355, 22 @@ -291,7 +321,7 @@ Export subscription (base64) share to clipboard - 356, 600 + 356, 622 cmsLv @@ -440,30 +470,6 @@ 0 - - 192, 22 - - - Move to top (T) - - - 192, 22 - - - Up (U) - - - 192, 22 - - - Down (D) - - - 192, 22 - - - Move to bottom (B) - Magenta @@ -587,27 +593,6 @@ NoControl - - 278, 192 - - - cmsMain - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - True - - - 277, 22 - - - System proxy - 243, 22 @@ -626,6 +611,12 @@ Do not change system proxy + + 277, 22 + + + System proxy + 277, 22 @@ -674,6 +665,21 @@ Exit + + 278, 192 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + Top @@ -701,42 +707,9 @@ 315, 17 - - 0, 0 - - - 952, 56 - - - 1 - - - tsMain - - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - 6, 56 - - Magenta - - - 99, 53 - - - Subscriptions - - - ImageAboveText - 277, 22 @@ -755,6 +728,18 @@ Update subscription with proxy + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + Magenta @@ -773,18 +758,6 @@ 6, 56 - - Magenta - - - 67, 53 - - - Settings - - - ImageAboveText - 195, 22 @@ -818,6 +791,18 @@ BackupGuiConfig + + Magenta + + + 67, 53 + + + Settings + + + ImageAboveText + 6, 56 @@ -839,18 +824,6 @@ 6, 56 - - Magenta - - - 128, 53 - - - Check for updates - - - ImageAboveText - 203, 22 @@ -878,21 +851,21 @@ Update Geo files - - 6, 56 - - + Magenta - - 48, 53 + + 128, 53 - - Help + + Check for updates - + ImageAboveText + + 6, 56 + 187, 22 @@ -920,6 +893,18 @@ 语言-[中文简体] + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + Magenta @@ -947,11 +932,32 @@ ImageAboveText + + 0, 0 + + + 952, 56 + + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + True - 25 + 64 6, 12 @@ -1043,6 +1049,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuServerFilter + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolStripSeparator3 @@ -1055,12 +1067,6 @@ 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 - menuMoveEvent @@ -1091,6 +1097,12 @@ 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 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 2bb49b14..740a1506 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -558,4 +558,7 @@ 上下移至 + + 设置服务器过滤器 (Ctrl+F) + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs index 660aa2f4..edf3166b 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.cs +++ b/v2rayN/v2rayN/Forms/MainMsgControl.cs @@ -183,6 +183,7 @@ namespace v2rayN.Forms { var fm = new MsgFilterSetForm(); fm.MsgFilter = MsgFilter; + fm.ShowDefFilter = true; if (fm.ShowDialog() == DialogResult.OK) { MsgFilter = fm.MsgFilter; diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs index 96e61724..92343dee 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs @@ -30,12 +30,13 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MsgFilterSetForm)); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnFilderProxy = new System.Windows.Forms.Button(); + this.btnFilterDirect = new System.Windows.Forms.Button(); this.txtMsgFilter = new System.Windows.Forms.TextBox(); this.panel2 = new System.Windows.Forms.Panel(); this.btnClose = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); - this.btnFilterDirect = new System.Windows.Forms.Button(); - this.btnFilderProxy = new System.Windows.Forms.Button(); + this.btnClear = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); @@ -49,6 +50,20 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // btnFilderProxy + // + resources.ApplyResources(this.btnFilderProxy, "btnFilderProxy"); + this.btnFilderProxy.Name = "btnFilderProxy"; + this.btnFilderProxy.UseVisualStyleBackColor = true; + this.btnFilderProxy.Click += new System.EventHandler(this.btnFilderProxy_Click); + // + // btnFilterDirect + // + resources.ApplyResources(this.btnFilterDirect, "btnFilterDirect"); + this.btnFilterDirect.Name = "btnFilterDirect"; + this.btnFilterDirect.UseVisualStyleBackColor = true; + this.btnFilterDirect.Click += new System.EventHandler(this.btnFilterDirect_Click); + // // txtMsgFilter // resources.ApplyResources(this.txtMsgFilter, "txtMsgFilter"); @@ -56,6 +71,7 @@ // // panel2 // + this.panel2.Controls.Add(this.btnClear); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); resources.ApplyResources(this.panel2, "panel2"); @@ -76,19 +92,12 @@ this.btnOK.UseVisualStyleBackColor = true; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // - // btnFilterDirect + // btnClear // - resources.ApplyResources(this.btnFilterDirect, "btnFilterDirect"); - this.btnFilterDirect.Name = "btnFilterDirect"; - this.btnFilterDirect.UseVisualStyleBackColor = true; - this.btnFilterDirect.Click += new System.EventHandler(this.btnFilterDirect_Click); - // - // btnFilderProxy - // - resources.ApplyResources(this.btnFilderProxy, "btnFilderProxy"); - this.btnFilderProxy.Name = "btnFilderProxy"; - this.btnFilderProxy.UseVisualStyleBackColor = true; - this.btnFilderProxy.Click += new System.EventHandler(this.btnFilderProxy_Click); + resources.ApplyResources(this.btnClear, "btnClear"); + this.btnClear.Name = "btnClear"; + this.btnClear.UseVisualStyleBackColor = true; + this.btnClear.Click += new System.EventHandler(this.btnClear_Click); // // MsgFilterSetForm // @@ -114,5 +123,6 @@ private System.Windows.Forms.Button btnOK; private System.Windows.Forms.Button btnFilderProxy; private System.Windows.Forms.Button btnFilterDirect; + private System.Windows.Forms.Button btnClear; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs index debeb482..421f294c 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs @@ -13,6 +13,7 @@ namespace v2rayN.Forms public partial class MsgFilterSetForm : BaseForm { public string MsgFilter { get; set; } + public bool ShowDefFilter { get; set; } public MsgFilterSetForm() { @@ -22,6 +23,8 @@ namespace v2rayN.Forms private void MsgFilterSetForm_Load(object sender, EventArgs e) { txtMsgFilter.Text = MsgFilter; + btnFilderProxy.Visible = + btnFilterDirect.Visible = ShowDefFilter; } private void btnOK_Click(object sender, EventArgs e) @@ -44,5 +47,11 @@ namespace v2rayN.Forms { txtMsgFilter.Text = "^(?!.*direct).*$"; } + + private void btnClear_Click(object sender, EventArgs e) + { + MsgFilter = string.Empty; + this.DialogResult = DialogResult.OK; + } } } diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx index e154ee94..82cacfe0 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx @@ -117,14 +117,78 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + btnFilderProxy + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + btnFilterDirect + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + txtMsgFilter + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + + Fill + + + 0, 0 + + + 490, 76 + + + + 8 + + + Filter + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + 157, 47 95, 23 - 13 @@ -143,7 +207,6 @@ 0 - NoControl @@ -192,81 +255,33 @@ 2 - - Fill + + NoControl - - 0, 0 + + 211, 17 - - 490, 76 + + 75, 23 - - 8 + + 14 - - Filter + + Clear - - groupBox1 + + btnClear - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - btnClose - - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + panel2 - + 0 - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 76 - - - 490, 60 - - - 9 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - NoControl @@ -292,7 +307,7 @@ panel2 - 0 + 1 NoControl @@ -319,6 +334,30 @@ panel2 + 2 + + + Bottom + + + 0, 76 + + + 490, 60 + + + 9 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 1 diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx index 67a72ead..3ec9e0e7 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx @@ -135,4 +135,7 @@ 过滤Direct + + 清空 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 431ec5ea..aaa37f35 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -600,6 +600,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Servers (Filter : {0}) 的本地化字符串。 + /// + internal static string MsgServerTitle { + get { + return ResourceManager.GetString("MsgServerTitle", resourceCulture); + } + } + /// /// 查找类似 Simplify PAC Success 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index e6178559..e431fc52 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -469,4 +469,7 @@ Local + + Servers (Filter : {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 0f3a4ac1..f2fcb46c 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -469,4 +469,7 @@ 本地 + + 服务器 (过滤器 : {0}) + \ No newline at end of file From 3a9a49b163fd13184a5074789e0f84d44b08afa3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 09:40:31 +0800 Subject: [PATCH 221/252] Update MsgFilterSetForm.Designer.cs --- v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs index 92343dee..ff3ca4f8 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs @@ -103,6 +103,7 @@ // 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.Name = "MsgFilterSetForm"; From 89da3823a428305c24bb35b384f7c9ebcefa70e2 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 09:40:34 +0800 Subject: [PATCH 222/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index d5ef33b8..da07d48a 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.23")] +[assembly: AssemblyFileVersion("5.24")] From 4c2388749dce9ab0317423826f26d692a0302500 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 18:28:44 +0800 Subject: [PATCH 223/252] add Shadowsocks-2022 for xray-core --- v2rayN/v2rayN/Global.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 470412ed..f5fa4cf2 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -211,7 +211,7 @@ namespace v2rayN public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; - public static readonly List ssSecuritysInXray = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain" }; + public static readonly List ssSecuritysInXray = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" }; public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; From 7903228c130050870dd4c9b90ae9ab7899b8b385 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 29 May 2022 18:29:03 +0800 Subject: [PATCH 224/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index da07d48a..4788a113 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.24")] +[assembly: AssemblyFileVersion("5.25")] From f597f09914548ec974e052e59547a6add78a7528 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 31 May 2022 14:53:39 +0800 Subject: [PATCH 225/252] Support 2022-blake3 share --- v2rayN/v2rayN/Handler/ShareHandler.cs | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 9550729a..77d9d9f4 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -594,17 +594,30 @@ namespace v2rayN.Handler address = parsedUrl.IdnHost, port = parsedUrl.Port, }; - - // parse base64 UserInfo string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.UriEscaped); - string userInfo = Utils.Base64Decode(rawUserInfo); - string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); - if (userInfoParts.Length != 2) + //2022-blake3 + if (rawUserInfo.Contains(":")) { - return null; + string[] userInfoParts = rawUserInfo.Split(new char[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + server.security = userInfoParts[0]; + server.id = Utils.UrlDecode(userInfoParts[1]); + } + else + { + // parse base64 UserInfo + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + server.security = userInfoParts[0]; + server.id = userInfoParts[1]; } - server.security = userInfoParts[0]; - server.id = userInfoParts[1]; NameValueCollection queryParameters = HttpUtility.ParseQueryString(parsedUrl.Query); if (queryParameters["plugin"] != null) From 9415055e6f3fe900caa2750cf8e279bc05c04ad3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 5 Jun 2022 20:24:08 +0800 Subject: [PATCH 226/252] Timeout to 30s --- v2rayN/v2rayN/Handler/DownloadHandle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 19840eee..131b89c1 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -206,7 +206,7 @@ namespace v2rayN.Handler try { HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); - myHttpWebRequest.Timeout = 5000; + myHttpWebRequest.Timeout = 30 * 1000; myHttpWebRequest.Proxy = webProxy; Stopwatch timer = new Stopwatch(); From db7e8dd6dcc0beb1e84aa2bc857b0161eb3836b9 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 6 Jun 2022 15:10:09 +0800 Subject: [PATCH 227/252] Update MainFormHandler.cs --- v2rayN/v2rayN/Handler/MainFormHandler.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 37fd7c9c..b6735f32 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -94,8 +94,11 @@ namespace v2rayN.Handler Graphics graphics = Graphics.FromImage(bitmap); SolidBrush drawBrush = new SolidBrush(color); - graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); + graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + //graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height); + graphics.FillEllipse(drawBrush, width/2, width/2, width/2, width/2); + Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); drawBrush.Dispose(); From d5eaa56b607ff57d7829da8f3886c86c87dc12ea Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 6 Jun 2022 17:28:38 +0800 Subject: [PATCH 228/252] refactor update core url --- v2rayN/v2rayN/Forms/MainForm.cs | 10 ++------ v2rayN/v2rayN/Global.cs | 1 + v2rayN/v2rayN/Handler/LazyConfig.cs | 12 +++++++++ v2rayN/v2rayN/Handler/UpdateHandle.cs | 36 ++++++--------------------- v2rayN/v2rayN/Mode/CoreInfo.cs | 4 +++ 5 files changed, 26 insertions(+), 37 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index bbc7b6a5..69740ec9 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1314,10 +1314,7 @@ namespace v2rayN.Forms menuExit_Click(null, null); } }; - Task.Run(() => - { - (new UpdateHandle()).CheckUpdateGuiN(config, _updateUI); - }); + (new UpdateHandle()).CheckUpdateGuiN(config, _updateUI); } private void tsbCheckUpdateCore_Click(object sender, EventArgs e) @@ -1350,10 +1347,7 @@ namespace v2rayN.Forms AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfully); } }; - Task.Run(() => - { - (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); - }); + (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); } private void tsbCheckUpdateGeo_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index f5fa4cf2..a6bc8353 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -18,6 +18,7 @@ namespace v2rayN public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases"; public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases"; public const string naiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases"; + public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat"; diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 26625455..42dbb990 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -66,12 +66,22 @@ namespace v2rayN.Handler { coreInfos = new List(); + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.v2rayN, + coreUrl = Global.NUrl, + coreLatestUrl = Global.NUrl + "/latest", + coreDownloadUrl = Global.NUrl + "/download/{0}/v2rayN.zip", + }); + coreInfos.Add(new CoreInfo { coreType = ECoreType.v2fly, coreExes = new List { "wv2ray", "v2ray" }, arguments = "", coreUrl = Global.v2flyCoreUrl, + coreLatestUrl = Global.v2flyCoreUrl + "/latest", + coreDownloadUrl = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip", match = "V2Ray" }); @@ -81,6 +91,8 @@ namespace v2rayN.Handler coreExes = new List { "xray" }, arguments = "", coreUrl = Global.xrayCoreUrl, + coreLatestUrl = Global.xrayCoreUrl + "/latest", + coreDownloadUrl = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip", match = "Xray" }); diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 630225d2..7ddf3f7f 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -31,14 +31,6 @@ namespace v2rayN.Handler } } - private readonly string nLatestUrl = Global.NUrl + "/latest"; - private const string nUrl = Global.NUrl + "/download/{0}/v2rayN.zip"; - private readonly string v2flyCoreLatestUrl = Global.v2flyCoreUrl + "/latest"; - private const string v2flyCoreUrl = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip"; - private readonly string xrayCoreLatestUrl = Global.xrayCoreUrl + "/latest"; - private const string xrayCoreUrl = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip"; - private const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat"; - public void CheckUpdateGuiN(Config config, Action update) { _config = config; @@ -244,7 +236,7 @@ namespace v2rayN.Handler { _config = config; _updateFunc = update; - var url = string.Format(geoUrl, geoName); + var url = string.Format(Global.geoUrl, geoName); DownloadHandle downloadHandle = null; if (downloadHandle == null) @@ -306,23 +298,8 @@ namespace v2rayN.Handler { try { - string url; - if (type == ECoreType.v2fly) - { - url = v2flyCoreLatestUrl; - } - else if (type == ECoreType.Xray) - { - url = xrayCoreLatestUrl; - } - else if (type == ECoreType.v2rayN) - { - url = nLatestUrl; - } - else - { - throw new ArgumentException("Type"); - } + var coreInfo = LazyConfig.Instance.GetCoreInfo(type); + string url = coreInfo.coreLatestUrl; var result = await (new DownloadHandle()).UrlRedirectAsync(url, true); if (!Utils.IsNullOrEmpty(result)) @@ -396,6 +373,7 @@ namespace v2rayN.Handler try { string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); + var coreInfo = LazyConfig.Instance.GetCoreInfo(type); string curVersion; string message; @@ -405,20 +383,20 @@ namespace v2rayN.Handler curVersion = "v" + getCoreVersion(type); message = string.Format(ResUI.IsLatestCore, curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(v2flyCoreUrl, version, osBit); + url = string.Format(coreInfo.coreDownloadUrl, version, osBit); } else if (type == ECoreType.Xray) { curVersion = "v" + getCoreVersion(type); message = string.Format(ResUI.IsLatestCore, curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(xrayCoreUrl, version, osBit); + url = string.Format(coreInfo.coreDownloadUrl, version, osBit); } else if (type == ECoreType.v2rayN) { curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); message = string.Format(ResUI.IsLatestN, curVersion); - url = string.Format(nUrl, version); + url = string.Format(coreInfo.coreDownloadUrl, version); } else { diff --git a/v2rayN/v2rayN/Mode/CoreInfo.cs b/v2rayN/v2rayN/Mode/CoreInfo.cs index 8b2726b2..86391c7d 100644 --- a/v2rayN/v2rayN/Mode/CoreInfo.cs +++ b/v2rayN/v2rayN/Mode/CoreInfo.cs @@ -14,6 +14,10 @@ namespace v2rayN.Mode public string coreUrl { get; set; } + public string coreLatestUrl { get; set; } + + public string coreDownloadUrl { get; set; } + public string match { get; set; } } } From fec8641efe587db23eaf6b14ebbc31c8bf491304 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 12 Jun 2022 19:36:36 +0800 Subject: [PATCH 229/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 4788a113..d5a654ae 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.25")] +[assembly: AssemblyFileVersion("5.26")] From dd65c3fcaa75db9c51d2fd4e2f39b5bed13bedfb Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 19 Jun 2022 20:43:33 +0800 Subject: [PATCH 230/252] ss supports transport settings --- v2rayN/v2rayN/Forms/AddServerForm.cs | 4 ++-- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 24 +++++++-------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 8e731590..de447a33 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -32,8 +32,8 @@ namespace v2rayN.Forms case EConfigType.Shadowsocks: panSs.Dock = DockStyle.Fill; panSs.Visible = true; - panTran.Visible = false; - this.Height = this.Height - panTran.Height; + //panTran.Visible = false; + //this.Height = this.Height - panTran.Height; cmbSecurity3.Items.AddRange(LazyConfig.Instance.GetShadowsocksSecuritys().ToArray()); break; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 5c48c630..8f1d7e83 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -406,9 +406,7 @@ namespace v2rayN.Handler outbound.mux.enabled = config.muxEnabled; outbound.mux.concurrency = config.muxEnabled ? 8 : -1; - //远程服务器底层传输配置 - StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(node, "out", ref streamSettings); + boundStreamSettings(node, "out", outbound.streamSettings); outbound.protocol = Global.vmessProtocolLite; outbound.settings.servers = null; @@ -445,6 +443,7 @@ namespace v2rayN.Handler outbound.mux.enabled = false; outbound.mux.concurrency = -1; + boundStreamSettings(node, "out", outbound.streamSettings); outbound.protocol = Global.ssProtocolLite; outbound.settings.vnext = null; @@ -522,9 +521,7 @@ namespace v2rayN.Handler outbound.mux.enabled = config.muxEnabled; outbound.mux.concurrency = config.muxEnabled ? 8 : -1; - //远程服务器底层传输配置 - StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(node, "out", ref streamSettings); + boundStreamSettings(node, "out", outbound.streamSettings); //if xtls if (node.streamSecurity == Global.StreamSecurityX) @@ -585,10 +582,7 @@ namespace v2rayN.Handler outbound.mux.enabled = false; outbound.mux.concurrency = -1; - - //远程服务器底层传输配置 - StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(node, "out", ref streamSettings); + boundStreamSettings(node, "out", outbound.streamSettings); outbound.protocol = Global.trojanProtocolLite; outbound.settings.vnext = null; @@ -601,18 +595,18 @@ namespace v2rayN.Handler } /// - /// vmess协议远程服务器底层传输配置 + /// 底层传输配置 /// /// /// /// /// - private static int boundStreamSettings(VmessItem node, string iobound, ref StreamSettings streamSettings) + private static int boundStreamSettings(VmessItem node, string iobound, StreamSettings streamSettings) { try { var config = LazyConfig.Instance.GetConfig(); - //远程服务器底层传输配置 + streamSettings.network = node.GetNetwork(); string host = node.requestHost.TrimEx(); string sni = node.sni; @@ -1088,9 +1082,7 @@ namespace v2rayN.Handler inbound.settings.decryption = node.security; } - //远程服务器底层传输配置 - StreamSettings streamSettings = inbound.streamSettings; - boundStreamSettings(node, "in", ref streamSettings); + boundStreamSettings(node, "in", inbound.streamSettings); } catch { From 6f08cb0e88e2028021c0898956ad1701ff01580d Mon Sep 17 00:00:00 2001 From: Edi Wang Date: Wed, 22 Jun 2022 09:48:00 +0800 Subject: [PATCH 231/252] C sharp language usage improvements --- v2rayN/v2rayN/Base/ListViewFlickerFree.cs | 44 +++++----- v2rayN/v2rayN/Forms/AddServer2Form.cs | 26 ++---- v2rayN/v2rayN/Forms/AddServerForm.cs | 23 ++--- v2rayN/v2rayN/Forms/BaseForm.cs | 4 +- .../v2rayN/Forms/GlobalHotkeySettingForm.cs | 4 +- v2rayN/v2rayN/Forms/GroupSettingControl.cs | 2 +- v2rayN/v2rayN/Forms/GroupSettingForm.cs | 4 +- v2rayN/v2rayN/Forms/MainForm.cs | 62 ++++++------- v2rayN/v2rayN/Forms/MainMsgControl.cs | 32 +++---- v2rayN/v2rayN/Forms/MsgFilterSetForm.cs | 6 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 4 +- .../Forms/RoutingRuleSettingDetailsForm.cs | 32 +++---- v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs | 21 ++--- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 60 ++++++------- v2rayN/v2rayN/Forms/ServerTransportControl.cs | 2 +- v2rayN/v2rayN/Forms/SubSettingControl.cs | 8 +- v2rayN/v2rayN/Forms/SubSettingForm.cs | 4 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 24 ++---- v2rayN/v2rayN/Handler/DownloadHandle.cs | 8 +- v2rayN/v2rayN/Handler/LazyConfig.cs | 6 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 8 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 86 ++++++------------- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 17 ++-- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 10 +-- v2rayN/v2rayN/Handler/UpdateHandle.cs | 20 ++--- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 29 +++---- v2rayN/v2rayN/Handler/V2rayHandler.cs | 10 +-- v2rayN/v2rayN/Program.cs | 4 +- v2rayN/v2rayN/Tool/Logging.cs | 26 +++--- v2rayN/v2rayN/Tool/Utils.cs | 2 +- 30 files changed, 247 insertions(+), 341 deletions(-) diff --git a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs index 91f555c3..4d34e2c0 100644 --- a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs +++ b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs @@ -16,37 +16,37 @@ namespace v2rayN.Base UpdateStyles(); } - public void RegisterDragEvent(Action _update) + public void RegisterDragEvent(Action update) { - _updateFunc = _update; - this.AllowDrop = true; + _updateFunc = update; + AllowDrop = true; - this.ItemDrag += new ItemDragEventHandler(this.lv_ItemDrag); - this.DragDrop += new DragEventHandler(this.lv_DragDrop); - this.DragEnter += new DragEventHandler(this.lv_DragEnter); - this.DragOver += new DragEventHandler(this.lv_DragOver); - this.DragLeave += new EventHandler(this.lv_DragLeave); + ItemDrag += lv_ItemDrag; + DragDrop += lv_DragDrop; + DragEnter += lv_DragEnter; + DragOver += lv_DragOver; + DragLeave += lv_DragLeave; } private void lv_DragDrop(object sender, DragEventArgs e) { - int targetIndex = this.InsertionMark.Index; + int targetIndex = InsertionMark.Index; if (targetIndex == -1) { return; } - if (this.InsertionMark.AppearsAfterItem) + if (InsertionMark.AppearsAfterItem) { targetIndex++; } - if (this.SelectedIndices.Count <= 0) + if (SelectedIndices.Count <= 0) { return; } - _updateFunc(this.SelectedIndices[0], targetIndex); + _updateFunc(SelectedIndices[0], targetIndex); //ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); //this.BeginUpdate(); @@ -63,35 +63,35 @@ namespace v2rayN.Base private void lv_DragLeave(object sender, EventArgs e) { - this.InsertionMark.Index = -1; + InsertionMark.Index = -1; } private void lv_DragOver(object sender, DragEventArgs e) { - Point targetPoint = this.PointToClient(new Point(e.X, e.Y)); - int targetIndex = this.InsertionMark.NearestIndex(targetPoint); + Point targetPoint = PointToClient(new Point(e.X, e.Y)); + int targetIndex = InsertionMark.NearestIndex(targetPoint); if (targetIndex > -1) { - Rectangle itemBounds = this.GetItemRect(targetIndex); - this.EnsureVisible(targetIndex); + Rectangle itemBounds = GetItemRect(targetIndex); + EnsureVisible(targetIndex); if (targetPoint.Y > itemBounds.Top + (itemBounds.Height / 2)) { - this.InsertionMark.AppearsAfterItem = true; + InsertionMark.AppearsAfterItem = true; } else { - this.InsertionMark.AppearsAfterItem = false; + InsertionMark.AppearsAfterItem = false; } } - this.InsertionMark.Index = targetIndex; + InsertionMark.Index = targetIndex; } private void lv_ItemDrag(object sender, ItemDragEventArgs e) { - this.DoDragDrop(e.Item, DragDropEffects.Move); - this.InsertionMark.Index = -1; + DoDragDrop(e.Item, DragDropEffects.Move); + InsertionMark.Index = -1; } } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 78503fdd..81d87cfa 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -32,8 +32,10 @@ namespace v2rayN.Forms } else { - vmessItem = new VmessItem(); - vmessItem.groupId = groupId; + vmessItem = new VmessItem + { + groupId = groupId + }; ClearServer(); } } @@ -46,14 +48,7 @@ namespace v2rayN.Forms txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; - if (vmessItem.coreType == null) - { - cmbCoreType.Text = string.Empty; - } - else - { - cmbCoreType.Text = vmessItem.coreType.ToString(); - } + cmbCoreType.Text = vmessItem.coreType == null ? string.Empty : vmessItem.coreType.ToString(); } @@ -90,7 +85,7 @@ namespace v2rayN.Forms if (ConfigHandler.EditCustomServer(ref config, vmessItem) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -100,14 +95,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - if (Utils.IsNullOrEmpty(vmessItem.indexId)) - { - this.DialogResult = DialogResult.Cancel; - } - else - { - this.DialogResult = DialogResult.OK; - } + DialogResult = Utils.IsNullOrEmpty(vmessItem.indexId) ? DialogResult.Cancel : DialogResult.OK; } private void btnBrowse_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index de447a33..0af14fd1 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -16,7 +16,7 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { - this.Text = (eConfigType).ToString(); + Text = (eConfigType).ToString(); cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); cmbCoreType.Items.Add(string.Empty); @@ -41,7 +41,7 @@ namespace v2rayN.Forms panSocks.Dock = DockStyle.Fill; panSocks.Visible = true; panTran.Visible = false; - this.Height = this.Height - panTran.Height; + Height = Height - panTran.Height; break; case EConfigType.VLESS: panVless.Dock = DockStyle.Fill; @@ -65,8 +65,10 @@ namespace v2rayN.Forms } else { - vmessItem = new VmessItem(); - vmessItem.groupId = groupId; + vmessItem = new VmessItem + { + groupId = groupId + }; ClearServer(); } } @@ -106,14 +108,7 @@ namespace v2rayN.Forms break; } - if (vmessItem.coreType == null) - { - cmbCoreType.Text = string.Empty; - } - else - { - cmbCoreType.Text = vmessItem.coreType.ToString(); - } + cmbCoreType.Text = vmessItem.coreType == null ? string.Empty : vmessItem.coreType.ToString(); transportControl.BindingServer(vmessItem); } @@ -267,7 +262,7 @@ namespace v2rayN.Forms if (ret == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -284,7 +279,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } } } diff --git a/v2rayN/v2rayN/Forms/BaseForm.cs b/v2rayN/v2rayN/Forms/BaseForm.cs index edac4bdd..a307c13a 100644 --- a/v2rayN/v2rayN/Forms/BaseForm.cs +++ b/v2rayN/v2rayN/Forms/BaseForm.cs @@ -21,11 +21,11 @@ namespace v2rayN.Forms string file = Utils.GetPath(Global.CustomIconName); if (System.IO.File.Exists(file)) { - this.Icon = new System.Drawing.Icon(file); + Icon = new System.Drawing.Icon(file); return; } - this.Icon = Properties.Resources.NotifyIcon1; + Icon = Properties.Resources.NotifyIcon1; } catch (Exception e) { diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs index ce9ca023..0bf81688 100644 --- a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs @@ -101,7 +101,7 @@ namespace v2rayN.Forms if (ConfigHandler.SaveConfig(ref config, false) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -111,7 +111,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void btnReset_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.cs index a3fcbf27..07abc73d 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingControl.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.cs @@ -23,7 +23,7 @@ namespace v2rayN.Forms private void GroupSettingControl_Load(object sender, EventArgs e) { - this.Height = grbMain.Height; + Height = grbMain.Height; BindingSub(); } diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs index 6eabd74a..77860153 100644 --- a/v2rayN/v2rayN/Forms/GroupSettingForm.cs +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -70,7 +70,7 @@ namespace v2rayN.Forms { if (ConfigHandler.SaveGroupItem(ref config) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -80,7 +80,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void btnAdd_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 69740ec9..f57d92cc 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -18,8 +18,8 @@ namespace v2rayN.Forms { private V2rayHandler v2rayHandler; private List lstSelecteds = new List(); - private StatisticsHandler statistics = null; - private List lstVmess = null; + private StatisticsHandler statistics; + private List lstVmess; private string groupId = string.Empty; private string serverFilter = string.Empty; @@ -28,10 +28,10 @@ namespace v2rayN.Forms public MainForm() { InitializeComponent(); - this.ShowInTaskbar = false; - this.WindowState = FormWindowState.Minimized; + ShowInTaskbar = false; + WindowState = FormWindowState.Minimized; HideForm(); - this.Text = Utils.GetVersion(); + Text = Utils.GetVersion(); Global.processJob = new Job(); Application.ApplicationExit += (sender, args) => @@ -154,12 +154,12 @@ namespace v2rayN.Forms if (!config.uiItem.mainLocation.IsEmpty) { - this.Location = config.uiItem.mainLocation; + Location = config.uiItem.mainLocation; } if (!config.uiItem.mainSize.IsEmpty) { - this.Width = config.uiItem.mainSize.Width; - this.Height = config.uiItem.mainSize.Height; + Width = config.uiItem.mainSize.Width; + Height = config.uiItem.mainSize.Height; } @@ -172,9 +172,9 @@ namespace v2rayN.Forms private void StorageUI() { - config.uiItem.mainLocation = this.Location; + config.uiItem.mainLocation = Location; - config.uiItem.mainSize = new Size(this.Width, this.Height); + config.uiItem.mainSize = new Size(Width, Height); for (int k = 0; k < lvServers.Columns.Count; k++) { @@ -187,7 +187,7 @@ namespace v2rayN.Forms switch (Utils.ToInt(e.Name)) { case (int)EGlobalHotkey.ShowForm: - if (this.ShowInTaskbar) HideForm(); else ShowForm(); + if (ShowInTaskbar) HideForm(); else ShowForm(); break; case (int)EGlobalHotkey.SystemProxyClear: SetListenerType(ESysProxyType.ForcedClear); @@ -212,8 +212,8 @@ namespace v2rayN.Forms private void RefreshServers() { lstVmess = config.vmess - .Where(it => Utils.IsNullOrEmpty(groupId) ? true : it.groupId == groupId) - .Where(it => Utils.IsNullOrEmpty(serverFilter) ? true : it.remarks.Contains(serverFilter)) + .Where(it => Utils.IsNullOrEmpty(groupId) || it.groupId == groupId) + .Where(it => Utils.IsNullOrEmpty(serverFilter) || it.remarks.Contains(serverFilter)) .OrderBy(it => it.sort) .ToList(); @@ -371,7 +371,7 @@ namespace v2rayN.Forms { ts.Checked = true; } - ts.Click += new EventHandler(ts_Click); + ts.Click += ts_Click; lst.Add(ts); } menuServers.DropDownItems.AddRange(lst.ToArray()); @@ -415,7 +415,7 @@ namespace v2rayN.Forms } var tag = lvServers.Columns[e.Column].Tag?.ToString(); - bool asc = Utils.IsNullOrEmpty(tag) ? true : !Convert.ToBoolean(tag); + bool asc = Utils.IsNullOrEmpty(tag) || !Convert.ToBoolean(tag); if (ConfigHandler.SortServers(ref config, ref lstVmess, (EServerColName)e.Column, asc) != 0) { return; @@ -465,7 +465,7 @@ namespace v2rayN.Forms { Tag = item.id, }; - ts.Click += new EventHandler(ts_Group_Click); + ts.Click += ts_Group_Click; lst.Add(ts); } menuMoveToGroup.DropDownItems.AddRange(lst.ToArray()); @@ -516,7 +516,7 @@ namespace v2rayN.Forms /// async Task LoadV2ray() { - this.BeginInvoke(new Action(() => + BeginInvoke(new Action(() => { tsbReload.Enabled = false; })); @@ -536,7 +536,7 @@ namespace v2rayN.Forms ChangePACButtonStatus(config.sysProxyType); - this.BeginInvoke(new Action(() => + BeginInvoke(new Action(() => { tsbReload.Enabled = true; })); @@ -1085,8 +1085,8 @@ namespace v2rayN.Forms private void menuExit_Click(object sender, EventArgs e) { - this.Visible = false; - this.Close(); + Visible = false; + Close(); Application.Exit(); } @@ -1094,13 +1094,13 @@ namespace v2rayN.Forms private void ShowForm() { - this.Show(); - if (this.WindowState == FormWindowState.Minimized) + Show(); + if (WindowState == FormWindowState.Minimized) { - this.WindowState = FormWindowState.Normal; + WindowState = FormWindowState.Normal; } - this.Activate(); - this.ShowInTaskbar = true; + Activate(); + ShowInTaskbar = true; //this.notifyIcon1.Visible = false; mainMsgControl.ScrollToCaret(); @@ -1117,10 +1117,10 @@ namespace v2rayN.Forms private void HideForm() { //this.WindowState = FormWindowState.Minimized; - this.Hide(); + Hide(); //this.notifyMain.Icon = this.Icon; - this.notifyMain.Visible = true; - this.ShowInTaskbar = false; + notifyMain.Visible = true; + ShowInTaskbar = false; SetVisibleCore(false); } @@ -1293,9 +1293,9 @@ namespace v2rayN.Forms mainMsgControl.DisplayToolStatus(config); - this.BeginInvoke(new Action(() => + BeginInvoke(new Action(() => { - notifyMain.Icon = this.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); + notifyMain.Icon = Icon = MainFormHandler.Instance.GetNotifyIcon(config, Icon); })); } @@ -1487,7 +1487,7 @@ namespace v2rayN.Forms ts.Checked = true; mainMsgControl.SetToolSslInfo("routing", item.remarks); } - ts.Click += new EventHandler(ts_Routing_Click); + ts.Click += ts_Routing_Click; lst.Add(ts); } menuRoutings.DropDownItems.AddRange(lst.ToArray()); diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs index edf3166b..27986f5a 100644 --- a/v2rayN/v2rayN/Forms/MainMsgControl.cs +++ b/v2rayN/v2rayN/Forms/MainMsgControl.cs @@ -16,7 +16,7 @@ namespace v2rayN.Forms { public partial class MainMsgControl : UserControl { - private string MsgFilter = string.Empty; + private string _msgFilter = string.Empty; delegate void AppendTextDelegate(string text); public MainMsgControl() @@ -33,15 +33,15 @@ namespace v2rayN.Forms public void AppendText(string text) { - if (this.txtMsgBox.InvokeRequired) + if (txtMsgBox.InvokeRequired) { - Invoke(new AppendTextDelegate(AppendText), new object[] { text }); + Invoke(new AppendTextDelegate(AppendText), text); } else { - if (!Utils.IsNullOrEmpty(MsgFilter)) + if (!Utils.IsNullOrEmpty(_msgFilter)) { - if (!Regex.IsMatch(text, MsgFilter)) + if (!Regex.IsMatch(text, _msgFilter)) { return; } @@ -61,10 +61,10 @@ namespace v2rayN.Forms { ClearMsg(); } - this.txtMsgBox.AppendText(msg); + txtMsgBox.AppendText(msg); if (!msg.EndsWith(Environment.NewLine)) { - this.txtMsgBox.AppendText(Environment.NewLine); + txtMsgBox.AppendText(Environment.NewLine); } } @@ -124,7 +124,7 @@ namespace v2rayN.Forms public void ScrollToCaret() { - this.txtMsgBox.ScrollToCaret(); + txtMsgBox.ScrollToCaret(); } #endregion @@ -132,24 +132,24 @@ namespace v2rayN.Forms #region MsgBoxMenu private void menuMsgBoxSelectAll_Click(object sender, EventArgs e) { - this.txtMsgBox.Focus(); - this.txtMsgBox.SelectAll(); + txtMsgBox.Focus(); + txtMsgBox.SelectAll(); } private void menuMsgBoxCopy_Click(object sender, EventArgs e) { - var data = this.txtMsgBox.SelectedText.TrimEx(); + var data = txtMsgBox.SelectedText.TrimEx(); Utils.SetClipboardData(data); } private void menuMsgBoxCopyAll_Click(object sender, EventArgs e) { - var data = this.txtMsgBox.Text; + var data = txtMsgBox.Text; Utils.SetClipboardData(data); } private void menuMsgBoxClear_Click(object sender, EventArgs e) { - this.txtMsgBox.Clear(); + txtMsgBox.Clear(); } private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e) { @@ -182,12 +182,12 @@ namespace v2rayN.Forms private void menuMsgBoxFilter_Click(object sender, EventArgs e) { var fm = new MsgFilterSetForm(); - fm.MsgFilter = MsgFilter; + fm.MsgFilter = _msgFilter; fm.ShowDefFilter = true; if (fm.ShowDialog() == DialogResult.OK) { - MsgFilter = fm.MsgFilter; - gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, MsgFilter); + _msgFilter = fm.MsgFilter; + gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, _msgFilter); } } diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs index 421f294c..926b00cb 100644 --- a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs @@ -30,12 +30,12 @@ namespace v2rayN.Forms private void btnOK_Click(object sender, EventArgs e) { MsgFilter = txtMsgFilter.Text; - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void btnFilderProxy_Click(object sender, EventArgs e) @@ -51,7 +51,7 @@ namespace v2rayN.Forms private void btnClear_Click(object sender, EventArgs e) { MsgFilter = string.Empty; - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 70ae449d..2011a1d2 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -177,7 +177,7 @@ namespace v2rayN.Forms if (ConfigHandler.SaveConfig(ref config) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -335,7 +335,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index ef1e950e..219408b8 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -115,34 +115,28 @@ namespace v2rayN.Forms private void btnOK_Click(object sender, EventArgs e) { EndBindingData(); - var hasRule = false; - if (rulesItem.domain != null && rulesItem.domain.Count > 0) - { - hasRule = true; - } - if (rulesItem.ip != null && rulesItem.ip.Count > 0) - { - hasRule = true; - } - if (rulesItem.protocol != null && rulesItem.protocol.Count > 0) - { - hasRule = true; - } - if (!Utils.IsNullOrEmpty(rulesItem.port)) - { - hasRule = true; - } + + bool hasRule = + rulesItem.domain != null + && rulesItem.domain.Count > 0 + || rulesItem.ip != null + && rulesItem.ip.Count > 0 + || rulesItem.protocol != null + && rulesItem.protocol.Count > 0 + || !Utils.IsNullOrEmpty(rulesItem.port); + if (!hasRule) { UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP")); return; } - this.DialogResult = DialogResult.OK; + + DialogResult = DialogResult.OK; } private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } } } diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs index d7a7dc37..b88d67d1 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -15,9 +15,9 @@ namespace v2rayN.Forms { get; set; } - protected RoutingItem routingItem = null; + protected RoutingItem routingItem; - private List lvSelecteds = new List(); + private readonly List lvSelecteds = new List(); public RoutingRuleSettingForm() { InitializeComponent(); @@ -25,14 +25,7 @@ namespace v2rayN.Forms private void RoutingRuleSettingForm_Load(object sender, EventArgs e) { - if (EditIndex >= 0) - { - routingItem = config.routings[EditIndex]; - } - else - { - routingItem = new RoutingItem(); - } + routingItem = EditIndex >= 0 ? config.routings[EditIndex] : new RoutingItem(); if (routingItem.rules == null) { routingItem.rules = new List(); @@ -86,10 +79,8 @@ namespace v2rayN.Forms lvRoutings.BeginUpdate(); lvRoutings.Items.Clear(); - for (int k = 0; k < routingItem.rules.Count; k++) + foreach (var item in routingItem.rules) { - var item = routingItem.rules[k]; - ListViewItem lvItem = new ListViewItem(""); Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); Utils.AddSubItem(lvItem, "port", item.port); @@ -112,7 +103,7 @@ namespace v2rayN.Forms if (ConfigHandler.AddRoutingItem(ref config, routingItem, EditIndex) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -122,7 +113,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void btnBrowse_Click(object sender, EventArgs e) { diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index b8f21dd7..13bc1e59 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -10,8 +10,8 @@ namespace v2rayN.Forms { public partial class RoutingSettingForm : BaseForm { - private List lvSelecteds = new List(); - private RoutingItem lockedItem; + private readonly List _lvSelecteds = new List(); + private RoutingItem _lockedItem; public RoutingSettingForm() { InitializeComponent(); @@ -58,7 +58,7 @@ namespace v2rayN.Forms if (ConfigHandler.SaveRouting(ref config) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -68,7 +68,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void chkenableRoutingAdvanced_CheckedChanged_1(object sender, EventArgs e) { @@ -78,20 +78,20 @@ namespace v2rayN.Forms { if (chkenableRoutingAdvanced.Checked) { - this.tabPageProxy.Parent = null; - this.tabPageDirect.Parent = null; - this.tabPageBlock.Parent = null; - this.tabPageRuleList.Parent = tabNormal; + tabPageProxy.Parent = null; + tabPageDirect.Parent = null; + tabPageBlock.Parent = null; + tabPageRuleList.Parent = tabNormal; MenuItemBasic.Enabled = false; MenuItemAdvanced.Enabled = true; } else { - this.tabPageProxy.Parent = tabNormal; - this.tabPageDirect.Parent = tabNormal; - this.tabPageBlock.Parent = tabNormal; - this.tabPageRuleList.Parent = null; + tabPageProxy.Parent = tabNormal; + tabPageDirect.Parent = tabNormal; + tabPageBlock.Parent = tabNormal; + tabPageRuleList.Parent = null; MenuItemBasic.Enabled = true; MenuItemAdvanced.Enabled = false; } @@ -102,31 +102,31 @@ namespace v2rayN.Forms #region locked private void BindingLockedData() { - lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); - if (lockedItem != null) + _lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); + if (_lockedItem != null) { - txtProxyDomain.Text = Utils.List2String(lockedItem.rules[0].domain, true); - txtProxyIp.Text = Utils.List2String(lockedItem.rules[0].ip, true); + txtProxyDomain.Text = Utils.List2String(_lockedItem.rules[0].domain, true); + txtProxyIp.Text = Utils.List2String(_lockedItem.rules[0].ip, true); - txtDirectDomain.Text = Utils.List2String(lockedItem.rules[1].domain, true); - txtDirectIp.Text = Utils.List2String(lockedItem.rules[1].ip, true); + txtDirectDomain.Text = Utils.List2String(_lockedItem.rules[1].domain, true); + txtDirectIp.Text = Utils.List2String(_lockedItem.rules[1].ip, true); - txtBlockDomain.Text = Utils.List2String(lockedItem.rules[2].domain, true); - txtBlockIp.Text = Utils.List2String(lockedItem.rules[2].ip, true); + txtBlockDomain.Text = Utils.List2String(_lockedItem.rules[2].domain, true); + txtBlockIp.Text = Utils.List2String(_lockedItem.rules[2].ip, true); } } private void EndBindingLockedData() { - if (lockedItem != null) + if (_lockedItem != null) { - lockedItem.rules[0].domain = Utils.String2List(txtProxyDomain.Text.TrimEx()); - lockedItem.rules[0].ip = Utils.String2List(txtProxyIp.Text.TrimEx()); + _lockedItem.rules[0].domain = Utils.String2List(txtProxyDomain.Text.TrimEx()); + _lockedItem.rules[0].ip = Utils.String2List(txtProxyIp.Text.TrimEx()); - lockedItem.rules[1].domain = Utils.String2List(txtDirectDomain.Text.TrimEx()); - lockedItem.rules[1].ip = Utils.String2List(txtDirectIp.Text.TrimEx()); + _lockedItem.rules[1].domain = Utils.String2List(txtDirectDomain.Text.TrimEx()); + _lockedItem.rules[1].ip = Utils.String2List(txtDirectIp.Text.TrimEx()); - lockedItem.rules[2].domain = Utils.String2List(txtBlockDomain.Text.TrimEx()); - lockedItem.rules[2].ip = Utils.String2List(txtBlockIp.Text.TrimEx()); + _lockedItem.rules[2].domain = Utils.String2List(txtBlockDomain.Text.TrimEx()); + _lockedItem.rules[2].ip = Utils.String2List(txtBlockIp.Text.TrimEx()); } } @@ -207,7 +207,7 @@ namespace v2rayN.Forms private int GetLvSelectedIndex() { int index = -1; - lvSelecteds.Clear(); + _lvSelecteds.Clear(); try { if (lvRoutings.SelectedIndices.Count <= 0) @@ -219,7 +219,7 @@ namespace v2rayN.Forms index = lvRoutings.SelectedIndices[0]; foreach (int i in lvRoutings.SelectedIndices) { - lvSelecteds.Add(i); + _lvSelecteds.Add(i); } return index; } @@ -264,7 +264,7 @@ namespace v2rayN.Forms { return; } - for (int k = lvSelecteds.Count - 1; k >= 0; k--) + for (int k = _lvSelecteds.Count - 1; k >= 0; k--) { config.routings.RemoveAt(index); } diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs index 3b29ddd4..c35f10a6 100644 --- a/v2rayN/v2rayN/Forms/ServerTransportControl.cs +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -9,7 +9,7 @@ namespace v2rayN.Forms public partial class ServerTransportControl : UserControl { public bool AllowXtls { get; set; } - private VmessItem vmessItem = null; + private VmessItem vmessItem; public ServerTransportControl() { diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 3d4a36c4..12f8896c 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -26,7 +26,7 @@ namespace v2rayN.Forms private void SubSettingControl_Load(object sender, EventArgs e) { - this.Height = grbMain.Height; + Height = grbMain.Height; groupItem = LazyConfig.Instance.GetConfig().groupItem; @@ -90,7 +90,7 @@ namespace v2rayN.Forms private void btnShare_Click(object sender, EventArgs e) { - if (this.Height <= grbMain.Height) + if (Height <= grbMain.Height) { if (Utils.IsNullOrEmpty(subItem.url)) { @@ -98,11 +98,11 @@ namespace v2rayN.Forms return; } picQRCode.Image = QRCodeHelper.GetQRCode(subItem.url); - this.Height = grbMain.Height + 200; + Height = grbMain.Height + 200; } else { - this.Height = grbMain.Height; + Height = grbMain.Height; } } } diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index ac8266e2..1312c4a0 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -71,7 +71,7 @@ namespace v2rayN.Forms { if (ConfigHandler.SaveSubItem(ref config) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { @@ -81,7 +81,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void btnAdd_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 67013eb9..4661ec93 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -304,7 +304,7 @@ namespace v2rayN.Handler { VmessItem vmessItem = Utils.DeepCopy(item); vmessItem.indexId = string.Empty; - vmessItem.remarks = string.Format("{0}-clone", item.remarks); + vmessItem.remarks = $"{item.remarks}-clone"; if (vmessItem.configType == EConfigType.Custom) { @@ -469,7 +469,7 @@ namespace v2rayN.Handler return -1; } var ext = Path.GetExtension(fileName); - string newFileName = string.Format("{0}{1}", Utils.GetGUID(), ext); + string newFileName = $"{Utils.GetGUID()}{ext}"; //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); try @@ -489,7 +489,7 @@ namespace v2rayN.Handler vmessItem.configType = EConfigType.Custom; if (Utils.IsNullOrEmpty(vmessItem.remarks)) { - vmessItem.remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()); + vmessItem.remarks = $"import custom@{DateTime.Now.ToShortDateString()}"; } @@ -814,7 +814,7 @@ namespace v2rayN.Handler && o.path == n.path && o.streamSecurity == n.streamSecurity && o.flow == n.flow - && (remarks ? o.remarks == n.remarks : true); + && (!remarks || o.remarks == n.remarks); } private static int RemoveVmessItem(Config config, int index) @@ -1051,7 +1051,7 @@ namespace v2rayN.Handler if (lstSsServer == null || lstSsServer.Count <= 0) { var ssSIP008 = Utils.FromJson(clipboardData); - if (ssSIP008 != null && ssSIP008.servers != null && ssSIP008.servers.Count > 0) + if (ssSIP008?.servers != null && ssSIP008.servers.Count > 0) { lstSsServer = ssSIP008.servers; } @@ -1154,12 +1154,9 @@ namespace v2rayN.Handler return -1; } - foreach (SubItem item in config.subItem) + foreach (var item in config.subItem.Where(item => Utils.IsNullOrEmpty(item.id))) { - if (Utils.IsNullOrEmpty(item.id)) - { - item.id = Utils.GetGUID(false); - } + item.id = Utils.GetGUID(false); } ToJsonFile(config); @@ -1203,12 +1200,9 @@ namespace v2rayN.Handler return -1; } - foreach (GroupItem item in config.groupItem) + foreach (var item in config.groupItem.Where(item => Utils.IsNullOrEmpty(item.id))) { - if (Utils.IsNullOrEmpty(item.id)) - { - item.id = Utils.GetGUID(false); - } + item.id = Utils.GetGUID(false); } ToJsonFile(config); diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 131b89c1..27595b9e 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -29,8 +29,8 @@ namespace v2rayN.Handler public ResultEventArgs(bool success, string msg) { - this.Success = success; - this.Msg = msg; + Success = success; + Msg = msg; } } @@ -51,7 +51,7 @@ namespace v2rayN.Handler { if (UpdateCompleted != null) { - string msg = string.Format("{0} M/s", value).PadLeft(9, ' '); + string msg = $"{value} M/s".PadLeft(9, ' '); UpdateCompleted(this, new ResultEventArgs(false, msg)); } }; @@ -88,7 +88,7 @@ namespace v2rayN.Handler { if (UpdateCompleted != null) { - string msg = string.Format("...{0}%", value); + string msg = $"...{value}%"; UpdateCompleted(this, new ResultEventArgs(value > 100 ? true : false, msg)); } }; diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 42dbb990..71b53f3a 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -11,10 +11,8 @@ namespace v2rayN.Handler private Config _config; private List coreInfos; - public static LazyConfig Instance - { - get { return _instance.Value; } - } + public static LazyConfig Instance => _instance.Value; + public void SetConfig(ref Config config) { _config = config; diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index b6735f32..a59592c0 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -24,10 +24,8 @@ namespace v2rayN.Handler //private List _selecteds; //private Thread _workThread; //Action _updateFunc; - public static MainFormHandler Instance - { - get { return instance.Value; } - } + public static MainFormHandler Instance => instance.Value; + public Icon GetNotifyIcon(Config config, Icon def) { try @@ -84,7 +82,7 @@ namespace v2rayN.Handler int index = (int)config.sysProxyType; if (index > 0) { - color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; + color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; } int width = 128; diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 77d9d9f4..f171c3c6 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -81,7 +81,7 @@ namespace v2rayN.Handler url = Utils.ToJson(vmessQRCode); url = Utils.Base64Encode(url); - url = string.Format("{0}{1}", Global.vmessProtocol, url); + url = $"{Global.vmessProtocol}{url}"; return url; } @@ -104,7 +104,7 @@ namespace v2rayN.Handler //new Sip002 var pw = Utils.Base64Encode($"{item.security}:{item.id}"); url = $"{pw}@{GetIpv6(item.address)}:{ item.port}"; - url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); + url = $"{Global.ssProtocol}{url}{remark}"; return url; } @@ -125,7 +125,7 @@ namespace v2rayN.Handler //new var pw = Utils.Base64Encode($"{item.security}:{item.id}"); url = $"{pw}@{GetIpv6(item.address)}:{ item.port}"; - url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); + url = $"{Global.socksProtocol}{url}{remark}"; return url; } @@ -145,7 +145,7 @@ namespace v2rayN.Handler item.id, GetIpv6(item.address), item.port); - url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); + url = $"{Global.trojanProtocol}{url}{query}{remark}"; return url; } @@ -173,7 +173,7 @@ namespace v2rayN.Handler item.id, GetIpv6(item.address), item.port); - url = string.Format("{0}{1}{2}{3}", Global.vlessProtocol, url, query, remark); + url = $"{Global.vlessProtocol}{url}{query}{remark}"; return url; } private static string GetIpv6(string address) @@ -207,40 +207,20 @@ namespace v2rayN.Handler { dicQuery.Add("alpn", Utils.UrlEncode(Utils.List2String(item.alpn))); } - if (!Utils.IsNullOrEmpty(item.network)) - { - dicQuery.Add("type", item.network); - } - else - { - dicQuery.Add("type", "tcp"); - } + + dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp"); switch (item.network) { case "tcp": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); if (!Utils.IsNullOrEmpty(item.requestHost)) { dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); } break; case "kcp": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); if (!Utils.IsNullOrEmpty(item.path)) { dicQuery.Add("seed", Utils.UrlEncode(item.path)); @@ -272,14 +252,7 @@ namespace v2rayN.Handler break; case "quic": - if (!Utils.IsNullOrEmpty(item.headerType)) - { - dicQuery.Add("headerType", item.headerType); - } - else - { - dicQuery.Add("headerType", "none"); - } + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); dicQuery.Add("key", Utils.UrlEncode(item.path)); break; @@ -341,11 +314,7 @@ namespace v2rayN.Handler { msg = ResUI.ConfigurationFormatIncorrect; - vmessItem = ResolveSSLegacy(result); - if (vmessItem == null) - { - vmessItem = ResolveSip002(result); - } + vmessItem = ResolveSSLegacy(result) ?? ResolveSip002(result); if (vmessItem == null) { return null; @@ -361,11 +330,7 @@ namespace v2rayN.Handler { msg = ResUI.ConfigurationFormatIncorrect; - vmessItem = ResolveSocksNew(result); - if (vmessItem == null) - { - vmessItem = ResolveSocks(result); - } + vmessItem = ResolveSocksNew(result) ?? ResolveSocks(result); if (vmessItem == null) { return null; @@ -407,9 +372,11 @@ namespace v2rayN.Handler private static VmessItem ResolveVmess(string result, out string msg) { msg = string.Empty; - VmessItem vmessItem = new VmessItem(); + var vmessItem = new VmessItem + { + configType = EConfigType.Vmess + }; - vmessItem.configType = EConfigType.Vmess; result = result.Substring(Global.vmessProtocol.Length); result = Utils.Base64Decode(result); @@ -432,14 +399,7 @@ namespace v2rayN.Handler vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); vmessItem.security = Utils.ToString(vmessQRCode.scy); - if (!Utils.IsNullOrEmpty(vmessQRCode.scy)) - { - vmessItem.security = vmessQRCode.scy; - } - else - { - vmessItem.security = Global.DefaultSecurity; - } + vmessItem.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; if (!Utils.IsNullOrEmpty(vmessQRCode.net)) { vmessItem.network = vmessQRCode.net; @@ -598,7 +558,7 @@ namespace v2rayN.Handler //2022-blake3 if (rawUserInfo.Contains(":")) { - string[] userInfoParts = rawUserInfo.Split(new char[] { ':' }, 2); + string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); if (userInfoParts.Length != 2) { return null; @@ -610,7 +570,7 @@ namespace v2rayN.Handler { // parse base64 UserInfo string userInfo = Utils.Base64Decode(rawUserInfo); - string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); if (userInfoParts.Length != 2) { return null; @@ -668,8 +628,10 @@ namespace v2rayN.Handler private static VmessItem ResolveSocks(string result) { - VmessItem vmessItem = new VmessItem(); - vmessItem.configType = EConfigType.Socks; + VmessItem vmessItem = new VmessItem + { + configType = EConfigType.Socks + }; result = result.Substring(Global.socksProtocol.Length); //remark int indexRemark = result.IndexOf("#"); @@ -733,7 +695,7 @@ namespace v2rayN.Handler // parse base64 UserInfo string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); string userInfo = Utils.Base64Decode(rawUserInfo); - string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); if (userInfoParts.Length == 2) { server.security = userInfoParts[0]; diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 23e3f370..e5d6022d 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading; @@ -43,19 +44,19 @@ namespace v2rayN.Handler if (actionType == ESpeedActionType.Ping) { - Task.Run(() => RunPing()); + Task.Run(RunPing); } else if (actionType == ESpeedActionType.Tcping) { - Task.Run(() => RunTcping()); + Task.Run(RunTcping); } else if (actionType == ESpeedActionType.Realping) { - Task.Run(() => RunRealPing()); + Task.Run(RunRealPing); } else if (actionType == ESpeedActionType.Speedtest) { - Task.Run(() => RunSpeedTestAsync()); + Task.Run(RunSpeedTestAsync); } } @@ -63,12 +64,8 @@ namespace v2rayN.Handler { try { - foreach (var it in _selecteds) + foreach (var it in _selecteds.Where(it => it.configType != EConfigType.Custom)) { - if (it.configType == EConfigType.Custom) - { - continue; - } try { Task.Run(() => updateFun(it)); @@ -252,7 +249,7 @@ namespace v2rayN.Handler { return "Timeout"; } - return string.Format("{0}{1}", time, unit).PadLeft(8, ' '); + return $"{time}{unit}".PadLeft(8, ' '); } } } diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index 0cdcb98f..6465db26 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -31,13 +31,7 @@ namespace v2rayN.Handler } - public List Statistic - { - get - { - return serverStatistics_.server; - } - } + public List Statistic => serverStatistics_.server; public StatisticsHandler(Mode.Config config, Action> update) { @@ -68,7 +62,7 @@ namespace v2rayN.Handler GrpcInit(); - Task.Run(() => Run()); + Task.Run(Run); } private void GrpcInit() diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 7ddf3f7f..9e30e38d 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -26,8 +26,8 @@ namespace v2rayN.Handler public ResultEventArgs(bool success, string msg) { - this.Success = success; - this.Msg = msg; + Success = success; + Msg = msg; } } @@ -209,16 +209,12 @@ namespace v2rayN.Handler else { int ret = ConfigHandler.AddBatchServers(ref config, result, id, groupId); - if (ret > 0) - { - _updateFunc(false, $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}"); - } - else - { - _updateFunc(false, $"{hashCode}{ResUI.MsgFailedImportSubscription}"); - } + _updateFunc(false, + ret > 0 + ? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}" + : $"{hashCode}{ResUI.MsgFailedImportSubscription}"); } - _updateFunc(false, $"-------------------------------------------------------"); + _updateFunc(false, "-------------------------------------------------------"); } //restore system proxy if (bSysProxyType) @@ -331,7 +327,7 @@ namespace v2rayN.Handler string filePath = string.Empty; foreach (string name in coreInfo.coreExes) { - string vName = string.Format("{0}.exe", name); + string vName = $"{name}.exe"; vName = Utils.GetPath(vName); if (File.Exists(vName)) { diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 8f1d7e83..1e269548 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -427,14 +427,7 @@ namespace v2rayN.Handler serversItem.address = node.address; serversItem.port = node.port; serversItem.password = node.id; - if (LazyConfig.Instance.GetShadowsocksSecuritys().Contains(node.security)) - { - serversItem.method = node.security; - } - else - { - serversItem.method = "none"; - } + serversItem.method = LazyConfig.Instance.GetShadowsocksSecuritys().Contains(node.security) ? node.security : "none"; serversItem.ota = false; @@ -761,10 +754,12 @@ namespace v2rayN.Handler } break; case "grpc": - var grpcSettings = new GrpcSettings(); + var grpcSettings = new GrpcSettings + { + serviceName = node.path, + multiMode = (node.headerType == Global.GrpcmultiMode) + }; - grpcSettings.serviceName = node.path; - grpcSettings.multiMode = (node.headerType == Global.GrpcmultiMode ? true : false); streamSettings.grpcSettings = grpcSettings; break; default: @@ -785,7 +780,7 @@ namespace v2rayN.Handler string request = Utils.GetEmbedText(Global.v2raySampleHttprequestFileName); string[] arrHost = host.Split(','); string host2 = string.Join("\",\"", arrHost); - request = request.Replace("$requestHost$", string.Format("\"{0}\"", host2)); + request = request.Replace("$requestHost$", $"\"{host2}\""); //request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost())); //填入自定义Path @@ -795,7 +790,7 @@ namespace v2rayN.Handler string[] arrPath = node.path.Split(','); pathHttp = string.Join("\",\"", arrPath); } - request = request.Replace("$requestPath$", string.Format("\"{0}\"", pathHttp)); + request = request.Replace("$requestPath$", $"\"{pathHttp}\""); tcpSettings.header.request = Utils.FromJson(request); } else if (iobound.Equals("in")) @@ -882,7 +877,7 @@ namespace v2rayN.Handler policyObj.system = policySystemSetting; v2rayConfig.policy = policyObj; - if (!v2rayConfig.inbounds.Exists(item => { return item.tag == tag; })) + if (!v2rayConfig.inbounds.Exists(item => item.tag == tag)) { Inbounds apiInbound = new Inbounds(); Inboundsettings apiInboundSettings = new Inboundsettings(); @@ -895,7 +890,7 @@ namespace v2rayN.Handler v2rayConfig.inbounds.Add(apiInbound); } - if (!v2rayConfig.routing.rules.Exists(item => { return item.outboundTag == tag; })) + if (!v2rayConfig.routing.rules.Exists(item => item.outboundTag == tag)) { RulesItem apiRoutingRule = new RulesItem { @@ -1171,7 +1166,7 @@ namespace v2rayN.Handler vmessItem.port = outbound.settings.vnext[0].port; vmessItem.id = outbound.settings.vnext[0].users[0].id; vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId; - vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + vmessItem.remarks = $"import@{DateTime.Now.ToShortDateString()}"; //tcp or kcp if (outbound.streamSettings != null @@ -1316,7 +1311,7 @@ namespace v2rayN.Handler vmessItem.id = inbound.settings.clients[0].id; vmessItem.alterId = inbound.settings.clients[0].alterId; - vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + vmessItem.remarks = $"import@{DateTime.Now.ToShortDateString()}"; //tcp or kcp if (inbound.streamSettings != null diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index c6930890..6e5887f6 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -175,7 +175,7 @@ namespace v2rayN.Handler string fileName = string.Empty; foreach (string name in lstCoreTemp) { - string vName = string.Format("{0}.exe", name); + string vName = $"{name}.exe"; vName = Utils.GetPath(vName); if (File.Exists(vName)) { @@ -217,14 +217,14 @@ namespace v2rayN.Handler StandardOutputEncoding = Encoding.UTF8 } }; - p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + p.OutputDataReceived += (sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { string msg = e.Data + Environment.NewLine; ShowMsg(false, msg); } - }); + }; p.Start(); p.PriorityClass = ProcessPriorityClass.High; p.BeginOutputReadLine(); @@ -272,14 +272,14 @@ namespace v2rayN.Handler StandardOutputEncoding = Encoding.UTF8 } }; - p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + p.OutputDataReceived += (sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { string msg = e.Data + Environment.NewLine; ShowMsg(false, msg); } - }); + }; p.Start(); p.BeginOutputReadLine(); diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index ace9a3c6..8a3e27db 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -25,8 +25,8 @@ namespace v2rayN } Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); - AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + Application.ThreadException += Application_ThreadException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; //AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; diff --git a/v2rayN/v2rayN/Tool/Logging.cs b/v2rayN/v2rayN/Tool/Logging.cs index aa5cb956..400e84a5 100644 --- a/v2rayN/v2rayN/Tool/Logging.cs +++ b/v2rayN/v2rayN/Tool/Logging.cs @@ -13,23 +13,27 @@ namespace v2rayN.Tool { public static void Setup() { - Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); + var hierarchy = (Hierarchy)LogManager.GetRepository(); - PatternLayout patternLayout = new PatternLayout(); - patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; + var patternLayout = new PatternLayout + { + ConversionPattern = "%date [%thread] %-5level %logger - %message%newline" + }; patternLayout.ActivateOptions(); - RollingFileAppender roller = new RollingFileAppender(); - roller.AppendToFile = true; - roller.RollingStyle = RollingFileAppender.RollingMode.Date; - roller.DatePattern = "yyyy-MM-dd'.txt'"; - roller.File = Utils.GetPath(@"guiLogs\"); - roller.Layout = patternLayout; - roller.StaticLogFileName = false; + var roller = new RollingFileAppender + { + AppendToFile = true, + RollingStyle = RollingFileAppender.RollingMode.Date, + DatePattern = "yyyy-MM-dd'.txt'", + File = Utils.GetPath(@"guiLogs\"), + Layout = patternLayout, + StaticLogFileName = false + }; roller.ActivateOptions(); hierarchy.Root.AddAppender(roller); - MemoryAppender memory = new MemoryAppender(); + var memory = new MemoryAppender(); memory.ActivateOptions(); hierarchy.Root.AddAppender(memory); diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index f1062818..b07c5929 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -951,7 +951,7 @@ namespace v2rayN public static string GetDownloadFileName(string url) { - var fileName = System.IO.Path.GetFileName(url); + var fileName = Path.GetFileName(url); fileName += "_temp"; return fileName; From 2603132dae4809e52bf24e2f72a8f20d7b8ceec0 Mon Sep 17 00:00:00 2001 From: Edi Wang Date: Wed, 22 Jun 2022 10:24:02 +0800 Subject: [PATCH 232/252] fix English translations --- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 264 +++++++++++++-------------- v2rayN/v2rayN/Resx/ResUI.resx | 30 +-- v2rayN/v2rayN/v2rayN.csproj | 1 + 3 files changed, 148 insertions(+), 147 deletions(-) diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index aaa37f35..c30f56e5 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// 此代码由工具生成。 -// 运行时版本:4.0.30319.42000 +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // -// 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将会丢失。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -13,13 +13,13 @@ namespace v2rayN.Resx { /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// A strongly-typed resource class, for looking up localized strings, etc. /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ResUI { @@ -33,7 +33,7 @@ namespace v2rayN.Resx { } /// - /// 返回此类使用的缓存的 ResourceManager 实例。 + /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ namespace v2rayN.Resx { } /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 + /// Looks up a localized string similar to Do you want to append rules? Choose yes to append, choose otherwise to replace. /// internal static string AddBatchRoutingRulesYesNo { get { @@ -70,7 +70,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 All servers 的本地化字符串。 + /// Looks up a localized string similar to All servers. /// internal static string AllGroupServers { get { @@ -79,7 +79,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 + /// Looks up a localized string similar to Batch export subscription to clipboard successfully. /// internal static string BatchExportSubscriptionSuccessfully { get { @@ -88,7 +88,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Batch export share URL to clipboard successfully 的本地化字符串。 + /// Looks up a localized string similar to Batch export share URL to clipboard successfully. /// internal static string BatchExportURLSuccessfully { get { @@ -97,7 +97,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please check the server settings first 的本地化字符串。 + /// Looks up a localized string similar to Please check the server settings first. /// internal static string CheckServerSettings { get { @@ -106,7 +106,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 configuration format is incorrect 的本地化字符串。 + /// Looks up a localized string similar to Invalid configuration format. /// internal static string ConfigurationFormatIncorrect { get { @@ -115,7 +115,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 + /// Looks up a localized string similar to Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually.. /// internal static string CustomServerTips { get { @@ -124,7 +124,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Downloading... 的本地化字符串。 + /// Looks up a localized string similar to Downloading.... /// internal static string Downloading { get { @@ -133,7 +133,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 DOWN 的本地化字符串。 + /// Looks up a localized string similar to Download. /// internal static string downloadSpeed { get { @@ -142,7 +142,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Whether to download? {0} 的本地化字符串。 + /// Looks up a localized string similar to Whether to download? {0}. /// internal static string DownloadYesNo { get { @@ -151,7 +151,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to convert configuration file 的本地化字符串。 + /// Looks up a localized string similar to Failed to convert configuration file. /// internal static string FailedConversionConfiguration { get { @@ -160,7 +160,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to generate default configuration file 的本地化字符串。 + /// Looks up a localized string similar to Failed to generate default configuration file. /// internal static string FailedGenDefaultConfiguration { get { @@ -169,7 +169,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to get the default configuration 的本地化字符串。 + /// Looks up a localized string similar to Failed to get the default configuration. /// internal static string FailedGetDefaultConfiguration { get { @@ -178,7 +178,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to import custom configuration server 的本地化字符串。 + /// Looks up a localized string similar to Failed to import custom configuration server. /// internal static string FailedImportedCustomServer { get { @@ -187,7 +187,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to read configuration file 的本地化字符串。 + /// Looks up a localized string similar to Failed to read configuration file. /// internal static string FailedReadConfiguration { get { @@ -196,7 +196,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the correct custom DNS. /// internal static string FillCorrectDNSText { get { @@ -205,7 +205,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the correct format server port 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the correct format server port. /// internal static string FillCorrectServerPort { get { @@ -214,7 +214,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the KCP parameters correctly 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the KCP parameters correctly. /// internal static string FillKcpParameters { get { @@ -223,7 +223,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the local listening port 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the local listening port. /// internal static string FillLocalListeningPort { get { @@ -232,7 +232,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the password 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the password. /// internal static string FillPassword { get { @@ -241,7 +241,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the server address 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the server address. /// internal static string FillServerAddress { get { @@ -250,7 +250,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please browse to import server configuration 的本地化字符串。 + /// Looks up a localized string similar to Please browse to import server configuration. /// internal static string FillServerAddressCustom { get { @@ -259,7 +259,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the user ID 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the user ID. /// internal static string FillUUID { get { @@ -268,7 +268,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 is not the correct client configuration file, please check 的本地化字符串。 + /// Looks up a localized string similar to is not the correct client configuration file, please check. /// internal static string IncorrectClientConfiguration { get { @@ -277,7 +277,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 is not the correct configuration, please check 的本地化字符串。 + /// Looks up a localized string similar to is not the correct configuration, please check. /// internal static string Incorrectconfiguration { get { @@ -286,7 +286,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 is not the correct server configuration file, please check 的本地化字符串。 + /// Looks up a localized string similar to is not the correct server configuration file, please check. /// internal static string IncorrectServerConfiguration { get { @@ -295,7 +295,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Initial Configuration 的本地化字符串。 + /// Looks up a localized string similar to Initial Configuration. /// internal static string InitialConfiguration { get { @@ -304,7 +304,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 {0} already up to date. 的本地化字符串。 + /// Looks up a localized string similar to {0} already up to date.. /// internal static string IsLatestCore { get { @@ -313,7 +313,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 {0} already up to date. 的本地化字符串。 + /// Looks up a localized string similar to {0} already up to date.. /// internal static string IsLatestN { get { @@ -322,7 +322,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 LAN 的本地化字符串。 + /// Looks up a localized string similar to LAN. /// internal static string LabLAN { get { @@ -331,7 +331,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Local 的本地化字符串。 + /// Looks up a localized string similar to Local. /// internal static string LabLocal { get { @@ -340,7 +340,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Address 的本地化字符串。 + /// Looks up a localized string similar to Address. /// internal static string LvAddress { get { @@ -349,7 +349,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Alias 的本地化字符串。 + /// Looks up a localized string similar to Alias. /// internal static string LvAlias { get { @@ -358,7 +358,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Count 的本地化字符串。 + /// Looks up a localized string similar to Count. /// internal static string LvCount { get { @@ -367,7 +367,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Custom Icon 的本地化字符串。 + /// Looks up a localized string similar to Custom Icon. /// internal static string LvCustomIcon { get { @@ -376,7 +376,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Security 的本地化字符串。 + /// Looks up a localized string similar to Security. /// internal static string LvEncryptionMethod { get { @@ -385,7 +385,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Port 的本地化字符串。 + /// Looks up a localized string similar to Port. /// internal static string LvPort { get { @@ -394,7 +394,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 remarks 的本地化字符串。 + /// Looks up a localized string similar to remarks. /// internal static string LvRemarks { get { @@ -403,7 +403,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Type 的本地化字符串。 + /// Looks up a localized string similar to Type. /// internal static string LvServiceType { get { @@ -412,7 +412,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Subs 的本地化字符串。 + /// Looks up a localized string similar to Subs. /// internal static string LvSubscription { get { @@ -421,7 +421,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Test Results 的本地化字符串。 + /// Looks up a localized string similar to Test Results. /// internal static string LvTestResults { get { @@ -430,7 +430,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 TLS 的本地化字符串。 + /// Looks up a localized string similar to TLS. /// internal static string LvTLS { get { @@ -439,7 +439,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Today download traffic 的本地化字符串。 + /// Looks up a localized string similar to Download traffic today. /// internal static string LvTodayDownloadDataAmount { get { @@ -448,7 +448,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Today upload traffic 的本地化字符串。 + /// Looks up a localized string similar to Upload traffic today. /// internal static string LvTodayUploadDataAmount { get { @@ -457,7 +457,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Total download traffic 的本地化字符串。 + /// Looks up a localized string similar to Total download traffic. /// internal static string LvTotalDownloadDataAmount { get { @@ -466,7 +466,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Total upload traffic 的本地化字符串。 + /// Looks up a localized string similar to Total upload traffic. /// internal static string LvTotalUploadDataAmount { get { @@ -475,7 +475,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Transport 的本地化字符串。 + /// Looks up a localized string similar to Transport. /// internal static string LvTransportProtocol { get { @@ -484,7 +484,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Url 的本地化字符串。 + /// Looks up a localized string similar to Url. /// internal static string LvUrl { get { @@ -493,7 +493,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 MediumFresh 的本地化字符串。 + /// Looks up a localized string similar to Medium. /// internal static string MediumFresh { get { @@ -502,7 +502,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Clear original subscription content 的本地化字符串。 + /// Looks up a localized string similar to Clear original subscription content. /// internal static string MsgClearSubscription { get { @@ -511,7 +511,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 + /// Looks up a localized string similar to Download GeoFile: {0} successfully. /// internal static string MsgDownloadGeoFileSuccessfully { get { @@ -520,7 +520,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Download Core successfully 的本地化字符串。 + /// Looks up a localized string similar to Download Core successfully. /// internal static string MsgDownloadV2rayCoreSuccessfully { get { @@ -529,7 +529,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Failed to import subscription content 的本地化字符串。 + /// Looks up a localized string similar to Failed to import subscription content. /// internal static string MsgFailedImportSubscription { get { @@ -538,7 +538,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Get the subscription content successfully 的本地化字符串。 + /// Looks up a localized string similar to Get subscription content successfully. /// internal static string MsgGetSubscriptionSuccessfully { get { @@ -547,7 +547,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Informations (Filter : {0}) 的本地化字符串。 + /// Looks up a localized string similar to Information (Filter : {0}). /// internal static string MsgInformationTitle { get { @@ -556,7 +556,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the address (Url) 的本地化字符串。 + /// Looks up a localized string similar to Please fill in the address (Url). /// internal static string MsgNeedUrl { get { @@ -565,7 +565,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 No valid subscriptions set 的本地化字符串。 + /// Looks up a localized string similar to No valid subscriptions set. /// internal static string MsgNoValidSubscription { get { @@ -574,7 +574,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 PAC update failed 的本地化字符串。 + /// Looks up a localized string similar to PAC update failed. /// internal static string MsgPACUpdateFailed { get { @@ -583,7 +583,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 PAC update succeeded 的本地化字符串。 + /// Looks up a localized string similar to PAC update succeeded. /// internal static string MsgPACUpdateSuccessfully { get { @@ -592,7 +592,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Resolve {0} successfully 的本地化字符串。 + /// Looks up a localized string similar to Resolve {0} successfully. /// internal static string MsgParsingSuccessfully { get { @@ -601,7 +601,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Servers (Filter : {0}) 的本地化字符串。 + /// Looks up a localized string similar to Servers (Filter : {0}). /// internal static string MsgServerTitle { get { @@ -610,7 +610,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Simplify PAC Success 的本地化字符串。 + /// Looks up a localized string similar to Simplify PAC Success. /// internal static string MsgSimplifyPAC { get { @@ -619,7 +619,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Start getting subscriptions 的本地化字符串。 + /// Looks up a localized string similar to Start getting subscriptions. /// internal static string MsgStartGettingSubscriptions { get { @@ -628,7 +628,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Start updating {0}... 的本地化字符串。 + /// Looks up a localized string similar to Start updating {0}.... /// internal static string MsgStartUpdating { get { @@ -637,7 +637,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Start updating PAC... 的本地化字符串。 + /// Looks up a localized string similar to Start updating PAC.... /// internal static string MsgStartUpdatingPAC { get { @@ -646,7 +646,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Invalid subscription content 的本地化字符串。 + /// Looks up a localized string similar to Invalid subscription content. /// internal static string MsgSubscriptionDecodingFailed { get { @@ -655,7 +655,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 is unpacking... 的本地化字符串。 + /// Looks up a localized string similar to is unpacking.... /// internal static string MsgUnpacking { get { @@ -664,7 +664,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update subscription end 的本地化字符串。 + /// Looks up a localized string similar to Update subscription end. /// internal static string MsgUpdateSubscriptionEnd { get { @@ -673,7 +673,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update subscription starts 的本地化字符串。 + /// Looks up a localized string similar to Update subscription starts. /// internal static string MsgUpdateSubscriptionStart { get { @@ -682,7 +682,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update Core successfully 的本地化字符串。 + /// Looks up a localized string similar to Update Core successfully. /// internal static string MsgUpdateV2rayCoreSuccessfully { get { @@ -691,7 +691,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 + /// Looks up a localized string similar to Update Core successfully! Restarting service.... /// internal static string MsgUpdateV2rayCoreSuccessfullyMore { get { @@ -700,7 +700,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 This feature relies on the Http global proxy, please set it correctly first. 的本地化字符串。 + /// Looks up a localized string similar to This feature relies on the Http global proxy, please set it correctly first.. /// internal static string NeedHttpGlobalProxy { get { @@ -709,7 +709,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Non-vmess or ss protocol 的本地化字符串。 + /// Looks up a localized string similar to Non-vmess or ss protocol. /// internal static string NonvmessOrssProtocol { get { @@ -718,7 +718,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 non-Vmess service, this feature is invalid 的本地化字符串。 + /// Looks up a localized string similar to non-Vmess service, this feature is invalid. /// internal static string NonVmessService { get { @@ -727,7 +727,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Core not found, please download: {0} 的本地化字符串。 + /// Looks up a localized string similar to Core not found, please download: {0}. /// internal static string NotFoundCore { get { @@ -736,7 +736,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 + /// Looks up a localized string similar to Scan completed, no valid QR code found. /// internal static string NoValidQRcodeFound { get { @@ -745,7 +745,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 operation failed, please check retry 的本地化字符串。 + /// Looks up a localized string similar to operation failed, please check and retry. /// internal static string OperationFailed { get { @@ -754,7 +754,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Operation success 的本地化字符串。 + /// Looks up a localized string similar to Operation success. /// internal static string OperationSuccess { get { @@ -763,7 +763,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please Fill Remarks 的本地化字符串。 + /// Looks up a localized string similar to Please Fill Remarks. /// internal static string PleaseFillRemarks { get { @@ -772,7 +772,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please select the encryption method 的本地化字符串。 + /// Looks up a localized string similar to Please select the encryption method. /// internal static string PleaseSelectEncryption { get { @@ -781,7 +781,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please select an agreement 的本地化字符串。 + /// Looks up a localized string similar to Please select a protocol. /// internal static string PleaseSelectProtocol { get { @@ -790,7 +790,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please select rules 的本地化字符串。 + /// Looks up a localized string similar to Please select rules. /// internal static string PleaseSelectRules { get { @@ -799,7 +799,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please select the server first 的本地化字符串。 + /// Looks up a localized string similar to Please select the server first. /// internal static string PleaseSelectServer { get { @@ -808,7 +808,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 QuickFresh 的本地化字符串。 + /// Looks up a localized string similar to Fast. /// internal static string QuickFresh { get { @@ -817,7 +817,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 + /// Looks up a localized string similar to Global hotkey {0} registered failed, reason {1}. /// internal static string RegisterGlobalHotkeyFailed { get { @@ -826,7 +826,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 + /// Looks up a localized string similar to Global hotkey {0} registered successfully. /// internal static string RegisterGlobalHotkeySuccessfully { get { @@ -835,7 +835,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 + /// Looks up a localized string similar to Servers deduplication completed. Old: {0}, New: {1}.. /// internal static string RemoveDuplicateServerResult { get { @@ -844,7 +844,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 + /// Looks up a localized string similar to Are you sure to remove the rules?. /// internal static string RemoveRules { get { @@ -853,7 +853,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Are you sure to remove the server? 的本地化字符串。 + /// Looks up a localized string similar to Are you sure to remove the server?. /// internal static string RemoveServer { get { @@ -862,7 +862,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 {0},One of the required. 的本地化字符串。 + /// Looks up a localized string similar to {0},One of the required.. /// internal static string RoutingRuleDetailRequiredTips { get { @@ -871,7 +871,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 + /// Looks up a localized string similar to The client configuration file is saved at: {0}. /// internal static string SaveClientConfigurationIn { get { @@ -880,7 +880,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 The server configuration file is saved at: {0} 的本地化字符串。 + /// Looks up a localized string similar to The server configuration file is saved at: {0}. /// internal static string SaveServerConfigurationIn { get { @@ -889,7 +889,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 SlowFresh 的本地化字符串。 + /// Looks up a localized string similar to Slow. /// internal static string SlowFresh { get { @@ -898,7 +898,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! 的本地化字符串。 + /// Looks up a localized string similar to Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing.. /// internal static string SpeedServerTips { get { @@ -907,7 +907,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Speed Test... 的本地化字符串。 + /// Looks up a localized string similar to Speed Test.... /// internal static string Speedtesting { get { @@ -916,7 +916,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 PAC failed to start. Run it with Admin right. 的本地化字符串。 + /// Looks up a localized string similar to PAC failed to start. Please run this program as Administrator.. /// internal static string StartPacFailed { get { @@ -925,7 +925,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Start service ({0})... 的本地化字符串。 + /// Looks up a localized string similar to Start service ({0}).... /// internal static string StartService { get { @@ -934,8 +934,8 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Successful configuration - ///{0} 的本地化字符串。 + /// Looks up a localized string similar to Configuration successful + ///{0}. /// internal static string SuccessfulConfiguration { get { @@ -944,7 +944,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Successfully imported custom configuration server 的本地化字符串。 + /// Looks up a localized string similar to Custom configuration server imported successfully.. /// internal static string SuccessfullyImportedCustomServer { get { @@ -953,7 +953,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 {0} servers have been imported from clipboard. 的本地化字符串。 + /// Looks up a localized string similar to {0} servers have been imported from clipboard.. /// internal static string SuccessfullyImportedServerViaClipboard { get { @@ -962,7 +962,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Scan import URL successfully 的本地化字符串。 + /// Looks up a localized string similar to Scan import URL successfully. /// internal static string SuccessfullyImportedServerViaScan { get { @@ -971,7 +971,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 System proxy 的本地化字符串。 + /// Looks up a localized string similar to System proxy. /// internal static string SystemProxy { get { @@ -980,7 +980,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 The ping of current service: {0} ms 的本地化字符串。 + /// Looks up a localized string similar to The ping of current service: {0} ms. /// internal static string TestMeOutput { get { @@ -989,7 +989,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Too many servers, please open the main interface 的本地化字符串。 + /// Looks up a localized string similar to Too many servers, please open the main interface. /// internal static string TooManyServersTip { get { @@ -998,7 +998,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *tcp camouflage type 的本地化字符串。 + /// Looks up a localized string similar to *tcp camouflage type. /// internal static string TransportHeaderTypeTip1 { get { @@ -1007,7 +1007,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *kcp camouflage type 的本地化字符串。 + /// Looks up a localized string similar to *kcp camouflage type. /// internal static string TransportHeaderTypeTip2 { get { @@ -1016,7 +1016,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *QUIC camouflage type 的本地化字符串。 + /// Looks up a localized string similar to *QUIC camouflage type. /// internal static string TransportHeaderTypeTip3 { get { @@ -1025,7 +1025,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *grpc mode 的本地化字符串。 + /// Looks up a localized string similar to *grpc mode. /// internal static string TransportHeaderTypeTip4 { get { @@ -1034,7 +1034,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *ws path 的本地化字符串。 + /// Looks up a localized string similar to *ws path. /// internal static string TransportPathTip1 { get { @@ -1043,7 +1043,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *h2 path 的本地化字符串。 + /// Looks up a localized string similar to *h2 path. /// internal static string TransportPathTip2 { get { @@ -1052,7 +1052,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *QUIC key/Kcp seed 的本地化字符串。 + /// Looks up a localized string similar to *QUIC key/Kcp seed. /// internal static string TransportPathTip3 { get { @@ -1061,7 +1061,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *grpc serviceName 的本地化字符串。 + /// Looks up a localized string similar to *grpc serviceName. /// internal static string TransportPathTip4 { get { @@ -1070,7 +1070,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *Kcp seed 的本地化字符串。 + /// Looks up a localized string similar to *Kcp seed. /// internal static string TransportPathTip5 { get { @@ -1079,7 +1079,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 + /// Looks up a localized string similar to *http host Separated by commas (,). /// internal static string TransportRequestHostTip1 { get { @@ -1088,7 +1088,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *ws host 的本地化字符串。 + /// Looks up a localized string similar to *ws host. /// internal static string TransportRequestHostTip2 { get { @@ -1097,7 +1097,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 + /// Looks up a localized string similar to *h2 host Separated by commas (,). /// internal static string TransportRequestHostTip3 { get { @@ -1106,7 +1106,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 *QUIC securty 的本地化字符串。 + /// Looks up a localized string similar to *QUIC securty. /// internal static string TransportRequestHostTip4 { get { @@ -1115,7 +1115,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Ungrouped 的本地化字符串。 + /// Looks up a localized string similar to Ungrouped. /// internal static string UngroupedServers { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index e431fc52..93b646b7 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -127,7 +127,7 @@ Please check the server settings first - configuration format is incorrect + Invalid configuration format Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. @@ -136,7 +136,7 @@ Downloading... - DOWN + Download Whether to download? {0} @@ -214,10 +214,10 @@ Test Results - Today download traffic + Download traffic today - Today upload traffic + Upload traffic today Total download traffic @@ -229,7 +229,7 @@ Transport - MediumFresh + Medium Clear original subscription content @@ -241,7 +241,7 @@ Failed to import subscription content - Get the subscription content successfully + Get subscription content successfully No valid subscriptions set @@ -301,7 +301,7 @@ Scan completed, no valid QR code found - operation failed, please check retry + operation failed, please check and retry Please Fill Remarks @@ -310,13 +310,13 @@ Please select the encryption method - Please select an agreement + Please select a protocol Please select the server first - QuickFresh + Fast Servers deduplication completed. Old: {0}, New: {1}. @@ -331,23 +331,23 @@ The server configuration file is saved at: {0} - SlowFresh + Slow - Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! + Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. - PAC failed to start. Run it with Admin right. + PAC failed to start. Please run this program as Administrator. Start service ({0})... - Successful configuration + Configuration successful {0} - Successfully imported custom configuration server + Custom configuration server imported successfully. {0} servers have been imported from clipboard. @@ -389,7 +389,7 @@ Download GeoFile: {0} successfully - Informations (Filter : {0}) + Information (Filter : {0}) Custom Icon diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index b046e5ae..10d89345 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -307,6 +307,7 @@ OptionSettingForm.cs + Designer QRCodeControl.cs From 25c2871888cea3257aa743ee9dd73e0c2701e5f5 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 23 Jun 2022 15:20:49 +0800 Subject: [PATCH 233/252] Delete v2rayN.csproj --- v2rayN/v2rayN/v2rayN.csproj | 534 ------------------------------------ 1 file changed, 534 deletions(-) delete mode 100644 v2rayN/v2rayN/v2rayN.csproj diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj deleted file mode 100644 index 10d89345..00000000 --- a/v2rayN/v2rayN/v2rayN.csproj +++ /dev/null @@ -1,534 +0,0 @@ - - - - - Debug - AnyCPU - {0A9785E6-D256-4B73-9757-4EF59955FD1E} - WinExe - Properties - v2rayN - v2rayN - v4.8 - 512 - - false - - - 发布\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 2 - 1.0.0.%2a - false - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - AnyCPU - none - true - bin\Release\ - TRACE - prompt - 4 - false - - - v2rayN.ico - - - BD431FE78E8A6683106E7110882AE5C41CBF5C60 - - - v2rayN_TemporaryKey.pfx - - - false - - - false - - - - LocalIntranet - - - - - v2rayN.Program - - - true - - - - - - - - - - - - - - - - - - - - - - - - Component - - - Form - - - BaseServerForm.cs - - - UserControl - - - MainMsgControl.cs - - - Form - - - MsgFilterSetForm.cs - - - Form - - - RoutingRuleSettingDetailsForm.cs - - - Form - - - GlobalHotkeySettingForm.cs - - - Form - - - RoutingRuleSettingForm.cs - - - UserControl - - - ServerTransportControl.cs - - - UserControl - - - GroupSettingControl.cs - - - Form - - - GroupSettingForm.cs - - - - - - - Form - - - MainForm.cs - - - Form - - - RoutingSettingForm.cs - - - Form - - - SubSettingForm.cs - - - Form - - - AddServer2Form.cs - - - UserControl - - - QRCodeControl.cs - - - UserControl - - - SubSettingControl.cs - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True - True - ResUI.zh-Hans.resx - - - True - True - ResUI.resx - - - Code - - - Form - - - AddServerForm.cs - - - Form - - - BaseForm.cs - - - - - - - - - - - Form - - - OptionSettingForm.cs - - - - - - - - - - - - AddServer2Form.cs - Designer - - - AddServerForm.cs - Designer - - - BaseServerForm.cs - Designer - - - GlobalHotkeySettingForm.cs - - - MainForm.cs - Designer - - - MainForm.cs - Designer - - - MainMsgControl.cs - - - MainMsgControl.cs - - - MsgFilterSetForm.cs - - - MsgFilterSetForm.cs - - - OptionSettingForm.cs - Designer - - - QRCodeControl.cs - Designer - - - RoutingRuleSettingDetailsForm.cs - Designer - - - RoutingRuleSettingDetailsForm.cs - Designer - - - GlobalHotkeySettingForm.cs - Designer - - - RoutingRuleSettingForm.cs - Designer - - - RoutingRuleSettingForm.cs - - - ServerTransportControl.cs - - - ServerTransportControl.cs - - - GroupSettingControl.cs - Designer - - - GroupSettingControl.cs - Designer - - - SubSettingControl.cs - Designer - - - SubSettingControl.cs - - - RoutingSettingForm.cs - Designer - - - RoutingSettingForm.cs - - - GroupSettingForm.cs - Designer - - - GroupSettingForm.cs - - - SubSettingForm.cs - Designer - - - AddServerForm.cs - Designer - - - BaseForm.cs - - - OptionSettingForm.cs - Designer - - - QRCodeControl.cs - Designer - - - AddServer2Form.cs - Designer - - - SubSettingForm.cs - - - ResXFileCodeGenerator - Designer - Resources.Designer.cs - - - Designer - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - - - - - ResXFileCodeGenerator - ResUI.zh-Hans.Designer.cs - Designer - - - ResXFileCodeGenerator - ResUI.Designer.cs - Designer - - - - - - - - - - - - - False - Microsoft .NET Framework 4 %28x86 和 x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 4.5 - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3.21.1 - - - 2.46.3 - - - 2.46.3 - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - 2.0.14 - - - 13.0.1 - - - 2.1.0 - - - 2.1.0 - - - 0.16.8 - - - - - copy /y $(SolutionDir)v2rayUpgrade\$(OutDir)* $(TargetDir) - -del $(TargetDir)*.xml $(TargetDir)*.so $(TargetDir)*.dylib -if not "$(ConfigurationName)" == "Debug" del $(TargetDir)*.pdb - - - - \ No newline at end of file From aec845976166a5c93c0274e5f1cf38a9d6649a7a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 23 Jun 2022 15:23:41 +0800 Subject: [PATCH 234/252] Revert "Delete v2rayN.csproj" This reverts commit 25c2871888cea3257aa743ee9dd73e0c2701e5f5. --- v2rayN/v2rayN/v2rayN.csproj | 534 ++++++++++++++++++++++++++++++++++++ 1 file changed, 534 insertions(+) create mode 100644 v2rayN/v2rayN/v2rayN.csproj diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj new file mode 100644 index 00000000..10d89345 --- /dev/null +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -0,0 +1,534 @@ + + + + + Debug + AnyCPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E} + WinExe + Properties + v2rayN + v2rayN + v4.8 + 512 + + false + + + 发布\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 2 + 1.0.0.%2a + false + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + none + true + bin\Release\ + TRACE + prompt + 4 + false + + + v2rayN.ico + + + BD431FE78E8A6683106E7110882AE5C41CBF5C60 + + + v2rayN_TemporaryKey.pfx + + + false + + + false + + + + LocalIntranet + + + + + v2rayN.Program + + + true + + + + + + + + + + + + + + + + + + + + + + + + Component + + + Form + + + BaseServerForm.cs + + + UserControl + + + MainMsgControl.cs + + + Form + + + MsgFilterSetForm.cs + + + Form + + + RoutingRuleSettingDetailsForm.cs + + + Form + + + GlobalHotkeySettingForm.cs + + + Form + + + RoutingRuleSettingForm.cs + + + UserControl + + + ServerTransportControl.cs + + + UserControl + + + GroupSettingControl.cs + + + Form + + + GroupSettingForm.cs + + + + + + + Form + + + MainForm.cs + + + Form + + + RoutingSettingForm.cs + + + Form + + + SubSettingForm.cs + + + Form + + + AddServer2Form.cs + + + UserControl + + + QRCodeControl.cs + + + UserControl + + + SubSettingControl.cs + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + True + True + ResUI.zh-Hans.resx + + + True + True + ResUI.resx + + + Code + + + Form + + + AddServerForm.cs + + + Form + + + BaseForm.cs + + + + + + + + + + + Form + + + OptionSettingForm.cs + + + + + + + + + + + + AddServer2Form.cs + Designer + + + AddServerForm.cs + Designer + + + BaseServerForm.cs + Designer + + + GlobalHotkeySettingForm.cs + + + MainForm.cs + Designer + + + MainForm.cs + Designer + + + MainMsgControl.cs + + + MainMsgControl.cs + + + MsgFilterSetForm.cs + + + MsgFilterSetForm.cs + + + OptionSettingForm.cs + Designer + + + QRCodeControl.cs + Designer + + + RoutingRuleSettingDetailsForm.cs + Designer + + + RoutingRuleSettingDetailsForm.cs + Designer + + + GlobalHotkeySettingForm.cs + Designer + + + RoutingRuleSettingForm.cs + Designer + + + RoutingRuleSettingForm.cs + + + ServerTransportControl.cs + + + ServerTransportControl.cs + + + GroupSettingControl.cs + Designer + + + GroupSettingControl.cs + Designer + + + SubSettingControl.cs + Designer + + + SubSettingControl.cs + + + RoutingSettingForm.cs + Designer + + + RoutingSettingForm.cs + + + GroupSettingForm.cs + Designer + + + GroupSettingForm.cs + + + SubSettingForm.cs + Designer + + + AddServerForm.cs + Designer + + + BaseForm.cs + + + OptionSettingForm.cs + Designer + + + QRCodeControl.cs + Designer + + + AddServer2Form.cs + Designer + + + SubSettingForm.cs + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + ResXFileCodeGenerator + ResUI.zh-Hans.Designer.cs + Designer + + + ResXFileCodeGenerator + ResUI.Designer.cs + Designer + + + + + + + + + + + + + False + Microsoft .NET Framework 4 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.21.1 + + + 2.46.3 + + + 2.46.3 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + 2.0.14 + + + 13.0.1 + + + 2.1.0 + + + 2.1.0 + + + 0.16.8 + + + + + copy /y $(SolutionDir)v2rayUpgrade\$(OutDir)* $(TargetDir) + +del $(TargetDir)*.xml $(TargetDir)*.so $(TargetDir)*.dylib +if not "$(ConfigurationName)" == "Debug" del $(TargetDir)*.pdb + + + + \ No newline at end of file From cf45e89b164b76a06fcf404954222de52a426ba8 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 24 Jun 2022 09:32:55 +0800 Subject: [PATCH 235/252] Support update clash core --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 43 ++++++++++--- v2rayN/v2rayN/Forms/MainForm.cs | 10 ++++ v2rayN/v2rayN/Forms/MainForm.resx | 73 ++++++++++++++++------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 6 ++ v2rayN/v2rayN/Handler/LazyConfig.cs | 25 ++++++-- v2rayN/v2rayN/Handler/UpdateHandle.cs | 58 +++++++++++------- v2rayN/v2rayN/Mode/CoreInfo.cs | 4 +- 7 files changed, 161 insertions(+), 58 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index ac6c9e81..95f12d4a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -67,9 +67,9 @@ 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.tabGroup = new System.Windows.Forms.TabControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); - this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); this.scBig = new System.Windows.Forms.SplitContainer(); this.gbServers = new System.Windows.Forms.GroupBox(); this.mainMsgControl = new v2rayN.Forms.MainMsgControl(); @@ -111,6 +111,9 @@ this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateXrayCore = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbCheckUpdateClashCore = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateClashMetaCore = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); this.tsbCheckUpdateGeo = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); @@ -208,6 +211,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer @@ -414,6 +418,13 @@ resources.ApplyResources(this.menuExport2SubContent, "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"; + // // tabGroup // resources.ApplyResources(this.tabGroup, "tabGroup"); @@ -426,13 +437,6 @@ resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // - // tsbServer - // - this.tsbServer.DropDown = this.cmsLv; - this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); - this.tsbServer.Name = "tsbServer"; - // // scBig // resources.ApplyResources(this.scBig, "scBig"); @@ -707,6 +711,9 @@ this.tsbCheckUpdateN, this.tsbCheckUpdateCore, this.tsbCheckUpdateXrayCore, + this.toolStripSeparator16, + this.tsbCheckUpdateClashCore, + this.tsbCheckUpdateClashMetaCore, this.toolStripSeparator15, this.tsbCheckUpdateGeo}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; @@ -731,6 +738,23 @@ resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + resources.ApplyResources(this.toolStripSeparator16, "toolStripSeparator16"); + // + // tsbCheckUpdateClashCore + // + this.tsbCheckUpdateClashCore.Name = "tsbCheckUpdateClashCore"; + resources.ApplyResources(this.tsbCheckUpdateClashCore, "tsbCheckUpdateClashCore"); + this.tsbCheckUpdateClashCore.Click += new System.EventHandler(this.tsbCheckUpdateClashCore_Click); + // + // tsbCheckUpdateClashMetaCore + // + this.tsbCheckUpdateClashMetaCore.Name = "tsbCheckUpdateClashMetaCore"; + resources.ApplyResources(this.tsbCheckUpdateClashMetaCore, "tsbCheckUpdateClashMetaCore"); + this.tsbCheckUpdateClashMetaCore.Click += new System.EventHandler(this.tsbCheckUpdateClashMetaCore_Click); + // // toolStripSeparator15 // this.toolStripSeparator15.Name = "toolStripSeparator15"; @@ -936,6 +960,9 @@ private System.Windows.Forms.ToolStripMenuItem menuMoveDown; private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; private System.Windows.Forms.ToolStripMenuItem menuServerFilter; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashCore; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashMetaCore; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index f57d92cc..8c88b416 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1327,6 +1327,16 @@ namespace v2rayN.Forms CheckUpdateCore(ECoreType.Xray); } + private void tsbCheckUpdateClashCore_Click(object sender, EventArgs e) + { + CheckUpdateCore(ECoreType.clash); + } + + private void tsbCheckUpdateClashMetaCore_Click(object sender, EventArgs e) + { + CheckUpdateCore(ECoreType.clash_meta); + } + private void CheckUpdateCore(ECoreType type) { void _updateUI(bool success, string msg) diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 553fd572..565876f0 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -320,8 +320,20 @@ Export subscription (base64) share to clipboard + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + - 356, 622 + 356, 600 cmsLv @@ -470,18 +482,6 @@ 0 - - Magenta - - - 64, 53 - - - Servers - - - ImageAboveText - Fill @@ -825,28 +825,43 @@ 6, 56 - 203, 22 + 219, 22 v2rayN (this software) - 203, 22 + 219, 22 - Update v2flyCore + Update v2fly Core - 203, 22 + 219, 22 - Update XrayCore + Update Xray Core + + + 216, 6 + + + 219, 22 + + + Update clash Core + + + 219, 22 + + + Update Clash.Meta Core - 200, 6 + 216, 6 - 203, 22 + 219, 22 Update Geo files @@ -1391,6 +1406,24 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolStripSeparator16 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateClashCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateClashMetaCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolStripSeparator15 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 740a1506..b4881f2c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -561,4 +561,10 @@ 设置服务器过滤器 (Ctrl+F) + + Update clash Core + + + Update Clash.Meta Core + \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 71b53f3a..0f15823d 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -69,7 +69,8 @@ namespace v2rayN.Handler coreType = ECoreType.v2rayN, coreUrl = Global.NUrl, coreLatestUrl = Global.NUrl + "/latest", - coreDownloadUrl = Global.NUrl + "/download/{0}/v2rayN.zip", + coreDownloadUrl32 = Global.NUrl + "/download/{0}/v2rayN.zip", + coreDownloadUrl64 = Global.NUrl + "/download/{0}/v2rayN.zip", }); coreInfos.Add(new CoreInfo @@ -79,7 +80,8 @@ namespace v2rayN.Handler arguments = "", coreUrl = Global.v2flyCoreUrl, coreLatestUrl = Global.v2flyCoreUrl + "/latest", - coreDownloadUrl = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip", + coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip", + coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip", match = "V2Ray" }); @@ -90,7 +92,8 @@ namespace v2rayN.Handler arguments = "", coreUrl = Global.xrayCoreUrl, coreLatestUrl = Global.xrayCoreUrl + "/latest", - coreDownloadUrl = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip", + coreDownloadUrl32 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip", + coreDownloadUrl64 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip", match = "Xray" }); @@ -99,7 +102,11 @@ namespace v2rayN.Handler coreType = ECoreType.clash, coreExes = new List { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" }, arguments = "-f config.json", - coreUrl = Global.clashCoreUrl + coreUrl = Global.clashCoreUrl, + coreLatestUrl = Global.clashCoreUrl + "/latest", + coreDownloadUrl32 = Global.clashCoreUrl + "/download/{0}/clash-windows-386-{0}.zip", + coreDownloadUrl64 = Global.clashCoreUrl + "/download/{0}/clash-windows-amd64-{0}.zip", + match = "v" }); coreInfos.Add(new CoreInfo @@ -107,7 +114,10 @@ namespace v2rayN.Handler coreType = ECoreType.clash_meta, coreExes = new List { "Clash.Meta-windows-amd64v1", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, arguments = "-f config.json", - coreUrl = Global.clashMetaCoreUrl + coreUrl = Global.clashMetaCoreUrl, + coreLatestUrl = Global.clashMetaCoreUrl + "/latest", + coreDownloadUrl32 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-386-{0}.zip", + coreDownloadUrl64 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-amd64-compatible-{0}.zip", }); coreInfos.Add(new CoreInfo @@ -115,7 +125,10 @@ namespace v2rayN.Handler coreType = ECoreType.hysteria, coreExes = new List { "hysteria-tun-windows-6.0-amd64", "hysteria-tun-windows-6.0-386", "hysteria" }, arguments = "", - coreUrl = Global.hysteriaCoreUrl + coreUrl = Global.hysteriaCoreUrl, + coreLatestUrl = Global.hysteriaCoreUrl + "/latest", + coreDownloadUrl32 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-tun-windows-6.0-386.exe", + coreDownloadUrl64 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-tun-windows-6.0-amd64.exe", }); coreInfos.Add(new CoreInfo diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 9e30e38d..c200bbfe 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -295,7 +295,7 @@ namespace v2rayN.Handler try { var coreInfo = LazyConfig.Instance.GetCoreInfo(type); - string url = coreInfo.coreLatestUrl; + string url = coreInfo.coreLatestUrl; var result = await (new DownloadHandle()).UrlRedirectAsync(url, true); if (!Utils.IsNullOrEmpty(result)) @@ -374,29 +374,41 @@ namespace v2rayN.Handler string curVersion; string message; string url; - if (type == ECoreType.v2fly) + switch (type) { - curVersion = "v" + getCoreVersion(type); - message = string.Format(ResUI.IsLatestCore, curVersion); - string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(coreInfo.coreDownloadUrl, version, osBit); - } - else if (type == ECoreType.Xray) - { - curVersion = "v" + getCoreVersion(type); - message = string.Format(ResUI.IsLatestCore, curVersion); - string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(coreInfo.coreDownloadUrl, version, osBit); - } - else if (type == ECoreType.v2rayN) - { - curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); - message = string.Format(ResUI.IsLatestN, curVersion); - url = string.Format(coreInfo.coreDownloadUrl, version); - } - else - { - throw new ArgumentException("Type"); + case ECoreType.v2fly: + case ECoreType.Xray: + { + curVersion = "v" + getCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(coreInfo.coreDownloadUrl64, version, osBit); + break; + } + case ECoreType.clash: + case ECoreType.clash_meta: + { + curVersion = "";//getCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, curVersion); + if (Environment.Is64BitProcess) + { + url = string.Format(coreInfo.coreDownloadUrl64, version); + } + else + { + url = string.Format(coreInfo.coreDownloadUrl32, version); + } + break; + } + case ECoreType.v2rayN: + { + curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); + message = string.Format(ResUI.IsLatestN, curVersion); + url = string.Format(coreInfo.coreDownloadUrl64, version); + break; + } + default: + throw new ArgumentException("Type"); } if (curVersion == version) diff --git a/v2rayN/v2rayN/Mode/CoreInfo.cs b/v2rayN/v2rayN/Mode/CoreInfo.cs index 86391c7d..4afc1c22 100644 --- a/v2rayN/v2rayN/Mode/CoreInfo.cs +++ b/v2rayN/v2rayN/Mode/CoreInfo.cs @@ -16,7 +16,9 @@ namespace v2rayN.Mode public string coreLatestUrl { get; set; } - public string coreDownloadUrl { get; set; } + public string coreDownloadUrl32 { get; set; } + + public string coreDownloadUrl64 { get; set; } public string match { get; set; } } From cdaff661260f3ae96778f237afbe2c90e8ed4bbb Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 24 Jun 2022 09:54:52 +0800 Subject: [PATCH 236/252] add rule object doc --- .../RoutingRuleSettingDetailsForm.Designer.cs | 14 +- .../Forms/RoutingRuleSettingDetailsForm.cs | 6 + .../Forms/RoutingRuleSettingDetailsForm.resx | 241 +++++++++++++----- ...RoutingRuleSettingDetailsForm.zh-Hans.resx | 3 + 4 files changed, 204 insertions(+), 60 deletions(-) diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs index ee32e22e..5733b856 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -50,6 +50,7 @@ this.txtIP = new System.Windows.Forms.TextBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.txtDomain = new System.Windows.Forms.TextBox(); + this.linkRuleobjectDoc = new System.Windows.Forms.LinkLabel(); this.panel3.SuspendLayout(); this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); @@ -64,6 +65,7 @@ // // panel3 // + this.panel3.Controls.Add(this.linkRuleobjectDoc); this.panel3.Controls.Add(this.chkEnabled); this.panel3.Controls.Add(this.clbInboundTag); this.panel3.Controls.Add(this.label2); @@ -90,7 +92,9 @@ this.clbInboundTag.FormattingEnabled = true; this.clbInboundTag.Items.AddRange(new object[] { resources.GetString("clbInboundTag.Items"), - resources.GetString("clbInboundTag.Items1")}); + resources.GetString("clbInboundTag.Items1"), + resources.GetString("clbInboundTag.Items2"), + resources.GetString("clbInboundTag.Items3")}); this.clbInboundTag.MultiColumn = true; this.clbInboundTag.Name = "clbInboundTag"; // @@ -208,6 +212,13 @@ resources.ApplyResources(this.txtDomain, "txtDomain"); this.txtDomain.Name = "txtDomain"; // + // linkRuleobjectDoc + // + resources.ApplyResources(this.linkRuleobjectDoc, "linkRuleobjectDoc"); + this.linkRuleobjectDoc.Name = "linkRuleobjectDoc"; + this.linkRuleobjectDoc.TabStop = true; + this.linkRuleobjectDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkRuleobjectDoc_LinkClicked); + // // RoutingRuleSettingDetailsForm // resources.ApplyResources(this, "$this"); @@ -255,5 +266,6 @@ private System.Windows.Forms.Label label2; private System.Windows.Forms.CheckBox chkEnabled; private System.Windows.Forms.CheckBox chkAutoSort; + private System.Windows.Forms.LinkLabel linkRuleobjectDoc; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs index 219408b8..fa600925 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; @@ -138,5 +139,10 @@ namespace v2rayN.Forms { DialogResult = DialogResult.Cancel; } + + private void linkRuleobjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("https://www.v2fly.org/config/routing.html#ruleobject"); + } } } diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx index bbd5dbf2..1ffc0db3 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -144,6 +144,39 @@ 3 + + True + + + NoControl + + + 19, 86 + + + 0, 0, 0, 0 + + + 89, 12 + + + 43 + + + Ruleobject Doc + + + linkRuleobjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + True @@ -151,7 +184,7 @@ NoControl - 617, 19 + 632, 45 60, 16 @@ -172,7 +205,7 @@ panel3 - 0 + 1 80 @@ -183,11 +216,17 @@ http + + socks2 + + + http2 + 347, 16 - 245, 20 + 345, 20 41 @@ -202,7 +241,7 @@ panel3 - 1 + 2 True @@ -232,7 +271,7 @@ panel3 - 2 + 3 80 @@ -265,7 +304,7 @@ panel3 - 3 + 4 True @@ -295,7 +334,7 @@ panel3 - 4 + 5 107, 43 @@ -316,7 +355,7 @@ panel3 - 5 + 6 True @@ -346,16 +385,16 @@ panel3 - 6 + 7 NoControl - 19, 82 + 144, 86 - 598, 16 + 575, 16 33 @@ -373,7 +412,7 @@ panel3 - 7 + 8 True @@ -403,7 +442,7 @@ panel3 - 8 + 9 proxy @@ -433,7 +472,7 @@ panel3 - 9 + 10 Top @@ -459,6 +498,66 @@ 2 + + chkAutoSort + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 2 + + + Bottom + + + 0, 516 + + + 742, 60 + + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + True @@ -543,44 +642,53 @@ 2 - - Bottom + + groupBox2 - - 0, 516 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 742, 60 + + panel2 - - 10 + + 0 - - panel4 + + groupBox1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + panel2 - + 1 - + Fill - - 3, 17 + + 0, 121 - - True + + 742, 395 - - 344, 375 + + 11 - - 25 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 txtIP @@ -621,20 +729,32 @@ 0 - + Fill - + 3, 17 - + True - - 386, 375 + + 344, 375 - - 24 + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 txtDomain @@ -675,28 +795,31 @@ 1 - + Fill - - 0, 121 + + 3, 17 - - 742, 395 + + True - - 11 + + 386, 375 - - panel2 + + 24 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtDomain - - $this + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + 0 diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index 0059a7ff..3776d004 100644 --- a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -173,4 +173,7 @@ 保存时Domain和IP自动排序 + + 规则详细说明文档 + \ No newline at end of file From c43675d987e18fbcccc11ac4ec8e53b8492f2cfe Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 24 Jun 2022 13:56:01 +0800 Subject: [PATCH 237/252] Sort by test result --- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 9 +++++++++ v2rayN/v2rayN/Forms/MainForm.cs | 7 +++++++ v2rayN/v2rayN/Forms/MainForm.resx | 14 +++++++++++++- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 3 +++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 95f12d4a..6a76630c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -60,6 +60,7 @@ this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSortServerResult = new System.Windows.Forms.ToolStripMenuItem(); this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem(); this.menuClearServerStatistics = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); @@ -203,6 +204,7 @@ this.menuTcpingServer, this.menuRealPingServer, this.menuSpeedServer, + this.menuSortServerResult, this.tsbTestMe, this.menuClearServerStatistics, this.toolStripSeparator6, @@ -377,6 +379,12 @@ resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // + // menuSortServerResult + // + this.menuSortServerResult.Name = "menuSortServerResult"; + resources.ApplyResources(this.menuSortServerResult, "menuSortServerResult"); + this.menuSortServerResult.Click += new System.EventHandler(this.menuSortServerResult_Click); + // // tsbTestMe // this.tsbTestMe.Name = "tsbTestMe"; @@ -963,6 +971,7 @@ private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashCore; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashMetaCore; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + private System.Windows.Forms.ToolStripMenuItem menuSortServerResult; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 8c88b416..d0d43197 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -633,6 +633,9 @@ namespace v2rayN.Forms case Keys.F: menuServerFilter_Click(null, null); break; + case Keys.E: + menuSortServerResult_Click(null, null); + break; } } else @@ -774,6 +777,10 @@ namespace v2rayN.Forms ClearTestResult(); SpeedtestHandler statistics = new SpeedtestHandler(config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); } + private void menuSortServerResult_Click(object sender, EventArgs e) + { + lvServers_ColumnClick(null, new ColumnClickEventArgs((int)EServerColName.testResult)); + } private void tsbTestMe_Click(object sender, EventArgs e) { diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 565876f0..5714620a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -281,6 +281,12 @@ Test servers download speed (Ctrl+T) + + 355, 22 + + + Sort by test result (Ctrl+E) + 355, 22 @@ -333,7 +339,7 @@ ImageAboveText - 356, 600 + 356, 644 cmsLv @@ -1148,6 +1154,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuSortServerResult + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + tsbTestMe diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index b4881f2c..695e1a3d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -567,4 +567,7 @@ Update Clash.Meta Core + + 按测试结果排序 (Ctrl+E) + \ No newline at end of file From b3e7eac89581c968af0f75086fc90cc52f168337 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 24 Jun 2022 14:25:09 +0800 Subject: [PATCH 238/252] Parse ss plugin obfs-host --- v2rayN/v2rayN/Handler/ShareHandler.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index f171c3c6..c00967ff 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -582,7 +582,19 @@ namespace v2rayN.Handler NameValueCollection queryParameters = HttpUtility.ParseQueryString(parsedUrl.Query); if (queryParameters["plugin"] != null) { - return null; + //obfs-host exists + var obfsHost = queryParameters["plugin"].Split(';').FirstOrDefault(t => t.Contains("obfs-host")); + if (queryParameters["plugin"].Contains("obfs=http") && !Utils.IsNullOrEmpty(obfsHost)) + { + obfsHost = obfsHost.Replace("obfs-host=", ""); + server.network = Global.DefaultNetwork; + server.headerType = Global.TcpHeaderHttp; + server.requestHost = obfsHost; + } + else + { + return null; + } } return server; From e4fa729071d33be9c6dcbca889126897a0ce912f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 26 Jun 2022 09:09:38 +0800 Subject: [PATCH 239/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index d5a654ae..f9f9ef99 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.26")] +[assembly: AssemblyFileVersion("5.27")] From eddd38ff03fd01c176843eaeee8e32ae23e49bf3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 26 Jun 2022 20:18:43 +0800 Subject: [PATCH 240/252] Update UpdateHandle.cs --- v2rayN/v2rayN/Handler/UpdateHandle.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index c200bbfe..01038ec4 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -200,6 +200,10 @@ namespace v2rayN.Handler _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); var result = await (new DownloadHandle()).DownloadStringAsync(url, blProxy, userAgent); + if (blProxy && Utils.IsNullOrEmpty(result)) + { + result = await (new DownloadHandle()).DownloadStringAsync(url, false, userAgent); + } _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); if (Utils.IsNullOrEmpty(result)) From d418f79d8f9fbac2ff733eb5004cfe2264f38106 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 28 Jun 2022 14:44:46 +0800 Subject: [PATCH 241/252] fix clash config --- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 1e269548..016929e4 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -956,6 +956,18 @@ namespace v2rayN.Handler break; case ECoreType.clash: case ECoreType.clash_meta: + //remove the original + var indexPort = fileContent.FindIndex(t => t.Contains("port:")); + if (indexPort >= 0) + { + fileContent.RemoveAt(indexPort); + } + indexPort = fileContent.FindIndex(t => t.Contains("socks-port:")); + if (indexPort >= 0) + { + fileContent.RemoveAt(indexPort); + } + fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}"); fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}"); break; From 209786cdb665d511528cdc9504c60370870afcdd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 30 Jun 2022 11:19:55 +0800 Subject: [PATCH 242/252] Vmess 2 VMess --- v2rayN/v2rayN/Forms/AddServerForm.cs | 10 +- v2rayN/v2rayN/Forms/MainForm.cs | 2 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 6 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 7 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 8 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 6 +- v2rayN/v2rayN/Mode/Config.cs | 4 +- v2rayN/v2rayN/Mode/EConfigType.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 264 ++++++++++---------- v2rayN/v2rayN/Resx/ResUI.resx | 4 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 4 +- 11 files changed, 158 insertions(+), 159 deletions(-) diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 0af14fd1..80458e83 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -23,7 +23,7 @@ namespace v2rayN.Forms switch (eConfigType) { - case EConfigType.Vmess: + case EConfigType.VMess: panVmess.Dock = DockStyle.Fill; panVmess.Visible = true; @@ -84,7 +84,7 @@ namespace v2rayN.Forms switch (eConfigType) { - case EConfigType.Vmess: + case EConfigType.VMess: txtId.Text = vmessItem.id; txtAlterId.Text = vmessItem.alterId.ToString(); cmbSecurity.Text = vmessItem.security; @@ -124,7 +124,7 @@ namespace v2rayN.Forms switch (eConfigType) { - case EConfigType.Vmess: + case EConfigType.VMess: txtId.Text = ""; txtAlterId.Text = "0"; cmbSecurity.Text = Global.DefaultSecurity; @@ -164,7 +164,7 @@ namespace v2rayN.Forms switch (eConfigType) { - case EConfigType.Vmess: + case EConfigType.VMess: id = txtId.Text; alterId = txtAlterId.Text; security = cmbSecurity.Text; @@ -241,7 +241,7 @@ namespace v2rayN.Forms int ret = -1; switch (eConfigType) { - case EConfigType.Vmess: + case EConfigType.VMess: ret = ConfigHandler.AddServer(ref config, vmessItem); break; case EConfigType.Shadowsocks: diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index d0d43197..aefdceb9 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -666,7 +666,7 @@ namespace v2rayN.Forms private void menuAddVmessServer_Click(object sender, EventArgs e) { - ShowServerForm(EConfigType.Vmess, -1); + ShowServerForm(EConfigType.VMess, -1); } private void menuAddVlessServer_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 4661ec93..d616a75c 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -245,7 +245,7 @@ namespace v2rayN.Handler /// public static int AddServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configType = EConfigType.Vmess; + vmessItem.configType = EConfigType.VMess; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); @@ -609,7 +609,7 @@ namespace v2rayN.Handler { return 0; } - if (vmessItem.configType == EConfigType.Vmess) + if (vmessItem.configType == EConfigType.VMess) { string path = ""; string host = ""; @@ -896,7 +896,7 @@ namespace v2rayN.Handler //groupId vmessItem.groupId = groupId; - if (vmessItem.configType == EConfigType.Vmess) + if (vmessItem.configType == EConfigType.VMess) { if (AddServer(ref config, vmessItem, false) == 0) { diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index a59592c0..975de934 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -95,7 +95,7 @@ namespace v2rayN.Handler graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height); - graphics.FillEllipse(drawBrush, width/2, width/2, width/2, width/2); + graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2); Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); @@ -118,8 +118,7 @@ namespace v2rayN.Handler { return; } - if (item.configType != EConfigType.Vmess - && item.configType != EConfigType.VLESS) + if (item.configType == EConfigType.Custom) { UI.Show(ResUI.NonVmessService); return; @@ -158,7 +157,7 @@ namespace v2rayN.Handler { return; } - if (item.configType != EConfigType.Vmess + if (item.configType != EConfigType.VMess && item.configType != EConfigType.VLESS) { UI.Show(ResUI.NonVmessService); diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index c00967ff..20b56da1 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -31,7 +31,7 @@ namespace v2rayN.Handler switch (item.configType) { - case EConfigType.Vmess: + case EConfigType.VMess: url = ShareVmess(item); break; case EConfigType.Shadowsocks: @@ -374,7 +374,7 @@ namespace v2rayN.Handler msg = string.Empty; var vmessItem = new VmessItem { - configType = EConfigType.Vmess + configType = EConfigType.VMess }; result = result.Substring(Global.vmessProtocol.Length); @@ -422,7 +422,7 @@ namespace v2rayN.Handler { VmessItem vmessItem = new VmessItem { - configType = EConfigType.Vmess + configType = EConfigType.VMess }; result = result.Substring(Global.vmessProtocol.Length); int indexSplit = result.IndexOf("?"); @@ -460,7 +460,7 @@ namespace v2rayN.Handler { VmessItem i = new VmessItem { - configType = EConfigType.Vmess, + configType = EConfigType.VMess, security = "auto" }; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 016929e4..4d4f6b0b 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -363,7 +363,7 @@ namespace v2rayN.Handler { var config = LazyConfig.Instance.GetConfig(); Outbounds outbound = v2rayConfig.outbounds[0]; - if (node.configType == EConfigType.Vmess) + if (node.configType == EConfigType.VMess) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -1076,7 +1076,7 @@ namespace v2rayN.Handler usersItem.id = node.id; usersItem.email = Global.userEMail; - if (node.configType == EConfigType.Vmess) + if (node.configType == EConfigType.VMess) { inbound.protocol = Global.vmessProtocolLite; usersItem.alterId = node.alterId; @@ -1492,7 +1492,7 @@ namespace v2rayN.Handler { continue; } - if (it.configType == EConfigType.Vmess || it.configType == EConfigType.VLESS) + if (it.configType == EConfigType.VMess || it.configType == EConfigType.VLESS) { if (!Utils.IsGuidByParse(configCopy.GetVmessItem(it.indexId).id)) { diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 4b913a89..8dab69c6 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -282,7 +282,7 @@ namespace v2rayN.Mode public VmessItem() { indexId = string.Empty; - configType = EConfigType.Vmess; + configType = EConfigType.VMess; configVersion = 2; sort = 0; address = string.Empty; @@ -323,7 +323,7 @@ namespace v2rayN.Mode } switch (configType) { - case EConfigType.Vmess: + case EConfigType.VMess: case EConfigType.Shadowsocks: case EConfigType.Socks: case EConfigType.VLESS: diff --git a/v2rayN/v2rayN/Mode/EConfigType.cs b/v2rayN/v2rayN/Mode/EConfigType.cs index e1adc53c..7aa329ed 100644 --- a/v2rayN/v2rayN/Mode/EConfigType.cs +++ b/v2rayN/v2rayN/Mode/EConfigType.cs @@ -3,7 +3,7 @@ namespace v2rayN.Mode { public enum EConfigType { - Vmess = 1, + VMess = 1, Custom = 2, Shadowsocks = 3, Socks = 4, diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index c30f56e5..789e013c 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ @@ -13,13 +13,13 @@ namespace v2rayN.Resx { /// - /// A strongly-typed resource class, for looking up localized strings, etc. + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [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 { @@ -33,7 +33,7 @@ namespace v2rayN.Resx { } /// - /// Returns the cached ResourceManager instance used by this class. + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ namespace v2rayN.Resx { } /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Do you want to append rules? Choose yes to append, choose otherwise to replace. + /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 /// internal static string AddBatchRoutingRulesYesNo { get { @@ -70,7 +70,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to All servers. + /// 查找类似 All servers 的本地化字符串。 /// internal static string AllGroupServers { get { @@ -79,7 +79,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Batch export subscription to clipboard successfully. + /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 /// internal static string BatchExportSubscriptionSuccessfully { get { @@ -88,7 +88,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Batch export share URL to clipboard successfully. + /// 查找类似 Batch export share URL to clipboard successfully 的本地化字符串。 /// internal static string BatchExportURLSuccessfully { get { @@ -97,7 +97,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please check the server settings first. + /// 查找类似 Please check the server settings first 的本地化字符串。 /// internal static string CheckServerSettings { get { @@ -106,7 +106,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Invalid configuration format. + /// 查找类似 Invalid configuration format 的本地化字符串。 /// internal static string ConfigurationFormatIncorrect { get { @@ -115,7 +115,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually.. + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 /// internal static string CustomServerTips { get { @@ -124,7 +124,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Downloading.... + /// 查找类似 Downloading... 的本地化字符串。 /// internal static string Downloading { get { @@ -133,7 +133,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download. + /// 查找类似 Download 的本地化字符串。 /// internal static string downloadSpeed { get { @@ -142,7 +142,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Whether to download? {0}. + /// 查找类似 Whether to download? {0} 的本地化字符串。 /// internal static string DownloadYesNo { get { @@ -151,7 +151,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to convert configuration file. + /// 查找类似 Failed to convert configuration file 的本地化字符串。 /// internal static string FailedConversionConfiguration { get { @@ -160,7 +160,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to generate default configuration file. + /// 查找类似 Failed to generate default configuration file 的本地化字符串。 /// internal static string FailedGenDefaultConfiguration { get { @@ -169,7 +169,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to get the default configuration. + /// 查找类似 Failed to get the default configuration 的本地化字符串。 /// internal static string FailedGetDefaultConfiguration { get { @@ -178,7 +178,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to import custom configuration server. + /// 查找类似 Failed to import custom configuration server 的本地化字符串。 /// internal static string FailedImportedCustomServer { get { @@ -187,7 +187,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to read configuration file. + /// 查找类似 Failed to read configuration file 的本地化字符串。 /// internal static string FailedReadConfiguration { get { @@ -196,7 +196,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the correct custom DNS. + /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 /// internal static string FillCorrectDNSText { get { @@ -205,7 +205,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the correct format server port. + /// 查找类似 Please fill in the correct format server port 的本地化字符串。 /// internal static string FillCorrectServerPort { get { @@ -214,7 +214,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the KCP parameters correctly. + /// 查找类似 Please fill in the KCP parameters correctly 的本地化字符串。 /// internal static string FillKcpParameters { get { @@ -223,7 +223,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the local listening port. + /// 查找类似 Please fill in the local listening port 的本地化字符串。 /// internal static string FillLocalListeningPort { get { @@ -232,7 +232,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the password. + /// 查找类似 Please fill in the password 的本地化字符串。 /// internal static string FillPassword { get { @@ -241,7 +241,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the server address. + /// 查找类似 Please fill in the server address 的本地化字符串。 /// internal static string FillServerAddress { get { @@ -250,7 +250,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please browse to import server configuration. + /// 查找类似 Please browse to import server configuration 的本地化字符串。 /// internal static string FillServerAddressCustom { get { @@ -259,7 +259,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the user ID. + /// 查找类似 Please fill in the user ID 的本地化字符串。 /// internal static string FillUUID { get { @@ -268,7 +268,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to is not the correct client configuration file, please check. + /// 查找类似 is not the correct client configuration file, please check 的本地化字符串。 /// internal static string IncorrectClientConfiguration { get { @@ -277,7 +277,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to is not the correct configuration, please check. + /// 查找类似 is not the correct configuration, please check 的本地化字符串。 /// internal static string Incorrectconfiguration { get { @@ -286,7 +286,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to is not the correct server configuration file, please check. + /// 查找类似 is not the correct server configuration file, please check 的本地化字符串。 /// internal static string IncorrectServerConfiguration { get { @@ -295,7 +295,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Initial Configuration. + /// 查找类似 Initial Configuration 的本地化字符串。 /// internal static string InitialConfiguration { get { @@ -304,7 +304,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} already up to date.. + /// 查找类似 {0} already up to date. 的本地化字符串。 /// internal static string IsLatestCore { get { @@ -313,7 +313,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} already up to date.. + /// 查找类似 {0} already up to date. 的本地化字符串。 /// internal static string IsLatestN { get { @@ -322,7 +322,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to LAN. + /// 查找类似 LAN 的本地化字符串。 /// internal static string LabLAN { get { @@ -331,7 +331,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Local. + /// 查找类似 Local 的本地化字符串。 /// internal static string LabLocal { get { @@ -340,7 +340,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Address. + /// 查找类似 Address 的本地化字符串。 /// internal static string LvAddress { get { @@ -349,7 +349,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Alias. + /// 查找类似 Alias 的本地化字符串。 /// internal static string LvAlias { get { @@ -358,7 +358,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Count. + /// 查找类似 Count 的本地化字符串。 /// internal static string LvCount { get { @@ -367,7 +367,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Custom Icon. + /// 查找类似 Custom Icon 的本地化字符串。 /// internal static string LvCustomIcon { get { @@ -376,7 +376,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Security. + /// 查找类似 Security 的本地化字符串。 /// internal static string LvEncryptionMethod { get { @@ -385,7 +385,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Port. + /// 查找类似 Port 的本地化字符串。 /// internal static string LvPort { get { @@ -394,7 +394,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to remarks. + /// 查找类似 remarks 的本地化字符串。 /// internal static string LvRemarks { get { @@ -403,7 +403,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Type. + /// 查找类似 Type 的本地化字符串。 /// internal static string LvServiceType { get { @@ -412,7 +412,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Subs. + /// 查找类似 Subs 的本地化字符串。 /// internal static string LvSubscription { get { @@ -421,7 +421,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test Results. + /// 查找类似 Test Results 的本地化字符串。 /// internal static string LvTestResults { get { @@ -430,7 +430,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to TLS. + /// 查找类似 TLS 的本地化字符串。 /// internal static string LvTLS { get { @@ -439,7 +439,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download traffic today. + /// 查找类似 Download traffic today 的本地化字符串。 /// internal static string LvTodayDownloadDataAmount { get { @@ -448,7 +448,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Upload traffic today. + /// 查找类似 Upload traffic today 的本地化字符串。 /// internal static string LvTodayUploadDataAmount { get { @@ -457,7 +457,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Total download traffic. + /// 查找类似 Total download traffic 的本地化字符串。 /// internal static string LvTotalDownloadDataAmount { get { @@ -466,7 +466,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Total upload traffic. + /// 查找类似 Total upload traffic 的本地化字符串。 /// internal static string LvTotalUploadDataAmount { get { @@ -475,7 +475,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Transport. + /// 查找类似 Transport 的本地化字符串。 /// internal static string LvTransportProtocol { get { @@ -484,7 +484,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Url. + /// 查找类似 Url 的本地化字符串。 /// internal static string LvUrl { get { @@ -493,7 +493,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Medium. + /// 查找类似 Medium 的本地化字符串。 /// internal static string MediumFresh { get { @@ -502,7 +502,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clear original subscription content. + /// 查找类似 Clear original subscription content 的本地化字符串。 /// internal static string MsgClearSubscription { get { @@ -511,7 +511,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download GeoFile: {0} successfully. + /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 /// internal static string MsgDownloadGeoFileSuccessfully { get { @@ -520,7 +520,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download Core successfully. + /// 查找类似 Download Core successfully 的本地化字符串。 /// internal static string MsgDownloadV2rayCoreSuccessfully { get { @@ -529,7 +529,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to import subscription content. + /// 查找类似 Failed to import subscription content 的本地化字符串。 /// internal static string MsgFailedImportSubscription { get { @@ -538,7 +538,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Get subscription content successfully. + /// 查找类似 Get subscription content successfully 的本地化字符串。 /// internal static string MsgGetSubscriptionSuccessfully { get { @@ -547,7 +547,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Information (Filter : {0}). + /// 查找类似 Information (Filter : {0}) 的本地化字符串。 /// internal static string MsgInformationTitle { get { @@ -556,7 +556,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the address (Url). + /// 查找类似 Please fill in the address (Url) 的本地化字符串。 /// internal static string MsgNeedUrl { get { @@ -565,7 +565,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to No valid subscriptions set. + /// 查找类似 No valid subscriptions set 的本地化字符串。 /// internal static string MsgNoValidSubscription { get { @@ -574,7 +574,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PAC update failed. + /// 查找类似 PAC update failed 的本地化字符串。 /// internal static string MsgPACUpdateFailed { get { @@ -583,7 +583,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PAC update succeeded. + /// 查找类似 PAC update succeeded 的本地化字符串。 /// internal static string MsgPACUpdateSuccessfully { get { @@ -592,7 +592,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Resolve {0} successfully. + /// 查找类似 Resolve {0} successfully 的本地化字符串。 /// internal static string MsgParsingSuccessfully { get { @@ -601,7 +601,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Servers (Filter : {0}). + /// 查找类似 Servers (Filter : {0}) 的本地化字符串。 /// internal static string MsgServerTitle { get { @@ -610,7 +610,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Simplify PAC Success. + /// 查找类似 Simplify PAC Success 的本地化字符串。 /// internal static string MsgSimplifyPAC { get { @@ -619,7 +619,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start getting subscriptions. + /// 查找类似 Start getting subscriptions 的本地化字符串。 /// internal static string MsgStartGettingSubscriptions { get { @@ -628,7 +628,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start updating {0}.... + /// 查找类似 Start updating {0}... 的本地化字符串。 /// internal static string MsgStartUpdating { get { @@ -637,7 +637,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start updating PAC.... + /// 查找类似 Start updating PAC... 的本地化字符串。 /// internal static string MsgStartUpdatingPAC { get { @@ -646,7 +646,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Invalid subscription content. + /// 查找类似 Invalid subscription content 的本地化字符串。 /// internal static string MsgSubscriptionDecodingFailed { get { @@ -655,7 +655,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to is unpacking.... + /// 查找类似 is unpacking... 的本地化字符串。 /// internal static string MsgUnpacking { get { @@ -664,7 +664,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update subscription end. + /// 查找类似 Update subscription end 的本地化字符串。 /// internal static string MsgUpdateSubscriptionEnd { get { @@ -673,7 +673,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update subscription starts. + /// 查找类似 Update subscription starts 的本地化字符串。 /// internal static string MsgUpdateSubscriptionStart { get { @@ -682,7 +682,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update Core successfully. + /// 查找类似 Update Core successfully 的本地化字符串。 /// internal static string MsgUpdateV2rayCoreSuccessfully { get { @@ -691,7 +691,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update Core successfully! Restarting service.... + /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 /// internal static string MsgUpdateV2rayCoreSuccessfullyMore { get { @@ -700,7 +700,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to This feature relies on the Http global proxy, please set it correctly first.. + /// 查找类似 This feature relies on the Http global proxy, please set it correctly first. 的本地化字符串。 /// internal static string NeedHttpGlobalProxy { get { @@ -709,7 +709,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Non-vmess or ss protocol. + /// 查找类似 Non-VMess or ss protocol 的本地化字符串。 /// internal static string NonvmessOrssProtocol { get { @@ -718,7 +718,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to non-Vmess service, this feature is invalid. + /// 查找类似 non-standard service, this feature is invalid 的本地化字符串。 /// internal static string NonVmessService { get { @@ -727,7 +727,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Core not found, please download: {0}. + /// 查找类似 Core not found, please download: {0} 的本地化字符串。 /// internal static string NotFoundCore { get { @@ -736,7 +736,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Scan completed, no valid QR code found. + /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 /// internal static string NoValidQRcodeFound { get { @@ -745,7 +745,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to operation failed, please check and retry. + /// 查找类似 operation failed, please check and retry 的本地化字符串。 /// internal static string OperationFailed { get { @@ -754,7 +754,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Operation success. + /// 查找类似 Operation success 的本地化字符串。 /// internal static string OperationSuccess { get { @@ -763,7 +763,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please Fill Remarks. + /// 查找类似 Please Fill Remarks 的本地化字符串。 /// internal static string PleaseFillRemarks { get { @@ -772,7 +772,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select the encryption method. + /// 查找类似 Please select the encryption method 的本地化字符串。 /// internal static string PleaseSelectEncryption { get { @@ -781,7 +781,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select a protocol. + /// 查找类似 Please select a protocol 的本地化字符串。 /// internal static string PleaseSelectProtocol { get { @@ -790,7 +790,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select rules. + /// 查找类似 Please select rules 的本地化字符串。 /// internal static string PleaseSelectRules { get { @@ -799,7 +799,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select the server first. + /// 查找类似 Please select the server first 的本地化字符串。 /// internal static string PleaseSelectServer { get { @@ -808,7 +808,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Fast. + /// 查找类似 Fast 的本地化字符串。 /// internal static string QuickFresh { get { @@ -817,7 +817,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Global hotkey {0} registered failed, reason {1}. + /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 /// internal static string RegisterGlobalHotkeyFailed { get { @@ -826,7 +826,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Global hotkey {0} registered successfully. + /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 /// internal static string RegisterGlobalHotkeySuccessfully { get { @@ -835,7 +835,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Servers deduplication completed. Old: {0}, New: {1}.. + /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 /// internal static string RemoveDuplicateServerResult { get { @@ -844,7 +844,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Are you sure to remove the rules?. + /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 /// internal static string RemoveRules { get { @@ -853,7 +853,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Are you sure to remove the server?. + /// 查找类似 Are you sure to remove the server? 的本地化字符串。 /// internal static string RemoveServer { get { @@ -862,7 +862,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0},One of the required.. + /// 查找类似 {0},One of the required. 的本地化字符串。 /// internal static string RoutingRuleDetailRequiredTips { get { @@ -871,7 +871,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to The client configuration file is saved at: {0}. + /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 /// internal static string SaveClientConfigurationIn { get { @@ -880,7 +880,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to The server configuration file is saved at: {0}. + /// 查找类似 The server configuration file is saved at: {0} 的本地化字符串。 /// internal static string SaveServerConfigurationIn { get { @@ -889,7 +889,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Slow. + /// 查找类似 Slow 的本地化字符串。 /// internal static string SlowFresh { get { @@ -898,7 +898,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing.. + /// 查找类似 Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. 的本地化字符串。 /// internal static string SpeedServerTips { get { @@ -907,7 +907,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Speed Test.... + /// 查找类似 Speed Test... 的本地化字符串。 /// internal static string Speedtesting { get { @@ -916,7 +916,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PAC failed to start. Please run this program as Administrator.. + /// 查找类似 PAC failed to start. Please run this program as Administrator. 的本地化字符串。 /// internal static string StartPacFailed { get { @@ -925,7 +925,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start service ({0}).... + /// 查找类似 Start service ({0})... 的本地化字符串。 /// internal static string StartService { get { @@ -934,8 +934,8 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Configuration successful - ///{0}. + /// 查找类似 Configuration successful + ///{0} 的本地化字符串。 /// internal static string SuccessfulConfiguration { get { @@ -944,7 +944,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Custom configuration server imported successfully.. + /// 查找类似 Custom configuration server imported successfully. 的本地化字符串。 /// internal static string SuccessfullyImportedCustomServer { get { @@ -953,7 +953,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} servers have been imported from clipboard.. + /// 查找类似 {0} servers have been imported from clipboard. 的本地化字符串。 /// internal static string SuccessfullyImportedServerViaClipboard { get { @@ -962,7 +962,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Scan import URL successfully. + /// 查找类似 Scan import URL successfully 的本地化字符串。 /// internal static string SuccessfullyImportedServerViaScan { get { @@ -971,7 +971,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to System proxy. + /// 查找类似 System proxy 的本地化字符串。 /// internal static string SystemProxy { get { @@ -980,7 +980,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to The ping of current service: {0} ms. + /// 查找类似 The ping of current service: {0} ms 的本地化字符串。 /// internal static string TestMeOutput { get { @@ -989,7 +989,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Too many servers, please open the main interface. + /// 查找类似 Too many servers, please open the main interface 的本地化字符串。 /// internal static string TooManyServersTip { get { @@ -998,7 +998,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *tcp camouflage type. + /// 查找类似 *tcp camouflage type 的本地化字符串。 /// internal static string TransportHeaderTypeTip1 { get { @@ -1007,7 +1007,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *kcp camouflage type. + /// 查找类似 *kcp camouflage type 的本地化字符串。 /// internal static string TransportHeaderTypeTip2 { get { @@ -1016,7 +1016,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *QUIC camouflage type. + /// 查找类似 *QUIC camouflage type 的本地化字符串。 /// internal static string TransportHeaderTypeTip3 { get { @@ -1025,7 +1025,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *grpc mode. + /// 查找类似 *grpc mode 的本地化字符串。 /// internal static string TransportHeaderTypeTip4 { get { @@ -1034,7 +1034,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *ws path. + /// 查找类似 *ws path 的本地化字符串。 /// internal static string TransportPathTip1 { get { @@ -1043,7 +1043,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *h2 path. + /// 查找类似 *h2 path 的本地化字符串。 /// internal static string TransportPathTip2 { get { @@ -1052,7 +1052,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *QUIC key/Kcp seed. + /// 查找类似 *QUIC key/Kcp seed 的本地化字符串。 /// internal static string TransportPathTip3 { get { @@ -1061,7 +1061,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *grpc serviceName. + /// 查找类似 *grpc serviceName 的本地化字符串。 /// internal static string TransportPathTip4 { get { @@ -1070,7 +1070,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *Kcp seed. + /// 查找类似 *Kcp seed 的本地化字符串。 /// internal static string TransportPathTip5 { get { @@ -1079,7 +1079,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *http host Separated by commas (,). + /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 /// internal static string TransportRequestHostTip1 { get { @@ -1088,7 +1088,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *ws host. + /// 查找类似 *ws host 的本地化字符串。 /// internal static string TransportRequestHostTip2 { get { @@ -1097,7 +1097,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *h2 host Separated by commas (,). + /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 /// internal static string TransportRequestHostTip3 { get { @@ -1106,7 +1106,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *QUIC securty. + /// 查找类似 *QUIC securty 的本地化字符串。 /// internal static string TransportRequestHostTip4 { get { @@ -1115,7 +1115,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Ungrouped. + /// 查找类似 Ungrouped 的本地化字符串。 /// internal static string UngroupedServers { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 93b646b7..0aa08ec9 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -289,10 +289,10 @@ This feature relies on the Http global proxy, please set it correctly first. - Non-vmess or ss protocol + Non-VMess or ss protocol - non-Vmess service, this feature is invalid + non-standard service, this feature is invalid Core not found, please download: {0} diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index f2fcb46c..f4c8cc69 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -289,10 +289,10 @@ 此功能依赖Http全局代理,请先设置正确。 - 非vmess或ss协议 + 非VMess或ss协议 - 非Vmess服务,此功能无效 + 非标准服务,此功能无效 找不到Core,下载地址: {0} From f7e3eb180bc9354df811e936d2a1174a8da95277 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 1 Jul 2022 19:57:22 +0800 Subject: [PATCH 243/252] bug fix --- v2rayN/v2rayN/Forms/MainForm.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index aefdceb9..39b3a072 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -799,12 +799,20 @@ namespace v2rayN.Forms private void menuExport2ClientConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } MainFormHandler.Instance.Export2ClientConfig(lstVmess[index], config); } private void menuExport2ServerConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } MainFormHandler.Instance.Export2ServerConfig(lstVmess[index], config); } @@ -1244,7 +1252,6 @@ namespace v2rayN.Forms int index = GetLvSelectedIndex(); if (index < 0) { - UI.Show(ResUI.PleaseSelectServer); return; } if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, eMove) == 0) From 2b40e87eb90c072cfe5895474bb45da3f6b20237 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 1 Jul 2022 20:50:47 +0800 Subject: [PATCH 244/252] read handle from reg and show the window --- v2rayN/v2rayN/Forms/MainForm.cs | 6 ++++++ v2rayN/v2rayN/Program.cs | 23 +++++++++++++++++------ v2rayN/v2rayN/Tool/Utils.cs | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 39b3a072..eb7d337d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1138,6 +1138,12 @@ namespace v2rayN.Forms ShowInTaskbar = false; SetVisibleCore(false); + + //write Handle to reg + if (IsHandleCreated) + { + Utils.RegWriteValue(Global.MyRegPath, Utils.WindowHwndKey, Convert.ToString((long)Handle)); + } } #endregion diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index 8a3e27db..a8154406 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -1,18 +1,13 @@ using System; -using System.Diagnostics; using System.Threading; using System.Windows.Forms; using v2rayN.Forms; -using v2rayN.Properties; using v2rayN.Tool; namespace v2rayN { static class Program { - [System.Runtime.InteropServices.DllImport("user32.dll")] - private static extern bool SetProcessDPIAware(); - /// /// 应用程序的主入口点。 /// @@ -21,7 +16,7 @@ namespace v2rayN { if (Environment.OSVersion.Version.Major >= 6) { - SetProcessDPIAware(); + Utils.SetProcessDPIAware(); } Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); @@ -47,6 +42,22 @@ namespace v2rayN } else { + try + { + //read handle from reg and show the window + long.TryParse(Utils.RegReadValue(Global.MyRegPath, Utils.WindowHwndKey, ""), out long llong); + if (llong > 0) + { + var hwnd = (IntPtr)llong; + if (Utils.IsWindow(hwnd)) + { + Utils.ShowWindow(hwnd, 4); + Utils.SwitchToThisWindow(hwnd, true); + return; + } + } + } + catch { } UI.ShowWarning($"v2rayN is already running(v2rayN已经运行)"); } } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index b07c5929..54f65f35 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -24,6 +24,7 @@ using System.Web; using log4net; using System.Linq; using System.Security.Cryptography; +using System.Runtime.InteropServices; namespace v2rayN { @@ -1111,5 +1112,30 @@ namespace v2rayN #endregion + + #region Windows API + + public static string WindowHwndKey + { + get + { + return $"WindowHwnd_{GetMD5(StartupPath())}"; + } + } + + [DllImport("user32.dll")] + public static extern bool SetProcessDPIAware(); + + [DllImport("user32.dll")] + public static extern int ShowWindow(IntPtr hwnd, int nCmdShow); + + [DllImport("user32.dll")] + public static extern int SwitchToThisWindow(IntPtr hwnd, bool fUnknown); + + [DllImport("user32.dll")] + public static extern bool IsWindow(IntPtr hwnd); + + + #endregion } } From d83ae315ed8920b7ffb386bd2299b811c8fba609 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 2 Jul 2022 10:54:27 +0800 Subject: [PATCH 245/252] refactor traffic statistics --- v2rayN/v2rayN/Forms/MainForm.cs | 4 +- .../Forms/OptionSettingForm.Designer.cs | 60 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 30 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3936 ++++++++--------- .../Forms/OptionSettingForm.zh-Hans.resx | 255 +- v2rayN/v2rayN/Global.cs | 6 - v2rayN/v2rayN/Handler/ConfigHandler.cs | 9 +- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 2 +- 8 files changed, 2139 insertions(+), 2163 deletions(-) diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index eb7d337d..dc304ef3 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1189,8 +1189,8 @@ namespace v2rayN.Forms { try { - up /= (ulong)(config.statisticsFreshRate / 1000f); - down /= (ulong)(config.statisticsFreshRate / 1000f); + up /= (ulong)(config.statisticsFreshRate); + down /= (ulong)(config.statisticsFreshRate); mainMsgControl.SetToolSslInfo("speed", string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down))); foreach (var it in statistics) diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 052f42fe..d2968958 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -68,6 +68,7 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.numStatisticsFreshRate = new System.Windows.Forms.NumericUpDown(); this.txttrayMenuServersLimit = new System.Windows.Forms.TextBox(); this.label17 = new System.Windows.Forms.Label(); this.txtautoUpdateSubInterval = new System.Windows.Forms.TextBox(); @@ -79,7 +80,6 @@ this.label15 = new System.Windows.Forms.Label(); this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox(); 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(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); @@ -112,6 +112,7 @@ this.tabPage2.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numStatisticsFreshRate)).BeginInit(); this.tabPageCoreType.SuspendLayout(); this.tabPage3.SuspendLayout(); this.groupBox2.SuspendLayout(); @@ -120,33 +121,34 @@ // // 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); this.tabControl1.Controls.Add(this.tabPageCoreType); this.tabControl1.Controls.Add(this.tabPage3); - resources.ApplyResources(this.tabControl1, "tabControl1"); 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.label16); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtpass); @@ -163,7 +165,6 @@ 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; // @@ -213,8 +214,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"), @@ -240,6 +241,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[] { @@ -248,7 +250,6 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -268,10 +269,10 @@ // // tabPage2 // + resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Controls.Add(this.linkDnsObjectDoc); this.tabPage2.Controls.Add(this.txtremoteDNS); this.tabPage2.Controls.Add(this.label14); - resources.ApplyResources(this.tabPage2, "tabPage2"); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // @@ -294,6 +295,7 @@ // // tabPage6 // + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -307,7 +309,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; // @@ -379,6 +380,8 @@ // // tabPage7 // + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.numStatisticsFreshRate); this.tabPage7.Controls.Add(this.txttrayMenuServersLimit); this.tabPage7.Controls.Add(this.label17); this.tabPage7.Controls.Add(this.txtautoUpdateSubInterval); @@ -390,14 +393,17 @@ this.tabPage7.Controls.Add(this.label15); this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); - this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // numStatisticsFreshRate + // + resources.ApplyResources(this.numStatisticsFreshRate, "numStatisticsFreshRate"); + this.numStatisticsFreshRate.Name = "numStatisticsFreshRate"; + // // txttrayMenuServersLimit // resources.ApplyResources(this.txttrayMenuServersLimit, "txttrayMenuServersLimit"); @@ -459,13 +465,6 @@ this.chkKeepOlderDedupl.Name = "chkKeepOlderDedupl"; this.chkKeepOlderDedupl.UseVisualStyleBackColor = true; // - // cbFreshrate - // - this.cbFreshrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cbFreshrate.FormattingEnabled = true; - resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); - this.cbFreshrate.Name = "cbFreshrate"; - // // lbFreshrate // resources.ApplyResources(this.lbFreshrate, "lbFreshrate"); @@ -485,6 +484,7 @@ // // tabPageCoreType // + resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); this.tabPageCoreType.Controls.Add(this.cmbCoreType6); this.tabPageCoreType.Controls.Add(this.labCoreType6); this.tabPageCoreType.Controls.Add(this.cmbCoreType5); @@ -497,15 +497,14 @@ this.tabPageCoreType.Controls.Add(this.labCoreType2); this.tabPageCoreType.Controls.Add(this.cmbCoreType1); this.tabPageCoreType.Controls.Add(this.labCoreType1); - resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); this.tabPageCoreType.Name = "tabPageCoreType"; this.tabPageCoreType.UseVisualStyleBackColor = true; // // cmbCoreType6 // + resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); this.cmbCoreType6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType6.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); this.cmbCoreType6.Name = "cmbCoreType6"; // // labCoreType6 @@ -515,9 +514,9 @@ // // cmbCoreType5 // + resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); this.cmbCoreType5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType5.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); this.cmbCoreType5.Name = "cmbCoreType5"; // // labCoreType5 @@ -527,9 +526,9 @@ // // cmbCoreType4 // + resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); this.cmbCoreType4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType4.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); this.cmbCoreType4.Name = "cmbCoreType4"; // // labCoreType4 @@ -539,9 +538,9 @@ // // cmbCoreType3 // + resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); this.cmbCoreType3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType3.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); this.cmbCoreType3.Name = "cmbCoreType3"; // // labCoreType3 @@ -551,9 +550,9 @@ // // cmbCoreType2 // + resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); this.cmbCoreType2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType2.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); this.cmbCoreType2.Name = "cmbCoreType2"; // // labCoreType2 @@ -563,9 +562,9 @@ // // cmbCoreType1 // + resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); this.cmbCoreType1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbCoreType1.FormattingEnabled = true; - resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); this.cmbCoreType1.Name = "cmbCoreType1"; // // labCoreType1 @@ -575,19 +574,19 @@ // // tabPage3 // - this.tabPage3.Controls.Add(this.groupBox2); resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Controls.Add(this.groupBox2); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.label18); this.groupBox2.Controls.Add(this.cmbSystemProxyAdvancedProtocol); this.groupBox2.Controls.Add(this.label13); this.groupBox2.Controls.Add(this.label12); this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -598,8 +597,8 @@ // // cmbSystemProxyAdvancedProtocol // - this.cmbSystemProxyAdvancedProtocol.FormattingEnabled = true; resources.ApplyResources(this.cmbSystemProxyAdvancedProtocol, "cmbSystemProxyAdvancedProtocol"); + this.cmbSystemProxyAdvancedProtocol.FormattingEnabled = true; this.cmbSystemProxyAdvancedProtocol.Name = "cmbSystemProxyAdvancedProtocol"; // // label13 @@ -619,9 +618,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 @@ -657,6 +656,7 @@ this.tabPage6.PerformLayout(); this.tabPage7.ResumeLayout(false); this.tabPage7.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numStatisticsFreshRate)).EndInit(); this.tabPageCoreType.ResumeLayout(false); this.tabPageCoreType.PerformLayout(); this.tabPage3.ResumeLayout(false); @@ -704,7 +704,6 @@ private System.Windows.Forms.CheckBox chkAllowLANConn; private System.Windows.Forms.CheckBox chksniffingEnabled; private System.Windows.Forms.CheckBox chkEnableStatistics; - private System.Windows.Forms.ComboBox cbFreshrate; private System.Windows.Forms.Label lbFreshrate; private System.Windows.Forms.CheckBox chkKeepOlderDedupl; private System.Windows.Forms.CheckBox chkdefAllowInsecure; @@ -746,5 +745,6 @@ private System.Windows.Forms.Label label17; private System.Windows.Forms.ComboBox cmbSystemProxyAdvancedProtocol; private System.Windows.Forms.Label label18; + private System.Windows.Forms.NumericUpDown numStatisticsFreshRate; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 2011a1d2..5d065166 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -19,7 +19,7 @@ namespace v2rayN.Forms private void OptionSettingForm_Load(object sender, EventArgs e) { cmbSystemProxyAdvancedProtocol.Items.AddRange(Global.IEProxyProtocols.ToArray()); - + InitBase(); InitKCP(); @@ -88,32 +88,9 @@ namespace v2rayN.Forms chkAutoRun.Checked = Utils.IsAutoRun(); chkEnableStatistics.Checked = config.enableStatistics; + numStatisticsFreshRate.Value = config.statisticsFreshRate; chkKeepOlderDedupl.Checked = config.keepOlderDedupl; - ComboItem[] cbSource = new ComboItem[] - { - new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = ResUI.QuickFresh}, - new ComboItem{ID = (int)Global.StatisticsFreshRate.medium, Text = ResUI.MediumFresh}, - new ComboItem{ID = (int)Global.StatisticsFreshRate.slow, Text = ResUI.SlowFresh}, - }; - cbFreshrate.DataSource = cbSource; - - cbFreshrate.DisplayMember = "Text"; - cbFreshrate.ValueMember = "ID"; - - switch (config.statisticsFreshRate) - { - case (int)Global.StatisticsFreshRate.quick: - cbFreshrate.SelectedItem = cbSource[0]; - break; - case (int)Global.StatisticsFreshRate.medium: - cbFreshrate.SelectedItem = cbSource[1]; - break; - case (int)Global.StatisticsFreshRate.slow: - cbFreshrate.SelectedItem = cbSource[2]; - break; - } - chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13; @@ -309,7 +286,8 @@ namespace v2rayN.Forms bool lastEnableStatistics = config.enableStatistics; config.enableStatistics = chkEnableStatistics.Checked; - config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; + config.statisticsFreshRate = Convert.ToInt32(numStatisticsFreshRate.Value); + config.keepOlderDedupl = chkKeepOlderDedupl.Checked; config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index deaae1d2..d4682ccc 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1082 +117,89 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabPage6 + - - 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 - - - 397, 65 - - - 59, 12 - - - 39 - - - Auth pass - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - NoControl - - - 224, 65 - - - 59, 12 - - - 38 - - - Auth user - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - 496, 61 - - - 120, 21 - - - 37 - - - txtpass - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - 285, 61 - - - 97, 21 - - - 36 - - - txtuser - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - NoControl - - - 15, 192 - - - 102, 16 - - - 35 - - - allowInsecure - - - chkdefAllowInsecure - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - True - - - 15, 63 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - NoControl - - - 496, 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 - - - 6 - - - 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 - - - 7 - - - False - - - socks - - - http - - - 285, 25 - - - 97, 20 - - - 12 - - - cmbprotocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 351, 211 groupBox1 - - 8 - - - True - - - 224, 29 - - - 53, 12 - - - 11 - - - protocol - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - - - 397, 27 - - - 84, 16 - - - 10 - - - Enable UDP - - - chkudpEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - 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 - - - 11 - - - 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 - - - 12 - - - 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 - - - 13 - - - 124, 25 - - - 78, 21 - - - 3 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 14 - - - True - - - 33, 29 - - - 89, 12 - - - 2 - Listening port - - label2 + + 8 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 317, 12 - - groupBox1 + + panel2 - - 15 + + tabPage7 - - Fill + + tabPage7 - - 3, 3 + + 355, 16 - - 722, 421 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 + + 97, 21 - - groupBox1 + + error - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 0 - - - True - - - NoControl - - - 342, 17 - - - 0, 0, 0, 0 - - - 107, 12 - - - 40 - - - Support DnsObject - - - linkDnsObjectDoc - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - 8, 41 - - - True - - - Vertical - - - 638, 356 - - - 39 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 1 - - - True - - - NoControl - - - 8, 17 - - - 281, 12 - - - 38 - - - Custom DNS (multiple, separated by commas (,)) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 2 - - - 4, 22 - - - 728, 427 - - - 4 - - - Core: DNS 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 - - - 1 - - - True - - - 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 - - - 94, 21 - - - 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 + + 15, 129 readBufferSize - - label11 + + + NoControl - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + chkudpEnabled - - tabPage6 + + 45 - - 4 + + txtpass - - 345, 62 + + 282, 23 - - 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 + + info 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.ComboBox, 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 - - - tabPage6 - - - 12 - - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - - 351, 211 - - - 97, 21 - - - 45 - - - txttrayMenuServersLimit - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - True - - - NoControl - - - 27, 215 - - - 263, 12 - - - 44 - - - Tray right-click menu servers display limit - - - label17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - + 1 - - 351, 184 - - - 97, 21 - - - 43 - - - txtautoUpdateSubInterval - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 2 - - - True - - - NoControl - - - 27, 188 - - - 305, 12 - - - 42 - - - Automatic update interval of subscriptions (hours) - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3 - - - 15, 131 + + labCoreType4 506, 16 @@ -1200,961 +207,1954 @@ 41 - - Enable Security Protocol TLS v1.3 (subscription/update/speedtest) - - - chkEnableSecurityProtocolTls13 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 4 - - - True - - - NoControl - - - 15, 108 - - - 390, 16 - - - 40 - - - Automatically adjust column width after updating subscription - - - chkEnableAutoAdjustMainLvColWidth - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 5 - - - NoControl - - - 30, 376 - - - 282, 23 - - - 39 - - - Set Windows10 UWP Loopback - - - btnSetLoopback - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 6 - - - 351, 157 - - - 97, 21 - - - 38 - - - txtautoUpdateInterval - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 7 - - - True - - - NoControl - - - 27, 161 - - - 269, 12 - - - 37 - - - Automatic update interval of and Geo (hours) - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 8 - - - True - - - NoControl - - - 15, 85 - - - 234, 16 - - + 36 - - Ignore Geo files when updating core - - - chkIgnoreGeoUpdateCore - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 9 - - - True - - - NoControl - - - 15, 62 - - - 198, 16 - - - 33 - - - Keep older when deduplication - - - chkKeepOlderDedupl - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 10 - - - 620, 37 - - - 58, 20 - - - 32 - - - cbFreshrate - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 11 - - - True - - - NoControl - - - 489, 41 - - - 125, 12 - - - 30 - - - Statistics freshrate - - - lbFreshrate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 12 - - - True - - - NoControl - - - 15, 39 - - - 468, 16 - - - 29 - - - Enable Statistics (Realtime netspeed and traffic records. Require restart) - - - chkEnableStatistics - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 13 - - - True - - - 15, 16 - - - 246, 16 - - - 23 - - - Automatically start at system startup - - - chkAutoRun - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 14 - - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 3 - - - v2rayN settings - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 3 - - - 117, 172 - 143, 20 - - 46 - - - cmbCoreType6 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 0 - - - True - - - NoControl - - - 45, 176 - - - 59, 12 - - - 47 - - - Core Type - - - labCoreType6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 1 - - - 117, 146 - - - 143, 20 - - - 44 - - - cmbCoreType5 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 2 - - - True - - - NoControl - - - 45, 150 - - - 59, 12 - - - 45 - - - Core Type - - - labCoreType5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 3 - - - 117, 120 - - - 143, 20 - - - 42 - - - cmbCoreType4 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 4 - - - True - - - NoControl - - - 45, 124 - - - 59, 12 - - - 43 - - - Core Type - - - labCoreType4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 5 - - - 117, 94 - - - 143, 20 - - - 40 - - - cmbCoreType3 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 6 - - - True - - - NoControl - - - 45, 98 - - - 59, 12 - - - 41 - - - Core Type - - - labCoreType3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 7 - - - 117, 68 - - - 143, 20 - - - 38 - - - cmbCoreType2 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 8 - - - True - - - NoControl - - - 45, 72 - - - 59, 12 - - - 39 - - - Core Type - - - labCoreType2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 9 - - - 117, 42 - - - 143, 20 - - - 36 - - - cmbCoreType1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - 10 - + + 120, 21 + + True - - NoControl - - - 45, 46 - - - 59, 12 - - - 37 - - - Core Type - - - labCoreType1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPageCoreType - - - 11 - - - 4, 22 - - - 3, 3, 3, 3 - - - 728, 427 - - - 6 - - - CoreType settings - - - tabPageCoreType - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 4 - - - True - - - NoControl - - - 8, 346 - - - 329, 12 - - - 45 - - - Advanced proxy settings, protocol selection (optional) - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - 8, 371 - - - 638, 20 - - - 44 - - - cmbSystemProxyAdvancedProtocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - True - - - NoControl - - - 6, 283 - - - 107, 12 - - - 42 - - - Use semicolon (;) - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - True - - - NoControl - - - 8, 28 - - - 317, 12 - - - 40 - - - Do not use proxy server for addresses beginning with - - - label12 - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Log level + + + groupBox1 + + + panel1 + + + tabPage6 + + + 11 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 35 + + + 6 + + + 45, 150 + + + Enable UDP + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 131 + + + tabPage7 + + + 8, 41 + + + 45, 46 + + + 94, 21 + + + 390, 16 + + + groupBox1 + + + 2 + + + tabPage7 + + + 285, 25 + + + 15, 16 + + + 179, 12 + + + 97, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Statistics freshrate (second) + + + warning + + + 0 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + Keep older when deduplication + + + txtlocalPort + + + 84, 16 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + True + + + 15 + + + groupBox2 + + + System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 193, 162 + + + 342, 17 + + + 95, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 27, 188 + + + 8 + + + tabPage7 + + + 236, 66 + + + 1 + + + groupBox1 + + + 13 + + + 2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 39 + + + 124, 25 + + + True + + + 11 + + + 0 + + + 9 + + + protocol + + + True + + + tabPage6 + + + 3, 3, 3, 3 + + + True + + + chkEnableStatistics + + + OptionSettingForm + + + 9 + + + 12 + + + label14 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + Record local logs + + + Automatically adjust column width after updating subscription + + + Auth user + + + 3, 3, 3, 3 + + + label15 + + + 43 + + + labCoreType3 + + + 5 + + + True + + + System.Windows.Forms.TabPage, 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 + + + 33, 29 + + + 11 + + + 117, 172 + + + Use semicolon (;) + + + 75, 23 + + + tabControl1 + + + tabPage2 + + + 12 + + + 3, 3, 3, 3 + + + groupBox1 + + + lbFreshrate + + + labCoreType1 + + + 44 + + + 10 + + + 9 + + + 14 + + + 4, 4, 4, 4 + + + True + + + NoControl + + + 4, 22 + + + Core Type + + + 736, 453 + + + 59, 12 + + + 15, 108 + + + True + + + 2 + + + True + + + 31 + + + 0 + + + 36 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + none + + + 7 + + + 45, 98 + + + label10 + + + 94, 21 + + + 4 + + + True + + + 78, 21 + + + 3 + + + txtsystemProxyExceptions + + + 236, 104 + + + 42 + + + True + + + label11 + + + 12 + + + True + + + chkEnableAutoAdjustMainLvColWidth + + + 0 + + + 7 + + + $this + + + btnSetLoopback + + + chkEnableSecurityProtocolTls13 + + + 10 + + + 15, 160 + + + 97, 20 + + + 143, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 23 + + + cmbloglevel + + + 496, 61 + + + label16 + + + 20 + + + v2rayN settings + + + groupBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + tabPage7 + + + 4 + + + 120, 16 + + + groupBox1 + + + NoControl + + + cmbCoreType6 + + + True + + + 663, 37 + + + label17 + + + 97, 21 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageCoreType + + + tabPageCoreType + + + 496, 27 + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + cmbCoreType5 + + + tabPageCoreType + + + Do not use proxy server for addresses beginning with + + + tabPageCoreType + + + 0, 463 + + + 143, 20 + + + True + + + Bottom + + + tti + + + 468, 16 + + + Enable Security Protocol TLS v1.3 (subscription/update/speedtest) + + + 94, 21 + + + 0 + + + NoControl + + + groupBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + groupBox2 3 - - 8, 52 - - - True - - - Vertical - - - 638, 219 - - - 41 - - - txtsystemProxyExceptions - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - Fill - - - 0, 0 - - - 728, 427 - - - 42 - - - Exception - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage3 - - - 0 - - - 4, 22 - - - 728, 427 - - - 5 - - - System proxy settings - - - tabPage3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 5 - - - Fill - - - 0, 10 - - - 736, 453 - - - 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, 463 - - - 736, 60 - - - 11 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Top - - - 0, 0 - - - 736, 10 - - + 9 - - panel1 + + 94, 21 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - True - - - 6, 12 - - - 736, 523 - - - 4, 4, 4, 4 + + tabPage6 Settings - - OptionSettingForm + + System.Windows.Forms.ComboBox, 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 + + True + + 11 + + + 89, 12 + + + label12 + + + 0 + + + chkmuxEnabled + + + 0 + + + Automatic update interval of and Geo (hours) + + + label2 + + + 1 + + + Automatically start at system startup + + + groupBox1 + + + label6 + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 13 + + + label13 + + + 46 + + + 0 + + + tabControl1 + + + 111, 100 + + + 2 + + + 37 + + + label18 + + + 0 + + + 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 + + + True + + + 7 + + + Automatic update interval of subscriptions (hours) + + + Custom DNS (multiple, separated by commas (,)) + + + 2 + + + 30, 376 + + + chklogEnabled + + + True + + + 345, 62 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 59, 12 + + + 4 + + + 5 + + + 8, 17 + + + 41 + + + 39 + + + 111, 24 + + + 97, 21 + + + &OK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + txtKcpmtu + + + 6 + + + Fill + + + 3, 3 + + + NoControl + + + 8, 52 + + + 4 + + + 102, 16 + + + cmbCoreType4 + + + groupBox2 + + + Fill + + + groupBox1 + + + 6 + + + 736, 523 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + txtKcpwriteBufferSize + + + 18, 28 + + + 62, 21 + + + 736, 10 + + + 236, 28 + + + groupBox2 + + + groupBox1 + + + NoControl + + + 8 + + + 75, 23 + + + 0 + + + 345, 100 + + + 39 + + + 3 + + + 15, 63 + + + Exception + + + cmbSystemProxyAdvancedProtocol + + + tabPage7 + + + 38 + + + chkIgnoreGeoUpdateCore + + + NoControl + + + chksniffingEnabled + + + tabPage7 + + + 5 + + + labCoreType6 + + + 198, 16 + + + numStatisticsFreshRate + + + 0, 0, 0, 0 + + + 15, 62 + + + 0, 10 + + + NoControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 42 + + + 397, 65 + + + tabPageCoreType + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 44 + + + tabPage7 + + + 53, 12 + + + 2 + + + tabPageCoreType + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 5 + + + 728, 427 + + + labCoreType2 + + + 8 + + + NoControl + + + 8, 28 + + + 9 + + + 59, 12 + + + chkKeepOlderDedupl + + + 45 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 6, 12 + + + 84, 16 + + + 329, 12 + + + 1 + + + NoControl + + + label5 + + + 59, 12 + + + 728, 427 + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 728, 427 + + + True + + + 479, 41 + + + tabControl1 + + + 1 + + + tabPage1 + + + 45, 176 + + + 10 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9 + + + 3 + + + 351, 157 + + + 43 + + + 47 + + + 59, 12 + + + allowInsecure + + + 36 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + tabPage7 + + + Core Type + + + 728, 427 + + + True + + + btnOK + + + True + + + 8 + + + cmbCoreType3 + + + 397, 27 + + + 42 + + + System.Windows.Forms.Label, 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 + + + 41 + + + 42 + + + 45, 124 + + + tabPage7 + + + tabControl1 + + + 59, 12 + + + 10 + + + Core: basic settings + + + 6 + + + CoreType settings + + + 6 + + + 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 + + + tabPage3 + + + 263, 12 + + + panel2 + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + chkAutoRun + + + 143, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 192 + + + tabPage2 + + + btnClose + + + 638, 356 + + + chkdefAllowInsecure + + + 1 + + + groupBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 638, 219 + + + System.Windows.Forms.TextBox, 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 + + + 4 + + + tabPage3 + + + 40 + + + 143, 20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtKcptti + + + 23, 12 + + + 3, 3, 3, 3 + + + 23, 12 + + + 4, 22 + + + True + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 30 + + + 285, 61 + + + 45, 72 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + writeBufferSize + + + 117, 146 + + + Ignore Geo files when updating core + + + 736, 60 + + + 39 + + + 38 + + + txtKcpdownlinkCapacity + + + 117, 42 + + + label4 + + + 29 + + + label8 + + + 257, 158 + + + NoControl + + + True + + + &Cancel + + + 15, 85 + + + 4, 22 + + + 351, 184 + + + NoControl + + + groupBox1 + + + chkAllowLANConn + + + txtautoUpdateSubInterval + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 27, 215 + + + 89, 12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 234, 16 + + + 89, 12 + + + 12 + + + Tray right-click menu servers display limit + + + congestion + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 107, 12 + + + groupBox1 + + + False + + + 97, 20 + + + 5 + + + 11 + + + tabPage6 + + + txtuser + + + tabControl1 + + + 107, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 20 + + + 117, 120 + + + True + + + 143, 20 + + + 345, 24 + + + Top + + + 11 + + + True + + + NoControl + + + 4, 22 + + + NoControl + + + 8 + + + 59, 12 + + + 39 + + + 18, 66 + + + Allow connections from the LAN + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 18, 104 + + + Set Windows10 UWP Loopback + + + txtautoUpdateInterval + + + 246, 16 + + + tabPage1 + + + 2 + + + 94, 21 + + + Fill + + + True + + + 13 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 6 + + + Turn on Mux Multiplexing + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + tabPageCoreType + + + groupBox1 + + + 7 + + + 94, 21 + + + Turn on Sniffing + + + socks + + + tabPageCoreType + + + 117, 94 + + + 14 + + + 29 + + + http + + + True + + + NoControl + + + Vertical + + + 8 + + + True + + + 37 + + + label1 + + + 5 + + + groupBox1 + + + 37 + + + $this + + + 728, 427 + + + 3 + + + label9 + + + True + + + tabPage7 + + + txttrayMenuServersLimit + + + Support DnsObject + + + True + + + 267, 16 + + + NoControl + + + txtKcpuplinkCapacity + + + 3 + + + tabPage6 + + + 40 + + + 174, 16 + + + 224, 29 + + + 40 + + + 722, 421 + + + 117, 68 + + + 4 + + + True + + + 224, 65 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + cmbCoreType2 + + + 8, 346 + + + 38 + + + 281, 12 + + + NoControl + + + 20, 143 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Core Type + + + 44 + + + True + + + System proxy settings + + + 15 + + + 126, 16 + + + cmbCoreType1 + + + label3 + + + 5 + + + tabPage6 + + + 2 + + + label7 + + + NoControl + + + tabPage6 + + + 59, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtremoteDNS + + + Auth pass + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 40 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 204, 16 + + + True + + + 12 + + + 47 + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Core: DNS settings + + + 45 + + + 59, 12 + + + 27, 161 + + + 0, 0 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart) + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + debug + + + 7 + + + Core: KCP settings + + + tabControl1 + + + labCoreType5 + + + 111, 62 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 305, 12 + + + 38 + + + 1 + + + 4 + + + chkKcpcongestion + + + 1 + + + 0 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33 + + + 7 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 101, 12 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 269, 12 + + + 728, 427 + + + NoControl + + + tabPageCoreType + + + tabPage6 + + + 728, 427 + + + System.Windows.Forms.Button, 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 + + + 638, 20 + + + tabPageCoreType + + + True + + + 6, 283 + + + 11 + + + cmbprotocol + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 4 + + + 3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + tabPage2 + + + tabPageCoreType + + + NoControl + + + True + + + 9 + + + 0, 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 8, 371 + + + uplinkCapacity + + + 10 + + + 14 + + + tabControl1 + + + Advanced proxy settings, protocol selection (optional) + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + tabPage6 + + + 1 + + + 0 + + + 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 5f82648b..04e93138 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -121,123 +121,6 @@ 取消(&C) - - 654, 443 - - - Core:基础设置 - - - 654, 443 - - - Core:DNS设置 - - - 654, 443 - - - Core:KCP设置 - - - 248, 211 - - - 185, 12 - - - 托盘右键菜单服务器展示数量限制 - - - 248, 184 - - - 173, 12 - - - 自动更新订阅的间隔(单位小时) - - - 启用安全协议TLS v1.3 (订阅/检查更新/测速) - - - 204, 16 - - - 自动调整服务器列宽在更新订阅后 - - - 解除Windows10 UWP应用回环代理限制 - - - 248, 157 - - - 191, 12 - - - 自动更新Geo文件的间隔(单位小时) - - - 150, 16 - - - 更新Core时忽略Geo文件 - - - 156, 16 - - - 去重时保留序号较小的项 - - - 431, 37 - - - 339, 41 - - - 77, 12 - - - 统计刷新频率 - - - 300, 16 - - - 启用统计(实时网速显示和使用流量显示,需要重启) - - - 180, 16 - - - 开机自动启动(可能会不成功) - - - 654, 443 - - - v2rayN设置 - - - 654, 443 - - - Core类型设置 - - - 654, 443 - - - 系统代理设置 - - - 662, 469 - - - 648, 437 - 53, 12 @@ -325,6 +208,15 @@ 本地监听端口 + + 648, 437 + + + 654, 443 + + + Core:基础设置 + 161, 12 @@ -337,11 +229,110 @@ 自定义DNS(可多个,用逗号(,)隔开) - + 654, 443 - - 例外 + + Core:DNS设置 + + + 654, 443 + + + Core:KCP设置 + + + 472, 37 + + + 248, 211 + + + 185, 12 + + + 托盘右键菜单服务器展示数量限制 + + + 248, 184 + + + 173, 12 + + + 自动更新订阅的间隔(单位小时) + + + 启用安全协议TLS v1.3 (订阅/检查更新/测速) + + + 204, 16 + + + 自动调整服务器列宽在更新订阅后 + + + 解除Windows10 UWP应用回环代理限制 + + + 248, 157 + + + 191, 12 + + + 自动更新Geo文件的间隔(单位小时) + + + 150, 16 + + + 更新Core时忽略Geo文件 + + + 156, 16 + + + 去重时保留序号较小的项 + + + 339, 41 + + + 125, 12 + + + 统计刷新频率(单位秒) + + + 300, 16 + + + 启用统计(实时网速显示和使用流量显示,需要重启) + + + 180, 16 + + + 开机自动启动(可能会不成功) + + + 654, 443 + + + v2rayN设置 + + + 654, 443 + + + Core类型设置 + + + 173, 12 + + + 高级代理设置, 协议选择(可选) 95, 12 @@ -355,15 +346,30 @@ 对于下列字符开头的地址不使用代理服务器: + + 654, 443 + + + 例外 + + + 654, 443 + + + 系统代理设置 + + + 662, 469 + + + 确定(&O) + 0, 479 662, 60 - - 确定(&O) - 662, 10 @@ -373,7 +379,4 @@ 参数设置 - - 高级代理设置, 协议选择(可选) - \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index a6bc8353..8de35296 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -191,12 +191,6 @@ namespace v2rayN /// public const string CustomIconName = "v2rayN.ico"; - public enum StatisticsFreshRate - { - quick = 1000, - medium = 2000, - slow = 3000 - } 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.*"; diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index d616a75c..9b51f78a 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -54,11 +54,9 @@ namespace v2rayN.Handler //Mux muxEnabled = false, - // 默认不开启统计 enableStatistics = false, - // 默认中等刷新率 - statisticsFreshRate = (int)Global.StatisticsFreshRate.medium, + statisticsFreshRate = 1, enableRoutingAdvanced = true }; @@ -158,7 +156,10 @@ namespace v2rayN.Handler { config.groupItem = new List(); } - + if (config.statisticsFreshRate > 100) + { + config.statisticsFreshRate = 1; + } if (config == null || config.vmess.Count <= 0 diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index 6465db26..32242e3f 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -127,7 +127,7 @@ namespace v2rayN.Handler } } } - Thread.Sleep(config_.statisticsFreshRate); + Thread.Sleep(1000 * config_.statisticsFreshRate); channel_.ConnectAsync(); } catch (Exception ex) From f5ecda9255e6c93c25afa3fcfaa6a51078a916ae Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 2 Jul 2022 11:11:23 +0800 Subject: [PATCH 246/252] add exception log --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 3 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 3 +- v2rayN/v2rayN/Handler/QRCodeHelper.cs | 6 ++- v2rayN/v2rayN/Handler/ShareHandler.cs | 6 ++- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 47 ++++++++++++++------- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index a2405adf..ebd58c3d 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -51,8 +51,9 @@ namespace v2rayN.Base return await response.Content.ReadAsStringAsync(); } - catch + catch (Exception ex) { + Utils.SaveLog("GetAsync", ex); } return null; } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 9b51f78a..77b804d1 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -481,8 +481,9 @@ namespace v2rayN.Handler File.Delete(fileName); } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); return -1; } diff --git a/v2rayN/v2rayN/Handler/QRCodeHelper.cs b/v2rayN/v2rayN/Handler/QRCodeHelper.cs index 2fc56954..4214f485 100644 --- a/v2rayN/v2rayN/Handler/QRCodeHelper.cs +++ b/v2rayN/v2rayN/Handler/QRCodeHelper.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System; +using System.Drawing; using ZXing; using ZXing.QrCode; @@ -34,8 +35,9 @@ namespace v2rayN.Handler img = (Image)bmp; return img; } - catch + catch(Exception ex) { + Utils.SaveLog(ex.Message, ex); return img; } } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 20b56da1..55a40eac 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -51,8 +51,9 @@ namespace v2rayN.Handler } return url; } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); return ""; } } @@ -360,8 +361,9 @@ namespace v2rayN.Handler return null; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); msg = ResUI.Incorrectconfiguration; return null; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 4d4f6b0b..a5707bee 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -83,8 +83,9 @@ namespace v2rayN.Handler msg = string.Format(ResUI.SuccessfulConfiguration, $"[{config.GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } - catch + catch (Exception ex) { + Utils.SaveLog("GenerateClientConfig", ex); msg = ResUI.FailedGenDefaultConfiguration; return -1; } @@ -130,8 +131,9 @@ namespace v2rayN.Handler } } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -176,8 +178,9 @@ namespace v2rayN.Handler } } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -246,8 +249,9 @@ namespace v2rayN.Handler } } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -345,8 +349,9 @@ namespace v2rayN.Handler } } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -581,8 +586,9 @@ namespace v2rayN.Handler outbound.settings.vnext = null; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -804,8 +810,9 @@ namespace v2rayN.Handler break; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -849,8 +856,9 @@ namespace v2rayN.Handler }; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -1040,8 +1048,9 @@ namespace v2rayN.Handler msg = string.Format(ResUI.SuccessfulConfiguration, node.GetSummary()); } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); msg = ResUI.FailedGenDefaultConfiguration; return -1; } @@ -1091,8 +1100,9 @@ namespace v2rayN.Handler boundStreamSettings(node, "in", inbound.streamSettings); } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -1112,8 +1122,9 @@ namespace v2rayN.Handler v2rayConfig.outbounds[0].settings = null; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -1258,8 +1269,9 @@ namespace v2rayN.Handler vmessItem.streamSecurity = Global.StreamSecurity; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1403,8 +1415,9 @@ namespace v2rayN.Handler vmessItem.streamSecurity = Global.StreamSecurity; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1472,7 +1485,10 @@ namespace v2rayN.Handler { lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); } - catch { } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } log(configCopy, ref v2rayConfig, false); //routing(config, ref v2rayConfig); @@ -1548,8 +1564,9 @@ namespace v2rayN.Handler //msg = string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); return Utils.ToJson(v2rayConfig); } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); msg = ResUI.FailedGenDefaultConfiguration; return ""; } From 3079f1c651cffc0b3594af62339c06dc8e5caefd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 2 Jul 2022 20:02:20 +0800 Subject: [PATCH 247/252] Improve subscription update --- v2rayN/v2rayN/Base/HttpClientHelper.cs | 24 ++++++------------------ v2rayN/v2rayN/Handler/DownloadHandle.cs | 1 + v2rayN/v2rayN/Handler/UpdateHandle.cs | 17 ++++++++++++++--- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index ebd58c3d..a3bacb5d 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -45,17 +45,9 @@ namespace v2rayN.Base { return null; } - try - { - HttpResponseMessage response = await httpClient.GetAsync(url); + HttpResponseMessage response = await httpClient.GetAsync(url); - return await response.Content.ReadAsStringAsync(); - } - catch (Exception ex) - { - Utils.SaveLog("GetAsync", ex); - } - return null; + return await response.Content.ReadAsStringAsync(); } public async Task GetAsync(HttpClient client, string url, CancellationToken token) { @@ -63,16 +55,12 @@ namespace v2rayN.Base { return null; } - try + HttpResponseMessage response = await client.GetAsync(url, token); + if (!response.IsSuccessStatusCode) { - HttpResponseMessage response = await client.GetAsync(url, token); - return await response.Content.ReadAsStringAsync(); + throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); } - catch (Exception ex) - { - Utils.SaveLog("GetAsync", ex); - } - return null; + return await response.Content.ReadAsStringAsync(); } public async Task PutAsync(string url, Dictionary headers) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 27595b9e..c2fb9914 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -166,6 +166,7 @@ namespace v2rayN.Handler catch (Exception ex) { Utils.SaveLog(ex.Message, ex); + Error?.Invoke(this, new ErrorEventArgs(ex)); } return null; } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 01038ec4..88ade46d 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -198,20 +198,31 @@ namespace v2rayN.Handler continue; } + var downloadHandle = new DownloadHandle(); + downloadHandle.Error += (sender2, args) => + { + _updateFunc(false, $"{hashCode}{args.GetException().Message}"); + }; + _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); - var result = await (new DownloadHandle()).DownloadStringAsync(url, blProxy, userAgent); + var result = await downloadHandle.DownloadStringAsync(url, blProxy, userAgent); if (blProxy && Utils.IsNullOrEmpty(result)) { - result = await (new DownloadHandle()).DownloadStringAsync(url, false, userAgent); + result = await downloadHandle.DownloadStringAsync(url, false, userAgent); } - _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); if (Utils.IsNullOrEmpty(result)) { _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); } else { + _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); + if (result.Length < 99) + { + _updateFunc(false, $"{hashCode}{result}"); + } + int ret = ConfigHandler.AddBatchServers(ref config, result, id, groupId); _updateFunc(false, ret > 0 From 069d47f01b4cdd8f361400ef5283f9333558fec3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 2 Jul 2022 20:03:13 +0800 Subject: [PATCH 248/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index f9f9ef99..5558e615 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.27")] +[assembly: AssemblyFileVersion("5.28")] From fd7d688e6bb8e33434f1d5596a9fdd4962e52347 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 3 Jul 2022 09:07:48 +0800 Subject: [PATCH 249/252] Improve subscription update --- v2rayN/v2rayN/Handler/DownloadHandle.cs | 47 +++++++++++++++++++++---- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index c2fb9914..5d4d3caf 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -66,7 +67,11 @@ namespace v2rayN.Handler catch (Exception ex) { //Utils.SaveLog(ex.Message, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } return 0; } @@ -104,7 +109,11 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } } @@ -167,6 +176,10 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } return null; } @@ -239,13 +252,35 @@ namespace v2rayN.Handler return null; } var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp); - var webProxy = new WebProxy(Global.Loopback, httpPort); - if (RunAvailabilityCheck(webProxy) > 0) + if (!SocketCheck(Global.Loopback, httpPort)) { - return webProxy; + return null; } - return null; + return new WebProxy(Global.Loopback, httpPort); + } + + private bool SocketCheck(string ip, int port) + { + Socket sock = null; + try + { + IPAddress ipa = IPAddress.Parse(ip); + IPEndPoint point = new IPEndPoint(ipa, port); + sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + sock.Connect(point); + return true; + } + catch { } + finally + { + if (sock != null) + { + sock.Close(); + sock.Dispose(); + } + } + return false; } } } From a331c70233137a97c298380a14d38a1f2dacaaa0 Mon Sep 17 00:00:00 2001 From: Miro11 <69784329+Miroxyz@users.noreply.github.com> Date: Mon, 4 Jul 2022 14:02:40 +0800 Subject: [PATCH 250/252] Update Clash.Meta coreExes --- v2rayN/v2rayN/Handler/LazyConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index 0f15823d..fb8bd77b 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -112,7 +112,7 @@ namespace v2rayN.Handler coreInfos.Add(new CoreInfo { coreType = ECoreType.clash_meta, - coreExes = new List { "Clash.Meta-windows-amd64v1", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, + coreExes = new List { "Clash.Meta-windows-amd64v1", "Clash.Meta-windows-amd64", "Clash.Meta-windows-amd64-compatible", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, arguments = "-f config.json", coreUrl = Global.clashMetaCoreUrl, coreLatestUrl = Global.clashMetaCoreUrl + "/latest", From b58e524d78212f8dcb0f11e70475aeb424122e68 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Jul 2022 20:47:39 +0800 Subject: [PATCH 251/252] bugfix --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 77b804d1..9f50d6d9 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -978,7 +978,9 @@ namespace v2rayN.Handler else if (clipboardData.IndexOf("server") >= 0 && clipboardData.IndexOf("up") >= 0 && clipboardData.IndexOf("down") >= 0 - && clipboardData.IndexOf("listen") >= 0) + && clipboardData.IndexOf("listen") >= 0 + && clipboardData.IndexOf("") < 0 + && clipboardData.IndexOf("") < 0) { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); File.WriteAllText(fileName, clipboardData); @@ -989,7 +991,9 @@ namespace v2rayN.Handler } //Is naiveproxy configuration else if (clipboardData.IndexOf("listen") >= 0 - && clipboardData.IndexOf("proxy") >= 0) + && clipboardData.IndexOf("proxy") >= 0 + && clipboardData.IndexOf("") < 0 + && clipboardData.IndexOf("") < 0) { var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); File.WriteAllText(fileName, clipboardData); From 6e5781c633ef2cc8daa23ecc5845c6c8a6c8b89b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 4 Jul 2022 20:56:04 +0800 Subject: [PATCH 252/252] Update AssemblyInfo.cs --- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 5558e615..e0b57fdc 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("5.28")] +[assembly: AssemblyFileVersion("5.29")]