diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bcf2cce --- /dev/null +++ b/.gitignore @@ -0,0 +1,366 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# FunGame Implement +FunGame.Core/Implement/*.cs \ No newline at end of file diff --git a/FunGame.Core/FunGame.Core.csproj b/FunGame.Core/FunGame.Core.csproj new file mode 100644 index 0000000..b8bfeac --- /dev/null +++ b/FunGame.Core/FunGame.Core.csproj @@ -0,0 +1,15 @@ + + + + net6.0-windows + enable + enable + Milimoe + ..\bin + + + + + + + diff --git a/FunGame.Core/Interface/ServerInterface.cs b/FunGame.Core/Interface/ServerInterface.cs new file mode 100644 index 0000000..ce13dcc --- /dev/null +++ b/FunGame.Core/Interface/ServerInterface.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Core.Interface +{ + /** + * 接口需要在FunGame.Core.Implement中创建新的类实现 + * 参考: + * using FunGame.Core.Interface; + + namespace FunGame.Core.Implement + { + public class ServerInterfaceImpl : ServerInterface + { + public string RemoteServerIP() + { + // 此处修改连接远程服务器IP + string serverIP = "127.0.0.1"; + string serverPort = "22222"; + return serverIP + ":" + serverPort; + } + } + } + */ + + public interface ServerInterface + { + // 实现类:ServerInterfaceImpl + public string RemoteServerIP(); + } +} diff --git a/FunGame.sln b/FunGame.sln new file mode 100644 index 0000000..2a2bce1 --- /dev/null +++ b/FunGame.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32804.467 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunGame", "FunGame\FunGame.csproj", "{BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunGame.Core", "FunGame.Core\FunGame.Core.csproj", "{CC6C83C6-5818-4565-8873-67587FED1D0A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFFCC8D2-DF96-4DD3-81BA-552FAB33495A}.Release|Any CPU.Build.0 = Release|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC6C83C6-5818-4565-8873-67587FED1D0A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9AD4C55B-5C44-4486-8497-5C5A7A7B299B} + EndGlobalSection +EndGlobal diff --git a/FunGame/FunGame.csproj b/FunGame/FunGame.csproj new file mode 100644 index 0000000..e78eeb2 --- /dev/null +++ b/FunGame/FunGame.csproj @@ -0,0 +1,51 @@ + + + + WinExe + net6.0-windows + enable + true + enable + Images\logo.ico + + logo.ico + Milimoe + ..\bin + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + True + \ + + + + \ No newline at end of file diff --git a/FunGame/Images/back.jpg b/FunGame/Images/back.jpg new file mode 100644 index 0000000..2bbc4df Binary files /dev/null and b/FunGame/Images/back.jpg differ diff --git a/FunGame/Images/exit.png b/FunGame/Images/exit.png new file mode 100644 index 0000000..f4fb70c Binary files /dev/null and b/FunGame/Images/exit.png differ diff --git a/FunGame/Images/favicon.ico b/FunGame/Images/favicon.ico new file mode 100644 index 0000000..25a4c90 Binary files /dev/null and b/FunGame/Images/favicon.ico differ diff --git a/FunGame/Images/green.png b/FunGame/Images/green.png new file mode 100644 index 0000000..4f3b032 Binary files /dev/null and b/FunGame/Images/green.png differ diff --git a/FunGame/Images/logo.ico b/FunGame/Images/logo.ico new file mode 100644 index 0000000..4082874 Binary files /dev/null and b/FunGame/Images/logo.ico differ diff --git a/FunGame/Images/min.png b/FunGame/Images/min.png new file mode 100644 index 0000000..864c84f Binary files /dev/null and b/FunGame/Images/min.png differ diff --git a/FunGame/Images/red.png b/FunGame/Images/red.png new file mode 100644 index 0000000..145a85b Binary files /dev/null and b/FunGame/Images/red.png differ diff --git a/FunGame/Images/send.png b/FunGame/Images/send.png new file mode 100644 index 0000000..d888873 Binary files /dev/null and b/FunGame/Images/send.png differ diff --git a/FunGame/Models/Component/ExitButton.Designer.cs b/FunGame/Models/Component/ExitButton.Designer.cs new file mode 100644 index 0000000..25cafce --- /dev/null +++ b/FunGame/Models/Component/ExitButton.Designer.cs @@ -0,0 +1,36 @@ +namespace FunGame.Models.Component +{ + partial class ExitButton + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/FunGame/Models/Component/ExitButton.cs b/FunGame/Models/Component/ExitButton.cs new file mode 100644 index 0000000..75862cf --- /dev/null +++ b/FunGame/Models/Component/ExitButton.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Component +{ + public partial class ExitButton : Button + { + public ExitButton() + { + InitializeComponent(); + Anchor = System.Windows.Forms.AnchorStyles.None; + BackColor = System.Drawing.Color.White; + BackgroundImage = global::FunGame.Properties.Resources.exit; + FlatAppearance.BorderColor = System.Drawing.Color.White; + FlatAppearance.BorderSize = 0; + FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + FlatStyle = System.Windows.Forms.FlatStyle.Flat; + Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + ForeColor = System.Drawing.Color.Red; + Location = new System.Drawing.Point(750, 3); + Size = new System.Drawing.Size(47, 47); + TextAlign = System.Drawing.ContentAlignment.TopLeft; + UseVisualStyleBackColor = false; + } + + public ExitButton(IContainer container) + { + container.Add(this); + InitializeComponent(); + Anchor = System.Windows.Forms.AnchorStyles.None; + BackColor = System.Drawing.Color.White; + BackgroundImage = global::FunGame.Properties.Resources.exit; + FlatAppearance.BorderColor = System.Drawing.Color.White; + FlatAppearance.BorderSize = 0; + FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + FlatStyle = System.Windows.Forms.FlatStyle.Flat; + Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + ForeColor = System.Drawing.Color.Red; + Location = new System.Drawing.Point(750, 3); + Size = new System.Drawing.Size(47, 47); + TextAlign = System.Drawing.ContentAlignment.TopLeft; + UseVisualStyleBackColor = false; + } + } +} diff --git a/FunGame/Models/Component/ShowMessage.Designer.cs b/FunGame/Models/Component/ShowMessage.Designer.cs new file mode 100644 index 0000000..ebfa044 --- /dev/null +++ b/FunGame/Models/Component/ShowMessage.Designer.cs @@ -0,0 +1,164 @@ +namespace FunGame.Models.Component +{ + partial class ShowMessage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShowMessage)); + this.MsgText = new System.Windows.Forms.Label(); + this.LeftButton = new System.Windows.Forms.Button(); + this.Exit = new FunGame.Models.Component.ExitButton(this.components); + this.RightButton = new System.Windows.Forms.Button(); + this.MidButton = new System.Windows.Forms.Button(); + this.Title = new System.Windows.Forms.Label(); + this.TransparentRect = new FunGame.Models.TransparentRect(); + this.TransparentRect.SuspendLayout(); + this.SuspendLayout(); + // + // MsgText + // + this.MsgText.BackColor = System.Drawing.Color.Transparent; + this.MsgText.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.MsgText.Location = new System.Drawing.Point(2, 51); + this.MsgText.Name = "MsgText"; + this.MsgText.Size = new System.Drawing.Size(232, 73); + this.MsgText.TabIndex = 100; + this.MsgText.Text = "Message"; + this.MsgText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // LeftButton + // + this.LeftButton.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.LeftButton.Location = new System.Drawing.Point(13, 127); + this.LeftButton.Name = "LeftButton"; + this.LeftButton.Size = new System.Drawing.Size(98, 37); + this.LeftButton.TabIndex = 98; + this.LeftButton.Text = "Left"; + this.LeftButton.UseVisualStyleBackColor = true; + this.LeftButton.Click += new System.EventHandler(this.LeftButton_Click); + // + // Exit + // + this.Exit.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Exit.BackColor = System.Drawing.Color.White; + this.Exit.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("Exit.BackgroundImage"))); + this.Exit.FlatAppearance.BorderColor = System.Drawing.Color.White; + this.Exit.FlatAppearance.BorderSize = 0; + this.Exit.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.Exit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.Exit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.Exit.Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Exit.ForeColor = System.Drawing.Color.Red; + this.Exit.Location = new System.Drawing.Point(187, 1); + this.Exit.Name = "Exit"; + this.Exit.Size = new System.Drawing.Size(47, 47); + this.Exit.TabIndex = 15; + this.Exit.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.Exit.UseVisualStyleBackColor = false; + this.Exit.Click += new System.EventHandler(this.Exit_Click); + // + // RightButton + // + this.RightButton.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.RightButton.Location = new System.Drawing.Point(125, 127); + this.RightButton.Name = "RightButton"; + this.RightButton.Size = new System.Drawing.Size(98, 37); + this.RightButton.TabIndex = 101; + this.RightButton.Text = "Right"; + this.RightButton.UseVisualStyleBackColor = true; + this.RightButton.Click += new System.EventHandler(this.RightButton_Click); + // + // MidButton + // + this.MidButton.Font = new System.Drawing.Font("LanaPixel", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.MidButton.Location = new System.Drawing.Point(65, 127); + this.MidButton.Name = "MidButton"; + this.MidButton.Size = new System.Drawing.Size(98, 37); + this.MidButton.TabIndex = 102; + this.MidButton.Text = "Middle"; + this.MidButton.UseVisualStyleBackColor = true; + this.MidButton.Click += new System.EventHandler(this.MidButton_Click); + // + // Title + // + this.Title.BackColor = System.Drawing.Color.Transparent; + this.Title.Font = new System.Drawing.Font("LanaPixel", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Title.Location = new System.Drawing.Point(2, 1); + this.Title.Name = "Title"; + this.Title.Size = new System.Drawing.Size(179, 47); + this.Title.TabIndex = 97; + this.Title.Text = "Message"; + this.Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // TransparentRect + // + this.TransparentRect.BackColor = System.Drawing.Color.WhiteSmoke; + this.TransparentRect.BorderColor = System.Drawing.Color.WhiteSmoke; + this.TransparentRect.Controls.Add(this.Title); + this.TransparentRect.Controls.Add(this.MidButton); + this.TransparentRect.Controls.Add(this.RightButton); + this.TransparentRect.Controls.Add(this.Exit); + this.TransparentRect.Controls.Add(this.LeftButton); + this.TransparentRect.Controls.Add(this.MsgText); + this.TransparentRect.Location = new System.Drawing.Point(0, 0); + this.TransparentRect.Name = "TransparentRect"; + this.TransparentRect.Opacity = 125; + this.TransparentRect.Radius = 20; + this.TransparentRect.ShapeBorderStyle = FunGame.Models.TransparentRect.ShapeBorderStyles.ShapeBSNone; + this.TransparentRect.Size = new System.Drawing.Size(235, 170); + this.TransparentRect.TabIndex = 103; + this.TransparentRect.TabStop = false; + this.TransparentRect.Text = "transparentRect1"; + // + // ShowMessage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.ClientSize = new System.Drawing.Size(235, 170); + this.Controls.Add(this.TransparentRect); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "ShowMessage"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Show"; + this.TransparentRect.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Label MsgText; + private Button LeftButton; + private ExitButton Exit; + private Button RightButton; + private Button MidButton; + private Label Title; + private TransparentRect TransparentRect; + } +} \ No newline at end of file diff --git a/FunGame/Models/Component/ShowMessage.cs b/FunGame/Models/Component/ShowMessage.cs new file mode 100644 index 0000000..7b1aee2 --- /dev/null +++ b/FunGame/Models/Component/ShowMessage.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using FunGame.Models.Enum; + +namespace FunGame.Models.Component +{ + public partial class ShowMessage : Form + { + private int Location_x, Location_y; + private static int MessageResult = -1; + private static ShowMessage? s = null; + + private ShowMessage() + { + InitializeComponent(); + Opacity = 0.85; + Title.MouseDown += new MouseEventHandler(Title_MouseDown); + Title.MouseMove += new MouseEventHandler(Title_MouseMove); + } + + private void SetButtonResult(string text) + { + switch (text) + { + case "确定": + MessageResult = (int)CommonEnums.MessageResult.OK; + break; + case "取消": + MessageResult = (int)CommonEnums.MessageResult.Cancel; + break; + case "是": + MessageResult = (int)CommonEnums.MessageResult.Yes; + break; + case "否": + MessageResult = (int)CommonEnums.MessageResult.No; + break; + case "重试": + MessageResult = (int)CommonEnums.MessageResult.Retry; + break; + } + Dispose(); + } + + // 设置窗口可拖动 + private void Title_MouseDown(object? sender, MouseEventArgs e) + { + //判断是否为鼠标左键 + if (e.Button == MouseButtons.Left) + { + //获取鼠标左键按下时的位置 + this.Location_x = e.Location.X; + this.Location_y = e.Location.Y; + } + } + + private void Title_MouseMove(object? sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + //计算鼠标移动距离 + this.Left += e.Location.X - this.Location_x; + this.Top += e.Location.Y - this.Location_y; + } + } + + public static int Message(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int TipMessage(string msg, string? title = null) + { + s = new ShowMessage(); + if (title != null) s.Title.Text = title; + else s.Title.Text = "提示"; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int WarningMessage(string msg, string? title = null) + { + s = new ShowMessage(); + if (title != null) s.Title.Text = title; + else s.Title.Text = "警告"; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int ErrorMessage(string msg, string? title = null) + { + s = new ShowMessage(); + if (title != null) s.Title.Text = title; + else s.Title.Text = "错误"; + s.MsgText.Text = msg; + s.LeftButton.Visible = false; + s.RightButton.Visible = false; + s.MidButton.Visible = true; + s.MidButton.Text = "确定"; + s.ShowDialog(); + return MessageResult; + } + + public static int YesNoMessage(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = true; + s.RightButton.Visible = true; + s.MidButton.Visible = false; + s.LeftButton.Text = "是"; + s.RightButton.Text = "否"; + s.ShowDialog(); + return MessageResult; + } + + public static int OKCancelMessage(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = true; + s.RightButton.Visible = true; + s.MidButton.Visible = false; + s.LeftButton.Text = "确定"; + s.RightButton.Text = "取消"; + s.ShowDialog(); + return MessageResult; + } + + public static int RetryCancelMessage(string msg, string title) + { + s = new ShowMessage(); + s.Title.Text = title; + s.MsgText.Text = msg; + s.LeftButton.Visible = true; + s.RightButton.Visible = true; + s.MidButton.Visible = false; + s.LeftButton.Text = "重试"; + s.RightButton.Text = "取消"; + s.ShowDialog(); + return MessageResult; + } + + private void LeftButton_Click(object sender, EventArgs e) + { + SetButtonResult(LeftButton.Text); + } + + private void RightButton_Click(object sender, EventArgs e) + { + SetButtonResult(RightButton.Text); + } + + private void MidButton_Click(object sender, EventArgs e) + { + SetButtonResult(MidButton.Text); + } + + private void Exit_Click(object sender, EventArgs e) + { + MessageResult = (int)CommonEnums.MessageResult.Cancel; + Dispose(); + } + } +} diff --git a/FunGame/Models/Component/ShowMessage.resx b/FunGame/Models/Component/ShowMessage.resx new file mode 100644 index 0000000..c28b501 --- /dev/null +++ b/FunGame/Models/Component/ShowMessage.resx @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAC8AAAAvCAYAAABzJ5OsAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAu + IgAALiIBquLdkgAAAQlJREFUaEPtmYEJwjAURDOSI3SUjtINOpKjOEr9h1Hyz9+E1haN3METif2Xp6CE + mpaUll55yt86pJC3x26Q/LfYLJ/SaEzEkD4I5qkPjOH+JTvkr/nakil77ArmqQ9cw/1LJC/5t85T5GcD + b6AEm+NLV3LJbi5Yp+sA5rlzDvcv2SwfsfLJZV8XrNN1YAp7W0he8kFvC8kbHFvBrwheYcKjRNTZRPIG + x1YkX0XyBsdWJF9F8gbHViRf5RD5hyiOCHsZwt4WB8lDwJ45dDCrInnJB70tNsuvbJ7ddgXz1Ad038Yj + eR/MUx+QvEfyPpinPiB5j+R9ME994BT5jv9Q+yX+S74/XvIdkpY7JUbXJnJZ8twAAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/FunGame/Models/Component/TextArea.Designer.cs b/FunGame/Models/Component/TextArea.Designer.cs new file mode 100644 index 0000000..a532cac --- /dev/null +++ b/FunGame/Models/Component/TextArea.Designer.cs @@ -0,0 +1,36 @@ +namespace FunGame.Models +{ + partial class TextArea + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/FunGame/Models/Component/TextArea.cs b/FunGame/Models/Component/TextArea.cs new file mode 100644 index 0000000..10f111f --- /dev/null +++ b/FunGame/Models/Component/TextArea.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FunGame.Models +{ + [ToolboxBitmap(typeof(TextBox))] + partial class TextArea : RichTextBox + { + private string _emptyTextTip = ""; + private Color _emptyTextTipColor = Color.DarkGray; + private const int WM_PAINT = 0xF; + + public TextArea() : base() + { + + } + + [DefaultValue("")] + public string EmptyTextTip + { + get { return _emptyTextTip; } + set + { + _emptyTextTip = value; + base.Invalidate(); + } + } + + [DefaultValue(typeof(Color), "DarkGray")] + public Color EmptyTextTipColor + { + get { return _emptyTextTipColor; } + set + { + _emptyTextTipColor = value; + base.Invalidate(); + } + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + if (m.Msg == WM_PAINT) + { + WmPaint(ref m); + } + } + + private void WmPaint(ref Message m) + { + using (Graphics graphics = Graphics.FromHwnd(base.Handle)) + { + if (Text.Length == 0 + && !string.IsNullOrEmpty(_emptyTextTip) + && !Focused) + { + TextFormatFlags format = + TextFormatFlags.EndEllipsis | + TextFormatFlags.VerticalCenter; + + if (RightToLeft == RightToLeft.Yes) + { + format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right; + } + + TextRenderer.DrawText( + graphics, + _emptyTextTip, + Font, + base.ClientRectangle, + _emptyTextTipColor, + format); + } + } + } + + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + private static extern IntPtr LoadLibrary(string lpFileName); + protected override CreateParams CreateParams + { + get + { + CreateParams prams = base.CreateParams; + if (LoadLibrary("msftedit.dll") != IntPtr.Zero) + { + prams.ExStyle |= 0x020; // transparent + prams.ClassName = "RICHEDIT50W"; + } + return prams; + } + } + } +} \ No newline at end of file diff --git a/FunGame/Models/Component/TextArea.resx b/FunGame/Models/Component/TextArea.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/FunGame/Models/Component/TextArea.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FunGame/Models/Component/TransparentRect.Designer.cs b/FunGame/Models/Component/TransparentRect.Designer.cs new file mode 100644 index 0000000..a4b1e20 --- /dev/null +++ b/FunGame/Models/Component/TransparentRect.Designer.cs @@ -0,0 +1,36 @@ +namespace FunGame.Models +{ + partial class TransparentRect + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/FunGame/Models/Component/TransparentRect.cs b/FunGame/Models/Component/TransparentRect.cs new file mode 100644 index 0000000..dedcd89 --- /dev/null +++ b/FunGame/Models/Component/TransparentRect.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FunGame.Models +{ + partial class TransparentRect : GroupBox + { + public enum ShapeBorderStyles + { + ShapeBSNone, + ShapeBSFixedSingle, + }; + private ShapeBorderStyles _borderStyle = ShapeBorderStyles.ShapeBSNone; + private Color _backColor = Color.Black; + private Color _borderColor = Color.White; + private int _radius = 20; + private int _opacity = 125; + protected int pointX = 0; + protected int pointY = 0; + protected Rectangle iRect = new Rectangle(); + public TransparentRect() + { + base.BackColor = Color.Transparent; + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true); + SetStyle(ControlStyles.Opaque, false); + UpdateStyles(); + } + public new Color BackColor + { + get { return _backColor; } + set { _backColor = value; Invalidate(); } + } + public ShapeBorderStyles ShapeBorderStyle + { + get { return _borderStyle; } + set { _borderStyle = value; this.Invalidate(); } + } + public Color BorderColor + { + get { return _borderColor; } + set { _borderColor = value; Invalidate(); } + } + public int Opacity + { + get { return _opacity; } + set { _opacity = value; this.Invalidate(); } + } + public int Radius + { + get { return _radius; } + set { _radius = value; this.Invalidate(); } + } + public override Color ForeColor + { + get { return base.ForeColor; } + set { base.ForeColor = value; this.Invalidate(); } + } + protected override void OnPaint(PaintEventArgs e) + { + SmoothingMode sm = e.Graphics.SmoothingMode; + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + if (_borderStyle == ShapeBorderStyles.ShapeBSFixedSingle) DrawBorder(e.Graphics); + DrawLabelBackground(e.Graphics); + e.Graphics.SmoothingMode = sm; + } + private void DrawBorder(Graphics g) + { + Rectangle rect = this.ClientRectangle; + rect.Width--; + rect.Height--; + using (GraphicsPath bp = GetPath(rect, _radius)) + { + using (Pen p = new Pen(_borderColor)) + { + g.DrawPath(p, bp); + } + } + } + private void DrawLabelBackground(Graphics g) + { + Rectangle rect = this.ClientRectangle; + iRect = rect; + rect.X++; + rect.Y++; + rect.Width -= 2; + rect.Height -= 2; + using (GraphicsPath bb = GetPath(rect, _radius)) + { + using (Brush br = new SolidBrush(Color.FromArgb(_opacity, _backColor))) + { + g.FillPath(br, bb); + } + } + } + protected GraphicsPath GetPath(Rectangle rc, int r) + { + int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height; + r = r << 1; + GraphicsPath path = new GraphicsPath(); + if (r > 0) + { + if (r > h) { r = h; }; + if (r > w) { r = w; }; + path.AddArc(x, y, r, r, 180, 90); + path.AddArc(x + w - r, y, r, r, 270, 90); + path.AddArc(x + w - r, y + h - r, r, r, 0, 90); + path.AddArc(x, y + h - r, r, r, 90, 90); + path.CloseFigure(); + } + else + { + path.AddRectangle(rc); + } + return path; + } + } +} \ No newline at end of file diff --git a/FunGame/Models/Config/Config.cs b/FunGame/Models/Config/Config.cs new file mode 100644 index 0000000..33540b9 --- /dev/null +++ b/FunGame/Models/Config/Config.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.AccessControl; +using System.Text; +using System.Threading.Tasks; +using FunGame.Models.Config; +using FunGame.Utils.DataHelper; + +namespace FunGame.Models.Config +{ + public static class Config + { + /** + * Game Configs + */ + public static string VERSION = ""; + public static string VERSION_TYPE = ""; + public static string VERSION_PATCH = ""; + public static string VERSION_DATE = ""; + + public static INIHelper DefaultINIHelper = new(); + public static AssemblyHelper DefaultAssemblyHelper = new(); + + /** + * WebHelper Configs + */ + public const string WebHelper_SetGreen = "-WebHelper .set green"; + public const string WebHelper_SetRed = "-WebHelper .set red"; + public const string WebHelper_Disconnected = "-WebHelper .disconnected"; + public const string WebHelper_GetUser = "-WebHelper .get user"; + public static int WebHelper_HeartBeatFaileds = 0; + + /** + * Socket Configs + */ + public static string SERVER_IPADRESS = ""; // 默认IP地址 + public static int SERVER_PORT; // 默认端口 + public static Encoding DEFAULT_ENCODING = Encoding.UTF8; + + /** + * FunGame Configs + */ + public const string GameMode_Mix = "混战模式"; + public const string GameMode_Team = "团队模式"; + public const string GameMode_MixHasPass = "带密码的混战模式"; + public const string GameMode_TeamHasPass = "带密码的团队模式"; + + public const string FunGame_PresetMessage = "- 快捷消息 -"; + public const string FunGame_SignIn = "签到"; + public const string FunGame_ShowCredits = "积分"; + public const string FunGame_ShowStock = "查看库存"; + public const string FunGame_ShowStore = "游戏商店"; + public const string FunGame_CreateMix = "创建游戏 混战"; + public const string FunGame_CreateTeam = "创建游戏 团队"; + public const string FunGame_StartGame = "开始游戏"; + public const string FunGame_Retry = "重新连接"; + public const string FunGame_AutoRetryOn = "开启自动重连"; + public const string FunGame_AutoRetryOff = "关闭自动重连"; + public static readonly object[] PresetItems = + { + FunGame_PresetMessage, + FunGame_SignIn, + FunGame_ShowCredits, + FunGame_ShowStock, + FunGame_ShowStore, + FunGame_CreateMix, + FunGame_CreateTeam, + FunGame_StartGame, + FunGame_Retry, + FunGame_AutoRetryOn, + FunGame_AutoRetryOff + }; + public const string FunGame_ConnectByDebug = "连接到Debug"; + } +} diff --git a/FunGame/Models/Config/Usercfg.cs b/FunGame/Models/Config/Usercfg.cs new file mode 100644 index 0000000..f92a09f --- /dev/null +++ b/FunGame/Models/Config/Usercfg.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Config +{ + public static class Usercfg + { + /** + * 玩家设定内容 + */ + public static bool Match_Mix = false; // 混战模式选项 + public static bool Match_Team = false; // 团队模式选项 + public static bool Match_HasPass = false; // 密码房间选项 + public static bool FunGame_isMatching = false; // 是否在匹配中 + public static bool FunGame_isConnected = false; // 是否连接上服务器 + public static bool FunGame_isRetrying = false; // 是否正在重连 + public static bool FunGame_isAutoRetry = true; // 是否自动重连 + public static string FunGame_roomid = "-1"; // 房间号 + public static string LoginUserName = ""; // 已登录用户名 + } +} diff --git a/FunGame/Models/Entity/ActiveItem.cs b/FunGame/Models/Entity/ActiveItem.cs new file mode 100644 index 0000000..144b53c --- /dev/null +++ b/FunGame/Models/Entity/ActiveItem.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class ActiveItem : Item + { + public ActiveSkill? Skill { get; set; } = null; + + public ActiveItem() + { + Active = true; + } + } +} diff --git a/FunGame/Models/Entity/ActiveSkill.cs b/FunGame/Models/Entity/ActiveSkill.cs new file mode 100644 index 0000000..61392f2 --- /dev/null +++ b/FunGame/Models/Entity/ActiveSkill.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class ActiveSkill : Skill + { + public decimal MP { get; set; } = 0; + public decimal EP { get; set; } = 0; + public decimal Reference1 { get; set; } = 0; + public decimal Reference2 { get; set; } = 0; + public decimal Reference3 { get; set; } = 0; + public decimal Reference4 { get; set; } = 0; + public decimal Reference5 { get; set; } = 0; + public decimal Reference6 { get; set; } = 0; + public decimal Reference7 { get; set; } = 0; + public decimal Reference8 { get; set; } = 0; + public decimal Reference9 { get; set; } = 0; + public decimal Reference10 { get; set; } = 0; + + public ActiveSkill() + { + Active = true; + } + } +} diff --git a/FunGame/Models/Entity/Character.cs b/FunGame/Models/Entity/Character.cs new file mode 100644 index 0000000..04135b3 --- /dev/null +++ b/FunGame/Models/Entity/Character.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class Character + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string FirstName { get; set; } = ""; + public User? User { get; set; } = null; + public CharacterStatistics? Statistics { get; set; } = null; + public int Level { get; set; } = 1; + public decimal EXP { get; set; } + public decimal HP { get; set; } + public decimal MP { get; set; } + public decimal EP { get; set; } + public decimal ATK { get; set; } + public decimal DEF { get; set; } + public decimal PhysicalReduction { get; set; } + public decimal MDF { get; set; } + public decimal HPRecovery { get; set; } = 0; + public decimal MPRecovery { get; set; } = 0; + public decimal EPRecovery { get; set; } = 0; + public decimal SPD { get; set; } + public decimal ATR { get; set; } + public decimal CritRate { get; set; } = 0.05M; + public decimal CritDMG { get; set; } = 1.25M; + public decimal EvadeRate { get; set; } = 0.05M; + public Hashtable? Skills { get; set; } = new Hashtable(); + public Hashtable? Items { get; set; } = new Hashtable(); + + public Character() + { + + } + } +} diff --git a/FunGame/Models/Entity/CharacterStatistics.cs b/FunGame/Models/Entity/CharacterStatistics.cs new file mode 100644 index 0000000..a611f4b --- /dev/null +++ b/FunGame/Models/Entity/CharacterStatistics.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class CharacterStatistics + { + public int Id { get; set; } + public Character? Character { get; set; } = null; + public Hashtable? DamageStats { get; set; } = new Hashtable(); + public Hashtable? PhysicalDamageStats { get; set; } = new Hashtable(); + public Hashtable? MagicDamageStats { get; set; } = new Hashtable(); + public Hashtable? RealDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgLiveRoundStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageRoundStats { get; set; } = new Hashtable(); + public Hashtable? KillStats { get; set; } = new Hashtable(); + public Hashtable? DeathStats { get; set; } = new Hashtable(); + public Hashtable? AssistStats { get; set; } = new Hashtable(); + public Hashtable? Plays { get; set; } = new Hashtable(); + public Hashtable? Wins { get; set; } = new Hashtable(); + public Hashtable? Loses { get; set; } = new Hashtable(); + public Hashtable? Winrates { get; set; } = new Hashtable(); + + public CharacterStatistics() + { + + } + } +} diff --git a/FunGame/Models/Entity/GameStatistics.cs b/FunGame/Models/Entity/GameStatistics.cs new file mode 100644 index 0000000..e13409a --- /dev/null +++ b/FunGame/Models/Entity/GameStatistics.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class GameStatistics + { + public int Id { get; set; } + public Room? Room { get; set; } = null; + public string? GameRecord { get; set; } = null; + public string? RunTime { get; set; } = null; + public Hashtable? DamageStats { get; set; } = new Hashtable(); + public Hashtable? PhysicalDamageStats { get; set; } = new Hashtable(); + public Hashtable? MagicDamageStats { get; set; } = new Hashtable(); + public Hashtable? RealDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageStats { get; set; } = new Hashtable(); + public Hashtable? KillStats { get; set; } = new Hashtable(); + public Hashtable? KillDetailStats { get; set; } = new Hashtable(); + public Hashtable? DeathStats { get; set; } = new Hashtable(); + public Hashtable? DeathDetailStats { get; set; } = new Hashtable(); + public Hashtable? AssistStats { get; set; } = new Hashtable(); + public Hashtable? RatingStats { get; set; } = new Hashtable(); + public Hashtable? EloStats { get; set; } = new Hashtable(); + public Hashtable? RankStats { get; set; } = new Hashtable(); + + public GameStatistics() + { + + } + } +} diff --git a/FunGame/Models/Entity/Item.cs b/FunGame/Models/Entity/Item.cs new file mode 100644 index 0000000..11cac8b --- /dev/null +++ b/FunGame/Models/Entity/Item.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public abstract class Item + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Describe { get; set; } = ""; + public decimal Price { get; set; } + public char Key { get; set; } + public bool Active { get; set; } + public Character? Character { get; set; } = null; + } +} diff --git a/FunGame/Models/Entity/PassiveItem.cs b/FunGame/Models/Entity/PassiveItem.cs new file mode 100644 index 0000000..1d88be2 --- /dev/null +++ b/FunGame/Models/Entity/PassiveItem.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class PassiveItem : Item + { + public PassiveSkill? Skill { get; set; } = null; + + public PassiveItem() + { + Active = false; + } + } +} diff --git a/FunGame/Models/Entity/PassiveSkill.cs b/FunGame/Models/Entity/PassiveSkill.cs new file mode 100644 index 0000000..8dee862 --- /dev/null +++ b/FunGame/Models/Entity/PassiveSkill.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class PassiveSkill : Skill + { + public decimal Reference1 { get; set; } = 0; + public decimal Reference2 { get; set; } = 0; + public decimal Reference3 { get; set; } = 0; + public decimal Reference4 { get; set; } = 0; + public decimal Reference5 { get; set; } = 0; + public decimal Reference6 { get; set; } = 0; + public decimal Reference7 { get; set; } = 0; + public decimal Reference8 { get; set; } = 0; + public decimal Reference9 { get; set; } = 0; + public decimal Reference10 { get; set; } = 0; + + public PassiveSkill() + { + Active = false; + } + } +} diff --git a/FunGame/Models/Entity/Room.cs b/FunGame/Models/Entity/Room.cs new file mode 100644 index 0000000..9b56d23 --- /dev/null +++ b/FunGame/Models/Entity/Room.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Security.Policy; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class Room + { + public int Id { get; set; } + public string Roomid { get; set; } = ""; + public DateTime Time { get; set; } = DateTime.Now; + public Hashtable PlayerList { get; set; } = new Hashtable(); + public User? RoomMaster { get; set; } + public int RoomType { get; set; } + public int RoomState { get; set; } + public GameStatistics? Statistics { get; set; } = null; + + public Room(User? master = null) + { + if (master != null) RoomMaster = master; + } + + public Room(string roomid, User? master = null) + { + Roomid = roomid; + if (master != null) RoomMaster = master; + } + } +} diff --git a/FunGame/Models/Entity/Skill.cs b/FunGame/Models/Entity/Skill.cs new file mode 100644 index 0000000..4b150f6 --- /dev/null +++ b/FunGame/Models/Entity/Skill.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public abstract class Skill + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Describe { get; set; } = ""; + public char Key { get; set; } + public bool Active { get; set; } + } +} diff --git a/FunGame/Models/Entity/Stock.cs b/FunGame/Models/Entity/Stock.cs new file mode 100644 index 0000000..3587f5f --- /dev/null +++ b/FunGame/Models/Entity/Stock.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class Stock + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public User? User { get; set; } = null; + public Hashtable? Characters { get; set; } = new Hashtable(); + public Hashtable? Items { get; set; } = new Hashtable(); + + public Stock() + { + + } + } +} diff --git a/FunGame/Models/Entity/User.cs b/FunGame/Models/Entity/User.cs new file mode 100644 index 0000000..38411a8 --- /dev/null +++ b/FunGame/Models/Entity/User.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class User + { + public int Id { get; set; } + public string Userame { get; set; } = ""; + public string Password { get; set; } = ""; + public DateTime RegTime { get; set; } + public DateTime LastTime { get; set; } + public string Email { get; set; } = ""; + public string NickName { get; set; } = ""; + public bool IsAdmin { get; set; } = false; + public bool IsOperator { get; set; } = false; + public bool IsEnable { get; set; } = false; + public int OnlineState { get; set; } = 0; + public string Roomid { get; set; } = ""; + public int Credits { get; set; } = 0; + public int Material { get; set; } = 0; + public UserStatistics? Statistics { get; set; } = null; + public Stock? Stock { get; set; } = null; + + public User() + { + + } + + public User(string username) + { + Userame = username; + } + + public User(string username, string password) + { + Userame = username; + Password = password; + } + } +} diff --git a/FunGame/Models/Entity/UserStatistics.cs b/FunGame/Models/Entity/UserStatistics.cs new file mode 100644 index 0000000..9132c53 --- /dev/null +++ b/FunGame/Models/Entity/UserStatistics.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Entity +{ + public class UserStatistics + { + public int Id { get; set; } + public User? User { get; set; } = null; + public Hashtable? DamageStats { get; set; } = new Hashtable(); + public Hashtable? PhysicalDamageStats { get; set; } = new Hashtable(); + public Hashtable? MagicDamageStats { get; set; } = new Hashtable(); + public Hashtable? RealDamageStats { get; set; } = new Hashtable(); + public Hashtable? AvgDamageStats { get; set; } = new Hashtable(); + public Hashtable? KillStats { get; set; } = new Hashtable(); + public Hashtable? DeathStats { get; set; } = new Hashtable(); + public Hashtable? AssistStats { get; set; } = new Hashtable(); + public Hashtable? Plays { get; set; } = new Hashtable(); + public Hashtable? Wins { get; set; } = new Hashtable(); + public Hashtable? Loses { get; set; } = new Hashtable(); + public Hashtable? Winrates { get; set; } = new Hashtable(); + public Hashtable? RatingStats { get; set; } = new Hashtable(); + public Hashtable? EloStats { get; set; } = new Hashtable(); + public Hashtable? RankStats { get; set; } = new Hashtable(); + + public UserStatistics() + { + + } + } +} diff --git a/FunGame/Models/Enum/CommonEnums.cs b/FunGame/Models/Enum/CommonEnums.cs new file mode 100644 index 0000000..925084c --- /dev/null +++ b/FunGame/Models/Enum/CommonEnums.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Enum +{ + /// + /// ſʵصState Type Result Method + /// FunGame.CoreӿںʵʱҪͬӣInterfaceTypeInterfaceMethod + /// + public static class CommonEnums + { + #region State + + public enum StartMatch_State + { + Matching = 1, + Success = 2, + Enable = 3, + Cancel = 4 + } + + public enum CreateRoom_State + { + Creating = 1, + Success = 2 + } + + public enum RoomState + { + Created = 1, + Gaming = 2, + Close = 3, + Complete = 4 + } + + public enum OnlineState + { + Offline = 1, + Online = 2, + Matching = 3, + InRoom = 4, + Gaming = 5 + } + + #endregion + + #region Type + + public enum RoomType + { + Mix = 1, + Team = 2, + MixHasPass = 3, + TeamHasPass = 4 + } + + public enum InterfaceType + { + ServerInterface = 1 + } + + #endregion + + #region Result + + public enum MessageResult + { + OK = 1, + Cancel = 2, + Yes = 3, + No = 4, + Retry = 5 + } + + #endregion + + #region Method + + public enum WebHelperMethod + { + CreateSocket = 1, + CloseSocket = 2, + StartWebHelper = 3, + } + + public enum InterfaceMethod + { + GetServerIP = 1 + } + + #endregion + + } +} diff --git a/FunGame/Models/Enum/SocketEnums.cs b/FunGame/Models/Enum/SocketEnums.cs new file mode 100644 index 0000000..e3e6882 --- /dev/null +++ b/FunGame/Models/Enum/SocketEnums.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Models.Enum +{ + public static class SocketEnums + { + public enum Type + { + GetNotice = 1, + Login = 2, + CheckLogin = 3, + Logout = 4, + HeartBeat = 5 + } + + public const string TYPE_UNKNOWN = "Unknown Type"; + public const string TYPE_GetNotice = "GetNotice"; + public const string TYPE_Login = "Login"; + public const string TYPE_CheckLogin = "CheckLogin"; + public const string TYPE_Logout = "Logout"; + public const string TYPE_HeartBeat = "HeartBeat"; + } +} diff --git a/FunGame/Properties/Resources.Designer.cs b/FunGame/Properties/Resources.Designer.cs new file mode 100644 index 0000000..57c3a18 --- /dev/null +++ b/FunGame/Properties/Resources.Designer.cs @@ -0,0 +1,143 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace FunGame.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FunGame.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap back { + get { + object obj = ResourceManager.GetObject("back", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap exit { + get { + object obj = ResourceManager.GetObject("exit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap favicon { + get { + object obj = ResourceManager.GetObject("favicon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap green { + get { + object obj = ResourceManager.GetObject("green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap logo { + get { + object obj = ResourceManager.GetObject("logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap min { + get { + object obj = ResourceManager.GetObject("min", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap red { + get { + object obj = ResourceManager.GetObject("red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap send { + get { + object obj = ResourceManager.GetObject("send", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/FunGame/Properties/Resources.resx b/FunGame/Properties/Resources.resx new file mode 100644 index 0000000..54e14d9 --- /dev/null +++ b/FunGame/Properties/Resources.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\images\exit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\send.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\back.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\images\min.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\favicon.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\logo.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/FunGame/UI/Main/Main.Designer.cs b/FunGame/UI/Main/Main.Designer.cs new file mode 100644 index 0000000..a648471 --- /dev/null +++ b/FunGame/UI/Main/Main.Designer.cs @@ -0,0 +1,644 @@ +using FunGame.Models.Component; +using FunGame.Models.Config; + +namespace FunGame +{ + partial class Main + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); + this.Exit = new FunGame.Models.Component.ExitButton(this.components); + this.Title = new System.Windows.Forms.Label(); + this.MinForm = new System.Windows.Forms.Button(); + this.Connection = new System.Windows.Forms.Label(); + this.Light = new System.Windows.Forms.Label(); + this.SendTalkText = new System.Windows.Forms.Button(); + this.TalkText = new System.Windows.Forms.TextBox(); + this.StartMatch = new System.Windows.Forms.Button(); + this.CheckMix = new System.Windows.Forms.CheckBox(); + this.CheckTeam = new System.Windows.Forms.CheckBox(); + this.RoomSetting = new System.Windows.Forms.Button(); + this.Login = new System.Windows.Forms.Button(); + this.NowAccount = new System.Windows.Forms.Label(); + this.AccountSetting = new System.Windows.Forms.Button(); + this.About = new System.Windows.Forms.Button(); + this.Room = new System.Windows.Forms.Label(); + this.RoomText = new System.Windows.Forms.TextBox(); + this.PresetText = new System.Windows.Forms.ComboBox(); + this.RoomBox = new System.Windows.Forms.GroupBox(); + this.QueryRoom = new System.Windows.Forms.Button(); + this.RoomList = new System.Windows.Forms.ListBox(); + this.Notice = new System.Windows.Forms.GroupBox(); + this.NoticeText = new FunGame.Models.TextArea(); + this.InfoBox = new System.Windows.Forms.GroupBox(); + this.TransparentRectControl = new FunGame.Models.TransparentRect(); + this.GameInfo = new FunGame.Models.TextArea(); + this.QuitRoom = new System.Windows.Forms.Button(); + this.CreateRoom = new System.Windows.Forms.Button(); + this.Logout = new System.Windows.Forms.Button(); + this.CheckHasPass = new System.Windows.Forms.CheckBox(); + this.Stock = new System.Windows.Forms.Button(); + this.Store = new System.Windows.Forms.Button(); + this.Copyright = new System.Windows.Forms.LinkLabel(); + this.StopMatch = new System.Windows.Forms.Button(); + this.RoomBox.SuspendLayout(); + this.Notice.SuspendLayout(); + this.InfoBox.SuspendLayout(); + this.TransparentRectControl.SuspendLayout(); + this.SuspendLayout(); + // + // Exit + // + this.Exit.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Exit.BackColor = System.Drawing.Color.White; + this.Exit.BackgroundImage = global::FunGame.Properties.Resources.exit; + this.Exit.FlatAppearance.BorderColor = System.Drawing.Color.White; + this.Exit.FlatAppearance.BorderSize = 0; + this.Exit.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.Exit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.Exit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.Exit.Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Exit.ForeColor = System.Drawing.Color.Red; + this.Exit.Location = new System.Drawing.Point(750, 3); + this.Exit.Name = "Exit"; + this.Exit.Size = new System.Drawing.Size(47, 47); + this.Exit.TabIndex = 15; + this.Exit.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.Exit.UseVisualStyleBackColor = false; + this.Exit.Click += new System.EventHandler(this.Exit_Click); + // + // Title + // + this.Title.BackColor = System.Drawing.Color.Transparent; + this.Title.Font = new System.Drawing.Font("LanaPixel", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.Title.Location = new System.Drawing.Point(3, 3); + this.Title.Name = "Title"; + this.Title.Size = new System.Drawing.Size(689, 47); + this.Title.TabIndex = 96; + this.Title.Text = "FunGame By Mili.cyou"; + this.Title.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.Title.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Title_MouseDown); + this.Title.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Title_MouseMove); + // + // MinForm + // + this.MinForm.Anchor = System.Windows.Forms.AnchorStyles.None; + this.MinForm.BackColor = System.Drawing.Color.White; + this.MinForm.BackgroundImage = global::FunGame.Properties.Resources.min; + this.MinForm.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.MinForm.FlatAppearance.BorderColor = System.Drawing.Color.LightGray; + this.MinForm.FlatAppearance.BorderSize = 0; + this.MinForm.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray; + this.MinForm.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkGray; + this.MinForm.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MinForm.Font = new System.Drawing.Font("LanaPixel", 36F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.MinForm.ForeColor = System.Drawing.Color.Red; + this.MinForm.Location = new System.Drawing.Point(698, 3); + this.MinForm.Name = "MinForm"; + this.MinForm.Size = new System.Drawing.Size(47, 47); + this.MinForm.TabIndex = 14; + this.MinForm.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.MinForm.UseVisualStyleBackColor = false; + this.MinForm.Click += new System.EventHandler(this.MinForm_Click); + // + // Connection + // + this.Connection.BackColor = System.Drawing.Color.Transparent; + this.Connection.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Connection.Location = new System.Drawing.Point(665, 425); + this.Connection.Margin = new System.Windows.Forms.Padding(3); + this.Connection.Name = "Connection"; + this.Connection.Size = new System.Drawing.Size(114, 23); + this.Connection.TabIndex = 92; + this.Connection.Text = "服务器连接失败"; + this.Connection.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // Light + // + this.Light.BackColor = System.Drawing.Color.Transparent; + this.Light.Image = global::FunGame.Properties.Resources.red; + this.Light.Location = new System.Drawing.Point(777, 426); + this.Light.Name = "Light"; + this.Light.Size = new System.Drawing.Size(20, 20); + this.Light.TabIndex = 93; + // + // SendTalkText + // + this.SendTalkText.Anchor = System.Windows.Forms.AnchorStyles.None; + this.SendTalkText.BackColor = System.Drawing.Color.Transparent; + this.SendTalkText.BackgroundImage = global::FunGame.Properties.Resources.send; + this.SendTalkText.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.SendTalkText.FlatAppearance.BorderSize = 0; + this.SendTalkText.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Teal; + this.SendTalkText.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.SendTalkText.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.SendTalkText.Font = new System.Drawing.Font("阿丽达黑体", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.SendTalkText.Location = new System.Drawing.Point(608, 421); + this.SendTalkText.Name = "SendTalkText"; + this.SendTalkText.Size = new System.Drawing.Size(51, 27); + this.SendTalkText.TabIndex = 3; + this.SendTalkText.TextAlign = System.Drawing.ContentAlignment.TopLeft; + this.SendTalkText.UseVisualStyleBackColor = false; + this.SendTalkText.Click += new System.EventHandler(this.SendTalkText_Click); + // + // TalkText + // + this.TalkText.AllowDrop = true; + this.TalkText.Font = new System.Drawing.Font("LanaPixel", 12.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.TalkText.ForeColor = System.Drawing.Color.DarkGray; + this.TalkText.Location = new System.Drawing.Point(317, 422); + this.TalkText.Name = "TalkText"; + this.TalkText.Size = new System.Drawing.Size(289, 26); + this.TalkText.TabIndex = 2; + this.TalkText.Text = "向消息队列发送消息..."; + this.TalkText.WordWrap = false; + this.TalkText.Click += new System.EventHandler(this.TalkText_Click); + this.TalkText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.TalkText_KeyUp); + this.TalkText.Leave += new System.EventHandler(this.TalkText_Leave); + // + // StartMatch + // + this.StartMatch.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.StartMatch.Location = new System.Drawing.Point(665, 184); + this.StartMatch.Name = "StartMatch"; + this.StartMatch.Size = new System.Drawing.Size(132, 35); + this.StartMatch.TabIndex = 9; + this.StartMatch.Text = "开始匹配"; + this.StartMatch.UseVisualStyleBackColor = true; + this.StartMatch.Click += new System.EventHandler(this.StartMatch_Click); + // + // CheckMix + // + this.CheckMix.BackColor = System.Drawing.Color.Transparent; + this.CheckMix.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CheckMix.Location = new System.Drawing.Point(675, 94); + this.CheckMix.Name = "CheckMix"; + this.CheckMix.Size = new System.Drawing.Size(123, 24); + this.CheckMix.TabIndex = 6; + this.CheckMix.Text = "混战模式房间"; + this.CheckMix.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + this.CheckMix.UseVisualStyleBackColor = false; + this.CheckMix.CheckedChanged += new System.EventHandler(this.CheckMix_CheckedChanged); + // + // CheckTeam + // + this.CheckTeam.BackColor = System.Drawing.Color.Transparent; + this.CheckTeam.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CheckTeam.Location = new System.Drawing.Point(675, 124); + this.CheckTeam.Name = "CheckTeam"; + this.CheckTeam.Size = new System.Drawing.Size(123, 24); + this.CheckTeam.TabIndex = 7; + this.CheckTeam.Text = "团队模式房间"; + this.CheckTeam.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + this.CheckTeam.UseVisualStyleBackColor = false; + this.CheckTeam.CheckedChanged += new System.EventHandler(this.CheckTeam_CheckedChanged); + // + // RoomSetting + // + this.RoomSetting.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.RoomSetting.Location = new System.Drawing.Point(665, 225); + this.RoomSetting.Name = "RoomSetting"; + this.RoomSetting.Size = new System.Drawing.Size(132, 35); + this.RoomSetting.TabIndex = 10; + this.RoomSetting.Text = "房间设置"; + this.RoomSetting.UseVisualStyleBackColor = true; + this.RoomSetting.Visible = false; + this.RoomSetting.Click += new System.EventHandler(this.RoomSetting_Click); + // + // Login + // + this.Login.Font = new System.Drawing.Font("LanaPixel", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Login.Location = new System.Drawing.Point(665, 380); + this.Login.Name = "Login"; + this.Login.Size = new System.Drawing.Size(132, 39); + this.Login.TabIndex = 13; + this.Login.Text = "登录账号"; + this.Login.UseVisualStyleBackColor = true; + this.Login.Click += new System.EventHandler(this.Login_Click); + // + // NowAccount + // + this.NowAccount.BackColor = System.Drawing.Color.Transparent; + this.NowAccount.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.NowAccount.Location = new System.Drawing.Point(659, 352); + this.NowAccount.Name = "NowAccount"; + this.NowAccount.Size = new System.Drawing.Size(141, 25); + this.NowAccount.TabIndex = 91; + this.NowAccount.Text = "请登录账号"; + this.NowAccount.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // AccountSetting + // + this.AccountSetting.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.AccountSetting.Location = new System.Drawing.Point(665, 317); + this.AccountSetting.Name = "AccountSetting"; + this.AccountSetting.Size = new System.Drawing.Size(65, 32); + this.AccountSetting.TabIndex = 11; + this.AccountSetting.Text = "设置"; + this.AccountSetting.UseVisualStyleBackColor = true; + // + // About + // + this.About.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.About.Location = new System.Drawing.Point(732, 317); + this.About.Name = "About"; + this.About.Size = new System.Drawing.Size(65, 32); + this.About.TabIndex = 12; + this.About.Text = "关于"; + this.About.UseVisualStyleBackColor = true; + // + // Room + // + this.Room.BackColor = System.Drawing.Color.Transparent; + this.Room.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Room.Location = new System.Drawing.Point(665, 263); + this.Room.Name = "Room"; + this.Room.Size = new System.Drawing.Size(132, 45); + this.Room.TabIndex = 90; + this.Room.Text = "房间号:114514"; + this.Room.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // RoomText + // + this.RoomText.AllowDrop = true; + this.RoomText.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.RoomText.ForeColor = System.Drawing.Color.DarkGray; + this.RoomText.Location = new System.Drawing.Point(6, 226); + this.RoomText.Name = "RoomText"; + this.RoomText.Size = new System.Drawing.Size(114, 25); + this.RoomText.TabIndex = 1; + this.RoomText.Text = "键入房间代号..."; + this.RoomText.WordWrap = false; + this.RoomText.Click += new System.EventHandler(this.RoomText_Click); + this.RoomText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.RoomText_KeyUp); + this.RoomText.Leave += new System.EventHandler(this.RoomText_Leave); + // + // PresetText + // + this.PresetText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.PresetText.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.PresetText.Font = new System.Drawing.Font("LanaPixel", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.PresetText.FormattingEnabled = true; + this.PresetText.Items.AddRange(new object[] { + "- 快捷消息 -", + "签到", + "积分", + "查看库存", + "游戏商店", + "创建游戏 混战", + "创建游戏 团队", + "开始游戏", + "重新连接", + "开启自动重连", + "关闭自动重连"}); + this.PresetText.Location = new System.Drawing.Point(195, 422); + this.PresetText.Name = "PresetText"; + this.PresetText.Size = new System.Drawing.Size(121, 26); + this.PresetText.TabIndex = 1; + this.PresetText.SelectedIndexChanged += new System.EventHandler(this.PresetText_SelectedIndexChanged); + // + // RoomBox + // + this.RoomBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.RoomBox.BackColor = System.Drawing.Color.Transparent; + this.RoomBox.Controls.Add(this.QueryRoom); + this.RoomBox.Controls.Add(this.RoomList); + this.RoomBox.Controls.Add(this.RoomText); + this.RoomBox.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.RoomBox.Location = new System.Drawing.Point(3, 56); + this.RoomBox.Name = "RoomBox"; + this.RoomBox.Size = new System.Drawing.Size(186, 258); + this.RoomBox.TabIndex = 0; + this.RoomBox.TabStop = false; + this.RoomBox.Text = "房间列表"; + // + // QueryRoom + // + this.QueryRoom.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.QueryRoom.Location = new System.Drawing.Point(126, 225); + this.QueryRoom.Name = "QueryRoom"; + this.QueryRoom.Size = new System.Drawing.Size(51, 27); + this.QueryRoom.TabIndex = 2; + this.QueryRoom.Text = "加入"; + this.QueryRoom.UseVisualStyleBackColor = true; + this.QueryRoom.Click += new System.EventHandler(this.QueryRoom_Click); + // + // RoomList + // + this.RoomList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.RoomList.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.RoomList.FormattingEnabled = true; + this.RoomList.ItemHeight = 19; + this.RoomList.Items.AddRange(new object[] { + "114514", + "1919810", + "12900", + "12600", + "12100", + "3329500", + "111111", + "123456", + "123698745", + "667678970", + "3305106902", + "987654"}); + this.RoomList.Location = new System.Drawing.Point(0, 26); + this.RoomList.Name = "RoomList"; + this.RoomList.Size = new System.Drawing.Size(186, 192); + this.RoomList.TabIndex = 0; + this.RoomList.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.RoomList_MouseDoubleClick); + // + // Notice + // + this.Notice.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Notice.BackColor = System.Drawing.Color.Transparent; + this.Notice.Controls.Add(this.NoticeText); + this.Notice.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Notice.Location = new System.Drawing.Point(3, 317); + this.Notice.Name = "Notice"; + this.Notice.Size = new System.Drawing.Size(186, 110); + this.Notice.TabIndex = 94; + this.Notice.TabStop = false; + this.Notice.Text = "通知公告"; + // + // NoticeText + // + this.NoticeText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.NoticeText.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.NoticeText.EmptyTextTip = null; + this.NoticeText.Location = new System.Drawing.Point(6, 24); + this.NoticeText.Name = "NoticeText"; + this.NoticeText.ReadOnly = true; + this.NoticeText.Size = new System.Drawing.Size(174, 86); + this.NoticeText.TabIndex = 0; + this.NoticeText.Text = "这里展示公告"; + // + // InfoBox + // + this.InfoBox.BackColor = System.Drawing.Color.Transparent; + this.InfoBox.Controls.Add(this.TransparentRectControl); + this.InfoBox.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.InfoBox.Location = new System.Drawing.Point(195, 56); + this.InfoBox.Name = "InfoBox"; + this.InfoBox.Size = new System.Drawing.Size(464, 363); + this.InfoBox.TabIndex = 95; + this.InfoBox.TabStop = false; + this.InfoBox.Text = "消息队列"; + // + // TransparentRectControl + // + this.TransparentRectControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TransparentRectControl.BackColor = System.Drawing.Color.Transparent; + this.TransparentRectControl.BorderColor = System.Drawing.Color.Transparent; + this.TransparentRectControl.Controls.Add(this.GameInfo); + this.TransparentRectControl.Location = new System.Drawing.Point(0, 20); + this.TransparentRectControl.Name = "TransparentRectControl"; + this.TransparentRectControl.Opacity = 125; + this.TransparentRectControl.Radius = 20; + this.TransparentRectControl.ShapeBorderStyle = FunGame.Models.TransparentRect.ShapeBorderStyles.ShapeBSNone; + this.TransparentRectControl.Size = new System.Drawing.Size(464, 343); + this.TransparentRectControl.TabIndex = 2; + this.TransparentRectControl.TabStop = false; + // + // GameInfo + // + this.GameInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GameInfo.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.GameInfo.EmptyTextTip = null; + this.GameInfo.EmptyTextTipColor = System.Drawing.Color.Transparent; + this.GameInfo.Location = new System.Drawing.Point(6, 6); + this.GameInfo.Name = "GameInfo"; + this.GameInfo.ReadOnly = true; + this.GameInfo.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.GameInfo.Size = new System.Drawing.Size(452, 331); + this.GameInfo.TabIndex = 1; + this.GameInfo.Text = "这里展示游戏信息,包括系统通知和游戏反馈"; + // + // QuitRoom + // + this.QuitRoom.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.QuitRoom.Location = new System.Drawing.Point(665, 184); + this.QuitRoom.Name = "QuitRoom"; + this.QuitRoom.Size = new System.Drawing.Size(132, 35); + this.QuitRoom.TabIndex = 9; + this.QuitRoom.Text = "退出房间"; + this.QuitRoom.UseVisualStyleBackColor = true; + this.QuitRoom.Visible = false; + this.QuitRoom.Click += new System.EventHandler(this.QuitRoom_Click); + // + // CreateRoom + // + this.CreateRoom.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CreateRoom.Location = new System.Drawing.Point(665, 225); + this.CreateRoom.Name = "CreateRoom"; + this.CreateRoom.Size = new System.Drawing.Size(132, 35); + this.CreateRoom.TabIndex = 10; + this.CreateRoom.Text = "创建房间"; + this.CreateRoom.UseVisualStyleBackColor = true; + this.CreateRoom.Click += new System.EventHandler(this.CreateRoom_Click); + // + // Logout + // + this.Logout.Font = new System.Drawing.Font("LanaPixel", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Logout.Location = new System.Drawing.Point(665, 380); + this.Logout.Name = "Logout"; + this.Logout.Size = new System.Drawing.Size(132, 39); + this.Logout.TabIndex = 13; + this.Logout.Text = "退出登录"; + this.Logout.UseVisualStyleBackColor = true; + this.Logout.Visible = false; + this.Logout.Click += new System.EventHandler(this.Logout_Click); + // + // CheckHasPass + // + this.CheckHasPass.BackColor = System.Drawing.Color.Transparent; + this.CheckHasPass.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.CheckHasPass.Location = new System.Drawing.Point(675, 154); + this.CheckHasPass.Name = "CheckHasPass"; + this.CheckHasPass.Size = new System.Drawing.Size(123, 24); + this.CheckHasPass.TabIndex = 8; + this.CheckHasPass.Text = "带密码的房间"; + this.CheckHasPass.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + this.CheckHasPass.UseVisualStyleBackColor = false; + this.CheckHasPass.CheckedChanged += new System.EventHandler(this.CheckHasPass_CheckedChanged); + // + // Stock + // + this.Stock.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Stock.Location = new System.Drawing.Point(661, 56); + this.Stock.Name = "Stock"; + this.Stock.Size = new System.Drawing.Size(65, 32); + this.Stock.TabIndex = 4; + this.Stock.Text = "库存"; + this.Stock.UseVisualStyleBackColor = true; + // + // Store + // + this.Store.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Store.Location = new System.Drawing.Point(732, 56); + this.Store.Name = "Store"; + this.Store.Size = new System.Drawing.Size(65, 32); + this.Store.TabIndex = 5; + this.Store.Text = "商店"; + this.Store.UseVisualStyleBackColor = true; + // + // Copyright + // + this.Copyright.ActiveLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.Copyright.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Copyright.BackColor = System.Drawing.Color.Transparent; + this.Copyright.Font = new System.Drawing.Font("LanaPixel", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Copyright.LinkArea = new System.Windows.Forms.LinkArea(6, 10); + this.Copyright.LinkBehavior = System.Windows.Forms.LinkBehavior.AlwaysUnderline; + this.Copyright.LinkColor = System.Drawing.Color.Teal; + this.Copyright.Location = new System.Drawing.Point(3, 430); + this.Copyright.Name = "Copyright"; + this.Copyright.Size = new System.Drawing.Size(186, 23); + this.Copyright.TabIndex = 97; + this.Copyright.TabStop = true; + this.Copyright.Text = "©2022 Mili.cyou. 米粒的糖果屋"; + this.Copyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.Copyright.UseCompatibleTextRendering = true; + this.Copyright.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.Copyright_LinkClicked); + // + // StopMatch + // + this.StopMatch.Font = new System.Drawing.Font("LanaPixel", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.StopMatch.Location = new System.Drawing.Point(665, 184); + this.StopMatch.Name = "StopMatch"; + this.StopMatch.Size = new System.Drawing.Size(132, 35); + this.StopMatch.TabIndex = 9; + this.StopMatch.Text = "停止匹配"; + this.StopMatch.UseVisualStyleBackColor = true; + this.StopMatch.Visible = false; + this.StopMatch.Click += new System.EventHandler(this.StopMatch_Click); + // + // Main + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::FunGame.Properties.Resources.back; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.StopMatch); + this.Controls.Add(this.Copyright); + this.Controls.Add(this.Store); + this.Controls.Add(this.Stock); + this.Controls.Add(this.Logout); + this.Controls.Add(this.RoomSetting); + this.Controls.Add(this.QuitRoom); + this.Controls.Add(this.InfoBox); + this.Controls.Add(this.CreateRoom); + this.Controls.Add(this.Notice); + this.Controls.Add(this.RoomBox); + this.Controls.Add(this.PresetText); + this.Controls.Add(this.SendTalkText); + this.Controls.Add(this.TalkText); + this.Controls.Add(this.Room); + this.Controls.Add(this.About); + this.Controls.Add(this.AccountSetting); + this.Controls.Add(this.NowAccount); + this.Controls.Add(this.Login); + this.Controls.Add(this.CheckHasPass); + this.Controls.Add(this.CheckTeam); + this.Controls.Add(this.CheckMix); + this.Controls.Add(this.StartMatch); + this.Controls.Add(this.Light); + this.Controls.Add(this.Connection); + this.Controls.Add(this.MinForm); + this.Controls.Add(this.Title); + this.Controls.Add(this.Exit); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "FunGame"; + this.RoomBox.ResumeLayout(false); + this.RoomBox.PerformLayout(); + this.Notice.ResumeLayout(false); + this.InfoBox.ResumeLayout(false); + this.TransparentRectControl.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private ExitButton Exit; + private Label Title; + private Button MinForm; + private Label Connection; + private Label Light; + private Button StartMatch; + private CheckBox CheckMix; + private CheckBox CheckTeam; + private Button RoomSetting; + private Button Login; + private Label NowAccount; + private Button AccountSetting; + private Button About; + private Label Room; + private Button SendTalkText; + private TextBox TalkText; + private TextBox RoomText; + private ComboBox PresetText; + private GroupBox RoomBox; + private ListBox RoomList; + private GroupBox Notice; + private GroupBox InfoBox; + private Button QuitRoom; + private Button CreateRoom; + private Button QueryRoom; + private Button Logout; + private CheckBox CheckHasPass; + private Button Stock; + private Button Store; + private LinkLabel Copyright; + private Button StopMatch; + private Models.TextArea GameInfo; + private Models.TextArea NoticeText; + private Models.TransparentRect TransparentRectControl; + } +} \ No newline at end of file diff --git a/FunGame/UI/Main/Main.cs b/FunGame/UI/Main/Main.cs new file mode 100644 index 0000000..a0650f6 --- /dev/null +++ b/FunGame/UI/Main/Main.cs @@ -0,0 +1,1176 @@ +using FunGame.Models.Component; +using FunGame.Models.Config; +using FunGame.Models.Entity; +using System.Diagnostics; +using System.Net.Sockets; +using System.Net; +using System.Windows.Forms; +using static FunGame.Models.Enum.CommonEnums; +using FunGame.Utils.WebHelper; +using FunGame.Models.Enum; +using FunGame.Utils.DataHelper; + +namespace FunGame +{ + public partial class Main : Form + { + + #region 变量定义 + + /** + * 定义全局变量 + */ + private int LOCATION_X, LOCATION_Y; // 窗口当前坐标 + private int MAX_CONNECTEDRETRY = 20; // 最大重试连接次数 + private int NOW_CONNECTEDRETRY = -1; // 当前重试连接次数 + + /** + * 定义全局对象 + */ + private Task? MatchFunGame = null; // 匹配线程 + private User? LoginUser = null; // 登录的玩家对象 + private WebHelper? WebHelper = null; // WebHelper + + /** + * 定义委托 + * 子线程操作窗体控件时,先实例化Action,然后Invoke传递出去。 + */ + Action? StartMatch_Action = null; + Action? CreateRoom_Action = null; + Action? WebHelper_Action = null; + Action? Main_Action = null; + + public Main() + { + InitializeComponent(); + Init(); + } + + /// + /// 所有自定义初始化的内容 + /// + public void Init() + { + this.PresetText.SelectedIndex = 0; // 快捷消息初始选择 + SetRoomid("-1"); // 房间号初始化 + WritelnGameInfo(); // 初始化消息队列 + SetLoginUser(new object[] { new User("Mili") }); // Debug,初始化玩家名字 + GetServerConnection(); // 开始连接服务器 + } + + #endregion + + #region 公有方法 + + /// + /// 提供公共方法给WebHelper + /// + /// + /// + /// + /// + public object? GetMessage(WebHelper webHelper, string? msg, bool needTime = false) + { + try + { + if (msg != null) + { + switch (msg) + { + case Config.WebHelper_SetGreen: + Usercfg.FunGame_isRetrying = false; + WebHelper_Action = (Main? main) => + { + SetServerStatusLight(true); + }; + if (this.InvokeRequired) + this.BeginInvoke(WebHelper_Action, this); + else + WebHelper_Action(this); + Usercfg.FunGame_isConnected = true; + NOW_CONNECTEDRETRY = 0; + break; + case Config.WebHelper_SetRed: + WebHelper_Action = (Main? main) => + { + SetServerStatusLight(false); + }; + if (this.InvokeRequired) + this.BeginInvoke(WebHelper_Action, this); + else + WebHelper_Action(this); + Usercfg.FunGame_isConnected = false; + break; + case Config.WebHelper_Disconnected: + Usercfg.FunGame_isRetrying = false; + WebHelper_Action = (Main? main) => + { + SetServerStatusLight(false); + }; + if (this.InvokeRequired) + this.BeginInvoke(WebHelper_Action, this); + else + WebHelper_Action(this); + Usercfg.FunGame_isConnected = false; + if (Usercfg.FunGame_isAutoRetry && NOW_CONNECTEDRETRY <= MAX_CONNECTEDRETRY) + { + Task.Run(() => + { + Thread.Sleep(5000); + Connect(); + }); + if (needTime) + throw new Exception(GetNowShortTime() + "\nERROR:连接服务器失败,5秒后自动尝试重连。"); + else + throw new Exception("ERROR:连接服务器失败,5秒后自动尝试重连。"); + } + else + if (needTime) + throw new Exception(GetNowShortTime() + "\nERROR:无法连接至服务器,请检查你的网络连接。"); + else + throw new Exception("ERROR:无法连接至服务器,请检查你的网络连接。"); + case Config.WebHelper_GetUser: + if (LoginUser != null) + return LoginUser; + return null; + default: + WritelnGameInfo(webHelper, msg); + return null; + } + } + return null; + } + catch (Exception e) + { + WritelnGameInfo(webHelper, (e.Message != null) ? e.Message + "\n" + e.StackTrace : "" + e.StackTrace); + GetMessage(webHelper, Config.WebHelper_SetRed); + } + return null; + } + + #endregion + + #region 实现 + + /// + /// 反射获取服务器IP和Port + /// + private void GetServerConnection() + { + try + { + string? ipaddress = (string?)Config.DefaultAssemblyHelper.GetFunGameCoreValue((int)InterfaceType.ServerInterface, (int)InterfaceMethod.GetServerIP); // 获取服务器IP + if (ipaddress != null) + { + string[] s = ipaddress.Split(':'); + if (s != null && s.Length > 1) + { + Config.SERVER_IPADRESS = s[0]; + Config.SERVER_PORT = Convert.ToInt32(s[1]); + Connect(); // 连接服务器 + } + else throw new Exception(); + } + else throw new Exception(); + } + catch (Exception e) + { + WritelnGameInfo(">> 查找可用的服务器失败,请重启FunGame!\n" + e.StackTrace); + ShowMessage.ErrorMessage("查找可用的服务器失败!"); + } + } + + /// + /// 在服务器IP获取成功后,尝试连接服务器 + /// + private void Connect() + { + Task.Run(() => + { + while (true) + { + if (this.IsHandleCreated) + { + // 检查是否创建了窗口句柄,再Invoke委托。 + break; + } + } + Main_Action = (Main? main) => + { + if (!Usercfg.FunGame_isConnected) + { + NOW_CONNECTEDRETRY++; + if (NOW_CONNECTEDRETRY == 0) + WritelnGameInfo(GetNowTime() + " >> 开始连接服务器..."); + else + WritelnGameInfo(GetNowTime() + " >> 第" + NOW_CONNECTEDRETRY + "次重试连接服务器..."); + if (NOW_CONNECTEDRETRY + 1 > MAX_CONNECTEDRETRY) // 判断重连次数是否达到上限 + { + WritelnGameInfo("ERROR:无法连接至服务器,请检查网络并重启游戏再试。"); + return; + } + WebHelper_Action = (Main? main) => + { + try + { + if (main != null) + { + if (WebHelper != null) + { + WebHelper.WebHelpMethod((int)CommonEnums.WebHelperMethod.CloseSocket); + WebHelper = null; + } + Usercfg.FunGame_isRetrying = true; + Application.DoEvents(); + WebHelper = new WebHelper(main); + WebHelper.WebHelpMethod((int)CommonEnums.WebHelperMethod.CreateSocket); // Invoke -> CreateSocket + } + } + catch + { + + } + }; + Task.Factory.StartNew(() => + { + if (this.InvokeRequired) + { + BeginInvoke(WebHelper_Action, main); + } + else + { + WebHelper_Action(main); + } + }); + } + }; + if (this.InvokeRequired) + { + Invoke(Main_Action, this); + } + else + { + Main_Action(this); + } + }); + } + + /// + /// 设置房间号和显示信息 + /// + /// + private void SetRoomid(string roomid) + { + Usercfg.FunGame_roomid = roomid; + if (!roomid.Equals("-1")) + { + WritelnGameInfo(GetNowShortTime() + " 加入房间"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已加入房间 -> [ " + Usercfg.FunGame_roomid + " ]"); + Room.Text = "[ 当前房间 ]\n" + Convert.ToString(Usercfg.FunGame_roomid); + } + else + Room.Text = "暂未进入房间"; + } + + /// + /// 设置登录信息 + /// + /// + private void SetLoginUser(object[]? objs = null) + { + if (objs != null && objs.Length > 0) + { + LoginUser = (User)objs[0]; + Usercfg.LoginUserName = LoginUser.Userame; + } + LoginAccount(); + } + + /// + /// 向消息队列输出换行符 + /// + private void WritelnGameInfo() + { + GameInfo.Text += "\n"; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + } + + /// + /// 由WebHelper委托向消息队列输出一行文字 + /// + /// + /// + private void WritelnGameInfo(WebHelper webHelper, string msg) + { + if (webHelper != null && msg.Trim() != "") + { + Invoke(new Action(() => + { + GameInfo.Text += msg + "\n"; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + })); + } + } + + /// + /// 向消息队列输出一行文字 + /// + /// + private void WritelnGameInfo(string msg) + { + if (msg.Trim() != "") + { + GameInfo.Text += msg + "\n"; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + } + } + + /// + /// 向消息队列输出文字 + /// + /// + private void WriteGameInfo(string msg) + { + if (msg.Trim() != "") + { + GameInfo.Text += msg; + GameInfo.SelectionStart = GameInfo.Text.Length - 1; + GameInfo.ScrollToCaret(); + } + } + + /// + /// 在大厅中,设置按钮的显示和隐藏 + /// + private void InMain() + { + // 显示:匹配、创建房间 + // 隐藏:退出房间、房间设定 + WritelnGameInfo(GetNowShortTime() + " 离开房间"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已离开房间 -> [ " + Usercfg.FunGame_roomid + " ]"); + SetRoomid("-1"); + QuitRoom.Visible = false; + StartMatch.Visible = true; + RoomSetting.Visible = false; + CreateRoom.Visible = true; + } + + /// + /// 在房间中,设置按钮的显示和隐藏 + /// + private void InRoom() + { + // 显示:退出房间、房间设置 + // 隐藏:停止匹配、创建房间 + StopMatch.Visible = false; + QuitRoom.Visible = true; + CreateRoom.Visible = false; + RoomSetting.Visible = true; + } + + /// + /// 加入房间 + /// + /// + /// + private void JoinRoom(bool isDouble, string roomid) + { + if (!isDouble) + if (!RoomText.Text.Equals("") && !RoomText.ForeColor.Equals(Color.DarkGray)) + { + if (CheckRoomIDExist(roomid)) + { + if (Usercfg.FunGame_roomid.Equals("-1")) + { + if (ShowMessage.YesNoMessage("已找到房间 -> [ " + roomid + " ]\n是否加入?", "已找到房间") == (int)CommonEnums.MessageResult.Yes) + { + SetRoomid(roomid); + InRoom(); + } + } + else + { + ShowMessage.TipMessage("你需要先退出房间才可以加入新的房间。"); + } + } + else + { + ShowMessage.WarningMessage("未找到此房间!"); + } + } + else + { + RoomText.Enabled = false; + ShowMessage.TipMessage("请输入房间号。"); + RoomText.Enabled = true; + } + else + { + if (CheckRoomIDExist(roomid)) + { + if (Usercfg.FunGame_roomid.Equals("-1")) + { + if (ShowMessage.YesNoMessage("已找到房间 -> [ " + roomid + " ]\n是否加入?", "已找到房间") == (int)CommonEnums.MessageResult.Yes) + { + SetRoomid(roomid); + InRoom(); + } + } + else + { + ShowMessage.TipMessage("你需要先退出房间才可以加入新的房间。"); + } + } + else + { + ShowMessage.WarningMessage("未找到此房间!"); + } + } + } + + /// + /// 这里实现匹配相关的方法 + /// + /// 主要参数:触发方法的哪一个分支 + /// 可传多个参数 + private void StartMatch_Method(int i, object[]? objs = null) + { + switch (i) + { + case (int)CommonEnums.StartMatch_State.Matching: + // 开始匹配 + Usercfg.FunGame_isMatching = true; + int loop = 0; + string roomid = Convert.ToString(new Random().Next(1, 10000)); + // 匹配中 匹配成功返回房间号 + Task.Factory.StartNew(() => + { + // 创建新线程,防止主界面阻塞 + Thread.Sleep(3000); + while (loop < 10000 && Usercfg.FunGame_isMatching) + { + loop++; + if (loop == Convert.ToInt32(roomid)) + { + // 创建委托,操作主界面 + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Success, new object[] { roomid }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Success, new object[] { roomid }); + } + break; + } + } + }); + break; + case (int)CommonEnums.StartMatch_State.Success: + Usercfg.FunGame_isMatching = false; + // 匹配成功返回房间号 + roomid = "-1"; + if (objs != null) roomid = (string)objs[0]; + if (!roomid.Equals(-1)) + { + WritelnGameInfo(GetNowShortTime() + " 匹配成功"); + WritelnGameInfo(">> 房间号: " + roomid); + SetRoomid(roomid); + } + else + { + WritelnGameInfo("ERROR:匹配失败!"); + break; + } + // 设置按钮可见性 + InRoom(); + // 创建委托,操作主界面 + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + MatchFunGame = null; + break; + case (int)CommonEnums.StartMatch_State.Enable: + // 设置匹配过程中的各种按钮是否可用 + bool isPause = false; + if (objs != null) isPause = (bool)objs[0]; + CheckMix.Enabled = isPause; + CheckTeam.Enabled = isPause; + CheckHasPass.Enabled = isPause; + CreateRoom.Enabled = isPause; + RoomBox.Enabled = isPause; + Login.Enabled = isPause; + break; + case (int)CommonEnums.StartMatch_State.Cancel: + WritelnGameInfo(GetNowShortTime() + " 终止匹配"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已终止匹配。"); + Usercfg.FunGame_isMatching = false; + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Enable, new object[] { true }); + } + MatchFunGame = null; + StopMatch.Visible = false; + StartMatch.Visible = true; + break; + } + } + + /// + /// 登录账号,显示登出按钮 + /// + private void LoginAccount() + { + NowAccount.Text = "[ID] " + Usercfg.LoginUserName; + Login.Visible = false; + Logout.Visible = true; + } + + /// + /// 登出账号,显示登录按钮 + /// + private void LogoutAccount() + { + NowAccount.Text = "请登录账号"; + Logout.Visible = false; + Login.Visible = true; + } + + /// + /// 终止匹配实现方法 + /// + private void StopMatch_Click() + { + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Cancel, new object[] { true }); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Cancel, new object[] { true }); + } + } + + /// + /// 发送消息实现 + /// + /// 是否离开焦点 + private void SendTalkText_Click(bool isLeave) + { + // 向消息队列发送消息 + if (!TalkText.Text.Trim().Equals("") && !TalkText.ForeColor.Equals(Color.DarkGray)) + { + WritelnGameInfo(GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + TalkText.Text); + SwitchTalkMessage(TalkText.Text); + TalkText.Text = ""; + if (isLeave) TalkText_Leave(); // 回车不离开焦点 + } + else + { + TalkText.Enabled = false; + ShowMessage.TipMessage("消息不能为空,请重新输入。"); + TalkText.Enabled = true; + } + } + + /// + /// 发送消息实现,往消息队列发送消息 + /// + /// + private void SendTalkText_Click(string msg) + { + WritelnGameInfo(GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + msg); + } + + /// + /// 焦点离开聊天框时设置灰色文本 + /// + private void TalkText_Leave() + { + if (TalkText.Text.Equals("")) + { + TalkText.ForeColor = Color.DarkGray; + TalkText.Text = "向消息队列发送消息..."; + } + } + + /// + /// 这里实现创建房间相关的方法 + /// + /// 主要参数:触发方法的哪一个分支 + /// 可传多个参数 + private void CreateRoom_Method(int i, object[]? objs = null) + { + if (!Usercfg.FunGame_roomid.Equals("-1")) + { + ShowMessage.WarningMessage("已在房间中,无法创建房间。"); + return; + } + string roomid = ""; + string roomtype = ""; + if (objs != null) + { + roomtype = (string)objs[0]; + } + switch (i) + { + case (int)CommonEnums.CreateRoom_State.Creating: + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Success, new object[] { roomtype }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Success, new object[] { roomtype }); + } + break; + case (int)CommonEnums.CreateRoom_State.Success: + roomid = Convert.ToString(new Random().Next(1, 10000)); + SetRoomid(roomid); + InRoom(); + WritelnGameInfo(GetNowShortTime() + " 创建" + roomtype + "房间"); + WritelnGameInfo(">> 创建" + roomtype + "房间成功!房间号: " + roomid); + ShowMessage.Message("创建" + roomtype + "房间成功!\n房间号是 -> [ " + roomid + " ]", "创建成功"); + break; + } + } + + /// + /// 设置服务器连接状态指示灯 + /// + /// + private void SetServerStatusLight(bool green) + { + if (green) + { + Connection.Text = "服务器连接成功"; + this.Light.Image = global::FunGame.Properties.Resources.green; + } + else + { + Connection.Text = "服务器连接失败"; + this.Light.Image = global::FunGame.Properties.Resources.red; + } + } + + #endregion + + #region 事件 + + /// + /// 关闭程序 + /// + /// + /// + private void Exit_Click(object sender, EventArgs e) + { + if (ShowMessage.OKCancelMessage("你确定关闭游戏?", "退出") == (int)CommonEnums.MessageResult.OK) + { + if (WebHelper != null) + { + WebHelper.WebHelpMethod((int)CommonEnums.WebHelperMethod.CloseSocket); + WebHelper = null; + } + System.Environment.Exit(0); + } + } + + /// + /// 鼠标按下,开始移动主窗口 + /// + /// + /// + private void Title_MouseDown(object sender, MouseEventArgs e) + { + //判断是否为鼠标左键 + if (e.Button == MouseButtons.Left) + { + //获取鼠标左键按下时的位置 + this.LOCATION_X = e.Location.X; + this.LOCATION_Y = e.Location.Y; + } + } + + /// + /// 鼠标移动,正在移动主窗口 + /// + /// + /// + private void Title_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + //计算鼠标移动距离 + this.Left += e.Location.X - this.LOCATION_X; + this.Top += e.Location.Y - this.LOCATION_Y; + } + } + + /// + /// 开始匹配 + /// + /// + /// + private void StartMatch_Click(object sender, EventArgs e) + { + // 开始匹配 + WritelnGameInfo(GetNowShortTime() + " 开始匹配"); + WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 开始匹配"); + WriteGameInfo(">> 匹配参数:"); + if (!Usercfg.Match_Mix && !Usercfg.Match_Team && !Usercfg.Match_HasPass) + WritelnGameInfo("无"); + else + { + WriteGameInfo((Usercfg.Match_Mix ? " 混战房间 " : "") + (Usercfg.Match_Team ? " 团队房间 " : "") + (Usercfg.Match_HasPass ? " 密码房间 " : "")); + WritelnGameInfo(); + } + // 显示停止匹配按钮 + StartMatch.Visible = false; + StopMatch.Visible = true; + // 暂停其他按钮 + StartMatch_Method((int)CommonEnums.StartMatch_State.Enable, new object[] { false }); + // 创建委托,开始匹配 + StartMatch_Action = (int i, object[]? objs) => + { + StartMatch_Method(i, objs); + }; + // 创建新线程匹配 + MatchFunGame = Task.Factory.StartNew(() => + { + + if (this.InvokeRequired) + { + Invoke(StartMatch_Action, (int)CommonEnums.StartMatch_State.Matching, null); + } + else + { + StartMatch_Action((int)CommonEnums.StartMatch_State.Matching, null); + } + }); + } + + /// + /// 创建房间 + /// + /// + /// + private void CreateRoom_Click(object sender, EventArgs e) + { + string roomtype = ""; + if (Usercfg.Match_Mix && Usercfg.Match_Team) + { + ShowMessage.WarningMessage("创建房间不允许同时勾选混战和团队!"); + return; + } + else if (Usercfg.Match_Mix && !Usercfg.Match_Team && !Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_Mix; + } + else if (!Usercfg.Match_Mix && Usercfg.Match_Team && !Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_Team; + } + else if (Usercfg.Match_Mix && !Usercfg.Match_Team && Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_MixHasPass; + } + else if (!Usercfg.Match_Mix && Usercfg.Match_Team && Usercfg.Match_HasPass) + { + roomtype = Config.GameMode_TeamHasPass; + } + if (roomtype.Equals("")) + { + ShowMessage.WarningMessage("请勾选你要创建的房间类型!"); + return; + } + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Creating, new object[] { roomtype }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Creating, new object[] { roomtype }); + } + } + + /// + /// 退出房间 + /// + /// + /// + private void QuitRoom_Click(object sender, EventArgs e) + { + InMain(); + } + + /// + /// 房间设置 + /// + /// + /// + private void RoomSetting_Click(object sender, EventArgs e) + { + + } + + /// + /// 查找房间 + /// + /// + /// + private void QueryRoom_Click(object sender, EventArgs e) + { + JoinRoom(false, RoomText.Text); + } + + /// + /// 登出 + /// + /// + /// + private void Logout_Click(object sender, EventArgs e) + { + LogoutAccount(); + } + + /// + /// 登录 + /// + /// + /// + private void Login_Click(object sender, EventArgs e) + { + LoginAccount(); + } + + /// + /// 终止匹配 + /// + /// + /// + private void StopMatch_Click(object sender, EventArgs e) + { + StopMatch_Click(); + } + + /// + /// 双击房间列表中的项可以加入房间 + /// + /// + /// + private void RoomList_MouseDoubleClick(object sender, MouseEventArgs e) + { +#pragma warning disable CS8600, CS8604 + if (RoomList.SelectedItem != null) + JoinRoom(true, RoomList.SelectedItem.ToString()); + } + + /// + /// 点击发送消息 + /// + /// + /// + private void SendTalkText_Click(object sender, EventArgs e) + { + SendTalkText_Click(true); + } + + /// + /// 勾选混战选项 + /// + /// + /// + private void CheckMix_CheckedChanged(object sender, EventArgs e) + { + if (CheckMix.Checked) Usercfg.Match_Mix = true; + else Usercfg.Match_Mix = false; + } + + /// + /// 勾选团队选项 + /// + /// + /// + private void CheckTeam_CheckedChanged(object sender, EventArgs e) + { + if (CheckTeam.Checked) Usercfg.Match_Team = true; + else Usercfg.Match_Team = false; + } + + /// + /// 勾选密码选项 + /// + /// + /// + private void CheckHasPass_CheckedChanged(object sender, EventArgs e) + { + if (CheckHasPass.Checked) Usercfg.Match_HasPass = true; + else Usercfg.Match_HasPass = false; + } + + /// + /// 点击房间号输入框事件 + /// + /// + /// + private void RoomText_Click(object sender, EventArgs e) + { + if (RoomText.Text.Equals("键入房间代号...")) + { + RoomText.ForeColor = Color.DarkGray; + RoomText.Text = ""; + } + } + + /// + /// 焦点离开房间号输入框事件 + /// + /// + /// + private void RoomText_Leave(object sender, EventArgs e) + { + if (RoomText.Text.Equals("")) + { + RoomText.ForeColor = Color.DarkGray; + RoomText.Text = "键入房间代号..."; + } + } + + /// + /// 房间号输入框内容改变事件 + /// + /// + /// + private void RoomText_KeyUp(object sender, KeyEventArgs e) + { + RoomText.ForeColor = Color.Black; + if (e.KeyCode.Equals(Keys.Enter)) + { + // 按下回车加入房间 + JoinRoom(false, RoomText.Text); + } + } + + /// + /// 点击聊天框事件 + /// + /// + /// + private void TalkText_Click(object sender, EventArgs e) + { + if (TalkText.Text.Equals("向消息队列发送消息...")) + { + TalkText.ForeColor = Color.DarkGray; + TalkText.Text = ""; + } + } + + /// + /// TalkText离开焦点事件 + /// + /// + /// + private void TalkText_Leave(object sender, EventArgs e) + { + TalkText_Leave(); + } + + /// + /// 聊天框内容改变事件 + /// + /// + /// + private void TalkText_KeyUp(object sender, KeyEventArgs e) + { + TalkText.ForeColor = Color.Black; + if (e.KeyCode.Equals(Keys.Enter)) + { + // 按下回车发送 + SendTalkText_Click(false); + } + } + + /// + /// 版权链接点击事件 + /// + /// + /// + private void Copyright_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + // Copyright 2022 mili.cyou + Process.Start(new ProcessStartInfo("https://mili.cyou/fungame") { UseShellExecute = true }); + } + + /// + /// 点击快捷消息 + /// + /// + /// + private void PresetText_SelectedIndexChanged(object sender, EventArgs e) + { + // 发送快捷消息并执行功能 + if (PresetText.SelectedIndex != 0) + { + string s = PresetText.SelectedItem.ToString(); + SendTalkText_Click(s); + SwitchTalkMessage(s); + PresetText.SelectedIndex = 0; + } + } + + /// + /// 最小化窗口 + /// + /// + /// + private void MinForm_Click(object sender, EventArgs e) + { + this.WindowState = FormWindowState.Minimized; + } + + #endregion + + #region 工具方法 + + /// + /// 判断是否存在这个房间 + /// + /// + /// + private bool CheckRoomIDExist(string roomid) + { + foreach (string BoxText in RoomList.Items) + { + if (roomid.Equals(BoxText)) + { + return true; + } + } + return false; + } + + /// + /// 判断快捷消息 + /// + /// + private void SwitchTalkMessage(string s) + { + switch (s) + { + case Config.FunGame_SignIn: + break; + case Config.FunGame_ShowCredits: + break; + case Config.FunGame_ShowStock: + break; + case Config.FunGame_ShowStore: + break; + case Config.FunGame_CreateMix: + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Mix }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Mix }); + } + break; + case Config.FunGame_CreateTeam: + CreateRoom_Action = (int i, object[]? objs) => + { + CreateRoom_Method(i, objs); + }; + if (this.InvokeRequired) + { + Invoke(CreateRoom_Action, (int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Team }); + } + else + { + CreateRoom_Action((int)CommonEnums.CreateRoom_State.Creating, new object[] { Config.GameMode_Team }); + } + break; + case Config.FunGame_StartGame: + break; + case Config.FunGame_AutoRetryOn: + WritelnGameInfo(">> 自动重连开启"); + Usercfg.FunGame_isAutoRetry = true; + break; + case Config.FunGame_AutoRetryOff: + WritelnGameInfo(">> 自动重连关闭"); + Usercfg.FunGame_isAutoRetry = false; + break; + case Config.FunGame_Retry: + if (!Usercfg.FunGame_isRetrying) + { + NOW_CONNECTEDRETRY = -1; + Connect(); + } + else + WritelnGameInfo(">> 你不能在连接服务器的同时重试连接!"); + break; + } + } + + /// + /// 获取系统日期 + /// + /// + private string GetNowTime() + { + DateTime now = System.DateTime.Now; + return now.AddMilliseconds(-now.Millisecond).ToString(); + } + + /// + /// 获取系统短日期 + /// + /// + private string GetNowShortTime() + { + DateTime now = System.DateTime.Now; + return now.AddMilliseconds(-now.Millisecond).ToString("T"); + } + + #endregion + } +} \ No newline at end of file diff --git a/FunGame/UI/Main/Main.resx b/FunGame/UI/Main/Main.resx new file mode 100644 index 0000000..e7db271 --- /dev/null +++ b/FunGame/UI/Main/Main.resx @@ -0,0 +1,1193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABILAAASCwAAAAAAAAAA + AACniJ3/p4id/6aHnf+piaH/mnqT/31ddv+AYHn/gmF6/3tbdP+KdIr/zMjb/73H1v+/x9X/xMnZ/727 + zf97Y3v/g1x5/4Ngev94YHX/emZ3/9vW2//g6OT/3eTh/9/k4v/e4+H/9vn4//3//v/9/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7///3///7+/v/8//3//P/9//v8+///////v7W+/3NUbv+DYn3/gF96/4Bf + ev+AX3r/gF96/4Bfev+AYXz/eVZ1/5mElv//////+P76//3+/v//////9/v6/9/k4v/g5eP/3+Ti/9/k + 4v/h5uT/+/38///+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/f/7/fr//////5uKmP96VXX/hV9+/39i + ev92WXH/rJ61/8jN3/+8xdb/w8fX/8LH1v/Bx9b/xMfW/8LH1v++xdb/yszf/6qetP91WXH/hGB7/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Jfev+CX3n/fWB5/39gef+EYHr/fl13/31nf//DwdT/wcjX/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJof+aepP/fV12/4Bg + ef+CYXr/e1t0/4p0iv/MyNv/vcfW/7/H1f/Eydn/vbvN/3tje/+DXHn/g2B6/3hgdf96Znf/29bb/+Do + 5P/d5OH/3+Ti/97j4f/2+fj//f/+//3+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v///f///v7+//z/ + /f/8//3/+/z7//////+/tb7/c1Ru/4Niff+AX3r/gF96/4Bfev+AX3r/gF96/4BhfP95VnX/mYSW//// + ///4/vr//f7+///////3+/r/3+Ti/+Dl4//f5OL/3+Ti/+Hm5P/7/fz///7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v79//v9+v//////m4qY/3pVdf+FX37/f2J6/3ZZcf+snrX/yM3f/7zF1v/Dx9f/wsfW/8HH + 1v/Ex9b/wsfW/77F1v/KzN//qp60/3VZcf+EYHv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gl96/4Jf + ef99YHn/f2B5/4Rgev9+XXf/fWd//8PB1P/ByNf/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4id/6eInf+mh53/qYmh/5p6k/99XXb/gGB5/4Jhev97W3T/inSK/8zI2/+9x9b/v8fV/8TJ + 2f+9u83/e2N7/4Ncef+DYHr/eGB1/3pmd//b1tv/4Ojk/93k4f/f5OL/3uPh//b5+P/9//7//f7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+///9///+/v7//P/9//z//f/7/Pv//////7+1vv9zVG7/g2J9/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gGF8/3lWdf+ZhJb///////j++v/9/v7///////f7+v/f5OL/4OXj/9/k + 4v/f5OL/4ebk//v9/P///v7//v7+//7+/v/+/v7//v7+//7+/v/+/v3/+/36//////+bipj/elV1/4Vf + fv9/Ynr/dllx/6yetf/Izd//vMXW/8PH1//Cx9b/wcfW/8TH1v/Cx9b/vsXW/8rM3/+qnrT/dVlx/4Rg + e/+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+CX3r/gl95/31gef9/YHn/hGB6/35dd/99Z3//xMHU/8HI + 1//Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aHnf+piaH/mnqT/31d + dv+AYHn/gmF6/3tbdP+KdIr/zMjb/73H1v+/x9X/xMnZ/7y7zf97Y3v/g1x5/4Ngev94YHX/emZ3/9zW + 3P/h6eX/3uXi/+Dl4//f5OL/9vn4//7//v/9/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7///3///z9 + /P/5/Pr/+fz6//j5+P//////vrS9/3RUbv+DYn3/gF96/4Bfev+AX3r/gF96/4Bfev+AYXz/eVZ1/5mE + lv//////+P75//3+/v//////9/v6/9/k4v/g5eP/3+Ti/9/k4v/h5uT/+/38///+/v/+/v7//v7+//7+ + /v/8/Pz/+/v7//v8+//4+/f//////5yKmf99V3f/h2GA/4FjfP94W3P/rZ+1/8jN3/+8xdb/w8fX/8LH + 1v/Bx9b/xMfW/8LH1v++xdb/yszf/6qetP91WXH/hGB7/4Ffev+AX3r/gF96/4Bfev+AX3r/gF96/4Jf + ev+CX3n/fWB5/39gef+EYHr/fl13/31nf//CwNL/v8fV/77F1P++xdT/vsXU/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJof+aepP/fV12/4Bgef+CYXr/e1t0/4p0iv/MyNv/vcfW/7/H + 1f/Fydn/vbvO/3tje/+DXXn/g2B7/3hgdf96ZXf/2tTa/97m4//b4t//3ePg/9zi4P/1+ff//f////3+ + /f/+/v7//v7+//7+/v/+/v7//v7+//7+/v///f///////////////////fz8//////+/t77/dFRu/4Ni + ff+AX3r/gF96/4Bfev+AX3r/gF96/4BhfP95VnX/mYSW///////4/vr//f7+///+///3+/r/3+Ti/9/l + 4v/f5OL/3+Ti/+Hm5P/7/fz///7+//7+/v/+/v7///7+//////////////////39/f//////lYaT/3FN + bP99WHf/d1pz/21Raf+pnLL/yM3f/7zF1v/Dx9f/wsfW/8HH1v/Ex9b/wcfW/77G1v/Kzd//qp60/3VZ + cf+EYHv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gl96/4Jfef9+YHn/f2B5/4Ngev9+XXb/fmiA/8zI + 2//K0N//yc7e/8nO3v/Jzt3/wcjX/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+mh53/qYmh/5p6 + k/99XXb/gGB5/4Jhev97W3T/inSK/8zI2/+9x9b/v8fV/8bJ2f/Au8z/f2N6/4dcef+FXnr/e152/39m + ev/o3uj/8fLz/+rw7v/n8ez/5/Ls//X9+f/7//7//f/8//7//P/+//3//f/9//z+/v/8/v7/+/3+//7/ + ///Xz9n/vqu8/8m2xv/DtL//yLvF/6SOn/95WHP/gmF8/4Bfev+AX3r/gF96/4Bfev9/YHr/f2J8/3dX + df+YhJb///////n+/P/+/P7///7///X8+P/d5uD/3ubg/93m4P/d5uD/3+ji//r9+/////3///78///9 + /P///P3/x7/F/720vf/CtcD/w7PA/8S0wv+lmKv/lYyi/5mOpf+djaX/kYye/7Cywv/Fytr/wMbV/8LH + 1v/Cx9b/wsfW/8PH1v/AyNb/vMbW/8nN3/+onrT/dFhx/4Ngev99YHn/fWB5/35gef9+YHn/fmB5/4Bg + ef+AX3n/gF96/4Bfev+AX3r/gF96/35deP+CY33/p5Or/6aXrv+pla3/qZas/6aZrv/BwdL/v8jY/77G + 1f/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aHnf+piaH/mnqT/31ddv+AYHn/gmF6/3tbdP+KdIr/zMjb/73H + 1v+/x9X/xcrZ/728y/98Y3r/hFx4/4Nge/95YHf/e2d6//Pu8////////v79//7//P/9//z//P77//79 + /f/+//3//v/8//3//f/8//3/+//9//r//f/3/fv//////6SYp/9mSWP/dlhv/3FZaf9xWGn/eVpz/4Fg + e/+AX3r/gF96/4Bfev+AX3r/gF96/39fev9/YXz/d1d1/5iEl///////9/76//z9/v///v//9/v6/+Dk + 4v/g5eL/4OTi/+Dk4v/i5uT//P38///+/v/9/v7//v3+//33/f+BcID/aVFn/29Ybv9vV23/ZlBn/7au + wv/N0+X/xMze/8vM3//Kz9//xMrZ/8HG1f/BxtX/wsfW/8LH1v/Cx9b/wsfW/7/I1v+9xtb/ys3f/6qe + s/92WXH/hWF6/39gef9+YHn/fmB5/35gef9+YHn/fmB5/39gef+AX3r/gF96/4Fge/9/Xnn/fl14/4Ff + ev9yWHL/cVhy/3ZXcv91WHH/blpx/7y3yv/Dytz/vsbV/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJ + of+aepP/fV12/4Bgef+CYXr/e1t0/4p0iv/MyNv/vcfW/7/H1f/Fytn/vbzL/3pkev+BXXj/gWF7/3dg + d/95ZXn/8u3x/////v/9/vn//f75//79+f///v3///3////+/v/+//3//f/9//z//f/5//r/+f/6//X9 + +P//////q6Gs/3ZZcv+DZn3/fmR3/39ief+DX33/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Fg + ff94VnT/mIWW///////1/vf/+f77///////6+/r/4uTj/+Lk4//i4+L/4uTi/+Tm5f/+/P3///7///n+ + /v/4/f///Pj//495jf+DXHr/gmJ9/39kfP90XXX/sqzA/7/K2v+1xdP/u8bT/7/F0//BxtX/wsfW/8LH + 1v/Cx9b/wsfW/8LH1v/Bx9b/wMfW/77G1v/MzN//rZ60/3hYcf+HYHr/g195/4Fgef+AYHn/gGB5/4Bg + ef+AYHn/f2B5/4Bfev+AX3r/gF96/39eef+AX3r/f155/31he/9+YXv/gmB7/4Fgev97ZHz/wLnN/8LH + 2f+/xtX/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+mh53/qYmh/5p6k/99XXb/gGB5/4Jhev97W3T/inSK/8zI + 2/+9x9b/v8fV/8bI2P/Busv/f2R7/4Vfe/+CYHv/e193/4FnfP/x6/D/+//8//n8+f/5/fr/+fv6//z8 + /P/9/v7//f39//z9/f/6/fz/+v37//n9+v/5/fr/9vv4//////+soav/dVZu/4Rjff99YXf/gF95/4Nc + fP+BX3v/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gGB8/3lXdP+Xg5X///////T89f/4/fn//P78//T6 + 9f/d5d7/3ubf/97m3//c5N3/3ufg//r79//9/fr/+P36//X8+//6+f3/j3qK/4Rcdv+FX3v/g2B7/3lc + df+1qsD/xczc/7vH1P/AyNX/wsfW/8HG1f/Cx9b/wsfW/8LH1v/Cx9b/wsfW/8DH1v+/yNb/v8XW/83L + 3v+snbP/d1t0/4VifP+AYHn/gGF6/4Bhev9/YHn/gGB5/4Bgef+AYHn/gF96/4Bfev+AX3r/gWB7/4Fg + e/+AX3r/f195/4Bfev+FXnr/gl55/3tief/Cuc3/xcja/77G1f/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aH + nf+piaH/mnqT/31ddv+AYHn/gmF6/3xbdP+KdIr/zMjb/77H1v+/x9X/yMrZ/8G5yv92XHP/eldz/3hZ + dP9zWXH/eV9z//Pw8v///////v7+////////////+v7+//b+/P/6/v3//P39//3+/v////////////// + ///9/P3//////7Gkr/94VHD/hmF9/39hd/9/YHn/hF19/4Ffe/+AX3r/gF96/4Bfev+AX3r/gF96/39f + ef+DYn7/eVVz/5qElv///////v7+/////////////P38/+Tr5P/k7OX/5Ovk/+Xt5f/m7ef//f79//// + //////////////////+Gd4H/dFlq/3tcc/96WXP/cVRt/7apvv/JzN3/wMbV/8bH1v/Dx9b/wsfW/8LH + 1v/Cx9b/wsfW/8LH1v/Cx9b/wMfW/8DH1v/AxdX/zc3g/6WbsP9nU2r/c1x0/3Jbc/9xWXH/d1x0/31g + ef9/YHn/gGB5/4Ffef+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gl96/4Veev+CXnj/e2J5/8C4 + y//Eydv/v8bV/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/poed/6mJof+aepP/fV12/4Bgef+BYXr/e1t0/4p0 + iv/MyNv/vcfW/8DH1v/Cydf/vMDP/4+Dl/+WgZr/lIOb/42Blv+ShZf/y8HM/9PL0v/SyND/0sjR/87H + zv/p6uv/7/by/+/08f/v8vL/9/b3/9nT2P/Pxs7/08fS/9LE0P/WztX/oImc/39Wdf+HYHz/fmF2/31h + d/+AXnv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gGB6/39gef99WHf/lXqQ/+La4f/a19j/3tTc/+DU + 3v/d09r/zsTM/8/Fzf/Qxs3/z8XM/9DFzf/Sx9H/0sjS/9PI0f/TyM//0cXP/5qNnP+LgJL/kYaY/5SE + mP+NfpP/ubbI/8PK3P/Axdj/x8XY/8TH1//Cx9b/wsfW/8LH1v/Cx9b/wsfW/8LH1v/Ax9b/wMfW/7/G + 1v/Gy93/rqzA/4V+k/+PhZr/joKY/5SFnP+NeZD/eV93/35gef+CX3n/gl95/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/39fev+BX3r/hF96/4BfeP94Ynn/vbnL/8HK2/++xtX/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eI + nf+mh53/qYmh/5p6k/99XXb/gGB5/4Ngev98WnT/inOK/8zI2/++x9b/wsfW/77H1f+4ydb/y8zf/8/K + 4P/MzOH/y83f/8rI2f90Y3b/b1Rp/3NXbf9zWG3/aldl/8/Iy//m6OP/2+Pe/9rh3//r6uv/joOM/2VR + Yf90WG7/dVZt/25Yav96W3P/h1x8/4Zee/9+YXf/fGJ3/35fev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AYHv/fV55/4Bcev+GZ4H/mIOU/5ODj/+ZgJX/nX2X/5t/lv+dgZj/noGY/5+Cmf+egpn/nH+X/3JY + cv9tVW//c1Zu/3RWbP9tV2z/wbnN/83Q5f/Fy9v/y83b/83N3v/ByNn/u8fY/77G2f/Fxdr/xMbX/8LH + 1v/Cx9b/wsfW/8LH1v/Cx9b/wsfW/8DH1v/Ax9b/wMfX/77F1v/Fydv/y8zg/8vL3//Lyd3/1tDl/7yv + xf9yW3P/gGF6/4Nfef+CX3n/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/f196/39fev+CX3r/f194/3Zj + ef+6ucv/vsrb/73G1f/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6aHnf+piaH/mnqT/31ddv+BX3n/hl97/31a + df+Jc4v/y8jb/7/H1v/Ixtb/w8fW/7jI2P/ExNf/xcTX/7vE1f++xtf/ycHU/4Rsg/9/Xnv/hGB//4Rh + ff96YXX/1MvR/+Ts5f/X593/2+fg/+zt7P+ZjJX/dl9v/4Rke/+FYXz/gmJ8/4Bge/+BX3v/gF96/4Bf + ev9/X3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/39efP99W3//fFt7/4dpg/+oi6P/p4mh/6iI + o/+oh6T/qIih/6iJn/+nipz/qIqd/6mKof+lhKD/gmSA/39hfP+EYnz/gWJ7/3djef+3tcf/vcna/7zF + 1P/BxdT/wcXU/8HG1v/Bx9b/wcfX/8LH1//Dx9b/wsfW/8HH1v/Bx9b/wsfW/8TH1v/Ex9b/wcfW/8DH + 1v/Ax9b/wMfW/7/G1f+/xtX/v8XV/7zD1P/Fytz/sKm+/3VbdP+EYHv/gF96/35fev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev9+X3r/fl96/4Jfev9+X3j/dmN5/7m5y/+8y9v/vcbX/8PG2P/Dxtj/wsbY/8HH + 2P+/x9j/v8fY/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/poed/6mJof+aepP/fV12/4Bgev+BYXv/eVt1/4R1iv/EyNr/ucbV/7/G1P+/xtX/vcbX/8bF + 2P/Gxdj/vcbX/8DH2P/Kw9b/gmqC/35dev+DX37/gmB9/3lgdf/SytH/4+jl/9jk3v/c5OD/7ers/5mJ + k/92XG3/gmJ6/4Jfev+BX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF97/31ee/97Xnb/h2t//6eMnf+lipz/poqd/6aKnv+mip3/poqb/6aMmf+mjJn/p4yc/6OH + m/+AY3v/fV95/4Jfev9/YHn/dWB3/7m1x//Aydr/u8bU/73H1f+9x9X/vcfV/73H1f+9x9X/vcfV/73H + 1f+9x9X/vcfV/73H1f+9x9X/vsfV/77H1f/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/vcXW/8bM + 3f+wq7//dFtz/4Vge/+AX3r/fl96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/35fev9+X3r/gl96/35f + eP93Ynn/vLjK/8DJ2v++xNb/wcXX/8HF1//Bxtj/wMfY/8DH2P+/x9j/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+mh53/qYmh/5l5kv97W3T/fl53/31f + eP90WXH/g3SJ/8vP4P+/zNz/w8zc/8fM3P/Iytz/x8bY/8TG2P++xtf/wcfY/8bD1v97Zn3/d1hz/3lb + d/94XHb/cFtu/9jO1//v7u//5enp/+no6//67/f/noqY/3Zabv+CYnr/gV96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/fV93/3xfdf+Gan7/o4ia/6GG + mP+hhpr/oYWb/6KFm/+ihZv/ooaa/6KHmf+jh5v/oISZ/39je/99X3r/gV96/39gef94YHf/w7nM/87O + 4P/Fytv/xszc/8bM3P/GzNz/xszc/8bM3P/GzNz/xczc/8XM3P/GzNz/xszc/8XM3P/Ezdz/wMrZ/7/H + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DG1v+9xdb/xszd/7Crv/90W3P/hWB7/4Bfev9+X3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/fl96/35fev+BX3r/fl94/3pief/FvND/zc3g/8jK3P/Jy93/x8vd/8HI + 2f/Ax9j/wMfY/8HH2P/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eHnf+piaH/nHyV/4dngP+IaIH/jGmC/4llfv+RdYz/vbHF/7Gvwv+1r8P/ua3C/7uz + xv/Fxdf/wcfY/77F1v/Ex9n/xcTW/4t+k/+LdIz/inaO/4l3jv+Gd4r/w7bF/9TI0v/NxM3/z8PP/9zI + 1/+YfpH/eVty/4Fhe/9/X3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev9+X3v/elt4/4hpiP+ylLX/r5Cz/66RtP+ukbX/sI+3/7CPtv+wkbb/r4+0/7GS + tv+tjrD/gGOA/31eef+AX3r/gWB5/3tfd/+0orf/vLHF/7muwv+5rsL/ua7C/7muwv+5rsL/ua7C/7mu + wv+3rsL/uK7C/7quw/+5rsL/uK/D/7KtwP+7us3/wsjX/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMbW/73F + 1v/GzN3/sKu//3Rbc/+FYHv/gF96/35fev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev9+X3r/fl96/4Bf + ev+AX3n/fGF5/7akuf+7scX/t67C/7Wvw/+vr8H/vMHT/8HI2f/Bxtj/w8bY/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4ie/6eHn/+nh6D/qIih/6mJ + of+tiJ7/tImh/6Z+l/92WnH/cl50/3Vddf93WnL/emh9/8TD1v/AyNn/wMXX/8XF2P/Extj/ysjb/8/H + 3P/Mx9z/zcfc/9TM3/+AcYP/b1ps/3NecP90X3L/eF1y/31edf+BYXr/f196/35fev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/39fff94Vnr/lHGb/+XC + 8//du/D/3Lzz/9288v/eu/P/3rv0/9668//eu/L/3r3w/9i35/+CY4b/fF54/4Bfev+CX3n/f2B5/3de + df9yXnT/dVxz/3hcdP94XHT/eFx0/3hcdP94XHT/eFx0/3VcdP93XHT/elt0/3tcdf95X3f/aVZt/56T + p//Jz97/vsXU/8DH1v/Ax9b/wMfW/8DH1v/Axtb/vcXW/8bM3f+wq7//dFtz/4Vge/+AX3r/fl96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/35fev9+X3r/gF96/4Jfef9/YHn/d151/3JedP91XnT/cl91/2Zc + cP+wsML/xsvd/8HF1//Cxtj/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ7/p4af/6aGn/+mhp//pIad/6WInP+uiJ7/p3+X/39geP99YHn/gmB7/4Nc + dv+GbIP/xMPW/7vG1//Cx9j/x8bY/8DF1v++xtj/vcTX/7zG1/+9xdb/ycfZ/4Z1iv95XHP/gWR8/35g + ev+BYXr/gl96/4Ffev9/X3r/fWB6/39fev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AYHn/gWN5/3hYd/+Vcp3/3rvx/9i18v/XtPb/17X1/9i28v/YtvT/2LX1/9i2 + 8v/aufD/07Tn/4BjiP98Xnj/gF97/4Jfef+BX3j/gGF5/31heP+AYXn/gl95/4Jgef+CYHn/gmB5/4Jg + ef+BYHn/fmB5/4Bgef+EX3n/hmB6/4Jie/9wWHH/oZSq/8nO3v++xdT/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+9xdb/xszd/7Crv/91W3P/hWB7/4Bfev9+X3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/fl96/35f + ev+AX3r/gl95/4FfeP9/YXj/fWB3/4hiev+CYHj/cV50/7Www//Jy93/wcXX/8LG2P/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInv+mhp7/p4ef/6mJ + of+liJ7/oYmc/6mKn/+hfpb/f2B4/35gef+CX3r/hFt2/4hrgv/GxNb/u8fX/77E1f/Gxtj/wcXX/7zH + 2P+5xtf/uMfX/7vG1//Hxtn/hXSL/3xcd/+BYHr/f195/4Ffef+DYHv/gV96/39fev99YHr/f2B6/4Bf + ev+AX3n/gF96/39fef+AX3n/gF95/4Bfef9/X3n/gF95/39eef+AX3r/gF97/4BgeP9/YnT/eFp0/5Fx + mP/fvfL/17Xz/9e19v/YtvX/2Lf0/9e28//YtvX/2bf2/9q48v/Vten/gmOI/35feP+BYHv/gmB6/4Jf + ef+AX3f/gWF5/4Bgef+BYHr/gWB5/4Fgef+BYHn/gWB5/4Bgef9+YXn/gGB5/4Rfef+EYHr/gWJ7/3Fa + cv+gk6n/yM7e/73F1P+/xtb/v8fW/7/G1v+/x9b/vsbW/73F1v/Gy93/sKq//3Nbc/+DYHv/gV96/4Fg + ev+AX3r/gF96/4Bfev+AX3r/f195/4Bfef9+X3n/fl95/4Bfef+BXnj/gF14/39fd/+BYHn/h113/4df + eP93XnT/uK/D/8jL3P/Axtb/wsbY/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bg + e/+AXHb/h2qC/8jC1f+/x9j/vsbX/8HE1v/Extj/xcnZ/8bL2v/Dytz/xMjc/87J3v+EcYr/d1p2/35e + d/9+Xnb/gGB4/35fd/+AYHr/gF96/4Bfev9+Xnf/gGB5/35ed/99XXb/fV12/31ddv99XXb/fV11/31d + dv99XXb/fl53/35deP9/Xnn/f157/31fe/94WnX/knOY/+C99P/YtPb/2Lf0/9W28//TtvT/1Ljw/9S1 + 7//WtPT/2rb2/9Ox6P9+XoP/eFlx/3pbdP95W3T/eVt0/3lbdP95W3T/elt0/3lbdP95W3T/eVt0/3lb + dP95W3T/eVt0/3hbdP95W3T/fFp0/31adP96W3T/bVRs/6KRqP/N0eP/wsja/8TK2//Eytv/xMrb/8TK + 3P/Eytv/wcfa/87P4/+1q8H/cFx0/4Bhev+FX3n/g154/35ed/+AYHn/fFx1/35ed/99XXb/fV12/31d + dv99XXX/fV12/31dd/9+Xnj/fl14/4Beev+BYHn/gV95/3hcdP+6r8P/xszc/73H1f/Cx9b/wcfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gGB7/39cdv+HaoH/x8LV/77H2P++xtf/xcfZ/8TF + 1/+/us3/wrjL/7+5zP++t8z/x7rR/4pzjP+CYn3/hGN8/4Nke/+EZHz/gWF6/4Bfef+AX3r/gF96/4Bg + ef+CYnv/hmZ//4Rkff+EZH3/hGR9/4Rkff+EZHz/hGR8/4Rkff+EZH3/g2N9/39eef+AX3v/fV97/3da + df+Scpf/4L30/9i09v/Yt/T/1rjz/9S58P/bwe7/2sHt/9u+7f/ewe//2b/l/451kf+Kb4f/i3GJ/4tx + if+LcYn/i3GJ/4txif+LcYn/i3GJ/4txif+LcYn/i3GJ/4txif+LcYn/inGJ/4pxif+McYn/jHGJ/4xy + i/+BbIL/ppWr/8a+0f+/uMv/wLnM/8C5zP/Aucz/wLnM/8C5zP+8tsv/xbvR/7Ggt/9zXHT/f2F6/4Nf + ef+DX3n/gWF6/4Vlfv+FZX7/hGR9/4Rkff+EZH3/hGR8/4RkfP+EZH3/g2R8/4Vlfv+AXnr/gF96/4Bg + ef+CYHr/eFx0/7qvw//GzNz/vcfV/8LH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bf + ev+AYHv/flx2/4Vrgf/GwtX/vcfY/73F1v/Exdj/xMTW/3hrgP94XnX/d2F4/3ZheP93YHj/m36X/6eF + n/+ph6D/p4ef/6iIoP+La4T/fl13/4Ffe/+AYHr/fVx1/5Z2jv+oiKD/pYWe/6eHn/+mhp//poaf/6aH + nf+mh53/poae/6mJov+YeJH/fVx2/4FgfP99X3v/d1p1/5Jyl//gvfT/2LT2/9m39f/Vtu//28Dw//nk + /v/66P7/++b+//rn/v/66fz/++r8//3p/v/96f7//en+//3p/v/96f7//en+//3p/v/96f7//en+//3p + /v/96f7//en+//3p/v/86f7//On+//3p/v/76Pz/9+b5///y//+0pbj/bVZt/3tjev94YHj/eGB4/3hg + eP95YHf/d2B4/3Zief94Ynn/emB4/31gef9+YHn/gmB5/39dd/+GZn7/poae/6WFnf+nh5//poae/6aG + n/+mh57/poed/6aGnv+nh6D/pYWe/4Rjff9/Xnn/gWB6/4Jgef94XHT/uq/D/8bM3P+9x9X/wsfW/8HH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bge/9+XXb/hGuB/8XC1f+9yNj/vcXW/8bG + 2f/Ew9X/fmuB/4Fcdv+BX3n/fl94/31ed/+ggJn/q4ii/6eGn/+mh5//qoqi/4xshf99XXf/gV97/4Fg + e/99XXX/l3eP/6mJof+nh57/p4ef/6eHn/+nh5//p4id/6eInf+nh57/qYmh/5h4kf99XXX/gF96/35f + e/93WnX/knKX/+C99P/YtPb/2Lf1/9a38P/awe3/+uf+//vs+//67Pz/+ev9//rt+v/67Pz/++v///vr + ///76///++v///vr///76///++v///vr///76///++v///vr///76///++v///nr///57P//+ez///ns + ///26fz///b//7imuf90VG7/g2F7/4BfeP+AX3j/gF94/4BfeP+AX3n/fWB5/35gef9+YHn/f2B5/4Bg + ef+AYHn/f153/4Zmfv+nh5//poee/6eHn/+nh5//p4ef/6eInv+niJ3/p4ie/6eHn/+mhp7/hGR9/35e + d/+AYHn/gmB5/3hcdP+6r8P/xszc/73H1f/Cx9b/wcfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39f + eP+AX3r/gWB7/31ddv+Da4H/xcPV/7zH2P+9xdb/xsbY/8bD1f+AaoL/g1x4/4Nge/+CYHr/gV94/6KA + mP+qiKD/p4ef/6eHn/+piaH/i2uE/35dd/+BX3v/gWB7/31ddP+XeI3/qYqg/6aHnP+niJ3/p4id/6eI + nf+niZz/p4mc/6aHnP+piqD/mHiQ/31ddf+AYHn/fl97/3dadf+Scpf/4L30/9i19v/Zt/X/1rfw/9rA + 7v/76P7/+u75//jt+f/37P3/9+z7//jr/P/56v3/+Ov9//jr/f/46/3/+Or9//jq/f/46v3/+Or9//jq + /f/46v3/+Or9//jq/f/46v3/9ur9//br/f/17P3/9ez9//Xq+///9///uaa6/3ZVcP+FYn3/g2B7/4Ng + e/+DYHv/g197/4Jgev+AYHr/gGB6/4Bgef+AYHn/gGB5/35gef99X3f/h2d9/6eInv+niJ3/p4id/6eI + nf+niJ3/p4id/6eJnP+niJ3/p4id/6aGnv+EZHz/fl53/4Bgef+CYHr/eFx0/7muw//GzNz/vcbU/8LH + 1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+BYHv/fV12/4Frgv/ExNb/vMnZ/73G + 1//Ix9r/x8TX/3xqgv99XHn/f196/4Bgef9+Xnf/oICY/6iJn/+mh57/p4ef/6mJof+La4T/fl13/4Ff + e/+BYHv/fV10/5d4jf+pi5//poec/6eInf+niJ3/p4id/6eJnP+niZz/poic/6mKn/+YeZD/fV10/4Bg + ef99X3v/d1p1/5Jyl//fvPT/2LP2/9i29f/WtvL/2r7w//vo/v/57fr/9+z7//bq///26f//+Or+//nr + /f/56/3/+ev9//nr/f/77P7/++3+//vt/v/77f7/++3+//vt/v/77f7/++3+//vt/v/67f7/9+z9//Ts + /f/07P3/9ur7///3//+6pbj/clNt/4Bge/9+XXn/fl15/35eeP9+Xnj/fl54/39fd/9+X3f/f194/35g + ef9+YHn/fmB5/31fdv+HZ3z/qImd/6eInf+niJ3/p4id/6eInf+niZz/p4mc/6eJnP+niJ3/poad/4Nj + e/9+Xnb/gGB5/4Ffef93W3P/urDE/8bO3f+9yNb/w8jX/8HI1/+/yNb/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/ + mP9/X3j/gF96/4Fge/98XXf/gmuC/8e+0v/EwdT/xb/T/8u/1P/LvtP/gGuC/35eeP+AYXv/gWF5/4Bh + eP+hgpj/p4md/6aInv+nh5//qYmh/4trhP9+XXf/gV97/4Fge/99XXX/l3iP/6mKof+mh53/p4id/6eI + nf+niJ3/p4mc/6eJnP+miJ3/qYqg/5h4kP99XXX/f194/4Bge/94Wnb/kXOW/+DC8P/Zuu//2Lzv/9W7 + 7f/bw+3/+ef+//rt/P/47Pv/9+r+//fp/v/46P//+en///np///47fn/9+/5//Hj/P/u4Pn/7+H5//Dh + +P/v4fj/7+H4/+/h+P/v4fj/8OH5/+/f+v/15/3/+Oz8//fr/P/16/j///b//7ykwP90Wnf/gWmB/39n + ff+AZ37/f2WA/35hg/+BYoX/gWCC/4Fhg/+AYYD/fmB5/35hd/9+YXn/fF54/4Rnf/+liZ//pYid/6aJ + nf+miJ3/qIee/6eInf+niZz/p4ic/6iJnv+lhpz/hmZ9/39gd/+CYnr/hGJ7/3pddf+7qsD/ycXZ/8DA + 0//EwNT/yMDU/8XE1v/Bx9f/v8fW/8HH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/31fev96YXn/gmiA/4Jn + gP+BZn//gmiA/4Jpgf+fg5r/pYWa/6SFmv+khZr/pIWa/6eInf+niJ3/p4ee/6eHn/+piaH/i2uE/35d + d/+BX3v/gWB7/31ddv+Xd5D/qYmi/6aGn/+niJ7/p4id/6eInf+niJ3/p4id/6aHnv+piaL/mHiR/31d + dv+AYHn/g2J7/3ZYc/+Zf5r//+r///fj+//15P3/9eT8//bl/f/46P7/+ev8//rt+//57Pv/+ez9//nq + /v/56v7/+ef///fr/P/06/n/lXnW/35e3P+EZOD/hWHk/4Rh4/+EYeP/hGHj/4Rh4/+GY+X/fF/O/865 + 6P//8P//+er5//bv9P/57vT/9OD2//Hc9f/x4fT/8uHx//Xk9f/lzuv/z7Lf/9Ky5f/TseT/2Lbq/7yd + x/94WnX/f2R2/35heP98XXr/g2aB/6WIoP+kiZ3/pIqc/6WInv+oh6D/p4ef/6eInf+niJ3/p4id/6eI + nf+jhZn/pIWa/6aEnP+khJz/o4Wd/4dthf98Zn//e2iB/31pgv9+YXr/s6W7/8bM3v+8xdb/w8fX/8PH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJ + of+ff5j/f194/4Bfev+AX3r/fl95/31gef97Xnf/el52/3xfd/97Xnf/fF94/6OFnP+pip//qIme/6eI + nf+niJ3/p4id/6iJnv+mhp3/p4ef/6mJof+La4T/fl13/4Ffe/+BYHv/fV12/5d3kP+piaL/poae/6eI + nv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/4Bgef+BYXr/eFpy/5d/lf//8f//+ur9//ns + /v/46///+On///fq///46/3/9+v9//jr/v/46v//+Oz9//nu+P/56v7/9uz9//Hn/P+Lat//cUnw/3RR + 6v9zUej/c1Ho/3NR6P9zUej/c1Ho/3VR6/9tRuX/xazt///y///06Pr/+PD6//nx8f/+8Pf//u7///7v + ///+7/7//+7///DX9v/YuO7/2rr1/9a38//gwfv/wKLT/3NZd/99Y3j/fWF4/31def+HZYH/qIeg/6eI + nf+niZz/poie/6WHoP+mh5//p4id/6eInf+niJ3/poec/6eInf+mh5z/p4ef/6eHn/+piqL/hGeA/3dc + df95Xnj/eV95/3RXcP+uorj/x83f/7zF1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev+AX3n/f194/39f + eP+AYHn/gGB5/39feP+DY3z/oYKZ/6eInf+mh5z/p4id/6iJnv+mh5z/p4id/6eHn/+nh5//qYmh/4tr + hP9+XXf/gV97/4Fge/99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4 + kf98XHb/gGB5/4Jie/91WG7/mYKV///y///57Pj/+O/3//bt+f/37f3/9uz8//bs/P/27Pz/9uz9//br + /v/47Pz/+e35//fr/f/07vv/7un7/4lu3/9vTPD/cVTp/3FV6P9xVOj/cVTo/3FU6P9xVej/c1Xs/2pI + 5//Cser/+/X5//To/P/05v7/+un8//3q/f/67Pv/+e36//rr/P/96v//79b2/9W17//Ztvf/1rT2/925 + +//BntT/d1h6/4Bief+BYHn/gF16/4hlgf+rhqD/q4ed/6qInP+niJ7/pIig/6aIn/+niJ3/p4id/6eI + nf+mh5z/qYqf/6eInf+nh57/p4ef/6eHn/+JaoP/f154/4Ffe/+DYXz/eFpz/7Glu//Fy93/vMXW/8PH + 1//Cx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + n/+piaH/n3+Y/39feP+AX3r/gF96/4Ffev+AXnf/gmB6/39ddv+CYHn/f112/4Ngev+kg5v/qIme/6eI + nf+niJ3/p4id/6eInf+niJz/p4ee/6eHn/+piaH/i2uE/35dd/+BX3v/gWB7/31ddv+Xd5D/qYmi/6aG + nv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/gmJ7/3VXb/+Xf5P///H///nr + +v/47fv/+O76//ju+//37fz/+Oz9//fr/f/26/z/9+z8//nr///56v7/+ej///Xs+f/w6/r/inHV/3JT + 4f91Vuj/c1Ls/3NS6/9zUuv/c1Lr/3NS6/91VO7/bkvi/8S06v/++fv/9Oj9//Tm///46f7//ev8//js + +v/37fr/+ev8//zq///s1PX/07br/9u49f/atPP/47v6/8Wf0/95Vnj/g2B4/4Reev9+W3r/g2SA/6uI + of+qhZv/q4ic/6eInv+kh6D/pYif/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6WHnv+nh5//qIih/4lo + gf+BXXj/hV97/4Vge/94WXL/r6O5/8fN3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+AX3r/gF95/39g + ef9/YHn/f194/3xddv98XXb/f194/6OEnP+oiZ7/p4id/6eInf+niJ3/p4id/6eInf+nh57/p4ef/6mJ + of+La4T/fl13/4Ffe/+BYHv/fV12/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJ + of+YeJH/fV12/39feP+BYHv/dldz/5l/m///7f//+eb+//jn///46P//++n///vn///75///++f///vp + ///66f7/+ev9//jr/f/55f//9+b///Pi/v+Oatv/d07i/3pV3/95VN//eVTf/3lU3/95VN//eVTf/3tV + 4f9yUND/ybTn///z///15/z/9ez+//bx8//78PT/9+z8//fs/P/36/3/++v//+vX9f/Tu+X/1rvp/9m5 + 6P/fv/D/waPM/3ZceP99Y3r/fGF+/3defv98ZoD/o4mg/6iInv+qiJz/qIie/6SHoP+liJ//p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/poif/6eHn/+oiKH/iGiB/35eeP+BX3v/gmB7/3hZcv+vorj/x8zf/7zF + 1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev9+Xnj/gGN8/5x/mP+dgJn/nYCZ/6CCm/+cf5j/pIad/6iI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHnv+nh5//qYmh/4trhP9+XXf/gV97/4Fge/99XXb/l3eQ/6mJ + ov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf98XXb/gGB5/4JgfP94V3f/knWZ/+PI + 7//awe3/2MHw/9rB8f/ewPD/3sDx/96/8f/fwPD/3cHt/+DF7P/25fv/9+78//nn///67fj/+PLx/+XT + 9f/fz/L/4dPx/+DQ8//g0fP/4NHz/+DR8//h0fP/4NDz/9zK9P/v4Pb//u37//no/f/17fz/9u74//np + /f/26v//9+v+//fr///67P//9+b9//Pf+//04fr/7+D4//rq///BtM3/OjJH/0Q+Uf9BOVb/PjVT/1RH + X/+diJ7/o4eb/6mJnP+oiJ7/pIeg/6WIn/+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh57/p4ef/6eJ + of+GaIH/e154/31ge/9/YXv/d1ly/6+iuP/HzN//vMXW/8PH1//Cx9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/39e + ef+CZH3/pYeg/6aIoP+oiqL/poif/6eKof+nh5//p4ee/6eHnv+nh57/p4ee/6eHnv+nh57/p4ef/6eH + n/+piaH/i2uE/35dd/+BX3v/gWB7/31ddv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aH + nf+piaH/mHiR/31ddv+AYHn/fmB2/3hbdP+QdJb/273t/9W28P/St/L/1Ljv/9e38P/XtvH/17Xy/9i3 + 8f/Vt+z/2bzq//jl/f/37P7/9+r///nt+v/57/P//O7+//zw///78v///PH///zx///88f///PH///zx + ///88f//+/D///vv+v/76/n/+ur+//fr/v/36v//+ef///fq/v/36/7/9+v///jr/v/66/7/++z+//zr + ///36/v///n//8O6z/8rJkD/NTVK/zEvUf8tKVH/RT1b/56Ip/+jhKH/poif/6WJnf+lipv/p4mc/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+nh5//p4mh/4dogf99Xnj/fmB7/39he/93WXL/r6K4/8fM + 3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+AX3r/f154/4Rkff+mhp//p4ef/6eHnv+niJ3/p4ic/6eH + nv+nh5//p4ef/6eHn/+nh5//p4ef/6eHn/+nh5//p4ef/6mJof+La4T/fl13/4Ffe/+BYHv/fV12/5d3 + kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/39gef9+YXn/d1tz/5Bz + lv/evfT/2LX2/9e39v/XuPL/2Lnx/9i48//Yt/X/2Lfz/9e48P/avO7/9+T9//fs/v/46/3/+Ov+//nq + ///46vz/+On9//jp/f/46vz/+Or9//jq/P/46vz/+Or9//jq/f/46vz/+er9//nr/v/56/3/+ev9//nr + /f/56/3/9+v9//fr/f/36/7/9+v9//fr/f/46/z/+ur+//no+f//+/3/xLnO/zAnR/85OEr/NTVN/y8t + T/9IQFn/ooii/6eFn/+nh5//p4ie/6uInP+qiJz/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6eH + n/+piKH/iGiB/35eeP+BX3v/gmB7/3hZcv+vorj/x8zf/7zF1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bf + ev9/Xnj/hGR9/6aGn/+nh5//p4ef/6eInf+niJ3/p4ee/6eHn/+nh5//p4ef/6eHn/+nh5//p4ee/6aG + nv+nh57/qYmh/4trhP9+XXf/gV97/4Fge/99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eI + nf+mh53/qYmh/5h4kf99XXX/gF97/35df/94V3r/kXCb/9669v/Xsvj/17T3/9e28//YtvP/2LX1/9i0 + 9v/XtfP/17Xx/9q48f/54v3/+e38//nr/P/57Pv/+ez6//nt+f/57vj/+ez8//nr/f/56/3/+ev9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/36/7/9+v9//fr/f/36/3/9ur8//Xp + /P/15f3/9OD7///1///AtNH/LyRP/zc2UP8zNk7/MS9M/05CVf+ki5f/qYiU/6mHm/+ohKH/roSg/6uH + n/+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//p4ef/6iIof+IaIH/fl54/4Bfe/+BYHv/eFly/6+i + uP/HzN//vMXW/8PH1//Cx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/39eeP+EZH3/poaf/6eHn/+nh5//p4id/6eI + nf+nh57/p4ef/6eHn/+nh5//p4ef/6iIoP+piaH/qYmh/6qKov+ri6P/jGyE/35dd/+BX3v/gWB7/31d + dv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddf9/X3r/fl5+/3hY + d/+Uc5j/6MP4/+G6+P/hvfb/4b/z/+C+9P/gvvT/4b/0/+C+8//gvvP/4L/y//zj/v/+6f///ej///3q + ///76///+uz9//nt+f/56/v/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr + /f/56/3/+Ov9//br///36/7/+Ov9//fq/f/57v7//vX///30///89fv//////8TBzv8mHUv/MC5T/y0w + Tf8qJFP/RjVm/6SQpv+nj5v/po2j/6aLqf+riqf/qIef/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + n/+nh5//qIih/4hogf9+Xnj/gF97/4Fge/94WXL/r6K4/8fM3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bf + ev+AX3r/f154/4Rkff+mhp//p4ef/6eHn/+niJ3/p4id/6eHnv+nh5//p4ef/6eHn/+mhp7/j2+H/4ho + gP+La4P/iWmB/4trg/+CYnv/gF95/4Bfev+BYHv/fV12/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eI + nf+niJ3/poed/6mJof+YeJH/fV12/39fef9/YXn/e19z/4Nlf/+Yd53/lnOf/5d2m/+Wd5j/lXWb/5V2 + mv+Vdpr/lnab/5Nzmv+aeqH/3sDp/+TG9f/ixPP/4cXx/97H7P/04/z/+uz///fq/f/56/3/+ev9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/46/3/9ev///fr/v/36fr///b//8O4 + yv9gWXH/a2WD/2ljff9nZnT/ZlqQ/2dNt/9kS7v/Y023/2RNvv9hTKz/UEFx/1ZNYv9QSWL/UEVk/11P + Zf+gh5v/qIme/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6eHn/+oiKH/iGiB/35eeP+AX3v/gWB7/3hZ + cv+vorj/x8zf/7zF1v/Dx9f/wsfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev9/Xnj/hGR9/6aGn/+nh5//p4ef/6eI + nf+niJ3/p4ee/6eHn/+nh5//p4ef/6aGnv+FZX3/e1tz/31ddf9/X3f/fl52/39feP+AYHr/gF96/4Fg + e/99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf99XXb/gGB5/35f + dP9/Y3T/fWB0/3hYdv95V3r/eVp0/3lbcv93WnX/d1t0/3dbc/92WnP/dVdz/31dfv/UseT/2rX2/9az + 8//VtfH/07nq//Le+//56v//+Or+//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr + /f/56/3/+ev9//jr/v/06///9+z+//fo+P//+///qJ6y/x4aNf8uKVD/KyNN/yQiQf8+LIL/glr1/3tQ + +P96UvT/e1n4/2lSzf8tIl7/Li5F/yotSP8qKUz/OjRM/5yGmf+piZ7/poid/6eInf+niJ3/p4id/6eI + nf+nh5//p4ef/6iIof+IaIH/fl54/4Bfe/+BYHv/eFly/6+iuP/HzN//vMXW/8PH1//Dx9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39f + eP+AX3r/gF96/39eef+EZH3/poaf/6eHn/+nh5//p4id/6eInf+niJ7/p4ef/6eHn/+mhp7/qIig/4dn + f/99XXX/gWF5/4BgeP+AYHj/gWF6/4Bgev+AX3r/gWB7/31cdv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eI + nf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/gF95/39gdf+AYXj/gFx9/4JdgP+CYHn/gGF3/31f + e/99YHn/fmF5/35hef98XXv/gmKE/9iz5//etvn/2rX1/9m49P/Vu+z/8t/7//fr///46/3/+ev9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/9+v+//Pr///36/7/+On5///4 + //+vpLr/KCVC/zY1WP81OE3/LTQ+/0U6fv97Wef/dE7t/3RT5f91VOn/aE/L/zEoXv8zNkf/MTVQ/zEu + Vv8/N1b/nIWb/6mJnv+niJ3/p4id/6eInf+niJ3/p4id/6eHnv+nh5//qIig/4hogf9+Xnj/gF97/4Fg + e/93WXL/r6O5/8fM3/+8xdb/w8fX/8LH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+ff5j/f194/4Bfev+AX3r/f154/4RkfP+mhp7/p4ef/6eH + n/+mhp3/poad/6aIn/+miJ//p4ie/6iHnP+ph5z/iWh//35fd/+AYnr/gGF8/4Bgff9+YHn/f2F2/4Bg + ef+BXn//fVx3/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fFx1/4Fh + ev9/X3n/gWF6/4Fgev+BXnz/gV58/4Ffev+AX3v/gF59/4Bfe/9/X3n/f196/4Befv+EYYT/1bHl/9q2 + +P/YtfX/2Lbz/9W46v/z4Pv/+O3+//nr/f/56/3/+ev9//nr/f/56/3/+ev9//nr/f/46/3/9+v9//fr + /f/36/z/9+v8//js/P/16fj/9ev4//bo+//14/r///n+/6qjtP8pJEb/NjpO/zY3S/8uMUf/Qjh7/3pd + 3/9zTu7/clPn/3dU7P9tTs3/NC5W/zYwVP82NEv/NTBL/0M4WP+bg5r/qoib/6aGnP+lhp3/pYWc/6mI + nf+qiZ3/qIef/6aGn/+piaL/iGiB/31ddv9/X3n/gWF7/3Rac/+rorf/w8nc/7nD1f+/xdf/v8XX/77G + 1//AyNf/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/ + mP9/X3j/gF96/4Bfev9/X3j/hGR8/6aGnv+nh5//pISc/6aGnv+mhp7/p4qh/6iLov+qi6D/rIug/66K + ov+DYXz/dlZ0/3VXdv92Vnn/dlR5/3pbef9/Ynb/gGB5/4Fef/99XHf/l3eQ/6mJov+mhp7/p4ie/6eI + nf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf99XXb/gGB5/39geP9+Xnf/fl53/3tbdP97W3T/e1p1/3ta + df97WnX/e1t0/3xcdP97W3T/eVd0/39cfP/evOn/4sH5/+K/+P/jwPf/4sPy//fi/P/56/7/+Ov9//nr + /f/56/3/+ev9//nr/f/56/3/+ev9//fr/f/36/3/9+v9//js/f/36/v/9en5//vy/f///f////f///zy + /P//////rqe9/x8TT/8wLFb/LihV/yYfU/8+MIP/el3i/3JN7/9wUen/dlfn/2tSwP8oKUb/MChX/y8s + Rv8wK0T/OTJO/56Nn/+rj6X/p42m/6iOp/+rj6f/qImf/6qInP+piKD/poaf/6iIof+GZn//elpz/3xd + df9+Xnf/c1Zv/7KmvP/S1Oj/x8re/8vK3v/OzeH/xcnc/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eHn/+piaH/n3+Y/39feP+AX3r/gF96/39feP+EZHz/poae/6eH + n/+mh5//p4ef/6WFnf+OcYj/jG+G/45vh/+Qbof/kW2L/7KPtP+7mMP/t5XB/7mWxP+8mcb/j26R/3pd + df+AYXn/gV99/31cd/+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31d + dv+AYHn/gWF6/31ddv+JaYP/poaf/6WFnv+lhZ7/pYWe/6WFnf+lhpv/pYaZ/6SFmv+khJz/pYSf/6KC + pP+hf6n/on+q/6F/qf+ggqf/7dnx//3t///46vv/+ev9//nr/f/56/3/+ev9//nr/f/56/3/9+v9//fr + /f/36/3/9+v8//To+P/98v//urHB/3Zwh/+BeJX/f3ST/4B/jP9vZZn/WkSs/1xJrP9cR6f/XEio/2RK + vf93Vej/c07w/3FT5/9zU+v/c1Lh/1pLo/9dRbL/Xker/15Hqf9fSqP/XE92/2BSa/9eUm7/YFFt/2ZS + bf+bgZn/qIif/6WFnf+mhp//qIig/5p6k/+Xd5D/l3iQ/5h3kP+YdY//mYKa/5KHnf+Sh53/loie/42B + l/+uqr7/xcvb/7/G1f/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJ + of+ff5j/f194/4Bfev+AX3r/f194/4RkfP+mhp7/p4ef/6eHn/+mhp7/p4ee/35feP95XHX/fV11/4Bd + d/97V3r/0q7d/+fC+f/gvvf/4Lz2/+rG/f+ceqP/d1lz/4Fief+BX3z/fVx3/5d3kP+piaL/poae/6eI + nv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/4Bgef+BYXr/fFx1/49viP/Do7v/v6C3/8Cg + t//Aobb/wKK1/8Cjs//Ao7L/wKOz/8Chtf+9nbX/fl54/3dWcv96V3X/eVd1/3VXc//o0uj//+////jq + +//56/3/+ev9//nr/f/56/3/+ev9//nr/f/36/3/9+v9//fr/f/26vz/9Oj4///7//+Qh5r/FhQy/ysm + SP8pI0f/ICE3/0Y4hP+BYfH/eFnq/3xb5/99Xeb/elno/3RQ7P9zT+//c1Tm/3JQ7v90TvT/eV3n/3pU + 9v97VPT/f1j2/3dX4P8vJl3/KytF/ywrSv8vKkr/NitI/5N8lv+niaH/pYWd/6iIoP+mhp7/qYmh/6qK + ov+piaL/qomh/7KLpf+HaIH/blZu/3Rac/93W3T/aVFp/56Uqf/Jz9//vsXU/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5//qYmh/59/mP9/X3j/gF96/4Bfev9/X3j/hGR8/6aG + nv+nh5//p4ef/6iIoP+mhp7/g2R9/31fef+BYXn/gmB7/31bf//Lp9n/3Ln2/9Sy8v/VsvL/3rv2/5h2 + ov93WnX/gGJ5/4Jge/99XHb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4 + kf99XXb/gF95/4Bgef99XXb/jW2F/72etP+7nLD/u52w/7udsP+7nq//u56t/7ufrP+6nqz/u52v/7iZ + r/+GZX3/g2F4/4Riev+CYnr/fGB4/+rV6f//8f//+Or8//nr/f/56/3/+ev9//nr/f/56/3/+ev9//fr + /f/36/3/9+v9//fr/f/z5/r///r//5mPpP8mJkb/ODda/zc0WP8wMUz/TT2T/3hT9f9vS/D/c03v/3NO + 7P9zUOv/c1Hs/3NR7P9zUur/c1Pn/3JW4f9yWNr/clPl/3FQ6P91Uuz/blXR/zMyX/8wM1H/MDRV/zEz + Uv84MlD/kX2Y/6eJof+nh57/p4ee/6eHnv+nh57/poed/6aHnf+nhp3/roeh/41shv99X3j/hWF7/4hi + fP92WnL/pJit/8nO3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + n/+piaH/n3+Y/39feP+BYHv/gWB7/4Bfef+FZX3/pYWd/6aGnv+mhp7/p4ef/6WFnf+CY37/fl56/4Bg + eP+AYHn/fFt9/8up2f/cuvj/1LT0/9W09P/evfj/l3ei/3dadP+AYnj/gmB7/31cdv+Xd5D/qYmi/6aG + nv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AX3n/gF96/31ddv+NbYX/vp+0/7ue + r/+8n6//vJ6v/7yesP+8n67/vJ+t/7uerf+7nbD/uJiw/4Rkff+AXnj/gWB5/39hef95X3b/59bq//zw + ///36v3/+ev9//nr/f/56/3/+ev9//nr/f/56/3/9+v9//Xp+//05/n/9Oj6//Dk9v//9v//lo2h/yQm + Qv81Nlf/NDJX/y4vSv9NPJL/elX0/3FO7f9yUO3/clDu/3JR6/9zU+j/c1Po/3NR7P90UOz/dFTm/3RU + 5f90U+b/dFDr/3ZQ8f9vVdT/NTNd/zIyUf8wM1T/MDNS/zkyT/+QfJb/p4ee/6aGmv+lhpv/poab/6eI + nP+niJ3/p4id/6eHnP+qiaL/imyF/31cdv+HX3n/iGB7/3RYcf+jl63/yM/e/77F1P/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ef/6mJof+efpf/e1t0/31cd/99XHf/e1t0/4Ji + ev+piaH/qoqi/6qKov+ri6P/qYig/4Njf/9+Xnr/gWB5/4Bhef97W3z/yarY/9u89//TtfP/1LXz/969 + 9/+Xd6L/d1p0/4FieP+DX3v/fVx2/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJ + of+YeJH/fV12/4Bfef+AX3r/fV13/41thf/Aobb/vaCw/76hsP++oLH/vqCz/76gsf++obH/vqCx/72f + s/+6mrL/hGN//39de/+AX3z/fmB5/3Zfdv/k1un/+fD///Xq+//46/v/+Ov8//jr/P/56/3/+ev+//nr + /f/36f3//PT+///7////+f//+/X8//////+YkaH/Gx44/y4wTv8uK1D/JydD/0k6iv99W+r/clLj/3FU + 5/9xUun/clPn/3NV5P9zVOb/c1Dt/3RO8P93UO3/d0/t/3dS6f90Tuz/eE/2/29R2v8yK1f/MCtJ/yst + TP8rLEr/MitH/5iFmP+vk6L/rY6j/62Ppf+tj6X/p4mf/6eInf+niJ3/poec/6eJov+IbIX/fF12/4df + ef+IYHv/c1hx/6GYrf/Iz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+oiZ7/poec/6SEmv+Scoj/k3OK/5Jzif+TdIv/knKL/5V1jv+Scov/lHSN/5NzjP+Scov/gGB8/35f + ev+AYHj/gGB6/3tbff/Jqdn/3Lv4/9a08//XtfL/4L33/5h3of93WnP/gGN4/4Fge/99XXb/l3eQ/6mJ + ov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh53/qYmh/5h4kf99XXb/gGB5/4Bgef98W3X/jGyE/7OU + q/+xkqb/sZOm/7GSp/+xkqf/sZKn/7GTp/+wkab/s5Sp/6+Qpf+CY3v/fV56/4BefP9/X3v/d2F1/+jg + 6f/6+/z/9fb3//j4+P/6+Pr/9u/7//fp///36v//+Or6///y//+9s8P/joqe/5iSp/+Wjaj/mpWn/3Nj + pP9MP5P/UkaX/1JEmv9QP5v/X0e6/3la5v90UeX/dVPo/3RS6P91Uuj/dVPn/3VS6P91Uun/dVHq/3VS + 6f91Uun/dVPo/3VS6P92U+v/clDk/1Y/pP9WRJP/VEaS/1RCm/9YQ5j/ZFx5/2xkcP9pXHn/aFx6/2hb + d/+Wfpn/qoii/6iGn/+kiJ3/qomi/4trhf96XXb/gmB5/4Vhe/9zWHH/o5et/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/poic/6aHnP+niJ3/poec/6qLoP+qi6D/qouf/6uM + ov+mhZ//fV12/3xcdf98XHX/fl53/31ddv9+Xnr/fl97/4BgeP+AYHr/e1t9/8qp2f/cuvj/17T0/9e1 + 8v/gvff/mHeh/3dbc/9/Y3j/gGB6/31cdv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aH + nf+piaH/mHiR/3xcdv+AYHn/gWF6/35ed/+JaYH/qIig/6aGnP+mh5z/poec/6aHnP+mh5z/poec/6SF + mv+lhpv/pIaa/4Bjef99X3n/gF58/4BffP94YnX/6ubp///////6/fz//P78//7//f/48/z/9un///fp + ///16Pn///v//3VtgP8ZGTD/KihD/yoiRf8fHjT/Tzyd/4Nc/f95VPL/e1fx/3tW8/95UvX/dEr1/3ZN + 9f91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/d1Tp/3RS5/92U+n/fFX0/35U + 9/98V+7/f1b4/31W7P84JnD/LSFS/zAnTv8vKkj/LiZD/4lyj/+tiqb/qIae/6SInf+riKL/i2uF/3pd + dv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/pYab/6eInf+mh5z/pYac/6aHnP+mh5z/p4ee/6ODnP+BYXr/f194/4Fhev+BYXr/gGB5/4Bg + fP9+X3v/gGB4/4Bgev97W33/yqnZ/9y6+P/WtPT/17Xy/+C99/+Yd6H/d1pz/39jeP+AYHr/fVx2/5d3 + kP+piaL/poae/6eInv+niJ3/p4id/6eInf+niJ3/poed/6mJof+YeJH/fV12/39feP9/X3j/fV12/4ho + gf+piaH/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6iJnv+lhpv/gWR7/31eef+AXnz/f197/3hh + df/q5en///////r9/P/8/vz//f39//jx/P/26f//9+n///bp+v//9v//fnmO/yYpRP83OFb/ODNY/y8w + Sf9TQqP/elTz/3NP6f91VOP/dVbf/3VX3v94WeL/dlbk/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS + 6P91Uuj/dVLo/3VS6P92U+n/dlPp/3VT6P91UOz/dE7v/3JU5f9yUef/dFfa/zs1Z/8yMkf/ODJR/zg0 + Uv82Lkv/iXSQ/62Kpf+ohp7/pYid/6uIov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6aHnP+niJ3/p4id/6eInf+mh5z/p4id/6eI + nP+niJ7/oYGb/4Bgef+AYHn/gGB5/39feP+AYHj/f197/35fe/+AYHj/gGB6/3tbff/Kqdn/3Lr4/9a0 + 9P/XtfL/4L33/5h3of93WnP/f2N4/4Bgev99XHb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eI + nf+mh53/qYmh/5h4kf98XHX/gWF6/39feP99XXb/iWmB/6iIoP+mh53/p4id/6eInf+niJ3/p4id/6aH + nP+mh5z/qIme/6WGmv+BY3r/fV95/4BefP+AX3v/d2Bz/+nk6f//////+v38//v++//+/v3/9/H7//bp + ///36f//9en6///2//96do7/IiVD/zI0Vf80MFf/KCtG/1BAov97VfX/dE7s/3VS6f91U+f/dVTm/3VU + 5/92U+j/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3ZT6f91Uuj/d1Tp/3RS + 6v9yUev/cVXk/3FS6/9zV9//ODJp/zAxSv81MVH/MzFP/zMuS/+HdJD/rIql/6mGnv+kiJ3/q4ii/4tr + hf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6iJn/+igpv/gGB5/39feP+AYHn/gGB5/4Bg + ef9/X3v/fl97/4BgeP+AYHr/e1t9/8qp2f/cuvj/1rT0/9e18v/gvff/mHeh/3dac/9/Y3j/gGB6/31c + dv+Xd5D/qYmi/6aGnv+niJ7/p4id/6eInf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/f194/31d + d/+JaYH/qYmh/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+oiZ7/pYab/4Bjev99X3n/gF58/39f + e/93YXT/6uXq///////8/v3//f/9///////48v3/9un///fp///16fr///f//3p1jf8iJUP/MjRV/zQw + V/8qLUj/UECh/3tX8P90UOn/dVHr/3VQ7P91UO3/dU7w/3VP7v91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS + 6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dFTl/3JV5P9xV+D/cVPr/3NV4P84MG3/MS9O/zIx + Uv8wMk//MC1K/4d1kP+siqX/qYae/6WInf+riKL/i2uF/3pddv+CYHn/hGF7/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/qIif/6KCm/+AYHn/f194/4Bgef+AYHn/gGB5/39fe/9+X3v/gGB5/4Fgev97W33/yqnZ/9y6 + +P/WtPP/17Xy/+C99/+Yd6H/eFpz/39jeP+AYHr/fVx2/5d3kP+piaL/poae/6eInv+niJ3/p4id/6eI + nf+niJ3/poed/6mJof+YeJH/fV12/4Bgef9/X3j/fV12/4lpgf+piaD/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6iJnv+lhpv/gGN6/31fef+AXnz/f157/3hhdf/l3eT/9/n3//Dz8f/09vT/9PTz//Xv + +v/36f//9+n///Xp+f//9///fHaM/yMmQf80NVP/NjBV/ywtRv9SQaD/e1jv/3RQ6P91Uer/dVHr/3VR + 6/91UOz/dVHr/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS6P91Uuj/dVLo/3VS + 6P91U+f/dVLo/3NU5P9zUe3/dVTh/zoxa/8yMEr/MDJR/y4zUP8vLkr/hXWQ/6uKpf+php7/poed/6uI + ov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+oiJ//ooKb/4Bgef9/X3j/gGB5/4Bg + ef+AYHn/f2B6/35fev+AYHj/gGF5/3tbff/Jqdr/3Lr5/9a09P/XtfL/4L33/5h3of93W3P/f2N4/4Bh + ev99XXb/l3eQ/6mJov+mhp7/p4ie/6eInf+niJ3/p4id/6eInf+mh57/qYmh/5h4kf99XXX/gGB5/39f + eP99XXb/iWmB/6mJof+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/qIme/6WGm/+AY3r/fV95/4Be + fP9/Xnv/dl9z/9bN1P/i5uL/3OLf/+Dl4f/g4eD/7+r0//fr///36v//9uj5///3//98doz/JCVB/zY1 + Uv84MVP/LS1E/1JBoP97WO//dFHn/3VS6P91U+f/dVTl/3VU5P91VOX/dVHq/3VS6f91Uun/dVLp/3VS + 6f91U+f/dVPn/3VT5/91U+b/dVPm/3VT5/91Uuj/dVLp/3ZR6/91T+7/dFLo/3VQ7v92VeD/OzNn/zQz + RP8yMk//LjJQ/y8uSv+FdY//q4uk/6mGnv+lh53/q4ii/4trhf96XXb/gmB5/4Rhe/90WHH/pJet/8nP + 3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6iIn/+igpv/gGB5/39feP+AYHn/gGB5/4Bgef+BYHn/gWB4/39idf9+Ynj/eVt+/8io + 3P/duPz/1rP1/9a18v/evvf/lnih/3dbcv9/Y3f/gGF5/31ddf+Xd4//qYmh/6aGnv+nh5//p4ef/6eH + n/+nh5//p4ef/6aGnv+piaH/mHiQ/31ddf+AYHj/f194/31ddv+JaYH/qYmh/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+oiZ7/pYab/4Fjev9+X3n/gV58/39gev94YnT/1tHT/+Ps4v/a597/3Ofh/9/l + 4//v7vP/9+77//rr/f/55/r///j//3x1jv8kI0X/NTRU/zcyUf8sLkX/Uj+j/3tY7v90Uef/dVLo/3VS + 6P91Uuj/dVLn/3VS6f91UOz/dVLp/3RS6P9zUev/c1Lq/3NV5P90VuL/dVTk/3VV4/91VeP/dVTk/3VT + 5/91Uev/dVHq/3RS6f9xVOX/clHt/3RV4f85MWr/MjFJ/zQwU/8yMFL/My1J/4h1jf+sjKL/qYec/6SH + nv+riKL/i2uF/3pddv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/qIif/6KCm/+AYHn/f194/4Bg + ef+AYHn/gGB5/4Jgef+BYHn/gGJ2/39jeP95XH3/yKjZ/9y4+f/Vs/L/1rTw/9689f+XeKH/eFt0/4Bj + ef+BYHz/fV12/5d3j/+piaH/poae/6eHn/+nh5//p4ef/6aGnv+nh57/poae/6mJof+YeJD/fV10/4Bg + eP9/X3j/fV12/4lpgf+oiKD/poed/6eInP+niJz/p4ic/6eInP+miJz/p4ic/6eJnf+khZr/gWN6/35f + ef+AX3v/f2B6/3hidP/WzdT/5Ojj/9vj3f/e4+L/3+Lj//Ds8//47vv/+uv8//nn+///+P//fHWO/yQj + Rv80NFT/NjJR/ywtRf9SP6P/e1ju/3RR5v91Uuj/dVLo/3VS6P91Uuj/dVPn/3VV4/91VeL/dVTj/3NS + 5v9zUOn/c1Ho/3NQ6f90Tu7/dU7w/3VQ7f91U+j/dVTm/3VS6P91Uuj/c1Lo/3FU5P9xUe3/c1Xh/zkx + av8yMEr/NTBU/zIwUv8zLUn/iXWN/6yMov+ph5z/pYee/6uIov+La4X/el12/4Jgef+EYXv/dFhx/6SX + rf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+oiJ//ooKb/4Bgef9/X3j/gGB5/4Bgef+AYHn/f153/35edv9+X3T/fWB1/3ha + eP/Qrtr/5cL6/9678//du/P/58T6/5h4oP91V3H/fV94/31de/96WnT/lnaO/6qKov+mhp7/p4ef/6eH + n/+oiKD/qYmi/6mJov+piaH/rIyk/5p6kv98XXX/gGB5/39eef99XXb/iWmC/6uLpP+piaH/qYqg/6mK + oP+piqD/qYqg/6mKoP+piqD/qouh/6eHnv+CY3v/fV95/4Bfev9/YHr/eWF1/+DT3f/x7u//6ejq/+vo + 7f/t5+//9e34//jt/P/66/7/9+f7///4//98dY7/JCNG/zU0VP82MlH/LC1F/1I/o/97WO7/dFHm/3VS + 6P91Uuj/dVLo/3VS6P91Uun/dFHr/3VQ6v92U+r/eVfs/3pW7f96VPD/elbu/3hV7P91TfP/dU3y/3VR + 6v91VOX/dVPm/3VT5/90Uun/cVTk/3JR7f9zVeH/OTFq/zIwSv81MFT/MjBS/zMtSf+IdY3/rIyi/6mH + nP+lh57/q4ii/4trhf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6iIn/+igpv/gGB5/39f + eP+BYXr/f194/4Bgef+JaYL/iWmC/4lqf/+Ia4D/hWeC/7uZv//HpNH/xKLQ/8Og0P/JpdT/mHmd/4Jl + fv+Ia4P/iGiH/4ZmgP+cfJT/qIig/6eHn/+mhp7/p4ef/6KCmv+cfJX/nX2W/519lv+ff5j/kXGK/35e + d/9/X3j/f155/39eef+GZoD/nn6X/519lf+dfZX/nX2V/519lf+dfZX/nX2V/5x8lf+efpb/mnqS/4Bh + ev9+X3r/gF96/35gef97YXf/wq+//9DCzf/Lvsn/zcDM/8q9yv/t4e//++7///jq/v/25/v///j//3x1 + jv8kI0b/NTRU/zYyUf8sLUX/Uj+j/3tY7v90Ueb/dVLo/3VS6P91Uuj/dVLn/3VS6/9zTvH/dlHw/3FR + 3v9jSr//ZU64/2ZNvP9jTbj/ZlG//3VT5f92UPH/dVLp/3VU5f91Uer/dVHq/3RS6P9xVOT/clHt/3NV + 4f85MWr/MjBK/zUwVP8yMFL/My1J/4l1jf+sjKL/qYec/6WHnv+riKL/i2uF/3pddv+CYHn/hGF7/3RY + cf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/qImf/6KCm/+AYHn/f194/4Fhev9/X3j/gmJ7/6WFnv+qiqL/qYqf/6iJ + nv+qi6P/gWF//3ZVef95WHv/eVd9/3VSef+Zepf/qo6i/6aJoP+nh6X/qIii/6iIoP+nh5//p4ef/6SE + nP+qiqH/k3OL/3pZc/9+XXj/fVx3/31dd/9+XXf/f154/4Bfev9+XHr/gWB8/35deP99XXb/fV12/31d + dv99XXX/fV12/31ddv99XXb/fl52/35edv9+Xnf/fl54/4Bfev+AX3r/fmB5/39iev92XHH/c1tu/3Vd + cP92XnH/aVNn/9fF2P//8v//9un9//To+///+P//fHWO/yQjRv81NFT/NjJR/ywtRf9SP6P/e1ju/3RR + 5/91Uuj/dVLo/3VS6P91Uuj/dFLn/3JT5v96XOb/Y0+1/yghWf8vL07/Ly1Q/ykmUv82LnT/eF3a/3RQ + 6v91U+j/dVTk/3VQ7f91UOz/dFPo/3FU5f9yUe3/c1Xg/zkxav8yMEr/NDBT/zIwUv8zLUn/iHWN/6yM + ov+ph5z/pYee/6uIov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+oiJ//ooKb/4Bg + ef9/X3f/f194/4Fhev+AYHn/ooOc/6aHoP+mh53/poec/6aHnf+IZ4D/gF97/4Bgev9/YHz/fV17/5l8 + k/+mjJr/pIib/6SFof+mhp//poae/6iHoP+mhp7/p4ef/6mJof+VdY3/fFt3/4Ffe/+AX3r/gWB7/39e + ev9/Xnn/gF56/4Feff9/XXz/gF56/4Bfev9/X3n/gGB5/4Bgef+AYHn/gGB5/4Bgef+AYHn/gmJ7/4Bg + ef+BYHr/gF96/35gef9/YXn/fV94/4Fjff9/YXr/gGF6/4Fie/93W3X/28Xc///x///26f7/8+j7///4 + //98dY7/IyNG/zQ0VP83MlH/LC5E/1I/o/97V+7/dFHm/3VS6P91Uuj/dVLo/3VS6P91U+n/clHo/3pb + 5/9kUbP/LCtT/zM6Q/81Nkj/LzBN/zg0cv92W9r/dE7u/3RR6P91VuH/dVHq/3VQ6/9zU+j/cVXk/3FR + 7f9zVeH/OTFq/zIwSv81MFT/MjBS/zMtSf+JdY3/rIyi/6mHnP+kh57/q4ii/4trhf96XXb/gmB5/4Rh + e/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nv+niJ3/p4id/6eJnf+niZ3/p4mc/6iJn/+jg5v/gGB5/4Bfef+AX3n/f194/4Fhev+ig5z/pomf/6aH + nf+niJ3/p4ed/4lngP9+XHb/gGB3/39fd/9/X3j/mn2R/6iMm/+liZv/pYeg/6iIoP+nh57/poee/6eH + nv+lhZ3/q4ui/5R0i/98W3X/gF96/39fef9+XXf/f155/4Fge/9+XXn/gF57/4BefP+AX3v/gF95/4Bf + ev+AX3n/gF95/4Bfef9/X3n/gGB5/4Bgef9/X3j/gF95/4Bgev9/X3r/fmB5/35gef99X3j/f195/4Ff + ev+CXn3/gmB9/3VYcP/dx9z///H///bq/P/y6fj///n//3x1jv8mJEb/NTVT/zUyUf8sLEz/UkCh/3pZ + 7f9yUeb/c1Ln/3NS6P9zUuj/c1Ln/3RR6/9xS/D/eFbx/2FKvP8tJl3/NTZL/zMzUf8uLlP/OjVx/3Ra + 2v9yTPD/dVHq/3VW4f90U+b/dVLn/3VS5/9yUuj/cVHs/3NX3P84Mmv/MTNI/zIxUf8yMVT/Mi1J/4d2 + jv+qjKP/qIec/6eHnf+riKL/i2uF/3pddv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+mh53/pYad/6aHnP+niJ3/p4mc/6aIm/+miZn/p4ma/6OE + mP+BYXn/gF96/39ee/9+XXj/gWF6/6ODm/+oiZ7/p4id/6eHn/+nh6D/hmZ//31ed/9/X3j/f194/31d + dv+be5P/qoqh/6eInP+niJ3/p4id/6eInf+niJ3/qIme/6aHnP+qi6D/lHWL/3lZcf9+Xnb/fV12/35e + d/9+XXj/f155/4Bee/+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/fl96/31gev9+YHr/fF94/31ed/96W3P/fFpy/3tXeP96Wnj/b1Vp/9rG2f//8///9+z8//Tt + 9////P//fXSO/ykhQf82NE//MjFO/yskVP9XRJz/fVzz/3VS7/92VPD/dlTw/3ZU8P92VPD/eFTw/3hU + 8P94WvD/YUy9/ywgWf80MUj/LDBN/ygoTv89MHP/dl7e/3NQ9v95UfT/fFXt/3VV7v94Ve3/e1Pw/3hP + +P94UvX/eFvc/zYpdv8rK0v/LjFN/y4uTf8xKUb/hHOO/6aMpP+oh5z/rIec/62Iof+La4X/el12/4Jg + ef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eH + nf+mhp3/poec/6WGnP+qjKD/qoyf/6qNnf+qjZ7/poic/4BheP+AX3r/f117/39eeP+BYXr/o4Ob/6iJ + nv+niJ3/p4ee/6eHn/+GZn//fl53/39feP9/X3j/fl52/5t7k/+piqH/poic/6eInf+niJ3/p4id/6eI + nf+oiZ7/pYab/6mKn/+Wd4z/g2N7/4Zmfv+FZX7/hWV+/4Rjfv9/Xnn/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/f196/39fev9/YHr/fV94/5B0 + i/+Sd43/j3OP/451jv+GcIX/28Te//zk///y3vr/8N/4///t//+FcpP/PSxN/0g8VP9EO1L/PjJY/1pG + i/9xV8z/a1DK/2xRyv9sUcv/bFHK/2xRy/9sUcj/bFPG/21YyP9jUKb/RjVi/04/V/9HPV3/Rjdh/086 + eP9vWMH/ak7Q/25Rzf9uUsf/aVLL/2pRy/9tUMz/a07R/21Qzv9wWL7/STd6/0U5X/9GPln/SUBZ/0g6 + Uv+NeJD/p4yj/6eHnf+rh5z/rIih/4trhf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ie/6aHnv+lhpv/q4yh/72esv+9n7H/vJ+v/76h + sv+1l6v/gWJ5/4Bfev9/XXr/f154/4Fhev+jg5v/qIme/6eInf+nh5//p4ef/4Zmf/9+Xnf/f194/39f + eP9+Xnb/m3uT/6mKof+miJz/p4id/6eInf+niJ3/p4id/6WGm/+mh5z/qIme/6aHnP+niJ7/p4ee/6eH + n/+qiqP/mHiS/31cdv+BYHv/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + ev+AX3r/gF96/4Ffev+CX3r/gl96/4Bgef98X3j/6tbq///v///76v3/+uv9//3r///iyO3/1rfs/9m4 + 8P/XuOv/4MLv/56Aqv9yV3j/e2V7/3Vidf95ZYH/WEVs/y0pUv8wLVb/MCxV/zAsVf8wLFX/LyxV/zEt + WP8xLFz/LCZX/09Faf+jkaH/o4yU/6CJnf+jjqD/jn6N/zIqT/8vK1n/MS1U/zAuUv8sLVb/LCxX/y4s + Vv8tK1j/LixW/zYvT/+Og5T/oJKW/56Mmv+diZ3/ooue/6OInf+liZ3/poid/6mHnf+siKL/i2uF/3pd + dv+CYHn/hGF7/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ7/qIif/6WHm/+rjKH/vZ6y/7yesf+8n6//vaCx/7WWqv+AYXj/gF96/39de/9+Xnj/gWF6/6OD + m/+oiZ7/p4id/6eHn/+nh5//hmZ//35ed/9/X3j/f194/35edv+be5P/qYqh/6aInP+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+mh5z/p4id/6eInf+niJ3/poee/6mJof+YeJH/fV12/4Bgef+AX3r/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gV96/4Jfev+DX3r/gWB5/3tf + d//o1On//vD///bq/f/47P3/++r//+DG8P/WtPT/27T5/9m09P/kv/j/oX2r/3hXdv+AYnj/fWB2/35j + fP9bSGL/MS9J/zQ0Tv80M03/NDNN/zQzTf80M03/NTJP/zUxU/8tKkv/U0dk/6eNpP+rhZ3/qYOk/6qI + p/+SeJH/OS5N/zQzUf80M03/NTNM/zAzT/8wM1D/MTJQ/y80T/8xM07/OzNM/5J+lf+miZ7/pYma/6SK + mv+lipv/pomd/6eInf+niJ3/p4ee/6yIov+La4X/el12/4Jgef+EYXv/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInv+nh57/poec/6uMof+9nrL/vJ6x/7yf + r/+9oLH/tZer/4BheP+AX3r/f117/35eeP+BYXr/o4Ob/6iJnv+niJ3/p4ef/6eHoP+GZn//fl53/39f + eP9/X3j/fl52/5t7k/+piqH/poic/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4mc/6eJ + nP+mh5z/qYqg/5h4kP99XXX/gGB5/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gF96/4Bf + e/+AX3v/gF97/4Bfe/+AYHv/gGB7/4Jge/+CYHr/fF93/+nV6v/87///9ev7//bs/f/56///38Xx/9az + 9f/atPj/2bTz/+C8+v+ffav/elh0/4Rhev+AX3v/gGR9/1tJYf8zLVD/NTFW/zUwVf81MFX/NTBV/zUw + Vf81MVP/NTRM/zAwQ/9WTF3/qo6h/62GnP+qhp3/q4in/5RznP85LFL/MzBW/zUvV/83L1X/MzFT/zMw + VP8yMFX/MDBW/zEvVf86LlP/k3qd/6mFp/+nhp7/p4mc/6eInf+niJ3/p4id/6aJnf+lh57/q4ii/4tr + hf96XXb/gmB5/4Rhe/90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6eHnv+lhpv/qoug/72esv+8nrH/vJ+u/72gsf+1l6v/gGF4/4Bfev9/XXv/fl54/4Fh + ev+jg5v/qIme/6aHnf+mhp7/p4ef/4Zmf/9+Xnf/f194/39feP9+Xnb/m3uT/6mKof+miJz/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niZz/p4mc/6aInP+pip//mHmQ/31ddP+AYHj/gF96/4Bf + ev+AX3r/gF96/4Bfev+AX3r/gF96/4Bfev9+XXj/fl14/39deP9+Xnj/f114/3pdeP95XXj/fV14/4Bd + d/96XHT/6tXp//7x///27fv/+O78//rs///fyPL/1rb2/9q5+P/YuPH/37/9/5x9qf93V2//gl94/35a + ff98X3//WEZf/y8tS/8yMVD/MjBP/zIwT/8yME//MjBP/zIwUP8xMFD/Ky1D/1JKXP+njaP/qYed/6aK + mP+pjJ//kXiS/zMvR/8tMU//Ly5U/zQvUf8zMkr/NDNK/zEyTv8tMVH/LTBQ/zYwTf+RfpT/qYyb/6eH + nP+mh6D/poef/6aHoP+liJ7/pYmd/6WInf+riKL/i2uF/3pddv+CYHn/hGF6/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+niJ7/p4id/6eInf+mh5z/poec/6mKnv+oiZ3/qIqe/6eInP+sjqL/vJ6x/7ye + sf+8nrD/vaCx/7WXqv+AYXj/gF96/39eev9+Xnj/gGB5/6SEnP+piqD/qIme/6iJnf+qiqD/hmZ//31d + d/9/X3n/f194/35edv+be5P/qYqh/6aInP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eJ + nP+niZz/poid/6mKoP+YeJD/fV11/4Bgef+AYHr/gF96/4Bfev+AX3r/gF96/4Bfev+AX3r/gGB9/4Rk + hP+FZIb/g2OG/4Njh/+DY4b/gmiE/4FrgP+EaoH/hWmC/4Jngf/o0+v/++r///Ll/P/05f3/+uX//9zB + 6P/SseP/1bTl/9Sx5P/Wue3/m4Kr/3Zgff99aIX/fGOG/3tpiv9WT2z/OjFR/z83Vv87N1X/OTdV/zc4 + VP83OFT/OjZW/z80W/85MFH/Wkto/6aKqv+mg6P/poag/6eKov+Se5L/QjZN/0A4VP9BNVb/QzVV/0Q4 + UP9BNk7/PjVR/z41Uv89NFL/QzVQ/5V/lf+mipr/poed/6aHoP+mh5//poie/6aInv+miJ3/poic/6uJ + of+La4X/el12/4Jfev+EYXv/dFhw/6SYrP/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eHn/+niJ3/p4id/6WH + m/+sjqH/u56u/7qdrf+8n7H/upyv/7udsP+9n7L/vJ6x/7yesf+9oLL/tZip/4Bhd/+AX3r/f155/35d + eP+BYXr/tJSs/7yds/+6nK//up2t/7yesf+MbIP/fl14/4Bfef9/X3j/fl52/5t7k/+piqH/poic/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+mh57/qYmi/5h4kf99XXb/gGB5/4Bg + ef+AYHn/gGB5/4Bgef+AYHn/gWF6/3tcd/+Haor/2Ljh/9e15//Wter/07Tn/9W45v/z3Pf/+Ob2//bk + 9v/14/j/9OD4/9zF6f/Wver/1b7t/9O76//gwvP/l3ag/31dfP+CY4X/gl+K/3dagv+ensD/rszr/5/H + 4v+kxeD/tMvl/5+mwf+ZfJn/ooKf/52Cnf+bgpz/moOb/5uDm/+Yg5n/loaa/5eEmf+chpv/ooie/6WI + n/+oh5//poig/5+Gnv+ehJz/noSb/5yCmv+ehJz/moCY/3hfeP91XXf/dl53/3hedv94XHT/n4KZ/6SH + n/+miJ3/p4id/6eInf+niJ3/p4id/6eInf+nh5z/rIqf/4tshP96XHj/gl59/4RgfP90WHD/pJmq/8nO + 3v++xdT/wMfW/8DH1v/Ax9b/p4ef/6eInf+niJ3/pIaa/66Qov+9oLH/up2u/7yesf+8nrH/u52w/7ye + sf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bfev+BYHv/fl14/4Fhev+3l6//vp61/7yesf+8n7D/vp+z/4pq + gf9+XXj/gGB6/39feP9+Xnb/m3uT/6mKof+miJz/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4id/6aHnf+piaH/mHiR/31ddv+AYHn/gGB5/4Bgef+AYHn/gGB5/4Bgef+BYXr/el13/4Zq + i//eve3/2rb1/9q1+P/YuPP/273t//vm/v/+7v///e7///zt/v/76f7/2sHw/9S19//XtvP/2bbx/9+7 + 9P+Ucp3/dVl0/3hgev96X37/fFN0/5alwv+c2PX/kc3u/4/Q7f+o1e//qanD/5yFmf+mip//qoef/66H + nv+uh5//rYaf/6mIof+iiZ//o4mg/6SJoP+liJ//poef/6eHn/+mh5//o4af/6SHoP+miaL/pYih/6WI + of+ihZ7/f2J8/3tfef99YHr/fWB5/35gef+hgpn/qImh/6aHnP+niJ3/p4id/6eInf+niJ3/p4id/6eH + nP+siZ//i2yE/3pceP+CXn3/hGB8/3RYcP+kmar/yc7e/77F1P/Ax9b/wMfW/8DH1v+nh5//p4id/6iI + nv+mh5v/rZCi/7yfsP+7nq//u52w/7udsP+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+AYXf/gF95/4Bf + ev+AX3n/gGB5/7aWrv+9nbT/u52w/7uerv+8nrH/imuB/31dd/+AYHn/f194/35edv+be5P/qYqh/6aI + nP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4ee/6mJov+ZeZH/fV12/4Bg + ef+AYHn/gGB5/4Bgef+AYHn/gGB5/4Fgef97XXf/hWqO/9m58P/Ysvn/2bL+/9e19//avu7/+OX9//ju + /f/47/j/+e35//nq/f/ZwPH/1LL7/9u1+v/bs/X/5Lz4/5lznv97WXL/gmF2/4Vhef98WHH/jqnA/6PT + 9f+oxPD/lsvv/5rV7v+iq8L/moWU/6WLmv+rh5r/roab/6yHm/+mh5z/pYid/6eGnv+mhZ3/p4ee/6eH + n/+nh5//p4ef/6eHn/+nh6D/poae/6aGn/+mhp//qYmh/6SEnP+AYHr/fl55/39fef+AYHn/fl53/6OC + mv+qiKD/qIie/6eInf+niJ3/p4id/6eInf+niJ3/p4ed/6yKn/+LbIT/elx4/4Jfff+EYHz/dFhw/6SZ + qv/Jzt7/vsXU/8DH1v/Ax9b/wMfW/6eHn/+niJ3/qIie/6aInP+tj6L/vqGx/7yfr/+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gF96/39eef+AYHn/tpau/72etP+8nbH/u56v/72f + sv+Ka4L/fVx3/4Bfef9/X3j/fl52/5t7k/+piqH/poic/6eInf+niJ3/p4id/6eInf+mh5z/poec/6aH + nP+oiZ7/p4id/6eInf+nh57/qYmh/5p6k/9+Xnf/gWF6/4Fhev+AYHn/gGB5/39feP9+Xnf/f193/3pd + d/+Faoz/2rjt/9q0+f/Zs/v/2Lb2/9q97P/45v7/+O39//ju+f/57vn//Or9/93C7f/XtfT/2rf2/9i0 + 8v/jvff/l3Oc/3xZcv+HYHb/i155/3xZcf+PqL7/q9Dw/7jE7f+kyOv/ptXt/6mqw/+gg5b/p4qc/6eI + nP+liZz/ooic/52Jm/+fiJz/q4ef/6uHn/+ph5//qIef/6eHn/+mh5//poef/6mHn/+ph5//qIee/6iH + nv+piJ//poSc/4Nhev+BXnr/gl96/4Ffef+BX3j/o4Ob/6eIn/+lhpz/poec/6eInf+oiZ7/p4id/6eI + nf+nh5z/rIqg/41uhv97XXj/g19+/4RgfP90WHD/pJmq/8nO3v++xdT/wMfW/8DH1v/Ax9b/p4ee/6eI + nf+niJ3/pYeb/62Pov+9n7D/u56v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bf + ef+CYHz/f155/4Nje/+2lq7/vp+1/7yesf+9oLD/vqCz/4tsgv98XHb/f195/39feP9+Xnb/m3uT/6mK + of+miJz/p4id/6eInf+niJ3/p4id/6aHnP+mh5z/poec/6aHnP+niJ3/p4ic/6aHnf+piaH/mnqT/3xc + df+CYXv/gGB5/4Bgef9+Xnf/gGB5/39feP+AYHn/e1x2/4lqiv/dvOX/3Ljr/9258P/auez/3L3q//fi + /P/56P//+uf+//zn/v/75f3/38Po/9u66P/du+v/2bjr/93A8f+Md5z/a1x1/3JjfP91YYH/ZFl1/4ap + vf+j1+v/p8zj/6LM4v+v1Or/p6jD/6GAn/+lh6T/oYei/6GIof+lh57/sIee/6+Gnv+oh5//qIef/6eH + n/+mh5//p4ef/6eHn/+miJ7/p4id/6aInf+miJ3/p4id/6iKnv+jhZr/g2F6/4Jeev+CX3r/gGB5/4Bg + ef+hg5r/pomg/6WHnP+niJ3/pYab/6eInf+niJ3/p4id/6aGm/+sip//jG2F/3pceP+CX33/hGB8/3RY + cP+kmar/yc7e/77F1P/Ax9b/wMfW/8DH1v+6mrH/upqw/7qasP+5m6//u52w/7yfr/+8n6//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+BYXj/f155/4Bfev9/Xnj/gWF5/6aGnv+ri6L/qYue/6qN + nf+qjJ//h2h+/35eeP+AX3n/f194/35edv+be5P/qYqh/6aInP+niJ3/p4id/6eInf+niJ3/p4id/6aH + nP+lhpv/r5Cl/7ubsf+5mq//uZmw/72dtf+lhZ7/fV12/4Fhev9/X3j/fV12/4hogf+jg5z/oYGa/6GB + mv+hgJv/nXya/4triP+JaYn/imqN/4Zmjf+Ma5X/17vn/93B8f/cvvD/4L/y/+G/7v+VdJ3/iGaK/5Fq + j/+KaJH/eGWN/6Smxf+vwtn/ob3X/5673/+wu93/pq7J/6aluf+1pbf/uKa6/6mhuv+qss7/rcXk/6PD + 4P+gxd3/rcnf/6etwv+ag5v/q4mh/6SIn/+kiJ//pIif/6WIn/+miJ//p4ef/6aInv+kiZ3/pImd/6SJ + nf+kiZ3/poqe/6GGmv+BYnr/gV56/4Bfev9+YHn/fWF5/56Dmv+kiaD/pYid/6aHnP+lhpz/tZar/7qb + sP+5mq//uZmv/8Ces/+Sc4v/elx4/4Jeff+EYHz/dFhw/6SZqv/Jzt7/vsXU/8DH1v/Ax9b/wMfW/72e + s/+9nrL/vZ6y/72fsv+8nrH/u56w/7yfsf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/tZeq/4Bh + eP9/X3n/f156/39eef+AYHn/ooKa/6eInv+mh5z/poec/6aHnv+HZ3//fl14/39fef9/X3j/fl52/5t7 + k/+piqH/poic/6eInf+nh57/p4ee/6eHnv+oiJ//p4if/6WFnP+xkqj/vqC0/7yfsP+8nrD/wKK1/6aH + nf97W3T/gWF7/39feP9+Xnf/iWmB/6qKo/+oiJ//qIif/6mJov+ggZv/e111/3tddf96XHb/eFh4/39c + gv/Ss+T/1rnz/9e18//YtfL/3Lnt/4lojf94WnH/f111/4Fce/9sVXX/p7DO/67X8v+gzu//qMv0/7DQ + 8/+wrcn/tZqt/7ahqv+7nqz/tJit/7S0z/+u0fL/n83v/5nP7v+m0+7/pbXN/5eFmf+rip3/pYif/6WI + n/+mh5//poef/6aHn/+nh5//p4ie/6WJnf+miZ3/pYid/6aJnf+nip7/ooWa/4Fhev9/Xnr/gF96/39g + ef9+YHn/oIOa/6aJoP+niJ//p4id/6aHnP+4ma7/vp+z/72fsf+8nrH/w6G2/5Jziv95XHb/g2B9/4Rg + fP90WHH/pJis/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+1l6v/gGF4/4Bfev9/XXv/fl54/4Fhev+jg5v/qIme/6eH + n/+nh5//p4eh/4Zmf/9+XXf/f195/39feP9+Xnb/m3uT/6mKof+miJz/p4id/6eInf+niJ7/p4ie/6eI + nv+niJ7/pYac/7CRp/++oLL/u5+u/7uerf+/o7L/p4ic/3tbdP+BYHv/f194/31ddv+JaYH/qIig/6aH + nf+niJz/p4if/56Bmf9+YXj/fmF4/35gef99XXv/g2KE/9S05f/Yufb/2Lb2/9m29f/duu7/jGuQ/3te + df+CYnj/hmB6/3Zad/+ir8z/ntPw/5XL7f+jyPD/os7u/7CsyP++mq7/uaKs/72grf+5ma7/t7TO/6nO + 7/+by+7/lszu/6TQ8P+lssz/nIWZ/6+JnP+niJ7/p4id/6eInf+niJ3/p4id/6eInv+niJ3/p4id/6eI + nf+niJ3/p4id/6iJnv+khZr/gWF6/4Beev+AX3r/gGB5/4Bgef+igpr/qIig/6eHn/+niJ3/poec/7eY + rf+9n7L/vJ6v/7uerv/CobT/knWK/3lbdf+DYHz/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH + 1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7WX + qv+AYXj/gF96/39de/9/Xnj/gWF6/6ODm/+oiZ7/p4id/6eHn/+nh6D/hmZ//35ed/9/X3j/f194/35e + dv+be5P/qYqh/6aInP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+lhpv/sZKn/76gsv+8n67/u56t/8Cj + sv+niJz/e1t0/4Fge/9/X3j/fV12/4lpgf+piaH/p4id/6eInf+niZ//n4Ga/31gd/9+YXj/fmB5/3xd + ef+DYoP/1LLl/9m2+P/Ys/f/2rT2/9228P+MaJX/e1t6/4Vgev+HYHv/cVp4/5+wzP+e1PD/j83r/5fM + 7v+e0Oz/ra7I/8SYsf/OnLH/yJyy/7Gasf+ot8//ndHu/5PN7P+Uzez/ptDv/6ixzf+ehJz/sIie/6iI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/qIme/6SFmv+BYXr/gF56/4Bf + ev+AYHn/gGB5/6KCmv+oiKD/p4ef/6eInf+mh5z/t5mt/72fsv+8nq//u56u/8KhtP+SdIr/eVt1/4Ng + ff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/tZeq/4BheP+AX3r/f117/35eeP+AYHn/o4OZ/6eJ + nP+mh5v/poac/6eHn/+FZX7/fl52/39feP9/X3j/fl52/5t7k/+piqH/poic/6eInf+mh5z/poec/6aH + nP+mh5z/poec/6SFmv+wkab/vaCy/7yfrv+7nq3/wKOy/6eInP97W3T/gWB7/39feP99XXb/iWmB/6mJ + oP+niJ3/p4ic/6iJoP+egJn/fF92/3tfc/97XnX/e1x3/4Bhfv/buuX/4r72/+G79P/hvPT/5L/w/4po + j/94WXb/gF53/39dd/9sWHP/qbDL/7XU7/+nzen/rMzr/7PT6v+mr8f/qZiz/7aatf+ym7X/oJmx/6u3 + z/+00u//q83r/6zN6/+70u//sbHN/5qCm/+rh57/poeb/6aHnP+mh5z/poec/6aHnP+mh5z/poec/6eI + nf+mh5z/p4id/6eInf+oiZ7/pIWa/4Fhev+AXnr/gF96/4Bgef9/X3j/ooKa/6eHn/+lhZ3/poec/6WG + m/+2mKz/vZ+y/7yer/+7nq7/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72f + sv+1l6r/gGF4/4Bfev9/XXv/f154/4Fhev+wkaf/uJut/7eYrP+2mKz/uZqv/4trg/99XXb/gGB4/39f + eP9+Xnb/m3uT/6mKof+miJz/p4id/6WHmv+vkaT/t5ms/7eZrP+4mq3/tZeq/7qcsP+8n7H/vJ+u/7ue + rf/Ao7L/p4ic/3tbdP+BYHv/f194/31ddv+JaYH/qYmg/6eInf+niJ3/p4ig/6OFn/+cfpb/nICU/5p+ + k/+cfpf/m3yX/5V1lv+TcZj/k3KZ/5NxmP+Uc5X/qIqj/66Ro/+sj6T/qY6l/6SPpv+uorr/sKrD/6+n + w/+zp8T/rKa9/6q6z/+oxN7/qcDd/6zA3P+1xN7/rKzG/6CTsf+glrT/m5ez/5uWsf+lmbL/rpiw/7SY + rf+3maz/t5ms/7eZrP+3maz/t5ms/7eZrP+3mKz/tJWq/6eInf+mh5z/p4id/6iJnv+khZr/gWF6/4Bf + ev+AX3r/gGB5/4BgeP+wkKj/uJiw/7eXr/+3mK7/tpes/7ydsv+8nrH/vJ+w/7uerv/CobT/knSK/3lb + df+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7WXqv+AYXj/gF96/4BefP9+XXf/gWF7/7eY + rf+/obL/vZ+y/72fsv++oLT/imuB/35fdf+AYHn/f194/35edv+be5P/qYqh/6aInP+niJ3/pIeZ/7SX + qP++oLL/u56v/76gsv+8n7D/u56w/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/9/X3j/fV12/4lp + gf+piaH/p4id/6eInf+mhp//pIag/6aJoP+miZ7/poqd/6iLof+miKH/fF14/3lZdf96WXj/ell3/3lZ + c/+0lqr/wKOy/76gsf+8obP/uKGz/7WdsP+4m6//vJqw/76bsf+2l6z/qrzQ/6HV7v+dzO3/n83t/7DV + 7/+nqML/o36Y/6mFn/+jhZ7/nYSa/6eOo/+7obf/uZ2x/72gsf+9n7H/vZ+x/72fsf+9n7H/vZ+x/76g + s/+4ma7/poec/6iJnv+niJ3/qIme/6SFmv+BYXr/gF56/4Bfev+AYHn/gGB5/7aWrv++nrb/vJy0/76f + tP+8nbL/vJ2x/7yesf+8n7D/u56u/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+9n7L/tZer/4BheP+AX3r/gV98/39eef+AYHr/tpet/72gsP+7nq//u52w/7yesv+Ka4D/fV5z/4Bg + eP9/X3j/fV12/5t7k/+qiqH/p4ic/6eInf+lh5n/s5am/7yfr/+7nq7/u56t/7yfrv+8n6//vJ6w/7yf + r/+7nq3/wKOy/6eInP97W3T/gWB7/39feP99XXb/iWmB/6mJoP+niJ3/p4id/6aHn/+khqD/pomg/6SJ + nP+liZz/pIic/6KFnP+DY33/gV16/4FefP+CX3z/f194/7OTq/+9nrL/v5us/76frf+4n63/vKCu/8Ge + rf/Anq3/v5+u/76arP+tvdH/n9Dt/6LJ8P+cye3/o9Pu/5+sxP+mg5j/roqd/6yJnP+piJn/spCi/8Ce + sv+9nbD/vJ+u/7ufrv+8n67/vJ+u/7yfrv+7n67/vJ6x/7eXrf+mh5z/p4id/6eInf+oiZ7/pIWa/4Fh + ev+AXnr/gF96/4Bgef+AYHn/tZWt/72dtP+6mrL/u5yx/7ydsv+8nbH/vJ6x/7yfsP+7nq7/wqG0/5J0 + iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsv+1mKn/gGF4/39fef9/Xnn/f155/4Fh + ef+2l6z/vaCx/7ufrv+7nq7/vZ+x/4trgv99XXf/gGB6/4Bgef9+Xnf/nHyT/6qLoP+niZz/qIuc/6aI + m/+zlqj/vqCz/7yesf+8nrH/vJ6w/7yesP+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+BYHv/gF95/35e + d/+JaYL/qYqg/6eJnf+oipz/p4md/6eHoP+oiaH/p4if/6WGnf+mh57/pIWd/4Jhe/9+XXn/gF55/39e + eP+AYHj/sJCo/76ftf+8nK//vp+w/7uer/+8n7D/vp6w/72er/+8n7D/spqx/7K71f+mz+7/l8ru/5nK + 7v+rz/D/oKrH/6CDmf+qiZ//qYie/6aGmv+wkKT/v5+y/72dsP+8nrD/vJ6w/7yesP+8nrD/vJ6w/7ye + sP+8nrH/uJqt/6eInP+mh53/p4ef/6iIoP+khJv/gWF6/4Bfef+AX3r/gF96/4Bgef+1lqr/vaCw/7ye + sP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vaCx/7WYqf+AYXf/gF95/4Bfev+AX3r/gWF6/7aXrP++oLH/vJ+u/7yfrv+9n7D/imuC/31d + d/+AX3r/gGB6/31ddf+ae5L/qImd/6WHmP+liZj/o4aY/7KUp/++n7P/u52w/7yesf+8nrH/vJ6x/7ye + sf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3n/fl53/4hngP+niJ7/pYeZ/6WImP+lh5r/pYac/6WG + m/+lhpv/pIWb/6aHnP+ig5j/gGB4/3tbdf98XXX/fV11/3xcdf+ykqj/vZ6z/7yesf+7nrH/vJ6x/7ye + sf+8nrH/vJ6x/7uesv+nnbH/sb7U/63T7P+c0u7/n8/t/7TU8P+hqsX/n4Kb/6mIoP+nh6D/pYac/66Q + pP+9oLP/u56x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+5m67/p4ic/6eInf+nh5//qIig/6SE + nP+BYXr/gF95/4Bfev+AX3r/gGB4/7SWqv+9oK//u56v/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8Kh + tP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gF56/4Bf + ef+BYXn/tpes/76gsf+8n67/vJ+u/72fsf+Ka4L/fV13/4Fge/+BYXr/fFx1/6SEnP+4ma7/tJeo/7WY + qP+1l6n/upyv/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gmB8/4Fg + ev9+Xnb/i2uD/7eXrf+1l6n/tZio/7WXqf+1lqv/tZar/7WWq/+0lar/tZar/7OUqf+be5P/mHiS/5l5 + kv+aepL/l3eO/7iZrv+7nbH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7aerv+4qbv/s67G/6us + x/+srMf/uK/I/6uasf+jhZz/qIig/6iHoP+lhpz/r5Ck/76fs/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vZ+y/7mbrv+niJz/p4id/6eHn/+oiKD/pISc/4Fhev+AX3n/gF96/4Bfev+AYHj/tZaq/72g + r/+7nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP + 3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bfef+AXnr/gF95/4Fhef+2l6z/vqCx/7yfrv+8n67/vZ+w/4pr + gv99XXf/gWB7/4Fgev98XHX/q4yj/8Gjt/+9n7H/vqGw/76gsv+8nrH/u52w/72fsv+8nrH/vJ6x/7ye + sf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+CYHz/gWB6/31ddv+Obof/wKG2/72fsv++obD/vqCx/76f + s/++n7P/vp+z/72fs/+9nrL/vJ6y/6uMov+piaL/qoqi/6qKof+oiZ7/upuv/72fsf+7nbD/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/u5+t/7idrP+2mq7/tpmw/7ebsf+3mq7/rpKk/6aGnf+nh5//qIeg/6WG + nP+ukKT/vp+z/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/uZuu/6eInP+niJ3/p4ef/6iI + oP+khJz/gWF6/4Bfef+AX3r/gF96/4BgeP+0lqr/vaCv/7uesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+AYXf/gF95/4Be + ev+AX3n/gWF5/7aXrP++oLH/vJ+u/7yfrv+9n7D/imuC/31dd/+AX3r/gWF6/3xcdf+qiqH/wKG1/7ud + r/+8n6//vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fg + e/+AX3r/fV12/41thf++n7X/u52w/7yfr/+8nq//vJ6x/7yesf+8nrH/vJ6x/72esv+6nK//p4ie/6aG + nv+nh57/p4ic/6aHm/+5m67/vZ+x/7yesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesP+3oK7/t6Gv/7ug + sP+9n7D/vJ+w/7yisv+ulKT/pYad/6eHn/+nh6D/pYac/66QpP++n7P/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/72fsv+5m67/p4ic/6eHnf+nh5//qIig/6SEnP+BYXr/gF95/4Bfev+AX3r/gGB4/7SW + qv+9oK//u56w/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SX + rf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gF56/4Bfef+BYXn/tpes/76gsf+8n67/vJ+u/72f + sP+Ka4L/fV13/4Bfev+BYXr/fFx1/6qKof/AobX/u56v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gWB7/4Bfev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yf + r/+8n7D/vJ+w/7yfsP+8n7D/vZ+w/7udrv+oip3/p4ee/6eInf+niZz/poib/7mbrf+9oLD/vJ6w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/8Sdsf/FnLH/xJyw/8OcsP/EnLD/x56x/7mRpv+nhp3/qIig/6iI + oP+lhpz/r5Cl/76gs/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7mbrv+mh5z/poec/6aH + nv+nh5//o4Ob/4Jie/+BYHv/gWB7/4Fge/+BYXn/tZaq/72gr/+7nrD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bf + ef+AXnr/gF95/4Fhef+2l6z/vqCx/7yfrv+8n67/vZ+x/4prgv99XXf/gF96/4Fhev98XHX/qoqh/8Ch + tf+7nq//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tb + dP+BYHv/gF96/31ddv+NbYX/v5+1/7uesP+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+9oLD/u56t/6iK + nf+niJ3/p4id/6eJnP+miJv/uZus/72gsP+8nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZy0/7ud + tP+4oLT/tqCz/7egs/+8orb/sJKm/6OEm/+mhp3/poad/6OEmv+tj6P/vZ+y/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/uZuu/6qLn/+qiqD/qoqi/6uLpP+mhp7/fV11/3tadP98W3X/e1p0/3xc + dP+0lqn/vaCv/7yesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RY + cf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+AYXf/gF95/4Beev+AX3n/gWF5/7aXrP++oLL/vJ+v/7yf + r/+9n7L/imqD/31ceP+AX3v/gWF6/3xcdf+qiqH/wKG1/7uer/+8n6//vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3r/fV12/41thf+/n7X/u56w/7yf + r/+8n7D/vJ6x/7yesf+8nrH/vJ6x/72fsv+7na//qIme/6eHnf+niJ3/p4id/6aIm/+5m63/vaCw/7ye + sP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n7P/s5ir/62Spf+tkqX/rZOl/6+Upv+vk6b/spSn/7KU + p/+ylKf/sZOm/7eZrP+8nrH/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsv+0lqj/kHGH/5Ny + jP+ScYv/kXCK/5NzjP+ef5X/oIGV/5+Blf+ggZX/oIKV/7iarf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bh + d/+AX3n/gF96/4Bfef+BYXr/tpes/76gs/+8nq//vJ+v/72es/+KaoP/fVx5/4Bee/+BYXr/fFx1/6qK + of/AobX/u56v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eI + nP97W3T/gWB7/4Bfev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7yesf+8nrH/vZ+y/7ud + r/+oiZ//p4ee/6eInf+niJ3/poib/7mbrf+9oLD/vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/76g + sv+uj6L/pYea/6WHmv+lhpn/o4SX/7GTpv/AorX/vZ+y/72gsv++oLP/vZ+y/7yesf+9n7L/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nbH/vqGy/7KUpv98XHP/fFt2/31cd/96WXT/gmJ6/72es//Bo7b/wKK1/8Ci + tf+/obT/vJ6x/7yesf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4Rg + fP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72gsf+1mKn/gGF3/4Bfef9/Xnr/gF95/4Fhev+2l6z/vqCz/7ye + r/+8n6//vZ+z/4pqg/99XHn/gF57/4Fhev98XHX/qoqh/8Chtf+7nq//vJ+v/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+BYHv/gF96/31ddv+NbYX/v5+1/7ue + sP+8n6//vJ+w/7yesf+8nrH/vJ6x/7yesf+9n7L/up2v/6iJn/+nh53/p4id/6eInf+miJv/uJut/72g + sP+8nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ+y/62Pov+lh5r/qIqd/6WIm/+miJv/spSn/72f + sv+7nbD/vJ6x/7yesf+7nbD/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf++oLL/spWm/4Bg + d/+AX3n/gWB7/39eeP+DY3v/uZqv/7udsP+6nK//u52w/7qcr/+8nrH/u52w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH + 1v+7nbD/u52w/7udsP+7nbD/vJ6x/7udsP+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WY + qf+AYXf/gF95/4Bfev+AX3r/gWF5/7aXrP+9n7L/u56u/7uerv+8nbL/imqD/31cef+AXnv/gWF6/3xc + df+qiqH/wKG1/7uer/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cj + sv+niJz/e1t0/4Fge/+AX3r/fV12/41thf+/n7X/u56w/7yfr/+8n7D/vJ6x/7yesf+8nrH/u52w/7ud + sP+7na//qYmf/6iInv+oiZ7/qIme/6eJnP+5m63/vaCw/7yesP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+9n7L/rpCj/6aIm/+niZz/qYue/6aIm/+ylKf/vZ+y/7udsP+8nrH/u52w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/76gsv+xk6X/fl92/39eef+AXnr/f155/4Vlff+5m6//vZ+y/7ye + sf+8nrH/u52w/7yesf+7nbD/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ng + ff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/76gs/++oLP/vqCz/76gs/+9n7L/u52w/7ud + sP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9oLH/tZip/4Bhd/+AX3n/gWB7/39eef+CYnr/t5it/8Ci + tf+9oLH/vqGx/7+htf+La4T/fFt4/39eev+BYXr/fFx1/6qKof/AobX/u56v/7yfr/+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gWB7/4Bfev99XXb/jW2F/7+f + tf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7yesf+7nbD/vJ6x/7udsP+niJ7/pYWc/6WHm/+lhpv/pYea/7ia + rP+9oLD/vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+tj6L/o4WY/6WHmv+lh5r/o4WY/7CS + pf++oLP/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vqCy/7KU + pv9+X3b/gF96/4Bfev9/Xnn/hGR8/7mar/+9n7L/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH + 1v/Ax9b/tJap/7SWqf+0lqn/s5Wo/7WXqv+9n7L/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72g + sf+1mKn/gGF3/39fef+BYHv/f155/4Jie/+vkKX/tZeq/7OWp/+0l6f/tJaq/4logv99XHn/f156/4Fh + ev98XHX/qoqh/8Chtf+7nq//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7ue + rf/Ao7L/p4ic/3tbdP+BYHv/gF96/31ddv+NbYX/v5+1/7uesP+8n6//vJ+w/7yesf+8nrH/vJ6x/7ye + sf+9n7L/u52w/7GRqP+vkKb/sJGm/6+Qpf+wkqX/upyu/7yfrv+8nrD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7SWqf+ukKP/sJKl/7CSpf+ukKP/t5ms/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ydsf++oLL/sZSl/35fdv+AX3r/gF96/39eef+EZHz/uZqv/72f + sv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lb + df+DYH3/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+lh5v/pYea/6WHm/+khpn/rI6h/72f + sv+6na//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vaCx/7WYqf+BYXj/f155/39eef9/Xnn/gGB5/6KD + mP+miJv/pYeZ/6WHmf+lhpz/h2aA/39dev9/Xnr/gWF6/3xcdf+qiqH/wKG1/7uer/+8n6//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3r/fV12/41t + hf+/n7X/u56w/7yfr/+8n7D/vJ6x/7yesf+8nrH/u52w/7udsP+8nrH/vZ6z/76ftP++n7T/vp+z/76g + s/+8nrD/vJ+v/7yfsf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vqCz/72fsv+8nrH/vqCz/72f + sv+9n7L/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6w/76h + sf+ylKX/fl92/4Bfev+AXnr/f155/4RkfP+5mq//vZ+y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH + 1v/Ax9b/wMfW/6eHn/+niJ//qIig/6aGnP+tjqP/vZ+z/7yesP+8n6//vJ+v/7yfr/+8n6//vJ+v/7yf + rv+9oLH/tZer/4BheP+AX3r/f117/39eef+BYXr/o4Ob/6iKnv+nh5//p4ef/6iIoP+GZoD/fl14/39e + ef+BYXr/fFx1/6qKof/AobX/u56v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yf + r/+7nq3/wKOy/6eInP97W3T/gWB7/4Bfev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+8nrH/vJ6x/7udsP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8n6//vJ+v/7yfr/+8n67/vqGw/7KUpf9+X3b/gF96/4BdfP9/Xnn/hGR8/7ma + r/+9n7L/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0 + iv95W3X/g2B9/4RgfP90WHH/pJet/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4ef/6eHn/+nh6D/pYac/62O + o/+9n7L/u56w/7yer/+8nrD/vJ6w/7yesP+8nrD/u56v/72fsf+1lqr/gGF4/4Bfev9/XXv/fl54/4Fh + ev+jg5v/qIme/6eInv+nh5//p4eg/4Zmf/9+XXf/f155/4Fhev98XHX/qoqh/8Chtf+7nq//vJ+v/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7uerf/Ao7L/p4ic/3tbdP+BYHv/gF96/31d + dv+NbYX/v5+1/7uesP+8n6//vJ+w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesP+7nq//u56v/7ud + r/+9oLH/sZOl/39gdv+BYHr/gGB6/4Bgef+EZH3/uZqv/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP/CobT/knSK/3lbdf+DYH3/hGB8/3RYcf+kl63/yc/e/77F + 1P/Ax9b/wMfW/8DH1v+nh5//p4ef/6eHoP+lhpz/rY6j/7+gtP+9n7L/vZ+y/72fs/+9n7P/vZ+z/72f + sv+9n7L/v6G0/7aYrP+BYXn/f196/39de/9+Xnj/gWF6/6KDmf+niJz/pYeb/6WGnP+mhp7/hmZ+/35e + d/9/X3n/gWF6/3xcdf+qiqH/wKG1/7uer/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8n6//u56t/8Cjsv+niJz/e1t0/4Fge/+AX3r/fV12/41thf+/n7X/u56w/7yfr/+8n7D/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yfsP+8nrD/vZ+y/8Citf/AobX/v6G1/8KjuP+0lqr/e1ty/31ddf98XHT/e1t0/4Fh + eP+5mq7/vZ+y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8Kh + tP+SdIr/eVt1/4Ngff+EYHz/dFhx/6SXrf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eHn/+nh5//p4ef/6aH + nf+tjqP/tpir/7WXqv+1lqv/tZer/7WXq/+1l6v/tZer/7WWq/+3maz/rpCk/4Fhef+AYHv/f157/39e + eP+AYHn/qImf/66Qo/+tjqL/rI2i/6+Ppv+IaID/fV11/39fef+BYXr/fFx1/6qKof/AobX/u56v/7yf + r/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+7nq3/wKOy/6eInP97W3T/gWB7/4Bf + ev99XXb/jW2F/7+ftf+7nrD/vJ+v/7yfsP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/up6t/76gsv+3maz/qYuf/6uL + ov+qi6L/rIyj/6WGnf+Rcoj/knOI/5Bxhv+Scoj/lHSK/7qcsP+8n7H/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/wqG0/5J0iv95W3X/g2B9/4RgfP90WHH/pJet/8nP + 3v++xdT/wMfW/8DH1v/Ax9b/p4ef/6eHn/+nh5//poed/6aHnP+lh5v/pYea/6aHnP+mh5z/poec/6aH + nP+mh5z/poec/6eJnf+ig5f/gGB3/4Bfev9/XXv/fl13/4Jie/+2l6z/v6Gz/72fsv+9nrL/vp+0/4xs + g/9+Xnb/gGB5/4Fgev98XHX/qoqh/8Chtf+7nq//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ+v/7uerf+/o7L/p4ic/3tbdP+BYHv/gF96/31ddv+NbYX/v5+1/7uesP+8n6//vJ+w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7uesP+8n6//vqGy/6uMof94WHD/fV11/3xcdf96WnP/h2d//8GiuP++oLP/v6Ky/76h + sv++n7P/u52x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP/CobT/knSK/3lbdf+DYHz/hGB8/3RYcf+kl63/yc/e/77F1P/Ax9b/wMfW/8DH1v+nh5//p4ef/6eH + n/+niJ7/poec/6aIm/+niZz/p4ie/6iInv+niJ7/p4id/6eInf+niJ3/qImd/6KEl/+AYXj/f154/4Ff + ff9+Xnn/gGF6/7aYrf+9oLD/u56w/7yesf+9n7L/iWp//31edP+AYHn/gWB6/3xcdf+qiqH/wKG1/7ue + r/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//u56t/8Cjsv+niJz/e1t0/4Fg + e/+AX3r/fV12/41thf+/n7X/vJ6w/7yfr/+8n7D/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/u56w/7qdrf+/obP/qoug/35e + dv+BYXr/gWB7/35deP+KaoP/vJ2y/7uerv+6naz/vJ6v/7qcr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/u52w/8KhtP+SdYr/eVt1/4Ngff+EYHz/dFhx/6OX + rf/Jz97/vsXU/8DH1v/Ax9b/wMfW/6eHnv+nh57/p4ef/6aHnf+mh5z/p4ic/6aInP+nh57/pYad/6eH + nv+nh5//p4ef/6aHn/+piKH/pIKa/4Jfev+BXID/gl55/4JfeP+DX3v/uJes/72gr/+7nq7/u52w/7yd + sf+MbIP/fl52/4Fgev+BYXv/fFx1/6qKof+/obX/u52u/7yfrv+8nrH/u5yw/7udsf+8nrL/vJ6x/7ye + sf+8nrD/vJ+w/7yfrv+7nq7/v6Gy/6eInv98XHX/gWB7/4Fgev9+Xnb/jm6G/76ftP+7nbD/u56v/7ue + r/+8nrH/vJ6w/7udsP+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrD/vJ+x/7yesP+6na3/u56t/76hsv+sjaL/fFx0/4Bgef+AX3r/fl14/4pqgv++n7T/u56u/7uf + rf+8n6//vZ+x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nbH/vZ6y/7qcr/+7nbD/vJ2x/7ue + sP+7na//w6C1/5N0iv96XXb/g2B8/4VhfP91WXH/pZit/8nP3v++xdT/wMfW/8DH1v/Ax9b/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/poec/6WGm/+mh5z/poad/6mJof+piaL/qYmi/6yKof+mh5L/gGB0/4BY + hf9+YHL/f2Fv/4JhdP+3mab/vqGw/7yfrv+8nrD/vZ2z/4pqgv96WXP/fV13/35dd/93V3D/q4ui/8Kj + uP+9n7L/vqGy/76ftf++nrT/u5yx/7yesv+8nrH/vJ+v/7yfr/+8n67/vJ+u/7uer/+/oLX/poee/3lY + cv9+Xnf/f194/3pacv+La4P/v6C2/72esv+9n7L/vZ+x/72fsv+7nbD/u52w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6w/7yfr/+9oK//vaCw/8Cjsv+9oLH/w6W4/66P + pP95WXH/fl52/31dd/96W3L/hmh7/72fsv+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7ucsf+7nLH/vJ6x/72fsv++oLP/vqGy/76gsf/Hobn/knOL/3NYb/97XXT/fl11/21U + a/+ilqr/yc7d/77F1P/Ax9b/wMfW/8DH1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/pYac/6eI + nf+lhZz/n3+X/6CAmP+ff5n/n4CX/5qAkf9+Xo3/elSj/3dalv92W5L/el+S/7CXrf++oa//vJ+v/7ye + sf++n7T/lHOM/4pqg/+La4L/i2yC/4hpf/+khZr/s5Op/7CQp/+wkaf/sJCn/7eYrf+8nbL/vJ6y/7ye + sf+8n7D/vJ+v/7yfrv+8n67/u56v/8Chtv+ri6L/iGiB/4trhP+La4T/iGiA/5V1jP+7nLL/uJmu/7mb + rv+5m67/t5ms/7yesf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrD/u56w/7eZq/+vkaP/sZOm/7CRp/+ykqn/qIie/4lqf/+LbIL/jGyC/4hqf/+SdIf/vJ6x/7ye + sf+9nrL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ2x/7yesf+8nbH/s5Wp/6+R + pf+wkqb/sJCl/7KTqv+VfpT/hHSJ/4d1iv+Ldoz/fG2C/6aitf/Hzt3/vsXU/8DH1v/Ax9b/wMfW/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+mh53/qIme/59/lv98XHT/f194/39fd/98Wn7/eFWS/4ld + 0v+AUev/e1Xm/31X4/9+Wtn/rpLF/76hrf+8n6//u56v/7udsf+8nbP/v5+1/76gsv+7nq7/waO2/5Bx + h/96WnL/f154/35eeP95WXH/ooOY/8Git/+6m7D/vJ6x/7yfsP+8n6//vJ+u/7yfrv+8n6//u52w/7uc + sv++nrT/v5+2/72ctf++n7b/uJmu/6WGm/+mh5z/poec/6aHm/+pi57/vJ6x/7udsP+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//vJ6w/7udsP/CpLf/ooSY/3lbb/9+X3X/gF95/3ta + dP+Ob4b/waK3/72fsf+9oLH/vqGy/72fsv+6nK//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/upyv/72es/+LbIH/e1tx/35edv+AYHf/dFhv/7GkuP/RzuH/ysXY/8/G + 2v/NyNv/xMfZ/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+oiZ7/oICX/35ed/+AYHn/gGB5/31fe/91XIv/gFnY/3VP7/9wUvD/c1Lv/3dZ3/+qk8H/vqGu/7uf + r/+8n6//vJ+w/7udsP+8nrD/vJ+u/7qdrP++obL/knOI/31ddf+BYXv/gmB9/3xcdf+jhJn/wKG2/7qb + r/+8nrH/vJ+w/7yfr/+8n67/vJ+v/7yfr/+9oLD/vJ6w/7udsP+7nbH/vJ2y/7ydsv+3mK3/poec/6eI + nv+nh5//poec/6mLnv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yf + r/+8n7D/u52w/7+htf+khJv/e1tz/4Fhev+BX3z/fVx2/49viP+/oLX/u56u/7yfrf+7nq3/u56w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+6nK//vZ6z/45v + hf99XXX/gWF6/4Fie/91W3L/rqS4/8fL3f++xdb/w8XX/8TF2P/Axtf/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6mKn/+ff5b/f193/4Bgev+AYHr/fWF2/3Zh + gv9/Wtf/cVXn/21W6f9yU+v/elzZ/6yXu/++oK//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n67/up2t/7+i + s/+Scoj/fFx1/4Fgev+BYHv/e1tz/6OEmf/Aobb/upyw/7yesf+8n7D/vJ+v/7yfr/+8n6//vJ+v/7yf + r/+8n6//vJ+v/7yfr/+8nrH/vp+z/7aXrP+mh5z/p4if/6eHoP+mh53/qYue/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+v/7yer/+7nLD/v6C3/6SEnf97W3T/gWB7/4Bf + e/99XXb/j2+I/7+gtf+7nq//vJ+v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ucr/++n7T/jW2F/31ddv+BYHv/gmB7/3lZcv+vo7f/xc3e/7rF + 1v/Ax9j/wsbY/8HH2P/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6eInf+niJ3/p4id/6eInf+oiJ7/qIme/6iJ + nv+oiZ//qoug/6CAl/9/XnX/gWB3/4Fgd/9+X3f/eVyJ/39S4/9wUuv/bFPt/3VO8/+AVeH/sJW8/76g + rv+8n6//vJ+u/7yfrv+8n67/vJ+u/7yfr/+6nK//v6G0/5JyiP98XHT/gWF5/4Fhev97W3P/o4SZ/8Ch + tv+6nLD/vJ6x/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+u/7yfrv+8n67/vJ+u/7yesP+9n7L/t5is/6WF + nf+nh5//p4ag/6aGnf+pi57/vJ6x/72fsv+8nrH/vJ6x/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/vZ+y/72fsv+9oLL/vaCy/72g + sv+9obD/vaCx/72esv/Born/pYWe/3lYdP9/Xnr/f194/3tbdP+Obob/v6C2/7udsf+8nrH/vJ6w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//up2v/76f + tP+NbYb/fV12/4BffP+CX33/flhy/7Oit//GzN7/usbW/8HH2P/Fxtj/xMbY/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/p4ie/6eInf+miZz/pYmc/6OHm/+hhJj/pIaX/6aHkv+miJf/mH6W/3Reg/9yXI3/dFuO/3Rb + iv90WJj/h17Y/39d3P98Xdv/glvd/49h0P+2lL3/vaCv/7yesP+8n6//vJ+v/7yfr/+8n6//vJ6x/7qc + r/+/oLX/knKI/3xcdP+BYXr/gWB6/3tbdP+jhJr/wKG1/7qdr/+8n7D/vJ6w/7yesP+8n7D/vJ+w/7yf + sP+8n6//vJ+v/7yfr/+8nrD/vJ6w/72fsv+2mKz/qYqe/6mJoP+piqD/qIme/6qMn/+7nbD/uZuu/7qc + r/+7nbD/uZuu/72esv+8nbH/vJ2y/7ydsv+8nbL/vJ2y/7ydsv+8nbL/vJ2y/7ydsv+8nbL/vJ2y/7yd + sv+8nbH/vJ+x/7aZqv+2mKv/tpir/7eYrP+2mKz/tpis/7aZqv+2mKv/tpes/7qasf+jg5v/gmF8/4dm + gP+FZnv/g2R6/5R1if+/oLT/u52x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72er/+9nK7/wJ+0/45thv9+XHb/gl98/4Jfff95WXL/sKO3/8XN + 3v+6xtb/wcbY/8XG2P/Extj/wMfW/8DH1v/Ax9b/wMfW/8DH1v+niZz/pomc/6SJnP+ni6D/l3qR/31f + d/+BYXr/g2B3/4Fgff95Wpj/fF/N/3VV4v96U+T/fVbb/4Nly/+rjc7/r5e9/62Ztv+vnLX/uJu0/7yc + s/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/upyv/7+gtf+ScYr/fFx2/4Fge/+BX3z/e1t1/6OE + mv/AorT/up6t/7yfr/+8nrH/vJ2y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/vZ+y/7ye + sf+7nbD/u52w/7udsP+9n7H/t5ms/6iKnf+niZz/poib/6iKnf+oi53/upyw/7yesv+8nbH/vJ2y/7yd + sv+8nbL/vJ2y/7ydsv+8nbL/vJ2y/7ydsv+8nrL/vJ2x/7ydsf+/obP/l3mL/35fc/+CY3j/gmJ5/4Fh + ev+BYXr/gWF6/4Fhef+DY3v/fl52/5d3j/+/n7j/uJiv/7qcr/+5m63/uZuu/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6v/7ud + rv++n7T/jW2G/31cdv+AX3z/gGB9/3Racv+spLf/xM3e/7rG1v/Ax9j/wsbY/8HG2P/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/6WLmf+miZz/poaf/6mHpP+ceJb/fVx3/39cf/98WoH/emFz/3ZVn/98Uuj/dU7y/3pS + 6v98TO//g1zd/7OWwP++n7H/vp20/7mgqf+9oKz/vp6y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+6nK//v6C1/5Jyiv98XHb/gWB7/4FgfP97W3X/o4Sa/8CitP+6na3/vJ+v/7yesP+8nbL/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+5m67/pYea/6eJ + nP+niZz/poib/6iKnf+7na//vJ+w/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yf + r/+8n6//u56v/8Chtv+Wdo7/eVlx/4Fhef9/X3j/f155/39eef9/XXv/f156/4Bfev97W3T/l3eP/8Gh + uf+7nLH/vJ6x/7yesf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+6n7H/t52w/7ugtP+Kbob/el12/35ge/+AYHz/d1py/6+j + t//Izd7/vcXW/8PG2P/Cxtj/wMfY/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/pIqb/6aJnf+ohqD/qoei/516 + k/98XnD/fl54/4Nhef9+alz/eFqT/3xT6/9vUu3/cFni/3JO8v9/X9v/sp+u/8Geq//Cl7z/vaCs/7qi + qv+8nbL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7qcr/+/oLX/knKK/3xcdv+BYHv/gWB8/3tb + df+jhJr/wKK0/7qdrf+8n6//vJ6w/7ydsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72f + sv+9n7L/u52w/7yesf+8nrH/vJ6x/7eZrP+lh5r/poib/6aIm/+miJv/qIqd/7qdrv+8n6//vJ+v/7yf + r/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+7na7/wKC4/5Z2j/98XHX/gF96/39f + ef9/Xnv/f118/39dfv9/XX3/gF58/3tbdf+YeJD/waK3/7qcsP+7nbD/vZ+y/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/u52w/7yd + sf+7nLD/v6C1/45thf9+XXb/gmB6/4Rge/95WnL/sqO4/8vM3v/AxNb/xMbY/8LG2P++x9j/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+liKL/p4ig/6qInv+ri5//mXyP/3ZfcP98YHz/hVx6/4NnZf97Vpf/fFLo/2xS + 6f9oVeb/a07u/3xmy/+vo6b/u5+o/7yXvf+3oK3/taOo/7mesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/upyv/7+gtf+Scor/fFx2/4Fge/+BYHz/e1t1/6OEmv/AorT/up2t/7yfr/+8nrD/vJ2y/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/uJqt/6eJ + nP+miJv/poib/6eJnP+pi57/upyu/72gsP+8n6//vJ+v/7yfr/+8n6//vJ+v/7yfr/+8n6//vJ+v/7yf + r/+8n6//vJ+v/7udr//Bobn/lXWO/3tbdf+AX3r/f155/39dev9/XXv/f1x8/39de/+AX3r/e1t0/5Z2 + jf/Borf/upyv/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrD/wZ2z/8Casf/Enrf/kW2F/31ac/+BXnf/gF94/3Ra + cP+vpLj/y8ze/8DD1f/Fxtj/wcbY/73H2P/Ax9b/wMfW/8DH1v/Ax9b/wMfW/6OFov+lh53/p4iY/6eK + nf+UeJr/b1aL/3FXlv93WYn/elyB/3xVov+DXNT/eVvY/3pX4P97S/H/hVrg/7CUwf+7oa7/uKCv/7Si + rP+2nrP/upy2/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+6nK//v6C1/5Jyiv98XHb/gWB7/4Fg + fP97W3X/o4Sa/8CitP+6na3/vJ+v/7yesP+8nbL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+4mq3/p4mc/6aIm/+niZz/p4mc/6iKnf+6nK//upuw/7qb + sP+6m7D/upuw/7qbsP+6m7D/upuw/7qbsP+6m7D/upuw/7qbsP+6m7D/uZuw/7+gtf+Xd47/fl51/4Ji + ev+BYXr/gWB7/4Fge/+BYXr/gWF6/4Jiev97XHP/l3iN/8Citf+7nbD/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+8nrH/uZuu/7ud + sP++mrL/wJqz/7+dtf+Lb4b/eGB2/3hkef94ZXr/bl9z/6mluP/GzN7/wMXW/8bG2P/Bxtj/vcfY/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/gWR8/4Nmdv+DaHT/fmF+/31dnv+CX8v/d1bY/3NZ1f98WM//iWTE/5Z8 + t/+Xg6X/ooCo/6R9rv+ihaz/vZy1/7yer/+3nrH/tp+y/7+fr//Anq//vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7qcr/+/oLX/knKK/3xcdv+BYHv/gWB8/3tbdf+jhJr/wKK0/7qdrf+8n6//vJ6x/7yd + sv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP+5m67/upyv/7qcr/+6nK//t5ms/4hpf/+EZH3/hWV+/4Vlfv+FZX7/hWV+/4Vlfv+FZX7/hWV+/4Vl + fv+FZX7/hWV+/4Vlfv+GZn7/g2V4/6SGmP+4mq7/tZar/7aWrf+2lq7/tpau/7aYqv+2mKr/tpmq/7aY + qv+3maz/upyw/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7qdr/+MboH/g2Z5/4Nlff+DaIH/eWR7/7aovf/Gv9P/u7zO/7u9 + zv++u87/vsPU/7zH2P++xtj/xcbY/8LG2P++x9j/wMfW/8DH1v/Ax9b/wMfW/8DH1v96XH//fmJx/4Ff + d/98YXL/eFmd/35V6v9xU+r/cVTt/3ZP8f+HYdH/oYWo/6iKmv+riZz/qIed/6mNmP++nq7/vZ+v/7qf + r/+6nrH/v5+u/76frv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrD/up2u/7+htP+Scon/fFx1/4Fg + e/+BX33/e1p1/6ODm//AorT/up2t/7yfrv+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+8nrH/vJ6x/7yesf+4m63/g2N6/31c + eP9/XXr/fl15/35def9+XXn/fl15/35def9+XXn/fl15/35def9+XXn/f115/39eev96W3H/poeb/8Kk + uP+8nbH/vZ+y/72fsv+9n7L/vaCx/72gsf+9oLH/vZ+x/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+7n7D/u5+v/7uesP+9nrL/vJux/4hl + ff+BXHX/gF94/3tfeP9vW3L/t7HE/8nP3//Bydj/xsnZ/8bJ2f/Bydj/vcbW/7/H1//Cx9f/wcfX/8DH + 1//Ax9b/wMfW/8DH1v/Ax9b/wMfW/3pdgf9/ZHL/hV5+/35ib/96WqH/e072/29R6/9yU+v/dU30/4Vh + 0f+jh6P/rIic/6eKmv+jh6D/qIuc/7uerv+8n6//vJ+v/7yfr/+8n6//vJ6w/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yfr/+6na3/v6G0/5JyiP98XHX/gWB6/4Fge/97WnX/o4Ob/8Citf+6na3/vJ+u/7ye + sP+8nbL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+7nbD/vJ6x/7mbrf+EZXz/f156/4Ffe/+AX3v/gF97/4Bfe/+AX3v/gF97/4Bf + e/+AX3v/gF97/4Bfe/+AX3v/gWB8/3xcdP+lhpz/v6C1/7qcsP+8nrH/vJ+v/7yfr/+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7ufr/+6oK7/up6w/7ydsv+8m7P/iWaB/4Ndef+EYHv/gmB6/3ZddP+0r8L/w8zb/77G + 1P/GxtX/wcbV/7/H1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/f2F3/4Jj + cP+FXX3/fl53/3tVqP9/Tvb/c1Du/3NR7/92TfT/hGDT/6GEqP+rh57/qIuX/6WJm/+oip3/u56w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ+w/7qdrf+/obT/knOI/31d + df+BYXr/gWF6/3xcdf+jg5v/wKG1/7qcrv+8n6//vJ6x/7ydsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/uZuu/4Rl + fP9/Xnn/gWB6/4Bgev+AYHr/gGB6/4Bgev+AYHr/gGB6/4Bgev+AYHr/gGB6/4Bgev+BYXv/fFx0/6WG + m//Aobb/upyw/7yesf+8n6//vJ+v/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/up6w/7qer/+7nbH/u52y/7ib + s/+FZ4D/e154/4Fhe/+CYXr/dl10/7avw//EzNz/vsfV/8TH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+DYXb/hGF1/4VefP9+X3b/fFme/4NZ2v95WtL/el3V/3pX + 2/+HacH/oYaj/6qGof+nipr/pIic/6qLn/+7nbH/vZ+y/72esv+9n7L/vJ6x/72fsv+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+9n7D/up2s/7+htP+PcYX/e1tx/39fd/9/X3f/eVlw/6OEm//Borj/vZ6z/76f + tP++n7X/vZ6z/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+4mq3/gmJ5/31ddv9+Xnf/fl53/35ed/9+Xnf/fl53/35e + d/9+Xnf/fl53/35ed/9+Xnf/fl53/39feP96WnL/pYab/7+gtf+7nLD/vJ6x/7yfr/+8n6//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+7nbD/vJ6x/72esf+8oLP/vZ+0/76etP+9n7b/up62/3xlff9xXnX/d193/3lddv9wWXH/ta/C/8TN + 3P+9x9X/w8fW/8HH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/4Ng + eP+DXnz/g2B6/31ib/+EZpD/mHi+/5J6s/+SerT/jnTA/5Z/sv+ki5n/qoSj/6eHoP+kh5//qIme/6uM + of+qi6D/qoug/6yNov+rjKH/upyw/7yfsf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsf+8nq//vJ6x/7OV + qP+vkaT/sJGm/66PpP+zlKj/mnuQ/4hogf+MbIT/jW2F/4hogP+ig5n/wKK1/7udsP+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+9n7L/u52w/7ue + sP+wkab/r5Cn/7CQp/+wkKf/sJCn/7CQp/+wkKf/sJCn/7CQp/+wkKf/sJCn/7CQp/+wkKf/sJCn/6+P + pv+3mK3/vJ2y/7udsf+8nrH/vJ+v/7yfr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+9n7L/uJqt/4xvhf+Ka4T/jGyE/4ps + hP+GbIX/t6i+/7qyx/+7scb/vq7F/76vxf/EwdT/v8nY/73I1v/Cx9b/wcfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/gV95/4Fbgv+AYHr/e2Ft/4lrh/+liKn/o4mb/6WK + nP+ghqr/noig/6WNkv+rhKX/poeh/6SIoP+mh5z/pYab/6aHnP+mh5z/pYab/6eInf+6nLD/vJ+x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsP+9n7L/vaCx/76hsv++obL/vaCx/8Oltv+Yeo3/d1dw/39e + eP98XHb/eVly/5p6kf/Bo7b/u52w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vZ+y/7udsP+8nrH/vZ+y/76gs/++oLT/vqC0/76gtP++oLT/vqC0/76g + tP++oLT/vqC0/76gtP++oLT/vqC0/76gtP++n7T/vp61/7ydsv+9nrP/u5yw/7yesf+8n6//vJ+v/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+7nbD/vJ6x/7udsP+2mKv/fmB3/3tbdv99XXb/elx1/3Vfd//FvNH/ysvf/8TI3P/Iydz/zcnd/8TG + 2P+8x9f/vcjW/8LH1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v9/YXf/fluD/35gfP97YHH/i2qI/6uJov+sipb/roqT/6eHof+jiZn/qI2R/6yDpv+miJ//o4md/6aG + nv+mh57/p4ee/6eIn/+nh57/qIif/7qbr/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7qc + rv+7nq7/u56u/7uerv+6na3/wKOy/5d5jf98XHT/gF57/4Nhfv96WXP/nHyT/8Gitv+7nbD/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ud + sP+6nK//u52w/7udsP+7nbD/u52w/7udsP+7nbD/u52w/7udsP+7nbD/u52w/7udsP+7nbD/u52w/7ye + sf+7m7L/u5yx/7ucsf+7nbH/vJ6x/7yfr/+8n6//vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vZ6x/7udsP+6nK//vqCz/7eYq/+CZHv/fl55/4Bf + ev9+YHr/d2N6/7+5zv/Axtn/t8bX/7vF1//BxNf/v8bX/7vI1/+9yNb/wsfW/8HH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/4BgeP+AX3v/gGB6/31edv+LaoX/qomi/6eF + nP+ph5z/p4ag/6aHnf+oiZv/qYaf/6eInf+miZ3/p4ed/6eInf+nh53/poec/6eHnf+niJ3/upuv/7ye + sf+7nbD/u56v/7yer/+7nq7/u52t/7uesP+8nrH/vZ+y/7yesf+8nrH/vJ6x/7uer/+/orH/mXuO/3tb + dP+CYXz/gWB7/3xcdf+bfJL/wKK0/7qcrv+7nbD/vJ6w/7udsP+7nbH/vJ6y/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/72fsv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7udsf+8nrH/vJ6x/7udsf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/up6x/7mf + sf+6nbD/upuw/72dsv+6m7H/tpmv/4Fje/9/Xnj/gl95/39gef95Y3v/wLfN/8XI2/+9xtb/wMnY/8DG + 1v/Ax9f/v8jW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/gGB5/4Bgef+BYXn/fVx2/4xshf+qiqP/qIih/6qKpP+piqP/p4eg/6aGn/+niJ3/p4id/6eI + nf+niJ3/p4id/6eInf+niJ3/poec/6iJnv+7nLH/vqC0/76gs/++oLP/vaCw/72gr/+7nq3/vJ6w/7ye + sf+8nrH/vJ6x/7yesf+8nrH/u52w/8GktP+WeIv/eFhw/3xcdv9+Xnf/dVVu/5l6kP/Fp7n/vqCz/7+h + tP+/obT/v6G0/7ucsf+8nrL/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+4nbD/uaCy/7ugsv/Borb/wJ+1/8Ghuf+3m7L/dl11/3BZ + cf91WXL/cllx/25cc/+9t8z/xcjb/7/G1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v+AYHn/gGB5/4Bgef9/X3j/g2N8/4xs + hf+MbIX/imqD/4hogf+RcYr/qImg/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6aHnP+mh5z/p4id/62O + o/+uj6P/rY+j/66Qo/+sj6D/uJyr/7yfr/+8nrD/vJ6x/7yesf+8nrH/vJ6x/7yesf+7nbD/vaCw/7CT + pP+piqD/qoqi/6eHoP+sjKP/nn+U/5Bwhv+Scoj/knOI/45whP+ggZb/vqCz/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yg + s/+wl6n/kHKH/5NyiP+RcYn/kXOL/5J2jv+xo7n/rqi8/7GmvP+yprz/rqe7/8HB1f/Axtn/v8fX/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/4Bgef+AYHn/gGB5/4Bgef9/X3j/fV12/35ed/98XHX/fV12/4Vlff+piaH/p4ed/6eI + nf+niJ3/p4id/6eInf+niJ3/poec/6eInf+mh5z/poac/6WGnP+lhpv/poeb/6WHmf+4m6z/vJ+v/7ue + r/+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8n6//vaCw/8CitP/Aorb/vp61/8Sluv+ggZf/dlZv/31d + dv99XXT/eFlu/5Fyh//Bo7b/uZuu/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nbD/vqG1/66Spv96W3H/flx0/3xddf93WnP/fmN8/8zG + 2v/Hz+D/ycze/8rM3v/KzN7/wsjZ/77G1//Ax9f/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/gGB5/4Bgef+AYHn/gGB5/4Bg + ef+BYXr/gGB5/4BgeP9+Xnf/iGiA/6iIoP+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ7/p4eg/6eIn/+oiZ7/poib/7iarf+9n7L/vJ6w/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yf + sP+8n6//u56u/7uerv+5m67/v6C1/6CAmP98XHb/gmJ7/4Jiev99XXT/lXaL/8Chtf+6nK//vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+9n7P/sZKp/4Bfd/+DYXr/gmJ7/3teeP+BZ4H/w7/T/7zI1/+9xtX/vsbW/77G1v+/x9f/v8jX/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v+AYHn/gGB5/4Bgef+AYHn/gGB5/4Bgef+AYHn/f194/35ed/+HZ4D/qIig/6eI + nf+niJ3/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eHnv+nh5//p4ef/6eIn/+mh5z/uJmt/72f + sv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yfr/+8n67/vKCu/7qdrf/AobX/oICY/3ta + dv+BYHz/gWF6/3xcdP+UdYv/wKK1/7qdrv+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6w/76ftP+ykar/gF52/4Jgef+AYHr/eV14/39n + gP/EwdT/wMnX/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/4Bgef+AYHn/gGB5/4Bg + ef+AYHn/gGB5/4Bgef9/X3j/fl53/4dngP+oiKD/p4id/6eInf+niJ3/p4id/6eInf+niJ3/p4id/6eI + nf+niJ3/p4ef/6eHoP+nh5//p4ef/6aHnP+4ma7/vZ+y/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ+v/7yfrv+8oK3/up2s/8Chtf+ggJn/e1l4/4Ffff+BYHr/fFx0/5R1i//AorX/up2u/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7yesf+8nrH/vJ6x/7ye + sf+8nrD/vp+0/7ORqv+AXnf/gl95/4Bgev95XXf/fmeB/8bA1f/EyNf/wsfW/8DH1v/Ax9b/wMfW/8HH + 1v/Bx9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH1v/Ax9b/wMfW/8DH + 1v/Ax9b/wMfW/8DH1v/Ax9b/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/FunGame/UI/Start.cs b/FunGame/UI/Start.cs new file mode 100644 index 0000000..0d89156 --- /dev/null +++ b/FunGame/UI/Start.cs @@ -0,0 +1,15 @@ +namespace FunGame.UI +{ + internal static class Start + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + Application.Run(new Main()); + } + } +} \ No newline at end of file diff --git a/FunGame/Utils/DataHelper/AssemblyHelper.cs b/FunGame/Utils/DataHelper/AssemblyHelper.cs new file mode 100644 index 0000000..d9b548a --- /dev/null +++ b/FunGame/Utils/DataHelper/AssemblyHelper.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Reflection; +using FunGame.Models.Config; +using FunGame.Models.Enum; +using System.Diagnostics; + +namespace FunGame.Utils.DataHelper +{ + /// + /// 在FunGame.Core中添加新接口和新实现时,需要: + /// 1、在这里定义类名和方法名 + /// 2、在FunGame.Models.Enum.CommonEnums里同步添加InterfaceType和InterfaceMethod + /// + public class AssemblyHelper + { + /** + * 定义类名 + */ + public const string ServerInterface = "ServerInterface"; + + public const string Implement = "Impl"; // 实现类的后缀(无需修改) + + /** + * 定义方法名 + */ + public const string GetRemoteServerIP = "RemoteServerIP"; + + /** + * 定义反射变量 + */ + private Assembly? Assembly; + private Type? Type; + private MethodInfo? Method; + private object? Instance; + + /// + /// 获取FunGame.Core.dll中接口的实现方法 + /// + /// 类名 + /// + private Type? GetFunGameCoreImplement(int Interface) + { + // 通过类名获取获取命名空间+类名称 + string ClassName = Interface switch + { + (int)CommonEnums.InterfaceType.ServerInterface => ServerInterface + Implement, + _ => "", + }; + List? Classes = null; + if (Assembly != null) + { + Classes = Assembly.GetTypes().Where(w => + w.Namespace == "FunGame.Core.Implement" && + w.Name.Contains(ClassName) + ).ToList(); + if (Classes != null && Classes.Count > 0) + { + Debug.WriteLine(Classes); + return Classes[0]; + } + else return null; + } + else return null; + } + + private string GetMethodName(int Method) + { + // 通过AssemblyHelperType来获取方法名 + switch (Method) + { + case (int)CommonEnums.InterfaceMethod.GetServerIP: + return GetRemoteServerIP; + } + return ""; + } + + public object? GetFunGameCoreValue(int Interface, int Method) + { + Assembly = Assembly.LoadFile(System.Windows.Forms.Application.StartupPath + @"FunGame.Core.dll"); // 要绝对路径 + Type = GetFunGameCoreImplement(Interface); // 通过类名获取获取命名空间+类名称 + string MethodName = GetMethodName(Method); // 获取方法名 + if (Assembly != null && Type != null) this.Method = Type.GetMethod(MethodName); // 从Type中查找方法名 + else return null; + Instance = Assembly.CreateInstance(Type.Namespace + "." + Type.Name); + if (Instance != null && this.Method != null) + { + object? value = this.Method.Invoke(Instance, Array.Empty()); // 实例方法的调用 + if (value != null) + return value; + else return null; + } + else return null; + } + } +} diff --git a/FunGame/Utils/DataHelper/INIHelper.cs b/FunGame/Utils/DataHelper/INIHelper.cs new file mode 100644 index 0000000..0e38dda --- /dev/null +++ b/FunGame/Utils/DataHelper/INIHelper.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace FunGame.Utils.DataHelper +{ + public class INIHelper + { + /* + * 声明API函数 + */ + public string INIPath; + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + [DllImport("kernel32", CharSet = CharSet.Unicode)] + private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); + + /// + /// 构造函数 + /// + /// ini文件路径 + public INIHelper(string INIPath = "./fungame.milimoe") + { + this.INIPath = INIPath; + } + + /// + /// 写入ini文件 + /// + /// Section + /// 键 + /// 值 + public void WriteINI(string Section, string Key, string Value) + { + WritePrivateProfileString(Section, Key, Value, INIPath); + } + + /// + /// 读取ini文件 + /// + /// Section + /// 键 + /// 返回的值 + public string ReadINI(string Section, string Key) + { + StringBuilder temp = new StringBuilder(256); + int i = GetPrivateProfileString(Section, Key, "", temp, 256, INIPath); + return temp.ToString(); + } + + /// + /// 查询ini文件是否存在 + /// + /// 是否存在 + public bool ExistINIFile() + { + return File.Exists(INIPath); + } + } +} diff --git a/FunGame/Utils/WebHelper/WebHelper.cs b/FunGame/Utils/WebHelper/WebHelper.cs new file mode 100644 index 0000000..9fa6bee --- /dev/null +++ b/FunGame/Utils/WebHelper/WebHelper.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using FunGame.Models.Config; +using FunGame.Models.Component; +using FunGame.Models.Entity; +using System.ComponentModel.DataAnnotations; +using FunGame.Models.Enum; + +namespace FunGame.Utils.WebHelper +{ + public class WebHelper + { + private Socket? client; + private EndPoint? server; + Main Main; + + Action? WebHelper_Action = null; + + Task? WaitHeartBeat = null; + + public WebHelper(Main main) + { + Main = main; + } + + /// + /// 选择WebHelp分支方法 + /// + /// 分支方法ID + public void WebHelpMethod(int i) + { + switch (i) + { + case (int)CommonEnums.WebHelperMethod.CreateSocket: + CreateSocket(); + break; + case (int)CommonEnums.WebHelperMethod.CloseSocket: + Close(); + break; + case (int)CommonEnums.WebHelperMethod.StartWebHelper: + StartWebHelper(); + break; + } + } + + /// + /// 创建客户端专属Socket + /// + private void CreateSocket() + { + try + { + client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + server = new IPEndPoint(IPAddress.Parse(Config.SERVER_IPADRESS), Config.SERVER_PORT); + while (true) + { + if (!IsConnected()) + { + client.Connect(server); + if (IsConnected()) + { + Main.GetMessage(this, Config.WebHelper_SetGreen); + break; + } + } + } + WebHelper_Action = (main, socket) => + { + object? obj = main.GetMessage(this, Config.WebHelper_GetUser); + object[] objs; + if (obj != null) + objs = new object[] { main, socket, obj }; + else + objs = new object[] { main, socket }; + Task.Factory.StartNew(() => + { + + }); + if (Send((int)SocketEnums.Type.CheckLogin, objs)) // 确认连接的玩家 + StartWebHelper(); // 开始创建TCP流 + }; + Task t = Task.Factory.StartNew(() => + { + if (Main.InvokeRequired) + { + Main.Invoke(WebHelper_Action, Main, client); + } + else + { + WebHelper_Action(Main, client); + } + }); + } + catch (Exception e) + { + Main.GetMessage(this, Config.WebHelper_Disconnected); + Main.GetMessage(this, e.StackTrace); + Close(); + } + } + + /// + /// 判断是否连接成功 + /// + /// 连接状态 + public bool IsConnected() + { + if (client != null) + return client.Connected; + return false; + } + + private bool Read(object[]? objs = null) + { + Main main = Main; + Socket? socket = null; + try + { + if (objs != null) + { + if (objs.Length > 0) main = (Main)objs[0]; + if (objs.Length > 1) socket = (Socket)objs[1]; + } + else + { + main = Main; + socket = client; + } + if (socket != null) + { + // 从服务器接收消息 + byte[] buffer = new byte[2048]; + int length = socket.Receive(buffer); + if (length > 0) + { + string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); + int type = GetType(msg); + string typestring = GetTypeString(type); + string read = GetMessage(msg); + main.GetMessage(this, read); + switch (type) + { + case (int)SocketEnums.Type.GetNotice: + break; + case (int)SocketEnums.Type.Login: + break; + case (int)SocketEnums.Type.CheckLogin: + return true; + case (int)SocketEnums.Type.Logout: + break; + case (int)SocketEnums.Type.HeartBeat: + if (WaitHeartBeat != null && !WaitHeartBeat.IsCompleted) WaitHeartBeat.Wait(1); + Config.WebHelper_HeartBeatFaileds = 0; + return true; + } + } + else + throw new Exception("ERROR:未收到任何来自服务器的信息,与服务器连接可能丢失。"); + } + else + { + main.GetMessage(this, Config.WebHelper_Disconnected); + throw new Exception("ERROR:服务器连接失败。"); + } + } + catch (Exception e) + { + main.GetMessage(this, Config.WebHelper_Disconnected); + main.GetMessage(this, e.Message != null ? e.Message + "\n" + e.StackTrace : "" + e.StackTrace); + Close(); + } + return false; + } + + private bool Send(int i, object[]? objs = null) + { + Main main = Main; + Socket? socket = null; + try + { + if (objs != null) + { + if (objs.Length > 0) main = (Main)objs[0]; + if (objs.Length > 1) socket = (Socket)objs[1]; + } + else + { + main = Main; + socket = client; + } + if (socket != null) + { + // 发送消息给服务器端 + switch (i) + { + case (int)SocketEnums.Type.GetNotice: + break; + case (int)SocketEnums.Type.Login: + break; + case (int)SocketEnums.Type.CheckLogin: + User user; + string msg; + if (objs != null && objs.Length > 2) + { + user = (User)objs[2]; + msg = user.Userame; + } + else + { + Usercfg.FunGame_isAutoRetry = false; + throw new Exception("SUCCESS:服务器连接成功,检测到未登录账号已自动断开,请登录后手动发起服务器连接。"); + } + byte[] buffer = new byte[2048]; + buffer = Config.DEFAULT_ENCODING.GetBytes(MakeMessage((int)SocketEnums.Type.CheckLogin, msg)); + int l = socket.Send(buffer); + if (l > 0) + { + return Read(objs); + } + else + throw new Exception("ERROR:消息未送达服务器,与服务器连接可能丢失。"); + case (int)SocketEnums.Type.Logout: + break; + case (int)SocketEnums.Type.HeartBeat: + buffer = new byte[2048]; + buffer = Config.DEFAULT_ENCODING.GetBytes(Convert.ToString(MakeMessage((int)SocketEnums.Type.HeartBeat, ">> 心跳检测"))); + if (socket.Send(buffer) > 0) + { + WaitHeartBeat = Task.Run(() => + { + Thread.Sleep(4000); + AddHeartBeatFaileds(main); + }); + return true; + } + AddHeartBeatFaileds(main); + break; + } + } + else + { + main.GetMessage(this, Config.WebHelper_Disconnected); + throw new Exception("ERROR:服务器连接失败。"); + } + } + catch (Exception e) + { + CatchException(main, e, false); + } + return false; + } + + private void CatchException(Main main, Exception e, bool isDisconnected) + { + if (isDisconnected) + main.GetMessage(this, Config.WebHelper_Disconnected); + else + main.GetMessage(this, Config.WebHelper_SetRed); + main.GetMessage(this, e.Message != null ? e.Message + "\n" + e.StackTrace : "" + e.StackTrace); + Close(); + } + + private void AddHeartBeatFaileds(Main main) + { + // 超过三次没回应心跳,服务器连接失败。 + try + { + Config.WebHelper_HeartBeatFaileds++; + if (Config.WebHelper_HeartBeatFaileds >= 3) + throw new Exception("ERROR:服务器连接失败。"); + } + catch (Exception e) + { + CatchException(main, e, true); + } + } + + private int GetType(string msg) + { + int index = msg.IndexOf(';') - 1; + if (index > 0) + return Convert.ToInt32(msg[..index]); + else + return Convert.ToInt32(msg[..1]); + } + + private string GetTypeString(int type) + { + switch (type) + { + case (int)SocketEnums.Type.GetNotice: + return SocketEnums.TYPE_GetNotice; + case (int)SocketEnums.Type.Login: + return SocketEnums.TYPE_Login; + case (int)SocketEnums.Type.CheckLogin: + return SocketEnums.TYPE_CheckLogin; + case (int)SocketEnums.Type.Logout: + return SocketEnums.TYPE_Logout; + case (int)SocketEnums.Type.HeartBeat: + return SocketEnums.TYPE_HeartBeat; + default: + return SocketEnums.TYPE_UNKNOWN; + } + } + + private string GetMessage(string msg) + { + int index = msg.IndexOf(';') + 1; + return msg[index..]; + } + + private string MakeMessage(int type, string msg) + { + return type + ";" + msg; + } + + private void Close() + { + if (client != null) + { + client.Close(); + client = null; + } + if (server != null) + { + server = null; + } + } + + private void StartWebHelper() + { + Task HeartBeatStream = Task.Factory.StartNew(() => + { + CreateSendHeartBeatStream(); + }); + Task StreamReader = Task.Factory.StartNew(() => + { + CreateStreamReader(); + }); + } + + private void CreateSendHeartBeatStream() + { + Thread.Sleep(1000); + Main.GetMessage(this, "Creating: SendHeartBeatStream...OK"); + while (IsConnected()) + { + Send((int)SocketEnums.Type.HeartBeat); // 发送心跳包 + Thread.Sleep(20000); + } + } + + private void CreateStreamReader() + { + Thread.Sleep(1000); + Main.GetMessage(this, "Creating: StreamReader...OK"); + while (IsConnected()) + { + Read(); + } + } + } +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb31c99 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# FunGame \ No newline at end of file