├── CrapChat2 ├── README.md ├── Icon.ico ├── packages.config ├── FoundServer.cs ├── Program.cs ├── LICENSE.md ├── Properties │ ├── Settings.settings │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Settings.Designer.cs │ └── Resources.resx ├── App.config ├── Audio.cs ├── CrapChat2.csproj ├── Net.cs ├── CClient.cs ├── CServer.cs ├── Main.cs ├── Main.Designer.cs └── Main.resx ├── Guide Images ├── Base.png ├── Name.png ├── Port and Refresh.png └── Host Port and Name.png ├── CrapChat2.sln ├── LICENSE.md ├── .gitignore └── README.md /CrapChat2/README.md: -------------------------------------------------------------------------------- 1 | CrapChat2 2 | -------------------------------------------------------------------------------- /CrapChat2/Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/CrapChat2/Icon.ico -------------------------------------------------------------------------------- /Guide Images/Base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Base.png -------------------------------------------------------------------------------- /Guide Images/Name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Name.png -------------------------------------------------------------------------------- /Guide Images/Port and Refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Port and Refresh.png -------------------------------------------------------------------------------- /Guide Images/Host Port and Name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Epicguru/CChat2/HEAD/Guide Images/Host Port and Name.png -------------------------------------------------------------------------------- /CrapChat2/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /CrapChat2/FoundServer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace CrapChat 9 | { 10 | public struct FoundServer 11 | { 12 | public string Name; 13 | public IPEndPoint EndPoint; 14 | 15 | public override string ToString() 16 | { 17 | return Name == null ? "" : Name.Trim(); 18 | } 19 | 20 | public bool IsInvalid() 21 | { 22 | return this.EndPoint == null; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /CrapChat2/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace CrapChat 8 | { 9 | static class Program 10 | { 11 | 12 | /// 13 | /// The main entry point for the application. 14 | /// 15 | [STAThread] 16 | static void Main() 17 | { 18 | Application.EnableVisualStyles(); 19 | Application.SetCompatibleTextRenderingDefault(false); 20 | Application.Run(new Main()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CrapChat2.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27428.2015 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrapChat2", "CrapChat2\CrapChat2.csproj", "{D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Debug|x64.ActiveCfg = Debug|x64 15 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Debug|x64.Build.0 = Debug|x64 16 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Release|x64.ActiveCfg = Release|x64 17 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC}.Release|x64.Build.0 = Release|x64 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {72F07010-BF10-49B1-ABB1-F89C6C06B1EA} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2018 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /CrapChat2/LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2018 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /CrapChat2/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Anon 7 | 8 | 9 | 14242 10 | 11 | 12 | New Server 13 | 14 | 15 | 14242 16 | 17 | 18 | 10000 19 | 20 | 21 | False 22 | 23 | 24 | -------------------------------------------------------------------------------- /CrapChat2/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CrapChat2")] 9 | [assembly: AssemblyDescription("It's like discord, but for people who play on LAN. Also way crappier, hence the name.")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Epicguru")] 12 | [assembly: AssemblyProduct("CrapChat2")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("d2f9bf3a-dde6-4f8e-b462-fa241f1661ac")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CrapChat2/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Anon 15 | 16 | 17 | 14242 18 | 19 | 20 | New Server 21 | 22 | 23 | 14242 24 | 25 | 26 | 10000 27 | 28 | 29 | False 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /CrapChat2/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CrapChat.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CrapChat.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /CrapChat2/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CrapChat.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("Anon")] 29 | public string DefaultUsername { 30 | get { 31 | return ((string)(this["DefaultUsername"])); 32 | } 33 | } 34 | 35 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 36 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 37 | [global::System.Configuration.DefaultSettingValueAttribute("14242")] 38 | public int DefaultPort { 39 | get { 40 | return ((int)(this["DefaultPort"])); 41 | } 42 | } 43 | 44 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 45 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 46 | [global::System.Configuration.DefaultSettingValueAttribute("New Server")] 47 | public string DefaultNewServerName { 48 | get { 49 | return ((string)(this["DefaultNewServerName"])); 50 | } 51 | } 52 | 53 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 54 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 55 | [global::System.Configuration.DefaultSettingValueAttribute("14242")] 56 | public int DefaultNewServerPort { 57 | get { 58 | return ((int)(this["DefaultNewServerPort"])); 59 | } 60 | } 61 | 62 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 64 | [global::System.Configuration.DefaultSettingValueAttribute("10000")] 65 | public int AutoRefreshInterval { 66 | get { 67 | return ((int)(this["AutoRefreshInterval"])); 68 | } 69 | } 70 | 71 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 72 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 73 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 74 | public bool AutoLogin { 75 | get { 76 | return ((bool)(this["AutoLogin"])); 77 | } 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opensdf 80 | *.sdf 81 | *.cachefile 82 | 83 | # Visual Studio profiler 84 | *.psess 85 | *.vsp 86 | *.vspx 87 | *.sap 88 | 89 | # TFS 2012 Local Workspace 90 | $tf/ 91 | 92 | # Guidance Automation Toolkit 93 | *.gpState 94 | 95 | # ReSharper is a .NET coding add-in 96 | _ReSharper*/ 97 | *.[Rr]e[Ss]harper 98 | *.DotSettings.user 99 | 100 | # JustCode is a .NET coding add-in 101 | .JustCode 102 | 103 | # TeamCity is a build add-in 104 | _TeamCity* 105 | 106 | # DotCover is a Code Coverage Tool 107 | *.dotCover 108 | 109 | # NCrunch 110 | _NCrunch_* 111 | .*crunch*.local.xml 112 | nCrunchTemp_* 113 | 114 | # MightyMoose 115 | *.mm.* 116 | AutoTest.Net/ 117 | 118 | # Web workbench (sass) 119 | .sass-cache/ 120 | 121 | # Installshield output folder 122 | [Ee]xpress/ 123 | 124 | # DocProject is a documentation generator add-in 125 | DocProject/buildhelp/ 126 | DocProject/Help/*.HxT 127 | DocProject/Help/*.HxC 128 | DocProject/Help/*.hhc 129 | DocProject/Help/*.hhk 130 | DocProject/Help/*.hhp 131 | DocProject/Help/Html2 132 | DocProject/Help/html 133 | 134 | # Click-Once directory 135 | publish/ 136 | 137 | # Publish Web Output 138 | *.[Pp]ublish.xml 139 | *.azurePubxml 140 | # TODO: Comment the next line if you want to checkin your web deploy settings 141 | # but database connection strings (with potential passwords) will be unencrypted 142 | *.pubxml 143 | *.publishproj 144 | 145 | # NuGet Packages 146 | *.nupkg 147 | # The packages folder can be ignored because of Package Restore 148 | **/packages/* 149 | # except build/, which is used as an MSBuild target. 150 | !**/packages/build/ 151 | # Uncomment if necessary however generally it will be regenerated when needed 152 | #!**/packages/repositories.config 153 | 154 | # Windows Azure Build Output 155 | csx/ 156 | *.build.csdef 157 | 158 | # Windows Store app package directory 159 | AppPackages/ 160 | 161 | # Visual Studio cache files 162 | # files ending in .cache can be ignored 163 | *.[Cc]ache 164 | # but keep track of directories ending in .cache 165 | !*.[Cc]ache/ 166 | 167 | # Others 168 | ClientBin/ 169 | [Ss]tyle[Cc]op.* 170 | ~$* 171 | *~ 172 | *.dbmdl 173 | *.dbproj.schemaview 174 | *.pfx 175 | *.publishsettings 176 | node_modules/ 177 | orleans.codegen.cs 178 | 179 | # RIA/Silverlight projects 180 | Generated_Code/ 181 | 182 | # Backup & report files from converting an old project file 183 | # to a newer Visual Studio version. Backup files are not needed, 184 | # because we have git ;-) 185 | _UpgradeReport_Files/ 186 | Backup*/ 187 | UpgradeLog*.XML 188 | UpgradeLog*.htm 189 | 190 | # SQL Server files 191 | *.mdf 192 | *.ldf 193 | 194 | # Business Intelligence projects 195 | *.rdl.data 196 | *.bim.layout 197 | *.bim_*.settings 198 | 199 | # Microsoft Fakes 200 | FakesAssemblies/ 201 | 202 | # Node.js Tools for Visual Studio 203 | .ntvs_analysis.dat 204 | 205 | # Visual Studio 6 build log 206 | *.plg 207 | 208 | # Visual Studio 6 workspace options file 209 | *.opt 210 | 211 | # Visual Studio LightSwitch build output 212 | **/*.HTMLClient/GeneratedArtifacts 213 | **/*.DesktopClient/GeneratedArtifacts 214 | **/*.DesktopClient/ModelManifest.xml 215 | **/*.Server/GeneratedArtifacts 216 | **/*.Server/ModelManifest.xml 217 | _Pvt_Extensions -------------------------------------------------------------------------------- /CrapChat2/Audio.cs: -------------------------------------------------------------------------------- 1 | using Lidgren.Network; 2 | using NAudio.Wave; 3 | using NAudio.Wave.SampleProviders; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace CrapChat 11 | { 12 | public static class Audio 13 | { 14 | public static Dictionary Providers = new Dictionary(); 15 | public static Dictionary IDs = new Dictionary(); 16 | public static WaveOutEvent Output; 17 | public static WaveInEvent Input; 18 | public static MixingSampleProvider Mixer; 19 | public static bool Initialized = false; 20 | 21 | private static int maxID; 22 | const int SAMPLE_RATE = 44100; 23 | const int CHANNELS = 1; 24 | 25 | public static WaveFormat GetFormat() 26 | { 27 | return WaveFormat.CreateIeeeFloatWaveFormat(SAMPLE_RATE, CHANNELS); 28 | } 29 | 30 | public static void InitAll() 31 | { 32 | if (Initialized) 33 | { 34 | Main.Log("[AUDIO] Already initialized!"); 35 | return; 36 | } 37 | 38 | Input = new WaveInEvent(); 39 | Input.WaveFormat = GetFormat(); 40 | Input.BufferMilliseconds = 25; 41 | Input.DataAvailable += NewInputData; 42 | Input.StartRecording(); 43 | 44 | Mixer = new MixingSampleProvider(GetFormat()); 45 | Mixer.ReadFully = true; 46 | 47 | Output = new WaveOutEvent(); 48 | Output.DesiredLatency = 60; 49 | Output.Init(Mixer); 50 | Output.Play(); 51 | 52 | Initialized = true; 53 | Main.Log("[AUDIO] Initialized."); 54 | } 55 | 56 | public static int GetOrCreateID(NetConnection n) 57 | { 58 | if (n == null) 59 | return -1; 60 | 61 | if (IDs.ContainsKey(n)) 62 | { 63 | return IDs[n]; 64 | } 65 | else 66 | { 67 | IDs.Add(n, maxID++); 68 | return maxID - 1; 69 | } 70 | } 71 | 72 | public static void QueuePlay(int key, byte[] bytes, int count) 73 | { 74 | if (!Providers.ContainsKey(key)) 75 | { 76 | Main.Log("Creating new Buffered Wave Provider for key '" + key + "'"); 77 | BufferedWaveProvider bufferedWave = new BufferedWaveProvider(GetFormat()); 78 | bufferedWave.BufferLength = (32 / 8) * SAMPLE_RATE * CHANNELS * 5; // 5 seconds of buffer. 79 | Mixer.AddMixerInput(bufferedWave); 80 | Providers[key] = bufferedWave; 81 | 82 | } 83 | Providers[key].AddSamples(bytes, 0, count); 84 | //Main.Log("Buffer @ " + Math.Round((float)Providers[key].BufferedBytes / Providers[key].BufferLength * 100f) + "%"); 85 | } 86 | 87 | public static void ClearAll() 88 | { 89 | if (!Initialized) 90 | { 91 | Main.Log("[AUDIO] Not initialized, cannot clear all!"); 92 | return; 93 | } 94 | 95 | foreach (var item in Providers) 96 | { 97 | item.Value.ClearBuffer(); 98 | } 99 | Providers.Clear(); 100 | IDs.Clear(); 101 | Mixer.RemoveAllMixerInputs(); 102 | Output.Stop(); 103 | Input.StopRecording(); 104 | 105 | Mixer = null; 106 | Output = null; 107 | Input = null; 108 | maxID = 0; 109 | 110 | Initialized = false; 111 | Main.Log("[AUDIO] Cleared all data, reset."); 112 | } 113 | 114 | private static void NewInputData(object sender, WaveInEventArgs e) 115 | { 116 | if (Net.IsConnected) 117 | { 118 | // Client... 119 | Net.Client.SendAudio(e.Buffer, e.BytesRecorded); 120 | } 121 | else if(Net.IsServer) 122 | { 123 | // Server... 124 | Net.Server.SendAudio(e.Buffer, e.BytesRecorded); 125 | } 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /CrapChat2/CrapChat2.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {D2F9BF3A-DDE6-4F8E-B462-FA241F1661AC} 8 | Exe 9 | CrapChat 10 | CrapChat2 11 | v4.7.1 12 | 512 13 | true 14 | 15 | 16 | CrapChat.Program 17 | 18 | 19 | true 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | full 23 | x64 24 | prompt 25 | MinimumRecommendedRules.ruleset 26 | true 27 | 28 | 29 | bin\Release\ 30 | TRACE 31 | true 32 | pdbonly 33 | x64 34 | prompt 35 | MinimumRecommendedRules.ruleset 36 | true 37 | 38 | 39 | Icon.ico 40 | 41 | 42 | 43 | ..\packages\Lidgren.Network.1.0.2\lib\net451\Lidgren.Network.dll 44 | 45 | 46 | ..\packages\NAudio.1.8.5\lib\net35\NAudio.dll 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | Form 67 | 68 | 69 | Main.cs 70 | 71 | 72 | 73 | 74 | 75 | Main.cs 76 | 77 | 78 | ResXFileCodeGenerator 79 | Resources.Designer.cs 80 | Designer 81 | 82 | 83 | True 84 | Resources.resx 85 | True 86 | 87 | 88 | 89 | SettingsSingleFileGenerator 90 | Settings.Designer.cs 91 | 92 | 93 | True 94 | Settings.settings 95 | True 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /CrapChat2/Net.cs: -------------------------------------------------------------------------------- 1 | using CrapChat; 2 | using Lidgren.Network; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace CrapChat 10 | { 11 | public static class Net 12 | { 13 | public const string APP_ID = "Crap Chat 2"; 14 | public static CClient Client; 15 | public static CServer Server; 16 | 17 | public static bool IsClient 18 | { 19 | get 20 | { 21 | return Client != null; 22 | } 23 | } 24 | 25 | public static bool IsServer 26 | { 27 | get 28 | { 29 | return Server != null; 30 | } 31 | } 32 | 33 | public static bool IsConnected 34 | { 35 | get 36 | { 37 | return IsClient && Client.Status == NetPeerStatus.Running && Client.ConnectionStatus == NetConnectionStatus.Connected; 38 | } 39 | } 40 | 41 | public static bool IsConnecting 42 | { 43 | get 44 | { 45 | return IsClient && Client.Status == NetPeerStatus.Running && Client.ConnectionStatus != NetConnectionStatus.Disconnected; 46 | } 47 | } 48 | 49 | public static void StartClient() 50 | { 51 | if (IsClient) 52 | { 53 | Main.Log("Client is already started, cannot start a new one."); 54 | return; 55 | } 56 | 57 | var config = new NetPeerConfiguration(APP_ID); 58 | config.EnableMessageType(NetIncomingMessageType.DiscoveryResponse); 59 | 60 | Client = new CClient(null, config); 61 | Client.Start(); 62 | 63 | Main.Log("Started client..."); 64 | } 65 | 66 | public static void StopClient() 67 | { 68 | if (!IsClient) 69 | { 70 | Main.Log("Client is not running..."); 71 | return; 72 | } 73 | 74 | Client.Shutdown("The user has disconnected from the server. Bye!"); 75 | Client = null; 76 | } 77 | 78 | public static bool ConnectClient(string ip, int port) 79 | { 80 | if (!IsClient) 81 | return false; 82 | if (IsConnected || IsConnecting) 83 | return false; 84 | 85 | Main.Log("Attempting to connect to " + ip + " on port " + port); 86 | 87 | try 88 | { 89 | Client.Connect(ip, port, Client.CreateMessage(Main.ActiveUsername)); 90 | return true; 91 | } 92 | catch (Exception e) 93 | { 94 | Main.Log(e); 95 | return false; 96 | } 97 | } 98 | 99 | public static void UponClientConnected() 100 | { 101 | Audio.InitAll(); 102 | Main.UponConnected(); 103 | } 104 | 105 | public static void UponClientDisconnected() 106 | { 107 | Client = null; 108 | Audio.ClearAll(); 109 | Main.UponDisconnected(); 110 | } 111 | 112 | public static void DiscoverPeers(int port, CClient.ServerFound callback) 113 | { 114 | if (!IsClient) 115 | { 116 | Main.Log("Cannot discover peers, client is not started."); 117 | return; 118 | } 119 | Main.Log("Scanning for local peers on " + port + "..."); 120 | Client.StartDiscovery(port, callback); 121 | } 122 | 123 | public static bool StartServer(int port, string name) 124 | { 125 | if (IsServer) 126 | { 127 | Main.Log("Server already started, shut it down before you open a new one."); 128 | return false; 129 | } 130 | if (IsClient && (IsConnected || IsConnecting)) 131 | { 132 | Main.Log("Cannot host server while client is active."); 133 | return false; 134 | } 135 | 136 | var config = new NetPeerConfiguration(APP_ID); 137 | config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest); 138 | config.EnableMessageType(NetIncomingMessageType.ConnectionApproval); 139 | config.Port = port; 140 | 141 | Server = new CServer(name, config); 142 | Server.Start(); 143 | 144 | Main.Log("Started hosting server on port " + port + " called " + name); 145 | 146 | Main.SetStatus("Hosting Server (" + name.Trim() + ", " + port + ")"); 147 | Audio.InitAll(); 148 | 149 | return true; 150 | } 151 | 152 | public static void StopServer() 153 | { 154 | if (!IsServer) 155 | return; 156 | 157 | Server.Shutdown("The host has shutdown the server."); 158 | Server = null; 159 | 160 | Main.Log("The locally hosted server has been shut down."); 161 | Audio.ClearAll(); 162 | Main.UponServerStop(); 163 | } 164 | } 165 | 166 | public enum DataType : byte 167 | { 168 | AUDIO, 169 | MUTED, 170 | NAME 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /CrapChat2/CClient.cs: -------------------------------------------------------------------------------- 1 | using Lidgren.Network; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Net; 6 | using System.Text; 7 | using System.Threading; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace CrapChat 12 | { 13 | public class CClient : NetClient 14 | { 15 | public delegate void ServerFound(FoundServer server); 16 | public string Name { get; set; } 17 | private ServerFound callback; 18 | 19 | public CClient(string name, NetPeerConfiguration config) 20 | :base(config) 21 | { 22 | this.Name = name; 23 | this.RegisterReceivedCallback(new SendOrPostCallback(GotMessage)); 24 | } 25 | 26 | public void StartDiscovery(int port, ServerFound callback) 27 | { 28 | this.callback = callback; 29 | this.DiscoverLocalPeers(port); 30 | } 31 | 32 | private static void GotMessage(object peer) 33 | { 34 | var client = ((CClient)peer); 35 | var msg = client.ReadMessage(); 36 | 37 | switch (msg.MessageType) 38 | { 39 | case NetIncomingMessageType.DiscoveryResponse: 40 | string name = msg.ReadString(); 41 | var s = new FoundServer() { EndPoint = msg.SenderEndPoint, Name = name }; 42 | 43 | if (client.callback != null) 44 | client.callback.Invoke(s); 45 | break; 46 | 47 | case NetIncomingMessageType.StatusChanged: 48 | NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); 49 | string statusText = msg.ReadString(); 50 | Main.Log("[STATUS UPDATE] " + status + " - " + statusText); 51 | if(status == NetConnectionStatus.Connected) 52 | { 53 | Main.SetStatus("Connected to " + msg.SenderEndPoint.Address); 54 | Main.Log("Connected!"); 55 | Net.UponClientConnected(); 56 | } 57 | else if(status == NetConnectionStatus.Disconnected) 58 | { 59 | Main.Log("Disconnected from server. Reason: " + statusText); 60 | Net.UponClientDisconnected(); 61 | MessageBox.Show("Disconnected from server: " + statusText, "Disconnected", MessageBoxButtons.OK); 62 | } 63 | else 64 | { 65 | Main.SetStatus(status.ToString()); 66 | } 67 | break; 68 | 69 | case NetIncomingMessageType.Data: 70 | var type = (DataType)msg.ReadByte(); 71 | ProcessData(type, msg, client); 72 | break; 73 | 74 | default: 75 | Main.Log("[CLIENT UNHANDLED] Type: " + msg.MessageType); 76 | break; 77 | } 78 | 79 | client.Recycle(msg); 80 | } 81 | 82 | private static byte[] buffer = new byte[1024 * 10]; 83 | public static void ProcessData(DataType type, NetIncomingMessage msg, CClient c) 84 | { 85 | //Main.Log("Got data of type " + type + ", message is " + msg + ", size " + msg.LengthBytes); 86 | switch (type) 87 | { 88 | case DataType.AUDIO: 89 | // Play this audio. 90 | 91 | int id = msg.ReadInt32(); 92 | int bc = msg.ReadInt32(); 93 | msg.ReadBytes(bc, out buffer); 94 | 95 | Audio.QueuePlay(id, buffer, bc); 96 | break; 97 | case DataType.MUTED: 98 | bool muted = msg.ReadBoolean(); 99 | if (muted) 100 | { 101 | MessageBox.Show("You have been muted by the server owner. Nobody can hear you.", "Muted", MessageBoxButtons.OK); 102 | } 103 | else 104 | { 105 | MessageBox.Show("You have been un-muted by the server owner. Welcome back!", "Un-Muted", MessageBoxButtons.OK); 106 | } 107 | break; 108 | case DataType.NAME: 109 | int count = msg.ReadInt32(); 110 | Main.Log("Recieving " + count + " names."); 111 | for (int i = 0; i < count; i++) 112 | { 113 | bool add = msg.ReadBoolean(); 114 | string name = msg.ReadString(); 115 | if (add) 116 | Main.AddUser(name); 117 | else 118 | Main.RemoveUser(name); 119 | } 120 | break; 121 | } 122 | } 123 | 124 | public void SendAudio(byte[] buffer, int count) 125 | { 126 | var msg = this.CreateMessage(); 127 | msg.Write((byte)DataType.AUDIO); 128 | msg.Write(count); 129 | msg.Write(buffer); 130 | SendMessage(msg, NetDeliveryMethod.ReliableOrdered); 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # C-Chat 2 2 | 3 | This is a simple voice chat client, that allows a potentially unlimited number of clients to connect to voice chat servers. 4 | **It's primary purpose is to function on a local network only.** 5 | Those servers can be created by anyone. The person hosting that server has control over the other connected clients, so they can kick and mute other people. 6 | 7 | ## How to use 8 | Download and run CrapApp2.exe. It will open a windows form that has the basic controls. 9 | First, choose a username. It is important to press the **[Confirm Name]** button for the name to be updated. You will not be able to do anything else until you have done this step. 10 | 11 | ![Enter Name](https://github.com/Epicguru/CChat2/blob/master/Guide%20Images/Name.png) 12 | 13 | Now the app will automatically scan the local network for open servers. The port that it scans on can be changed here: 14 | 15 | ![Scanning Port](https://github.com/Epicguru/CChat2/blob/master/Guide%20Images/Port%20and%20Refresh.png) 16 | 17 | Remember to press refresh when you change this port number. 18 | If you see the name of the server you want to connect to, click on it in the list and then press the **[Connect]** button. 19 | You should now be connected. Say hello! 20 | 21 | You can also host a server. To do this, disconnect from any server that you were connected to (if any). 22 | Now type the name of the new server, and the port number you want to host it on: 23 | 24 | ![Server Name and Port](https://github.com/Epicguru/CChat2/blob/master/Guide%20Images/Host%20Port%20and%20Name.png) 25 | 26 | Press the **[Create New Server]** button. You should now be hosting a new server. There are some important things to note about server hosting: 27 | 1. Only one server can be hosted per device per port. Attempting to open more than one server with the same port on the same device will most likely crash the app. 28 | 2. Servers can have duplicate names. This can be confusing, so try to give them unique names. 29 | 3. There are no port restrictions imposed by the app. Despite this, you should never use ports below 1024. These are reserved for system use and attempting to use them could mess up you device. 30 | 31 | Other users can now join the server. 32 | 33 | ## Download 34 | You can download the most recent build in the releases section on github ([here](https://github.com/Epicguru/CChat2/releases)). 35 | >_**When downloading, your browser may warn you about suspicious or harmful files. This is just because the download contains .dll and .exe files. There is nothing harmful about this program.**_ 36 | 37 | >_**Your antivirus may also flag this program. Similarly, this is just because it is a relatively unknown file, and it connects to (and scans) the local network. Again, not harmful in any way.**_ 38 | 39 | If you don't trust me, feel free to inspect every line of code and compile it yourself. 40 | 41 | ## Permissions 42 | Available under the MIT liscence. 43 | Feel free to use this wherever and however you see fit. You can download the code, edit it, and compile it in Visual Studio 2017 if you want to. Any contributions here on github are very welcome. Make a pull request and I'll merge it as soon as I can. 44 | 45 | ## Advantages 46 | * By default uses high quality audio sampling and sending. No compression is used, since it is intended for LAN connections. 47 | * Unlimited users and servers. 48 | * Quite easy to use, even though the UI isn't very pretty. 49 | * Good for LAN parties where people are separated by rooms and internet connection can't be used or isn't desirable. 50 | * Very lightweight. All files required for execution total to under 1MB. Downloading the ZIP file will take seconds even on the slowest internet connection. 51 | 52 | ## Limitations & Problems 53 | * Uncompressed, high sample rate audio may bog down slow networks. I intend to allow the server to change audio sampling rate in the future. 54 | * Currently only supports LAN connections. The users will have to all be connected to the same WiFi network, or otherwise be connected directly. 55 | * Sudden disconnections may not be handled correctly, leaving ghost users left behind in servers. 56 | * Not extensively tested. May crash unexpectedly under certain conditions. 57 | 58 | ## Why the name? 59 | I was bored when I started this project. I didn't have any clever names so this is the result. I may change it at some point in the future. 60 | 61 | ## Plans 62 | If you have any suggestions, open an Issue [here](https://github.com/Epicguru/CChat2/issues) and tag it appropriately. I'm open to making changes or adding simple stuff if it makes sense. 63 | * Improve the general UI. 64 | * Attempt to use port forwarding to make the app work over the internet. So this thing will actually work as a chat client, such as skype or discord. 65 | * Implement better error reporting. 66 | * Add text chat, so that connected users can type and send out messages. 67 | * Add an option to connect directly. 68 | * Add optional passwords to servers. 69 | * Add optional encryption to servers? 70 | * Allow individual clients to both mute themselves and mute others. (currently only the host can do this) 71 | * Add a few different volume controls. A main, master volume slider, and ideally individual sliders for each connected user. I also want to make it possible for users individual user's volumes to be 'boosted' because some people have really terrible mics. 72 | * Once chat is implemented, allow users to share files? Files would be uploaded to the server and then distributed to all other clients. I could make it efficient enough to transmit huge files if I wanted to... Could be useful for LAN parties. 73 | -------------------------------------------------------------------------------- /CrapChat2/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /CrapChat2/CServer.cs: -------------------------------------------------------------------------------- 1 | using Lidgren.Network; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading; 7 | using System.Threading.Tasks; 8 | 9 | namespace CrapChat 10 | { 11 | public class CServer : NetServer 12 | { 13 | public string Name { get; protected set; } 14 | public Dictionary names = new Dictionary(); 15 | public Dictionary connections = new Dictionary(); 16 | public List muted = new List(); 17 | 18 | public bool LocalMuted = false; // Is the local user (host) muted? 19 | private byte[] buffer = new byte[1024 * 10]; // 10kb buffer, should be more than enough for any single package. 20 | 21 | public CServer(string name, NetPeerConfiguration config) 22 | : base(config) 23 | { 24 | Name = name; 25 | this.RegisterReceivedCallback(new SendOrPostCallback(GotMessage)); 26 | } 27 | 28 | public static void GotMessage(object peer) 29 | { 30 | var server = (CServer)peer; 31 | var msg = server.ReadMessage(); 32 | 33 | switch (msg.MessageType) 34 | { 35 | case NetIncomingMessageType.Error: 36 | string errorText; 37 | bool worked = msg.ReadString(out errorText); 38 | Main.Log("[SERVER ERROR] " + (worked ? errorText : "(???)")); 39 | break; 40 | 41 | case NetIncomingMessageType.StatusChanged: 42 | byte b = msg.ReadByte(); 43 | string statusText = msg.ReadString(); 44 | NetConnectionStatus status = (NetConnectionStatus)b; 45 | 46 | Main.Log("[STATUS UPDATE] " + status + " - " + statusText); 47 | 48 | if(status == NetConnectionStatus.Disconnected) 49 | { 50 | string n = server.GetUsername(msg.SenderConnection); 51 | if(n != null) 52 | { 53 | Main.Log("User '" + n + "' has disconnected from the server. Cya!"); 54 | server.SetName(msg.SenderConnection, null); 55 | Main.RemoveUser(n); 56 | 57 | var removeNameMsg = server.CreateMessage(); 58 | removeNameMsg.Write((byte)DataType.NAME); 59 | removeNameMsg.Write(1); 60 | removeNameMsg.Write(false); 61 | removeNameMsg.Write(n); 62 | server.SendToAll(removeNameMsg, NetDeliveryMethod.ReliableUnordered); 63 | } 64 | } 65 | if(status == NetConnectionStatus.Connected) 66 | { 67 | // Send the names of all connected people. 68 | var outMsg = server.CreateMessage(); 69 | outMsg.Write((byte)DataType.NAME); 70 | outMsg.Write(server.names.Count + 1); 71 | foreach (var item in server.names) 72 | { 73 | outMsg.Write(true); 74 | outMsg.Write(item.Value); 75 | } 76 | outMsg.Write(true); 77 | outMsg.Write(Main.ActiveUsername); 78 | server.SendMessage(outMsg, msg.SenderConnection, NetDeliveryMethod.ReliableUnordered); 79 | 80 | // Tell everyone else that this person joined... 81 | var outMsg2 = server.CreateMessage(); 82 | outMsg2.Write((byte)DataType.NAME); 83 | outMsg2.Write(1); 84 | outMsg2.Write(true); 85 | outMsg2.Write(server.GetUsername(msg.SenderConnection)); 86 | server.SendToAll(outMsg2, msg.SenderConnection, NetDeliveryMethod.ReliableUnordered, 0); 87 | } 88 | break; 89 | 90 | case NetIncomingMessageType.Data: 91 | // Find the type. 92 | var type = (DataType)msg.ReadByte(); 93 | ProcessData(type, msg, server); 94 | break; 95 | 96 | case NetIncomingMessageType.DiscoveryRequest: 97 | NetOutgoingMessage response = server.CreateMessage(server.Name); 98 | server.SendDiscoveryResponse(response, msg.SenderEndPoint); 99 | break; 100 | 101 | case NetIncomingMessageType.WarningMessage: 102 | Main.Log("[SERVER WARNING] " + msg.ReadString()); 103 | break; 104 | 105 | case NetIncomingMessageType.ConnectionApproval: 106 | string name = msg.ReadString().Trim(); 107 | if (server.names.ContainsValue(name) || Main.ActiveUsername == name) 108 | { 109 | msg.SenderConnection.Deny("Somebody else on the server already has your username."); 110 | Main.Log("Rejected connection from " + msg.SenderConnection + " because they have a duplicate username: " + name); 111 | } 112 | else 113 | { 114 | msg.SenderConnection.Approve(); 115 | server.SetName(msg.SenderConnection, name); 116 | 117 | Main.Log("Approved connection from " + msg.SenderConnection.RemoteEndPoint + ", called '" + name + "', and sent the current names. (" + (server.names.Count + 1) + ")"); 118 | } 119 | break; 120 | 121 | default: 122 | Main.Log("[SERVER UNHANDLED] Type: " + msg.MessageType); 123 | break; 124 | } 125 | 126 | server.Recycle(msg); 127 | } 128 | 129 | public static void ProcessData(DataType type, NetIncomingMessage msg, CServer s) 130 | { 131 | switch (type) 132 | { 133 | case DataType.AUDIO: 134 | bool muted = s.IsMuted(msg.SenderConnection); 135 | // Ignore if muted, just don't send. 136 | if (muted) 137 | break; 138 | 139 | // Bounce to all other clients. 140 | int c = msg.ReadInt32(); 141 | msg.ReadBytes(c, out s.buffer); 142 | 143 | // Find speaker ID. 144 | int id = Audio.GetOrCreateID(msg.SenderConnection); 145 | 146 | var outMsg = s.CreateMessage(); 147 | 148 | outMsg.Write((byte)DataType.AUDIO); 149 | outMsg.Write(id); 150 | outMsg.Write(c); 151 | outMsg.Write(s.buffer); 152 | 153 | s.SendToAll(outMsg, msg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 0); 154 | 155 | // Play on local device. 156 | Audio.QueuePlay(id, s.buffer, c); 157 | 158 | break; 159 | } 160 | } 161 | 162 | public string GetUsername(NetConnection n) 163 | { 164 | if (!names.ContainsKey(n)) 165 | return null; 166 | return names[n]; 167 | } 168 | 169 | public NetConnection GetConnection(string name) 170 | { 171 | return connections[name]; 172 | } 173 | 174 | protected void SetName(NetConnection n, string name) 175 | { 176 | if(name == null) 177 | { 178 | string na = names[n]; 179 | connections.Remove(na); 180 | names.Remove(n); 181 | return; 182 | } 183 | 184 | if (names.ContainsKey(n)) 185 | { 186 | throw new InvalidOperationException("Cannot change the name of an exising client."); 187 | } 188 | else 189 | { 190 | names.Add(n, name); 191 | connections.Add(name, n); 192 | Main.Log("User @ " + n.RemoteEndPoint + " has been assigned name '" + name + "'"); 193 | Main.AddUser(name); 194 | } 195 | } 196 | 197 | public void SendAudio(byte[] buffer, int count) 198 | { 199 | if (LocalMuted) 200 | return; 201 | 202 | var msg = CreateMessage(); 203 | msg.Write((byte)DataType.AUDIO); 204 | msg.Write(Audio.GetOrCreateID(null)); // Null because as the host we don't have a connection... 205 | msg.Write(count); 206 | msg.Write(buffer); 207 | 208 | this.SendToAll(msg, NetDeliveryMethod.ReliableOrdered); 209 | } 210 | 211 | public void Kick(string name) 212 | { 213 | if (connections.ContainsKey(name)) 214 | Kick(connections[name]); 215 | } 216 | 217 | public void Kick(NetConnection n) 218 | { 219 | n.Disconnect("You have been kicked from the server by the host."); 220 | } 221 | 222 | public bool IsMuted(string name) 223 | { 224 | if (name == Main.ActiveUsername) 225 | { 226 | return LocalMuted; 227 | } 228 | 229 | if (connections.ContainsKey(name)) 230 | return IsMuted(connections[name]); 231 | else 232 | return false; 233 | } 234 | 235 | public bool IsMuted(NetConnection n) 236 | { 237 | return muted.Contains(n); 238 | } 239 | 240 | public void Mute(string name) 241 | { 242 | if(name == Main.ActiveUsername) 243 | { 244 | LocalMuted = true; 245 | return; 246 | } 247 | 248 | if (connections.ContainsKey(name)) 249 | Mute(connections[name]); 250 | } 251 | 252 | public void Mute(NetConnection n) 253 | { 254 | if (!muted.Contains(n)) 255 | { 256 | muted.Add(n); 257 | 258 | // Notify the client. 259 | var msg = CreateMessage(); 260 | msg.Write((byte)DataType.MUTED); 261 | msg.Write(true); 262 | SendMessage(msg, n, NetDeliveryMethod.ReliableUnordered); 263 | } 264 | } 265 | 266 | public void Unmute(string name) 267 | { 268 | if (name == Main.ActiveUsername) 269 | { 270 | LocalMuted = false; 271 | return; 272 | } 273 | 274 | if (connections.ContainsKey(name)) 275 | Unmute(connections[name]); 276 | } 277 | 278 | public void Unmute(NetConnection n) 279 | { 280 | if (muted.Contains(n)) 281 | { 282 | muted.Remove(n); 283 | 284 | // Notify the client. 285 | var msg = CreateMessage(); 286 | msg.Write((byte)DataType.MUTED); 287 | msg.Write(false); 288 | SendMessage(msg, n, NetDeliveryMethod.ReliableUnordered); 289 | } 290 | } 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /CrapChat2/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace CrapChat 5 | { 6 | public partial class Main : Form 7 | { 8 | public static Main Instance; 9 | 10 | private bool IsValidUsername 11 | { 12 | get 13 | { 14 | return !string.IsNullOrWhiteSpace(this.NameInputBox.Text.Trim()); 15 | } 16 | } 17 | private bool IsNewServerNameValid 18 | { 19 | get 20 | { 21 | return !string.IsNullOrWhiteSpace(GetNewServerName()); 22 | } 23 | } 24 | private bool IsNewServerPortvalid 25 | { 26 | get 27 | { 28 | return GetNewServerPort() >= 0; 29 | } 30 | } 31 | 32 | public static string ActiveUsername = null; 33 | 34 | public Main() 35 | { 36 | Instance = this; 37 | 38 | InitializeComponent(); 39 | 40 | // Some more custom form setup: 41 | this.MaximizeBox = false; 42 | FormBorderStyle = FormBorderStyle.FixedSingle; 43 | this.Text = "Crap Chat 2 - "; 44 | this.FormClosing += AppClosing; 45 | 46 | // Main entry point here... 47 | SetStatus("Disconnected"); 48 | 49 | NameInputBox.Text = Properties.Settings.Default.DefaultUsername; 50 | SetButtonState(confirmNameButton, IsValidUsername); 51 | SetButtonState(MuteButton, false); 52 | SetButtonState(KickButton, false); 53 | SetButtonState(DisconnectButton, false); 54 | SetButtonState(ConnectButton, false); 55 | SetButtonState(CreateNewServerButton, false); 56 | SetButtonState(RefreshButton, false); 57 | SetButtonState(ShutdownServer, false); 58 | 59 | if (!IsValidUsername) 60 | DisplayUsernamePrompt(true, "Please type a username"); 61 | else 62 | DisplayUsernamePrompt(true, "Please confirm username"); 63 | 64 | SetPortNumber(Properties.Settings.Default.DefaultPort); 65 | this.NewServerNameBox.Text = Properties.Settings.Default.DefaultNewServerName; 66 | this.NewServerPortBox.Text = Properties.Settings.Default.DefaultNewServerPort.ToString(); 67 | 68 | bool autoLogin = Properties.Settings.Default.AutoLogin; 69 | if (autoLogin) 70 | { 71 | ConfirmNameClicked(null, null); 72 | } 73 | } 74 | 75 | public static void AddUser(string name) 76 | { 77 | if(!Instance.ClientNameList.Items.Contains(name)) 78 | Instance.ClientNameList.Items.Add(name); 79 | } 80 | 81 | public static void RemoveUser(string name) 82 | { 83 | if (Instance.ClientNameList.Items.Contains(name)) 84 | Instance.ClientNameList.Items.Remove(name); 85 | } 86 | 87 | public static void ClearUsers() 88 | { 89 | Instance.ClientNameList.Items.Clear(); 90 | } 91 | 92 | private void AppClosing(object sender, FormClosingEventArgs e) 93 | { 94 | Main.Log("Closing..."); 95 | 96 | if (Net.IsClient) 97 | { 98 | Net.StopClient(); 99 | } 100 | if (Net.IsServer) 101 | { 102 | Net.StopServer(); 103 | } 104 | } 105 | 106 | private void ConfirmNameClicked(object sender, EventArgs e) 107 | { 108 | if (!IsValidUsername) 109 | { 110 | Log("Invalid username '" + NameInputBox.Text + "'"); 111 | DisplayUsernamePrompt(true, "Invalid username!"); 112 | return; 113 | } 114 | 115 | if (ActiveUsername == this.NameInputBox.Text.Trim()) 116 | return; 117 | 118 | ActiveUsername = this.NameInputBox.Text.Trim(); 119 | Log("Confirmed new name - " + ActiveUsername); 120 | this.Text = "Crap Chat 2 - " + ActiveUsername; 121 | 122 | DisplayUsernamePrompt(false); 123 | SetButtonState(CreateNewServerButton, true); 124 | 125 | if (!RefreshButton.Enabled) 126 | RefreshButtonClick(null, null); 127 | SetButtonState(RefreshButton, true); 128 | 129 | if(!string.IsNullOrWhiteSpace(GetNewServerName()) && !Net.IsServer && !string.IsNullOrWhiteSpace(ActiveUsername)) 130 | { 131 | SetButtonState(CreateNewServerButton, true); 132 | } 133 | } 134 | 135 | public static void Log(object o) 136 | { 137 | if(o != null) 138 | { 139 | Console.WriteLine(o.ToString()); 140 | } 141 | else 142 | { 143 | Console.WriteLine("null"); 144 | } 145 | } 146 | 147 | private FoundServer GetSelectedServer() 148 | { 149 | if (ServerList.SelectedItem != null) 150 | return (FoundServer)this.ServerList.SelectedItem; 151 | else 152 | return new FoundServer(); 153 | } 154 | 155 | private void SetPortNumber(int port) 156 | { 157 | this.PortTextBox.Text = port.ToString(); 158 | } 159 | 160 | private void SelectedServerChanged(object sender, EventArgs e) 161 | { 162 | Log("Selected " + GetSelectedServer()); 163 | 164 | if(!Net.IsServer && !Net.IsConnecting && !GetSelectedServer().IsInvalid()) 165 | SetButtonState(ConnectButton, true); 166 | } 167 | 168 | private void NameInputKeyDown(object sender, KeyEventArgs k) 169 | { 170 | if(k.KeyCode == Keys.Enter || k.KeyCode == Keys.Return) 171 | { 172 | this.ConfirmNameClicked(sender, null); 173 | } 174 | } 175 | 176 | public static void SetStatus(string status) 177 | { 178 | Instance.StatusLabel.Text = "Status: " + status.Trim(); 179 | } 180 | 181 | private void DisplayUsernamePrompt(bool visible, string text = null) 182 | { 183 | if (visible) 184 | { 185 | this.typePrompt.Text = text != null ? text.Trim() : this.typePrompt.Text; 186 | this.typePrompt.Visible = true; 187 | } 188 | else 189 | { 190 | this.typePrompt.Visible = false; 191 | } 192 | } 193 | 194 | private void SetButtonState(Button b, bool enabled) 195 | { 196 | if(b != null) 197 | { 198 | if(b.Enabled != enabled) 199 | b.Enabled = enabled; 200 | } 201 | } 202 | 203 | private void NameInputValueChanged(object sender, EventArgs e) 204 | { 205 | SetButtonState(confirmNameButton, IsValidUsername); 206 | if (!IsValidUsername) 207 | { 208 | DisplayUsernamePrompt(true, "Invalid username!"); 209 | } 210 | else 211 | { 212 | DisplayUsernamePrompt(false); 213 | } 214 | } 215 | 216 | private void PortTextBoxChanged(object sender, KeyPressEventArgs e) 217 | { 218 | e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar); 219 | } 220 | 221 | private int GetRefreshPort() 222 | { 223 | if (string.IsNullOrWhiteSpace(PortTextBox.Text)) 224 | return Properties.Settings.Default.DefaultPort; 225 | 226 | int port = int.Parse(PortTextBox.Text); 227 | return port; 228 | } 229 | 230 | private int GetNewServerPort() 231 | { 232 | if (string.IsNullOrWhiteSpace(NewServerPortBox.Text)) 233 | return Properties.Settings.Default.DefaultNewServerPort; 234 | 235 | return int.Parse(NewServerPortBox.Text); 236 | } 237 | 238 | private string GetNewServerName() 239 | { 240 | return NewServerNameBox.Text.Trim(); 241 | } 242 | 243 | private void RefreshButtonClick(object sender, EventArgs e) 244 | { 245 | if (!Net.IsClient) 246 | { 247 | Net.StartClient(); 248 | } 249 | ServerList.Items.Clear(); 250 | Net.DiscoverPeers(GetRefreshPort(), ServerDiscovered); 251 | SetButtonState(ConnectButton, false); 252 | System.GC.Collect(); 253 | } 254 | 255 | private void ServerDiscovered(FoundServer s) 256 | { 257 | ServerList.Items.Add(s); 258 | Log("Discovered server '" + s.Name + "' @ " + s.EndPoint); 259 | } 260 | 261 | private void CreateNewServerButtonClick(object sender, EventArgs e) 262 | { 263 | var name = GetNewServerName(); 264 | int port = GetNewServerPort(); 265 | 266 | bool worked = Net.StartServer(port, name); 267 | if (worked) 268 | { 269 | SetButtonState(CreateNewServerButton, false); 270 | SetButtonState(ShutdownServer, true); 271 | RefreshButtonClick(null, null); 272 | ClearUsers(); 273 | AddUser(ActiveUsername); 274 | } 275 | } 276 | 277 | private void NewServerNameBox_TextChanged(object sender, EventArgs e) 278 | { 279 | if (string.IsNullOrWhiteSpace(GetNewServerName())) 280 | SetButtonState(CreateNewServerButton, false); 281 | else if(!Net.IsServer && !string.IsNullOrWhiteSpace(ActiveUsername)) 282 | SetButtonState(CreateNewServerButton, true); 283 | } 284 | 285 | private void ConnectButton_Click(object sender, EventArgs e) 286 | { 287 | if (!Net.IsClient) 288 | Net.StartClient(); 289 | 290 | var s = GetSelectedServer(); 291 | if (string.IsNullOrWhiteSpace(s.Name)) 292 | return; 293 | 294 | Log("Attempting to connect to " + s); 295 | bool worked = Net.ConnectClient(s.EndPoint.Address.ToString(), s.EndPoint.Port); 296 | if (worked) 297 | { 298 | SetButtonState(ConnectButton, false); 299 | } 300 | } 301 | 302 | public static void UponDisconnected() 303 | { 304 | Instance.SetButtonState(Instance.DisconnectButton, false); 305 | Instance.SetButtonState(Instance.ConnectButton, false); 306 | Instance.ServerList.ClearSelected(); 307 | SetStatus("Disconnected"); 308 | ClearUsers(); 309 | Instance.RefreshButtonClick(null, null); 310 | } 311 | 312 | public static void UponConnected() 313 | { 314 | Instance.SetButtonState(Instance.DisconnectButton, true); 315 | Instance.SetButtonState(Instance.ConnectButton, false); 316 | } 317 | 318 | public static void UponServerStop() 319 | { 320 | Instance.SetButtonState(Instance.MuteButton, false); 321 | Instance.SetButtonState(Instance.KickButton, false); 322 | } 323 | 324 | private void ShutdownServer_Click(object sender, EventArgs e) 325 | { 326 | Net.StopServer(); 327 | RefreshButtonClick(null, null); 328 | SetButtonState(ShutdownServer, false); 329 | if (!string.IsNullOrWhiteSpace(GetNewServerName()) && !Net.IsServer && !string.IsNullOrWhiteSpace(ActiveUsername)) 330 | { 331 | SetButtonState(CreateNewServerButton, true); 332 | } 333 | ClearUsers(); 334 | SetStatus("Disconnected"); 335 | } 336 | 337 | private void DisconnectButton_Click(object sender, EventArgs e) 338 | { 339 | if(Net.IsClient && Net.IsConnected) 340 | { 341 | SetButtonState(DisconnectButton, false); 342 | Net.StopClient(); 343 | } 344 | else 345 | { 346 | SetButtonState(DisconnectButton, false); 347 | } 348 | } 349 | 350 | private string GetSelectedUser() 351 | { 352 | return ClientNameList.SelectedItem == null ? null : (string)ClientNameList.SelectedItem; 353 | } 354 | 355 | private void KickButton_Click(object sender, EventArgs e) 356 | { 357 | string name = GetSelectedUser(); 358 | if (!string.IsNullOrWhiteSpace(name)) 359 | { 360 | if (Net.IsServer) 361 | { 362 | Net.Server.Kick(name); 363 | } 364 | } 365 | } 366 | 367 | private void MuteButton_Click(object sender, EventArgs e) 368 | { 369 | string name = GetSelectedUser(); 370 | if (!string.IsNullOrWhiteSpace(name)) 371 | { 372 | if (Net.IsServer) 373 | { 374 | bool isMuted = Net.Server.IsMuted(name); 375 | if (isMuted) 376 | { 377 | Net.Server.Unmute(name); 378 | MuteButton.Text = "Mute Person"; 379 | } 380 | else 381 | { 382 | Net.Server.Mute(name); 383 | MuteButton.Text = "Un-mute Person"; 384 | } 385 | } 386 | } 387 | } 388 | 389 | private void SelectedUserChanged(object sender, EventArgs e) 390 | { 391 | if (!Net.IsServer) 392 | return; 393 | 394 | string selected = this.ClientNameList.SelectedItem as string; 395 | 396 | if (!string.IsNullOrWhiteSpace(selected)) 397 | { 398 | if(selected == ActiveUsername) 399 | { 400 | SetButtonState(KickButton, false); 401 | SetButtonState(MuteButton, true); 402 | MuteButton.Text = "Mute Person"; 403 | } 404 | else 405 | { 406 | SetButtonState(KickButton, true); 407 | SetButtonState(MuteButton, true); 408 | 409 | bool muted = Net.Server.IsMuted(selected); 410 | MuteButton.Text = muted ? "Un-mute Person" : "Mute Person"; 411 | } 412 | } 413 | else 414 | { 415 | SetButtonState(KickButton, false); 416 | SetButtonState(MuteButton, false); 417 | MuteButton.Text = "Mute Person"; 418 | } 419 | } 420 | 421 | private void TimerTick(object sender, EventArgs e) 422 | { 423 | // This is the refresh timer. 424 | if(RefreshButton.Enabled && !Net.IsConnected) 425 | RefreshButtonClick(null, null); 426 | } 427 | } 428 | } 429 | -------------------------------------------------------------------------------- /CrapChat2/Main.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace CrapChat 2 | { 3 | partial class Main 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.Windows.Forms.Label label2; 33 | System.Windows.Forms.Label label3; 34 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); 35 | this.NameInputBox = new System.Windows.Forms.TextBox(); 36 | this.usernameLabel = new System.Windows.Forms.Label(); 37 | this.confirmNameButton = new System.Windows.Forms.Button(); 38 | this.ServerList = new System.Windows.Forms.ListBox(); 39 | this.serversFoundLabel = new System.Windows.Forms.Label(); 40 | this.typePrompt = new System.Windows.Forms.Label(); 41 | this.RefreshButton = new System.Windows.Forms.Button(); 42 | this.StatusLabel = new System.Windows.Forms.Label(); 43 | this.ConnectButton = new System.Windows.Forms.Button(); 44 | this.DisconnectButton = new System.Windows.Forms.Button(); 45 | this.ClientNameList = new System.Windows.Forms.ListBox(); 46 | this.MuteButton = new System.Windows.Forms.Button(); 47 | this.KickButton = new System.Windows.Forms.Button(); 48 | this.PortTextBox = new System.Windows.Forms.TextBox(); 49 | this.portLabel = new System.Windows.Forms.Label(); 50 | this.label1 = new System.Windows.Forms.Label(); 51 | this.NewServerNameBox = new System.Windows.Forms.TextBox(); 52 | this.CreateNewServerButton = new System.Windows.Forms.Button(); 53 | this.NewServerPortBox = new System.Windows.Forms.TextBox(); 54 | this.ShutdownServer = new System.Windows.Forms.Button(); 55 | this.RefreshTimer = new System.Windows.Forms.Timer(this.components); 56 | label2 = new System.Windows.Forms.Label(); 57 | label3 = new System.Windows.Forms.Label(); 58 | this.SuspendLayout(); 59 | // 60 | // label2 61 | // 62 | label2.AutoSize = true; 63 | label2.Location = new System.Drawing.Point(14, 298); 64 | label2.Name = "label2"; 65 | label2.Size = new System.Drawing.Size(38, 13); 66 | label2.TabIndex = 17; 67 | label2.Text = "Name:"; 68 | // 69 | // label3 70 | // 71 | label3.AutoSize = true; 72 | label3.Location = new System.Drawing.Point(14, 325); 73 | label3.Name = "label3"; 74 | label3.Size = new System.Drawing.Size(29, 13); 75 | label3.TabIndex = 20; 76 | label3.Text = "Port:"; 77 | // 78 | // NameInputBox 79 | // 80 | this.NameInputBox.Location = new System.Drawing.Point(12, 62); 81 | this.NameInputBox.MaxLength = 16; 82 | this.NameInputBox.Name = "NameInputBox"; 83 | this.NameInputBox.Size = new System.Drawing.Size(124, 20); 84 | this.NameInputBox.TabIndex = 0; 85 | this.NameInputBox.TextChanged += new System.EventHandler(this.NameInputValueChanged); 86 | this.NameInputBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.NameInputKeyDown); 87 | // 88 | // usernameLabel 89 | // 90 | this.usernameLabel.AutoSize = true; 91 | this.usernameLabel.Location = new System.Drawing.Point(12, 42); 92 | this.usernameLabel.Name = "usernameLabel"; 93 | this.usernameLabel.Size = new System.Drawing.Size(55, 13); 94 | this.usernameLabel.TabIndex = 1; 95 | this.usernameLabel.Text = "Username"; 96 | // 97 | // confirmNameButton 98 | // 99 | this.confirmNameButton.Location = new System.Drawing.Point(142, 62); 100 | this.confirmNameButton.Name = "confirmNameButton"; 101 | this.confirmNameButton.Size = new System.Drawing.Size(92, 20); 102 | this.confirmNameButton.TabIndex = 2; 103 | this.confirmNameButton.Text = "Confirm Name"; 104 | this.confirmNameButton.UseVisualStyleBackColor = true; 105 | this.confirmNameButton.Click += new System.EventHandler(this.ConfirmNameClicked); 106 | // 107 | // ServerList 108 | // 109 | this.ServerList.FormattingEnabled = true; 110 | this.ServerList.Location = new System.Drawing.Point(12, 122); 111 | this.ServerList.Name = "ServerList"; 112 | this.ServerList.ScrollAlwaysVisible = true; 113 | this.ServerList.Size = new System.Drawing.Size(379, 108); 114 | this.ServerList.TabIndex = 3; 115 | this.ServerList.SelectedValueChanged += new System.EventHandler(this.SelectedServerChanged); 116 | // 117 | // serversFoundLabel 118 | // 119 | this.serversFoundLabel.AutoSize = true; 120 | this.serversFoundLabel.Location = new System.Drawing.Point(12, 102); 121 | this.serversFoundLabel.Name = "serversFoundLabel"; 122 | this.serversFoundLabel.Size = new System.Drawing.Size(79, 13); 123 | this.serversFoundLabel.TabIndex = 4; 124 | this.serversFoundLabel.Text = "Servers Found:"; 125 | // 126 | // typePrompt 127 | // 128 | this.typePrompt.AutoSize = true; 129 | this.typePrompt.ForeColor = System.Drawing.Color.Red; 130 | this.typePrompt.Location = new System.Drawing.Point(240, 66); 131 | this.typePrompt.Name = "typePrompt"; 132 | this.typePrompt.Size = new System.Drawing.Size(93, 13); 133 | this.typePrompt.TabIndex = 5; 134 | this.typePrompt.Text = "Enter a username!"; 135 | // 136 | // RefreshButton 137 | // 138 | this.RefreshButton.Location = new System.Drawing.Point(316, 93); 139 | this.RefreshButton.Name = "RefreshButton"; 140 | this.RefreshButton.Size = new System.Drawing.Size(75, 22); 141 | this.RefreshButton.TabIndex = 6; 142 | this.RefreshButton.Text = "Refresh"; 143 | this.RefreshButton.UseVisualStyleBackColor = true; 144 | this.RefreshButton.Click += new System.EventHandler(this.RefreshButtonClick); 145 | // 146 | // StatusLabel 147 | // 148 | this.StatusLabel.AutoSize = true; 149 | this.StatusLabel.BackColor = System.Drawing.Color.Gainsboro; 150 | this.StatusLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 151 | this.StatusLabel.Location = new System.Drawing.Point(12, 9); 152 | this.StatusLabel.Name = "StatusLabel"; 153 | this.StatusLabel.Size = new System.Drawing.Size(54, 18); 154 | this.StatusLabel.TabIndex = 7; 155 | this.StatusLabel.Text = "Status:"; 156 | // 157 | // ConnectButton 158 | // 159 | this.ConnectButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); 160 | this.ConnectButton.Location = new System.Drawing.Point(12, 236); 161 | this.ConnectButton.Name = "ConnectButton"; 162 | this.ConnectButton.Size = new System.Drawing.Size(75, 23); 163 | this.ConnectButton.TabIndex = 8; 164 | this.ConnectButton.Text = "Connect"; 165 | this.ConnectButton.UseVisualStyleBackColor = false; 166 | this.ConnectButton.Click += new System.EventHandler(this.ConnectButton_Click); 167 | // 168 | // DisconnectButton 169 | // 170 | this.DisconnectButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); 171 | this.DisconnectButton.Enabled = false; 172 | this.DisconnectButton.Location = new System.Drawing.Point(93, 236); 173 | this.DisconnectButton.Name = "DisconnectButton"; 174 | this.DisconnectButton.Size = new System.Drawing.Size(75, 23); 175 | this.DisconnectButton.TabIndex = 9; 176 | this.DisconnectButton.Text = "Disconnect"; 177 | this.DisconnectButton.UseVisualStyleBackColor = false; 178 | this.DisconnectButton.Click += new System.EventHandler(this.DisconnectButton_Click); 179 | // 180 | // ClientNameList 181 | // 182 | this.ClientNameList.FormattingEnabled = true; 183 | this.ClientNameList.Location = new System.Drawing.Point(12, 392); 184 | this.ClientNameList.Name = "ClientNameList"; 185 | this.ClientNameList.Size = new System.Drawing.Size(263, 82); 186 | this.ClientNameList.Sorted = true; 187 | this.ClientNameList.TabIndex = 10; 188 | this.ClientNameList.SelectedValueChanged += new System.EventHandler(this.SelectedUserChanged); 189 | // 190 | // MuteButton 191 | // 192 | this.MuteButton.Location = new System.Drawing.Point(281, 392); 193 | this.MuteButton.Name = "MuteButton"; 194 | this.MuteButton.Size = new System.Drawing.Size(110, 23); 195 | this.MuteButton.TabIndex = 11; 196 | this.MuteButton.Text = "Mute Person"; 197 | this.MuteButton.UseVisualStyleBackColor = true; 198 | this.MuteButton.Click += new System.EventHandler(this.MuteButton_Click); 199 | // 200 | // KickButton 201 | // 202 | this.KickButton.Location = new System.Drawing.Point(281, 421); 203 | this.KickButton.Name = "KickButton"; 204 | this.KickButton.Size = new System.Drawing.Size(110, 23); 205 | this.KickButton.TabIndex = 12; 206 | this.KickButton.Text = "Kick Person"; 207 | this.KickButton.UseVisualStyleBackColor = true; 208 | this.KickButton.Click += new System.EventHandler(this.KickButton_Click); 209 | // 210 | // PortTextBox 211 | // 212 | this.PortTextBox.Location = new System.Drawing.Point(243, 95); 213 | this.PortTextBox.Name = "PortTextBox"; 214 | this.PortTextBox.Size = new System.Drawing.Size(67, 20); 215 | this.PortTextBox.TabIndex = 13; 216 | this.PortTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.PortTextBoxChanged); 217 | // 218 | // portLabel 219 | // 220 | this.portLabel.AutoSize = true; 221 | this.portLabel.Location = new System.Drawing.Point(208, 98); 222 | this.portLabel.Name = "portLabel"; 223 | this.portLabel.Size = new System.Drawing.Size(29, 13); 224 | this.portLabel.TabIndex = 14; 225 | this.portLabel.Text = "Port:"; 226 | // 227 | // label1 228 | // 229 | this.label1.AutoSize = true; 230 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 231 | this.label1.Location = new System.Drawing.Point(14, 280); 232 | this.label1.Name = "label1"; 233 | this.label1.Size = new System.Drawing.Size(74, 13); 234 | this.label1.TabIndex = 15; 235 | this.label1.Text = "Host Server"; 236 | // 237 | // NewServerNameBox 238 | // 239 | this.NewServerNameBox.Location = new System.Drawing.Point(58, 296); 240 | this.NewServerNameBox.Name = "NewServerNameBox"; 241 | this.NewServerNameBox.Size = new System.Drawing.Size(100, 20); 242 | this.NewServerNameBox.TabIndex = 16; 243 | this.NewServerNameBox.TextChanged += new System.EventHandler(this.NewServerNameBox_TextChanged); 244 | // 245 | // CreateNewServerButton 246 | // 247 | this.CreateNewServerButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); 248 | this.CreateNewServerButton.Location = new System.Drawing.Point(12, 349); 249 | this.CreateNewServerButton.Name = "CreateNewServerButton"; 250 | this.CreateNewServerButton.Size = new System.Drawing.Size(114, 23); 251 | this.CreateNewServerButton.TabIndex = 18; 252 | this.CreateNewServerButton.Text = "Create New Server"; 253 | this.CreateNewServerButton.UseVisualStyleBackColor = false; 254 | this.CreateNewServerButton.Click += new System.EventHandler(this.CreateNewServerButtonClick); 255 | // 256 | // NewServerPortBox 257 | // 258 | this.NewServerPortBox.Location = new System.Drawing.Point(58, 323); 259 | this.NewServerPortBox.Name = "NewServerPortBox"; 260 | this.NewServerPortBox.Size = new System.Drawing.Size(100, 20); 261 | this.NewServerPortBox.TabIndex = 19; 262 | // 263 | // ShutdownServer 264 | // 265 | this.ShutdownServer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); 266 | this.ShutdownServer.Location = new System.Drawing.Point(132, 349); 267 | this.ShutdownServer.Name = "ShutdownServer"; 268 | this.ShutdownServer.Size = new System.Drawing.Size(105, 23); 269 | this.ShutdownServer.TabIndex = 21; 270 | this.ShutdownServer.Text = "Shutdown Server"; 271 | this.ShutdownServer.UseVisualStyleBackColor = false; 272 | this.ShutdownServer.Click += new System.EventHandler(this.ShutdownServer_Click); 273 | // 274 | // RefreshTimer 275 | // 276 | this.RefreshTimer.Enabled = true; 277 | this.RefreshTimer.Interval = global::CrapChat.Properties.Settings.Default.AutoRefreshInterval; 278 | this.RefreshTimer.Tick += new System.EventHandler(this.TimerTick); 279 | // 280 | // Main 281 | // 282 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 283 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 284 | this.ClientSize = new System.Drawing.Size(403, 486); 285 | this.Controls.Add(this.ShutdownServer); 286 | this.Controls.Add(label3); 287 | this.Controls.Add(this.NewServerPortBox); 288 | this.Controls.Add(this.CreateNewServerButton); 289 | this.Controls.Add(label2); 290 | this.Controls.Add(this.NewServerNameBox); 291 | this.Controls.Add(this.label1); 292 | this.Controls.Add(this.portLabel); 293 | this.Controls.Add(this.PortTextBox); 294 | this.Controls.Add(this.KickButton); 295 | this.Controls.Add(this.MuteButton); 296 | this.Controls.Add(this.ClientNameList); 297 | this.Controls.Add(this.DisconnectButton); 298 | this.Controls.Add(this.ConnectButton); 299 | this.Controls.Add(this.StatusLabel); 300 | this.Controls.Add(this.RefreshButton); 301 | this.Controls.Add(this.typePrompt); 302 | this.Controls.Add(this.serversFoundLabel); 303 | this.Controls.Add(this.ServerList); 304 | this.Controls.Add(this.confirmNameButton); 305 | this.Controls.Add(this.usernameLabel); 306 | this.Controls.Add(this.NameInputBox); 307 | this.Cursor = System.Windows.Forms.Cursors.Default; 308 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 309 | this.Name = "Main"; 310 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 311 | this.Text = "Crap Chat 2"; 312 | this.ResumeLayout(false); 313 | this.PerformLayout(); 314 | 315 | } 316 | 317 | #endregion 318 | 319 | public System.Windows.Forms.TextBox NameInputBox; 320 | private System.Windows.Forms.Label usernameLabel; 321 | private System.Windows.Forms.Button confirmNameButton; 322 | private System.Windows.Forms.Label serversFoundLabel; 323 | private System.Windows.Forms.Label typePrompt; 324 | public System.Windows.Forms.ListBox ServerList; 325 | public System.Windows.Forms.Button RefreshButton; 326 | public System.Windows.Forms.Label StatusLabel; 327 | public System.Windows.Forms.Button ConnectButton; 328 | public System.Windows.Forms.Button DisconnectButton; 329 | public System.Windows.Forms.Button MuteButton; 330 | private System.Windows.Forms.Button KickButton; 331 | private System.Windows.Forms.Label portLabel; 332 | public System.Windows.Forms.TextBox PortTextBox; 333 | private System.Windows.Forms.Label label1; 334 | public System.Windows.Forms.TextBox NewServerNameBox; 335 | public System.Windows.Forms.TextBox NewServerPortBox; 336 | public System.Windows.Forms.Button CreateNewServerButton; 337 | public System.Windows.Forms.Button ShutdownServer; 338 | public System.Windows.Forms.ListBox ClientNameList; 339 | private System.Windows.Forms.Timer RefreshTimer; 340 | } 341 | } 342 | 343 | -------------------------------------------------------------------------------- /CrapChat2/Main.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | False 122 | 123 | 124 | False 125 | 126 | 127 | 17, 17 128 | 129 | 130 | 131 | 132 | AAABAAYAQEAAAAEAIAAoQgAAZgAAAEBAAAABAAgAKBYAAI5CAAAgIAAAAQAgAKgQAAC2WAAAICAAAAEA 133 | CACoCAAAXmkAABAQAAABACAAaAQAAAZyAAAQEAAAAQAIAGgFAABudgAAKAAAAEAAAACAAAAAAQAgAAAA 134 | AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 135 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 136 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 137 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 138 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 139 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 141 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 142 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 143 | AAAAAAAAAAAAAAAAAAAAAAAAEyxSKBMwUWoTL1OcFDBTvhQxU9UUMlTgFDBS4RIyVNoTMFLDEzBRqRMv 144 | UY0SLlFuFC5QTBQwUiUAVVUDHDhxCStGaR0pQWorKUNoMSlFZTcoRGk/KEVpRipEaE4qRGpZKERoZCpG 145 | anMrRWqBK0dskipHa6EoRGmsJEBntiI/ZMEeO2DJHjte0ho6XtsYN1viGDZa5xY0V+4VNFj1FDJX9hU0 146 | VvoVMVX6EzNW+BMxVfUUMVPtFDFU4xQwVNcTMVTFEzBSrRMvUY0RLU9kEC1PLQAAAAEAAAAAAAAAAAAA 147 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwITLk9dEjFT0BU0V/8XN1z/GDpf/xk7Yf8ZPGP/GTxj/xk8 148 | Y/8ZPGP/GDti/xg6YP8XOV7/Fzdc/xY1Wv8VNFf/GTdb+SI9Yf4nQWX/KUNo/ylEaf8qRWr/LEdt/y1J 149 | b/8uS3H/L010/zFPdv8yUXn/M1N7/zRUff81Vn//NleA/zVWf/8yU33/L1B5/ytNdv8oSnL/JUdv/yJE 150 | bP8fQmr/HUBo/xw/Z/8bPmb/Gj1l/xo9Zf8aPWT/GTxj/xk8Yv8YO2L/GDph/xg6X/8XOF7/FjZb/xU0 151 | V/8TL1PgEi5QeRkzTAoAAAAAAAAAAAAAAAAAAAAAAAAAABIvVBsTMVPEFjZa/xk7Yf8aPmX/Gz9n/xtA 152 | aP8bQGn/G0Bp/xtAaf8bQGn/G0Bp/xtAaP8bQGj/Gz9n/xo/Z/8aPmb/GT1k/xk8Y/8YOmD/Fzhe/xo5 153 | Xf8eO2D/JEBk/ytGa/8tSnD/ME10/zJRef81VX7/N1iC/zlbhv86XYj/O12I/zteif87Xon/O16J/zpd 154 | iP83W4X/M1eB/y9Sff8rT3j/J0t1/yRIcv8hRm//H0Rt/x1Ca/8cQWr/HEFq/xxBaf8bQGj/Gj9n/xo/ 155 | Z/8aP2f/Gj5m/xk+Zf8ZPGP/GDpg/xY1Wf8RL1PXEDFSHwAAAAAAAAAAAAAAABU1VRgTMlPeGDlf/xs+ 156 | Zv8cQGn/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8cQWn/HEFp/xtAaf8bQGn/G0Bp/xtA 157 | af8bQGj/G0Bo/xo/Z/8aPmX/GTxj/xg6YP8YOF3/HDtg/yNAZf8rSG7/ME51/zRUfP83WIL/OlyH/zte 158 | if87Xon/O16J/zteif87Xon/O16J/zteif84W4b/M1eB/y5SfP8qTnj/Jkt0/yNIcf8gRW7/HkNs/x1C 159 | a/8cQWr/HEFq/xtAaf8bQGj/Gj9n/xo/Z/8aP2f/Gj9n/xo/Zv8ZPWT/Fzhd/xIwUc4AKlUGAAAAAAAA 160 | AAATL1O3GDle/xs/Z/8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxB 161 | av8cQWr/HEFq/xxBav8cQWr/HEFp/xtAaf8bQGn/G0Bp/xtAaP8bP2f/Gj9m/xk9Zf8YO2L/GDpf/xw8 162 | Yf8kQmj/Lkty/zNSe/82V4H/OVuF/ztdiP87Xon/O16J/zteif87Xon/O16J/zteif84W4b/M1aB/y1R 163 | e/8pTXf/JUpz/yJHcP8fRG3/HkNs/xxBav8cQWr/HEFp/xtAaP8aP2j/Gj9n/xo/Z/8aP2f/Gj9n/xk9 164 | ZP8WNlr/Ey9QdQAAAAAVL1I7FzZb/xw/Zv8dQmv/HUJr/x1Ca/8eQmz/HUJr/x1Ca/8dQmv/HUJr/x1C 165 | a/8dQmv/HUJr/x1Ca/8dQmv/HEFq/xxBav8cQWr/HEFq/xxBav8cQWr/HEFq/xxBav8bQGn/G0Bp/xtA 166 | af8bQGj/G0Bo/xo/Z/8aPmb/GT1k/xk7Yf8fPmT/KEVr/zBOdv81VX3/OFmD/zpch/87Xon/O16J/zte 167 | if87Xon/O16J/zpdiP82WoT/MVR//yxQev8nS3X/I0hx/yFFb/8eQ2z/HUJr/xxBav8cQWr/G0Bp/xtA 168 | aP8aP2f/Gj9n/xo/Z/8aP2f/GDth/xMwU+scOFQJFzNWkBo7Yf8eQmv/H0Rt/x9Ebf8fRG3/H0Rt/x9E 169 | bf8fRG3/H0Rt/x9Ebf8fRG3/H0Nt/x5DbP8eQ2z/HkNs/x5DbP8dQmv/HUJr/x1Ca/8dQmv/HEFq/xxB 170 | av8cQWr/HEFq/xxBav8cQWr/HEFp/xtAaf8bQGn/G0Bo/xtAaP8aP2f/Gj5m/xk8Y/8aPGL/IkFn/y1K 171 | cf8zU3v/N1iC/zpchv87Xon/O16J/zteif87Xon/O16J/zlch/80V4L/LlJ8/ylNd/8lSXP/IkZw/x9E 172 | bf8dQmv/HEFq/xxBav8bQGn/G0Bo/xo/Z/8aP2f/Gj9n/xk9Zf8WNlr/ES9QVhg1WLsdP2b/IEVu/yFG 173 | b/8hRm//IUZv/yJGcP8iRnD/IkZw/yJGcP8hRm//IUZv/yFGb/8hRW//IEVu/yBFbv8gRG7/H0Rt/x9E 174 | bf8eQ2z/HkNs/x5CbP8dQmv/HUJr/x1Ca/8cQWr/HEFq/xxBav8cQWr/KEpw/z5bfP9KZYP/RmKA/zZV 175 | d/8fQ2r/Gj9n/xk9Zf8ZO2L/ID9l/ytJb/8zUnr/N1iC/zpchv87Xon/O16J/zteif87Xon/O16J/zda 176 | hf8wVH7/K095/yZLdP8jR3H/IEVu/x5DbP8cQWr/HEFq/xxBaf8bQGj/Gj9n/xo/Z/8aPmb/Fzlf/xQw 177 | UpgaN1m5H0Fp/yNHcP8kSHL/JEhy/yRJcv8lSXP/JUlz/yVJc/8lSXP/JUlz/yVJc/8kSXL/JEhy/yRI 178 | cv8jSHH/I0dx/yJHcP8iRnD/IUZv/yBFbv8gRG7/H0Rt/x9Dbf8eQ2z/HkNs/0plg/+Jl6f/v8TJ/97d 179 | 3v/k5OT/5+fn/+bm5v/i4eL/1tbX/6uzu/9xhJj/MFBz/xo+Zv8ZPGL/Hj5k/ypHbf8yUXn/N1iB/zpc 180 | h/87Xon/O16J/zteif87Xon/OFyG/zJWgP8tUHv/KEx2/yRIcv8gRW7/HkNs/x1Ca/8cQWr/HEFp/xtA 181 | af8aP2j/Gj9n/xg7Yf8UMlW8HDhbkSFCaf8mSnP/J0t1/ydLdf8oTHb/KEx2/yhNdv8pTXf/KU13/ylN 182 | d/8pTXf/KE12/yhMdv8oTHb/J0t1/ydLdf8mSnT/JUpz/yRJcv8kSHL/I0dx/yJHcP8iRm//WnKN/7e8 183 | w//j4+P/8PDw//j4+P/7+/v//Pz8//z8/P/8/Pz//Pz8//n5+f/19PX/6+vr/9nZ2f+Snqz/NVR2/xo+ 184 | Zv8ZO2L/Hj1j/ytJb/8zU3v/OFmD/zpdiP87Xon/O16J/zteif86XYj/NFeC/y5SfP8pTXf/JEly/yFG 185 | b/8eQ2z/HUJr/xxBav8cQWr/G0Bp/xo/Z/8YO2H/EjJVwB04W1YiQmj/KEt1/ypOeP8rT3n/LFB6/yxQ 186 | ev8tUXv/LVF7/y1Re/8uUXz/LVF7/y1Re/8tUXv/LFB6/yxQev8rT3n/K095/ypOeP8pTXf/KEx2/ydL 187 | df84WH3/oaq1/9/f3//w8PD/9/f3//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//j4 188 | +P/19fX/6enp/9DQ0f9vgZb/HUFp/xk+Zf8YO2H/IT9k/y5Mc/81Vn//OVuG/zteif87Xon/O16J/zpd 189 | iP81WIP/LlJ8/ylNd/8lSXP/IUZv/x9Dbf8dQmv/HEFq/xxBav8bQGj/GDpg/xQyU6IiM2YPIkBk9ipM 190 | df8uUnz/L1N9/zBUfv8xVH//MVV//zJWgP8yVoD/M1aB/zNWgf8zVoH/MlaA/zJWgP8yVYD/MVV//zBU 191 | fv8vU33/LlJ8/y1Re/9Paor/wcPG/+Tk5f/w8PD/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly 192 | 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/r6+v/2dnZ/5afqv8lR23/Gj9n/xk8Y/8ZOl//JkNo/zJQ 193 | d/83WIL/Ol2I/zteif87Xon/Ol2I/zVYg/8vUn3/KU13/yVJc/8hRm//H0Rt/x1Ca/8cQWr/Gz9o/xc4 194 | Xf8VL1RhAAAAACI+Y5wqSnL/MVR+/zNXgf81WIP/NlmE/zdahf84W4b/OFuG/zlch/85XIf/OVyH/zlc 195 | h/85XIf/OFuG/zdbhf83WoX/NlmE/zRYgv9Ra4r/tra4/9HQ0P/Z2Nn/2tnZ/9rZ2f/a2dn/2tnZ/9rZ 196 | 2f/a2dn/2tnZ/9rZ2f/a2dn/2tnZ/9rZ2f/a2dn/2tnZ/9rZ2f/a2dn/2tnZ/9fW1//Hxsf/kZig/yJF 197 | bP8bQGj/Gj5m/xg6Yf8ePGH/Lkty/zVWf/85XIb/O16J/zteif86XYj/NViD/y5SfP8pTXf/JUlz/yFG 198 | b/8fQ23/HUJr/xo9ZP8UNFjqFSpVDAAAAAAiO2YeJ0Zs8zJTfP84WoX/Ol2I/zpdiP87Xon/O16J/zte 199 | if87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/j5GW/6moqf+0srP/t7W2/7e1 200 | t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1t/+3tbf/t7W3/7e1 201 | tv+2tbb/sK6v/6Ggof9cbID/G0Bp/xtAaf8bP2f/GTxj/xk5Xv8oRWv/M1J7/zlbhf87Xon/O16J/zpd 202 | iP80WIL/LlJ8/yhNdv8kSXL/IUVv/x1Baf8YOF7/FTFUYQAAAAAAAAAAAAAAAClFaVwvTXT+N1iB/zpd 203 | h/87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/PF+J/31/ 204 | hf+LiYr/j4yO/5COj/+Qjo//kI6P/5COj/+Qjo//kI6P/5COj/+Qjo//kI6P/5COj/+Qjo//kI6P/5CO 205 | j/+Qjo//kI6P/5COj/+Qjo//j42P/42Ljf+Ihof/U2N3/xxBav8cQWr/G0Bp/xtAaP8aPmX/Fzhd/yM/ 206 | ZP8yUHj/OFmD/ztdiP87Xon/OVyH/zNWgf8tUXv/J0x1/yJFbv8cPGL/FzNXmgAAAAAAAAAAAAAAAAAA 207 | AAAAAAAAKkZrZi1Mc/o1VX7/OVqE/zpdh/87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zte 208 | if87Xon/O16J/zteif89X4n/PmCJ/z5gif8+YIn/PmCJ/z5gif8+YIn/Pl+J/z1eiP86XIX/OFqD/zVX 209 | gP8zVX7/MFN8/y5Ref8sT3f/Kk11/yhLc/8nSnL/JUhw/yRHb/8jRm7/IkVt/x1Ca/8cQWr/HEFq/xxB 210 | av8cQWn/G0Bp/xo+Zv8YOV//ID1h/zFPd/84WYP/O12I/zteif83W4X/MFR+/ylLdP8hQWf/GjhbmgBV 211 | VQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoR2syLUlwvzFOdv80VHz/NleA/zdYgv84WYP/OFmD/zha 212 | hP85W4X/OlyG/zpch/86XYj/O12I/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zte 213 | if87Xon/O16J/zpdiP84XIb/NlmE/zNWgf8wVH7/LVF7/ytPef8oTXb/Jkt0/yRJcv8iR3D/IUVv/x9E 214 | bf8eQ2z/HUJr/x1Ca/8cQWr/HEFq/xxBav8bQGn/Gj5m/xg5Xv8eOl7/ME52/zdYgf85W4b/OFqE/zBR 215 | ef8mQ2v1HzxhaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArRGkpKkVscSxI 216 | bpsrRmy1JUJm/ydEaf4qRmz+LUpw/jBOdf8xUHj/M1J6/zRUff82VoD/O1yE/154mP9uhaL/Ynub/0Bi 217 | i/87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif85XYf/N1qF/zRXgv8wVH7/LlF8/ytP 218 | ef8oTXb/KU12/0tniP9edpH/UGuJ/yhLcv8eQ2z/HUJr/xxBav8cQWr/HEFq/xxBaf8aPmb/Fzhe/x87 219 | X/8wTXT/M1J6/zFPdv8qSG60JEFlIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 220 | AAAAAAAAAAAAAAAAAAAAAAABFTFTtBc1Wv8XN1z/Fzdb/xc2Wv8WNVj+GDZZ/hs4W/4gPF/+doSZ/s/Q 221 | 0//j4uL/5+bm/+Tj4//U1dj/iJiu/zxdh/86XYf/O16I/zteif87Xon/O16J/zteif87Xon/O16J/zte 222 | if86XYj/N1qF/zRXgv8xVH//cYag/8vO0v/j4uL/5eTk/+Pi4v/U1df/gZKl/yVIcP8eQ2z/HUJr/xxB 223 | av8cQWr/HEFq/xo+Zv8XN13/IT1h/yVDZuctRWo+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 224 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjJUWhg4Xf8bPmX/HEBo/xxAaP8cQGj/Gz9n/xs+ 225 | Zf8dP2b/mqSw/+Tj5P/08/P/+/v7//39/f/8/Pz/9vX1/+fm5/+vt8H/OVd9/zVWf/84WYP/OVyG/ztd 226 | iP87Xon/O16J/zteif87Xon/O16J/zteif87Xoj/nKi5/+Tj4//v7+//9/b2//n5+f/49/f/8fHx/+Xk 227 | 5f+xuMH/Kkxz/x5DbP8dQmv/HUJr/xxBav8cQWr/Gz5m/xg5X/8UMlP9FixNFwAAAAAAAAAAAAAAAAAA 228 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg2WskdP2b/H0Ns/x9E 229 | bf8fRG3/H0Rt/x9Dbf8eQ2z/hZWn/+bl5f/5+fn//v7+//7+/v/+/v7//v7+//7+/v/7+/v/6enp/5eg 230 | rf8hPWH+Kkdt/jJQeP81Vn//OFmD/zpch/87Xon/O16J/zteif87Xon/iZqw/+Xk5P/29vb//v7+//7+ 231 | /v/+/v7//v7+//7+/v/5+fn/6Ofn/6KsuP8hRW7/H0Rt/x5DbP8dQmv/HEFq/xxBav8bPmb/Fzdb/xMu 232 | Uk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw4 233 | VBIcO2D+IURs/yJHcP8iR3D/Ikdw/yJHcP8iRnD/RWKD/97d3v/39/f//v7+//v7+/+mpqX/c3Ny/56e 234 | nf/4+Pj//v7+//r6+v/j4uL/TGN+/xY1Wf8YNVj+IT1i/ixJcP8zUnr/NleA/zlbhf86XYj/Um+U/93d 235 | 3v/29fX//v7+//39/f+srKz/c3Nz/5iYl//19fX//v7+//n5+f/j4uL/X3eS/yFGb/8fRG3/HkNs/x1C 236 | a/8cQWr/G0Bo/xg5X/8VMVJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 237 | AAAAAAAAAAAAAAAAAAAcOFk2ID9m/yVJcv8mSnT/Jkt0/yZLdP8mSnT/Jkp0/5umtf/t7Oz//fz8//v7 238 | +/9cXFz/EREQ/xEREP8RERD/TExL//f39//9/f3/8fHx/6qyvP8bPmb/GTti/xc4Xf8VM1f/Gzda/iVB 239 | Zv4wTnX/NVV+/5iltv/t7e3//f39//39/f9paWn/EREQ/xEREP8RERD/QkJB//Pz8//9/f3/8vLy/7a9 240 | xf8kSHL/IkZw/yBFbv8fQ23/HUJr/xxBaf8ZOmD/FDJWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 241 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHTpdNCNDav8pTXb/K095/ytPef8rT3n/K095/zFU 242 | fP/V1tf/9vX1//z8/P+hoaD/EREQ/xEREP8RERD/EREQ/xEREP+NjY3//Pz8//n4+f/e3t7/LlB1/xxB 243 | av8bQGj/Gj5l/xk7Yf8XNlv/FzRX/iQ/Y/7R0tX/9/f3//z8/P+wsK//EREQ/xEREP8RERD/EREQ/xER 244 | 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 272 | 4P/t7e3/4+Pj/zY2Nf8RERD/EREQ/xEREP8sLCv/29vb/+3t7f/k5OT/trvD/zteif87Xon/O16J/zte 273 | if84W4b/NFiC/zBUfv8sUHr/mqWz/+Lh4v/u7u7/6ejp/0BAQP8RERD/EREQ/xEREP8kJCP/1dXV/+7u 274 | 7v/m5ub/vL7D/zFOdf8vTHP+LkhwzChFaF8AAH8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 276 | AAAtRWo+KklukWd5jsrS0dH/5eXm/+rq6v/Z2dn/ampp/zs7Ov9iYmL/0tLS/+rq6v/o5+j/1dTV/3KH 277 | of87Xon/O16J/zteif87Xon/O16J/zpeiP84W4b/M1eB/1RvkP/T0tP/5ubm/+vr6//e3t//cHBw/zw8 278 | O/9eXl3/zc3N/+vr6//o6On/1tXV/2Z3iPgmQ2U1Lz9vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 279 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 280 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWMVNDk5ul/9XU1P/k5OT/5ubn/+bm5//m5uf/5ubn/+bm 281 | 5//l5eX/19fX/6iuuP86W4T/OlyH/ztdiP87Xon/O16J/zteif87Xon/O16J/zpdiP83WoX/lKCw/9XU 282 | 1f/j4uP/5+fo/+jo6P/o6Oj/6Ojo/+jn6P/l5eX/19fX/6uwt/8bOV3/Ey1PQwAAAAAAAAAAAAAAAAAA 283 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 284 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjNX0CVEZ/+orbT/0M/Q/9zc 285 | 3P/h4eH/4uLi/+Hh4v/e3d7/0tLS/7CzuP8zTGz+LElw/jNSev82V4D/OFqE/zpdh/87Xon/O16J/zte 286 | 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 342 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 343 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 344 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKkdrTjJQ 345 | eP85XIb/O16J/zteif87Xon/O16J/zteif87Xon/N1qF/zJVgP8tUXv/KE12/yVJc/8hRm//H0Rt/x5C 346 | bP8cQGj/GDlf/xQxVHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 347 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 348 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 349 | AAAAAAAAAAAAACtHbYA0VHz/Ol2H/zteif87Xon/O16J/zteif87Xon/O16J/zteif84W4b/MlaA/y1R 350 | e/8pTXf/JUlz/yJGcP8fRG3/HD9m/xUzV/cUMlEZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 351 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 352 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 353 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsR215NFR8/zpdh/87Xon/O16J/zteif87Xon/O16J/zte 354 | if87Xon/O16J/zhchv8zVoH/LVF7/ylNd/8lSXP/IURt/xs7Yf8WMVaHAAAAAAAAAAAAAAAAAAAAAAAA 355 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 356 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 357 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0VtRjJReP85W4b/O16J/zte 358 | if87Xon/O16J/zteif87Xon/O16J/zteif87Xon/OVyH/zNWgf8tUXv/KEt1/yFCaf8ZNVrWHDhUCQAA 359 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 360 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 361 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMz 362 | ZgUtTHLmN1iC/zteif87Xon/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zteif84XIb/MlV//ylL 363 | c/8ePGHwGDdXKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 364 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 365 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 366 | AAAAAAAAAAAAAAAAAAAAAAAAKkhscTNSev86XIb/O16J/zteif87Xon/O16J/zteif87Xon/O16J/zte 367 | if87Xon/Ol2I/zRVfv8mRGv1IDxhPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 368 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 369 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 370 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNmZgUuSm/SNleA/ztdiP87Xon/O16J/zte 371 | if87Xon/O16J/zteif87Xon/OlyH/zZWgP8tTHPxJ0NnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 372 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 373 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 374 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEhpLi9O 375 | d/Y5W4b/O16J/zteif87Xon/O16J/zteif87Xon/OVuG/zRUff8uSXHhK0ZsLwAAAAAAAAAAAAAAAAAA 376 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 377 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 378 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 379 | AAAAAAAAAAAAAAAAAAAtS3KpN1mD/zteif87Xon/O16J/zteif86XYf/N1iC/zJReP8sR265JEhtFQAA 380 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 381 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 382 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 383 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALEpyoTdXgf87Xon/O16J/ztdiP85W4X/NVV+/y9N 384 | cvcsRmxzAAB/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 385 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 386 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 387 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1Jb7U1VX7/OVuF/zlb 388 | hf82V4D/MlB4/y1Jbb8tR2gnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 389 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 390 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 391 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8/ 392 | XxArR2zvMlF5/zNTe/8xUHf/LElw3itGbFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 393 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 394 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 395 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 396 | AAAAAAAAAAAAAAAAAAApQmd2K0Vr8ytJbuoqSG60KkVqYCpVfwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 397 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 398 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 399 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 400 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 401 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 402 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 403 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 404 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 405 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 406 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 407 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////wB//wAAAP/4AAAAAAAAH+AA 408 | AAAAAAAHwAAAAAAAAAOAAAAAAAAAA4AAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 409 | AACAAAAAAAAAAIAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA+AAAAAAAAAD8AAAAAAAAAf4AAAAAAAAH/8A 410 | AAAAAAA//4AAAAAAAP//gAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAA 411 | AP//AAAAAAAA//+AAAAAAAD//4AAAAAAAf//wAAAAAAB///gAAAAAAP///AAAAAAD////AAAAAB///// 412 | AAAAAH////4AAAAAf////gAAAAA////+AAAAAD////4AAAAAf////gAAAAB////+AAAAAP////4AAAAA 413 | /////wAAAAH/////gAAAB/////+AAAA//////8AAAD//////8AAAP//////8AAA///////4AAD////// 414 | /gAAf//////8AAB///////4AAH///////gAA///////+AAH///////8AA////////wAH////////gA// 415 | //////+AH////////4B/////////gP////////+D/////////4///////////////////////////ygA 416 | AABAAAAAgAAAAAEACAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/EREQ/xoaGf8gIB//IiIh/yws 417 | K/8wMC//NjY1/zw8O/9AQD//ES1P/xYsTf8ZM0z/ACpV/xIuUf8ULlH/FSpV/xIvVP8VL1T/EjBS/xQw 418 | Uv8TMVT/FDFV/xU0Vv8YMFT/GTZX/xw4VP8WNVn/Fzdc/xk2Wf8ZN1z/Fzhd/xo4W/8cOFr/GDle/x06 419 | Xf8iOVz/IDxf/y8/X/8AAH//GTNm/xg6Yf8dO2D/GTxi/x08Yf8aPmb/HT5l/xo/aP8cOHH/IjNm/yE9 420 | Yf8kP2P/Ijtm/yE/ZP8mP2b/Lz9v/zMzZv8AVVX/H0Bn/xtAaP8cQWr/HkJs/x9EbP8iQGX/JUFl/yVE 421 | Z/8pQmf/KUVl/yFCaf8lQmj/JkRq/yBFbv8lRm7/KUJo/ylFaf8tRWn/KkZs/yxGbf8kSG3/KUhr/yxI 422 | af8qSG7/LEht/zBIbf8zTGz/IkZw/ypGcf8jSHH/JEhy/yZKdP8nTHX/KEpx/y1KcP8qTHP/Lkxy/yhL 423 | dP8oTHb/LU11/ypOeP8sT3r/ME51/y5Qdf8sUHr/LlJ8/ypVf/8wUHP/MVB2/zRTdf81VHb/OVNy/zJR 424 | ef80U3v/MVN8/zRTfP8wVH7/NFR9/zlXev85V33/PFl6/zhYff8+W3z/AH9//zNmZv9BQUD/TU1M/1VV 425 | Vf9dXVz/TGN+/1Njd/9hYWH/a2tq/3Jycf9+fn3/MlaA/zVWgP82WIL/NlmE/zhZg/84WoX/OVyG/zxd 426 | h/86XYj/PV6I/z5gif9EYYL/SmWD/0hkhP9AYor/RWWN/0tniP9Paor/TWqP/1xsgP9SbIn/WnKO/1Ju 427 | kv9XcZL/XHWS/154mP9nd4n/Z3mP/31/hf9ieZL/ZnqR/2h8kv9jfJv/AAD//2+Blv9tg53/cYSZ/3aG 428 | mv9yhZ3/domf/26Fov9xhqD/dYmk/3qOpv9+kKb/fJCo/4GBgf+Ihof/jYuN/5COj/+PkZb/kZCQ/5iY 429 | l/+enp3/gI+i/4KTpv+JlKP/iZen/4aXqv+ImK7/j5us/42cr/+RmKD/kpum/5Seq/+JmrD/kJ6w/5eg 430 | rf+aoq3/lKCw/5mls/+cqLn/oqKi/6qqqv+wrq//sLCv/6Gqtf+orbT/pKy4/6iuuP+rsLf/qrG6/6qy 431 | vP+2tLb/sLO4/7a2uP+2ub3/vLy8/6+3wf+1u8P/vL7D/7/Eyf/Bw8b/xsXG/8jHx//Kysr/zMvM/83M 432 | zf/LztL/0M/Q/8/Q0//R0NH/0dLV/9XV1v/U1dj/2dnZ/9zb2//e3d7/4N/f/+Df4P/i4eH/5OPj/+Tj 433 | 5P/l5eX/6Ofn/+fn6P/o5+j/6enp/+3t7f/z8/P/+Pf3//v7+/8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA 434 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 435 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREw4W 436 | FRUTFRUVEw4OEzkwS0lJQ0pKS0lKS0tNTEpFNSwqIx0dGxsVGxUVFRMVFRUTDgoKAAAAAAAAAAAAJw4V 437 | FxwpKSstLSsrKR8fGxcbMkBJSkpNUlxkZGpvcIaHhnJuYllXRz08Oi8tLS0tKykpKR8bFxUODAAAAAAA 438 | FRQbKS0vOzs8Ozw7Ozs7Ly8tLSkfHiMzTF5kboaJio2NjY2PjYiFZ2JZWFU+PTw8OzsvOy8tLSsfFxMT 439 | AAAAFxYpOzs8PTw8PDw8PDs8Ozw7PDs7LS0tKR4iP1FkcomOjY6PjY2Pj42HZ2JYVUc+Pjs8Ozs7Ly8v 440 | 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 496 | iY6OjopzXk0nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 497 | AAAAXHOKioZuUksAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 498 | AAAAAAAAJlJub25cTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 499 | AAAAAAAAAAAAAEJKUlFKaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 500 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 501 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// 502 | ////////////////////AH//AAAA//gAAAAAAAAf4AAAAAAAAAfAAAAAAAAAA4AAAAAAAAADgAAAAAAA 503 | AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAAcAA 504 | AAAAAAAD4AAAAAAAAAPwAAAAAAAAB/gAAAAAAAAf/wAAAAAAAD//gAAAAAAA//+AAAAAAAD//wAAAAAA 505 | AP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//4AAAAAAAP//gAAAAAAB///A 506 | AAAAAAH//+AAAAAAA///8AAAAAAP///8AAAAAH////8AAAAAf////gAAAAB////+AAAAAD////4AAAAA 507 | P////gAAAAB////+AAAAAH////4AAAAA/////gAAAAD/////AAAAAf////+AAAAH/////4AAAD////// 508 | wAAAP//////wAAA///////wAAD///////gAAP//////+AAB///////wAAH///////gAAf//////+AAD/ 509 | //////4AAf///////wAD////////AAf///////+AD////////4Af////////gH////////+A//////// 510 | /4P/////////j///////////////////////////KAAAACAAAABAAAAAAQAgAAAAAAAAIAAAAAAAAAAA 511 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 512 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 513 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQL1FLFDNXpBU0WtYVN1rsFjVb7hY0WtoVNFi+EzFXmxs5 514 | XYAoQWSRJkRnmStHbKAtSG+pLkxytTBOdsQwTXXSKklz3SREa+YgQGXuGzti9Bg5XfoXNl38Fjhb+hY1 515 | W/MWNVnmFTVZzhQzVqMRL1BWAAAAAgAAAAAAKlUGFDNWrhk7Yv8bP2j/G0Bp/xtAaf8bQGn/G0Bo/xo/ 516 | aP8aPmf/GT1k/xk7Yf8cPGH/I0Bl/yxJb/80U3z/OFuF/ztdiP87Xon/OV2H/zVYg/8sUHr/JUlz/x9E 517 | bf8cQWr/G0Bp/xo/Z/8aPmb/GT5l/xg6YP8RMlWwAAAAARQxVnwaPmX/HEFq/xxBav8cQWr/HEFq/xxB 518 | av8cQWr/HEFq/xxBav8bQGn/G0Bp/xs/aP8aP2b/GTxj/xw+ZP8mRWz/MVF5/zhahP86XYj/O16J/zpd 519 | iP80V4L/Kk54/yJHcP8eQ2z/HEFp/xo/aP8aP2f/Gj9n/xg7Yf8QMFJaGTld0h9Ebf8gRW7/IEVu/yBF 520 | bv8gRW7/H0Rt/x9Ebf8eQ2z/HUJr/x1Ba/8cQWr/HEFq/xxBaf8eQmv/L1Bz/yxMcP8aPmX/IEBn/y1M 521 | dP83WYL/Ol2I/zteif84W4b/L1N9/yVKc/8fRG3/HEFq/xtAaP8aP2f/GT5m/xQ1WbodO2LSJEhy/yVJ 522 | c/8mSnT/J0t1/ydLdf8mSnT/JUlz/yRIcv8iR3D/IUVv/yBEbv9TbYr/qbO//+Pk5v/w8PD/8O/w/9vd 523 | 4P+ZprP/Plt6/x4/Zv8sS3P/N1mD/zpdiP86XYj/M1aB/yhMdv8gRW7/HEFq/xtAaf8aP2f/FDda3iA9 524 | ZJYqTXf/LVF7/y5SfP8vU33/MFN+/y9Tff8vUn3/LVF7/ytPef8yVHv/n6q3/+zs7P/19fX/9fX1//X1 525 | 9f/19fX/9fX1//T09P/l5eX/fo6g/xs/Zv8gQGb/MVB4/zlch/86XYj/NFeC/ylNd/8hRW//HUJr/xtA 526 | af8VNlrAITxjLitMdfw2WYT/OFuG/zlch/86XYj/Ol2I/zlch/85XIf/OFuG/4+WoP/Fw8T/yMfI/8jH 527 | yP/Ix8j/yMfI/8jHyP/Ix8j/yMfI/8jHx//Bv8D/a3qL/xo/aP8aPGP/KEdu/zhZg/86XYj/NFeC/ylN 528 | d/8hRW//Gj1l/xUzV1UAAAAAK0hvcDRUfP06XIf/O16J/zteif87Xon/O16J/zteif87Xon/YHGI/2Z2 529 | i/9nd4z/Z3aM/2V1iv9jc4j/YHGG/15vg/9cbYH/W2uA/1hpfv9GW3X/HEFq/xtAaP8ZPWT/I0Fn/zZX 530 | gf86XYj/MVV//yRHb/8ZOFyNAAAAAAAAAAAAAAAAKkhuPC9OdKYxT3fTL051/jFRef41VX7/NliB/zlb 531 | hf9QbpP/RmaO/zteif87Xon/O16J/zpdiP83WoX/MVV//yxQev8nTHX/LVB3/zpZfP8gRG3/HEFq/xtA 532 | af8aPWT/IT5k/zRUff8vUXnsIj9nYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABU0V4MZOmD/GTth/xk5 533 | X/48VXT+xsnP/vDw8P/q6ur/lqS3/zhZgv85XIb/O12I/zteif86XYj/OFuF/4iZrv/l5eb/7u3t/8rO 534 | 1P9HY4T/HEFq/xxBav8ZPGT/Gjld+CQ8YRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8EGz1j8SBF 535 | bv8gRW7/KEty/8/T2P/7+/v/xcXE/+Tk5P/39/f/eYea/iJAZf4uTXX+N1iC/zpdh/98kar/8/Pz/+np 536 | 6f/BwcH/+vr6/9nb3v8wUXb/HUJr/xxBav8ZO2H/ECxNLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB06 537 | WBokRm7/KEx2/yhMdv9xhp7/9/b2/4KCgf8RERD/Hx8e/9/f3//c3uD/H0Jp/xg6YP8cOl/+J0Vr/tPW 538 | 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 580 | AAHgAAAH8AAAD/AAAA/wAAAP8AAAD/AAAA/4AAAf/AAAf/8AAH/+AAB//gAAf/8AAP//AAH//4AH///A 581 | B///4Af//+AP///gD///8B////g////4////8f///////ygAAAAgAAAAQAAAAAEACAAAAAAAAAgAAAAA 582 | AAAAAAAAAAAAAAAAAAAAAAD/EREQ/xUVFP8dHRz/ICAf/ycnJv8vLy7/MjIx/zU1NP8ZM0z/ACpV/xMv 583 | Uv8TMFL/FDBS/xQxVf8UM1b/FjNW/xU1Vf8cOFT/FTRY/xY0Wf8WNlv/Fjdc/xc3XP8YNlv/Gjdd/xc4 584 | Xf8aOFv/HDlb/xg4Xf8aOV3/GTpf/xo6X/8cOl//Hjpe/wAAf/8YOmH/Gjth/xk8Yv8aPGP/HDxi/x48 585 | Yf8ePmP/GT1k/xo9ZP8aPmb/HD1k/x0+Zf8aP2j/IDxh/yI+Y/8nPmL/ID9k/yY/Zv8cQGf/H0Bm/xtA 586 | aP8cQGn/HUFq/x5BaP8dQmv/H0Nr/x5CbP8fRG3/IEBm/yNAZv8kQmf/KEJn/yBBaP8gQ2r/J0Fo/yRC 587 | aP8nRGj/IERu/yFGb/8kRm7/JkZt/ylDa/8pRGn/K0Vr/yhGa/8rRmz/LEZs/yRIbf8pSG//Kkls/ytK 588 | bv8sSG3/IkZw/yVHcP8jSHH/JEhy/yVJc/8lSnP/Jkp0/ydMdf8pSXD/LUlw/yxKcP8uSnD/L0py/ylM 589 | c/8sTXH/LUxz/y5Mcv8vTXP/KEx2/ytMdP8pTnf/LUx0/y9NdP8tTnb/L051/ypNeP8rTnj/LE94/zBN 590 | dP8wT3b/MU52/y5Qd/8sUHr/LVF7/y5RfP8uUnz/MVBy/zBQdP8xUHf/MFJ3/z1WdP8xUHj/MlF5/zBS 591 | ef8zUnr/NFN7/zBTfv80U3z/MFR+/zNVfP80VHz/NVR9/zVWfv89WXn/P1t7/ztaff8/XX//XFxc/0dc 592 | dv9ZaX7/aGho/3BwcP8yVYD/MlaA/zRXgv82VoD/NFiC/zZYgv83WIH/NlmE/zdahP84WYL/OVqD/zha 593 | hf85WoX/OFyG/zpchv86XYj/O12I/zpeiP87Xoj/RGGC/0hkhP9GZo7/S2qP/1Bohv9bbID/XW2C/19v 594 | hP9TbYr/VW+P/1Fuk/9SbpL/YXGG/2FyiP9jc4j/ZnaL/2d3jP9seov/YXaR/2x9k/9qfZT/c4Wa/3KH 595 | n/96iZz/f4+h/3+Rpv99kav/goKB/4aGhf+Xl5f/nJyb/42Ypf+Omqj/iZmv/5CXoP+VoLD/lqO2/5el 596 | t/+bpbD/nqex/5mmtP+srKz/oKq3/6Srtv+jr73/pLC//6myvv+qtL//t7e3/664xf+yu8b/uL/H/73E 597 | zf/BwMH/wsLC/8XExf/Jx8j/x8vR/83O0f/Lz9X/0NDS/9DU2P/T19z/2tzf/9zc3P/e3d7/397e/9ze 598 | 4P/h4eH/4uLi/+Pj5P/k5OX/5uXm/+fm5//p6en/6urq/+zs7P/u7u7/8PDw//Tz8//09PT/9vb2//f3 599 | +P/5+fn/+/v7//z8/P8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwwUFRoWExQP 600 | IkZPUWJpfoFtTEAoJBcaGhUUEwwJABATJjA5OTw8ODAtKyhCYomip6iknXldSjw5ODArJBMKEC48PDw8 601 | PDw8PDg8OC0rL0yEoqimpZpyWj88MDAwJA4lP0pKWEpJST4+PDs5PD5+Zi1Eb56oqKWGXj89OjgtEypc 602 | Xl9eXl5eXFpYSrHX8vf37NGON2ehqKeXcko8OS0WNHN5e4iIiHt7eYnT9fr5+vr7+fDBOECCpKiabFg8 603 | Ohcyb6ClpqelpqWhy+Dh4eHh4eHh4d66OCxUnqibcUotDwBimKSmqKimqKa3uLm5ube2sK+uk5I4OS1C 604 | m6iXWR4AAABXdoJwgpiZpbSrpqanpZ6Xc193j0o5OSsyioFHAAAAAAAAFCQnHoDi9/XOpKWnqKikyvD2 605 | 5Ko8PC0hMwAAAAAAABIuSkpl5v7g8PzANXCfpMP489/+6H8+OScNAAAAAAAAHFlrar/6xAEE7Ow9JCBQ 606 | 5/UFAZX8wlo/LQ4AAAAAAAA1a5id1vwDAQHF96k+PH72xgEBAvfbalsuEAAAAAAAAAB0pKja9QEBAZX2 607 | sl5YkPbEAQEB6d2IaioAAAAAAAAAAFeCos33CAEBx/KslnKD79IBAQX21ZtgIgAAAAAAAAAAAFd0u+3Z 608 | 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 636 | AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAgAEAAMADAADAAwAAwAMAAPAPAADwDwAA8A8AAPg/ 637 | AAD8PwAA/D8AAPx/AAD//wAAKAAAABAAAAAgAAAAAQAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA 638 | AP8RERD/FRUU/xcXFv8ZM0z/FDJV/xUyVv8aNFf/HDhU/xU0WP8WNlr/Fzdb/xc3XP8aOFv/GDhe/xk4 639 | Xf8aOV3/Hjpd/wAAf/8YO2H/GTxi/x08Yv8bPWT/Gj5l/xs/Zv8cPWT/HT5l/x4/Zf8jPmP/H0Bm/xtA 640 | aP8cQGn/HUJr/x5Cav8fQmn/HkJs/x9Ebf8kQmf/IkNr/yREav8nRGj/IERt/yFGb/8iRm7/JEZs/yVG 641 | bv8mRm3/K0Zr/ytGbP8mSG7/LUht/yJHcP8jR3H/I0hx/yRIcv8oSHD/Kklw/ylKcv8qSnL/LUpw/y5K 642 | cf8vTHP/KU13/ytNdv8sTnb/L093/ypOeP8wT3b/MU93/yxQev8vUHj/L1J7/y5RfP8xUHf/MVJ7/zJS 643 | e/8zUnr/NFR5/zFUf/8zVH3/NFR9/zVVfv81Vn//OVl9/0BYd/9CXHr/Q118/0Vefv8zVoH/NVeB/zZW 644 | gP81WIP/N1iC/zZZhP84W4b/OVuF/zpchv8+XoT/Ol2I/zteiP8/YIn/SWSD/0pkhP9NaYf/UGmJ/1Fq 645 | i/9Yb43/W3KN/113lv9feJX/aoGc/3KClf9uhaL/coij/4GBgP+JiIj/lZWV/5eXl/+bm5v/ipam/4WW 646 | qv+Jmq7/jJ61/5Cgs/+jo6P/uLi4/6y2w/+wt8H/tLzG/7rCzP/AwMD/wcPH/8PFyP/Mzc3/0dLT/9va 647 | 2v/d3Nz/397f/+Df4P/h4eH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 648 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 649 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 650 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 651 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 652 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 653 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 654 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 655 | AP8SBgoMCRwwPEM4Gw4MCgUEDh8gHx4YGi5PYl0+IR4XCiI1NjUqJGd5eGVGYE4qHxM5WFtbWHeIiYqH 656 | byZbWDMUO1FaXGBqaWhmVlUgGktAEAAIGSKAi3tKYHqKgSsWBwAAET9sfAKFMSeGA3ZtIQYAAABQcHMB 657 | fWFGggFycS0AAAAAMleDdH9iXn51hFQoAAAAAAAVTWssGjpkblMPAAAAAAAAJUdFNSMeHVJBDQAAAAAA 658 | AABJXF1CJB4KAAAAAAAAAAAAAENjYkgpCgAAAAAAAAAAAAA9X2NgNwgAAAAAAAAAAAAAAFpfTDAAAAAA 659 | AAAAAAAAAAA8PAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAIABAADAAwAAwAMAAMADAADwDwAA8A8AAPAP 660 | AAD4PwAA/D8AAPw/AAD8fwAA//8AAA== 661 | 662 | 663 | --------------------------------------------------------------------------------