Browse Source

initial commit

pull/7/head
Zack Rauen 3 years ago
commit
2303d56d66
  1. 5
      .gitignore
  2. 25
      BandagedBD.sln
  3. 37
      BandagedBD/App.config
  4. BIN
      BandagedBD/BBD_small64.ico
  5. 236
      BandagedBD/BandagedBD.csproj
  6. 33
      BandagedBD/Controls/Button.cs
  7. 251
      BandagedBD/Controls/DiscordLocator.Designer.cs
  8. 68
      BandagedBD/Controls/DiscordLocator.cs
  9. 120
      BandagedBD/Controls/DiscordLocator.resx
  10. 21
      BandagedBD/Controls/FlatCheckBox.cs
  11. 28
      BandagedBD/Controls/FlatProgressBar.cs
  12. 190
      BandagedBD/FormMain.Designer.cs
  13. 100
      BandagedBD/FormMain.cs
  14. 479
      BandagedBD/FormMain.resx
  15. 208
      BandagedBD/Panels/ActionPanel.Designer.cs
  16. 45
      BandagedBD/Panels/ActionPanel.cs
  17. 120
      BandagedBD/Panels/ActionPanel.resx
  18. 12
      BandagedBD/Panels/IPanel.cs
  19. 92
      BandagedBD/Panels/InstallConfigPanel.Designer.cs
  20. 40
      BandagedBD/Panels/InstallConfigPanel.cs
  21. 120
      BandagedBD/Panels/InstallConfigPanel.resx
  22. 126
      BandagedBD/Panels/InstallPanel.Designer.cs
  23. 195
      BandagedBD/Panels/InstallPanel.cs
  24. 120
      BandagedBD/Panels/InstallPanel.resx
  25. 90
      BandagedBD/Panels/LicensePanel.Designer.cs
  26. 27
      BandagedBD/Panels/LicensePanel.cs
  27. 120
      BandagedBD/Panels/LicensePanel.resx
  28. 207
      BandagedBD/Panels/RepairConfigPanel.Designer.cs
  29. 56
      BandagedBD/Panels/RepairConfigPanel.cs
  30. 120
      BandagedBD/Panels/RepairConfigPanel.resx
  31. 94
      BandagedBD/Panels/RepairPanel.Designer.cs
  32. 67
      BandagedBD/Panels/RepairPanel.cs
  33. 120
      BandagedBD/Panels/RepairPanel.resx
  34. 109
      BandagedBD/Panels/UninstallConfigPanel.Designer.cs
  35. 47
      BandagedBD/Panels/UninstallConfigPanel.cs
  36. 120
      BandagedBD/Panels/UninstallConfigPanel.resx
  37. 94
      BandagedBD/Panels/UninstallPanel.Designer.cs
  38. 53
      BandagedBD/Panels/UninstallPanel.cs
  39. 120
      BandagedBD/Panels/UninstallPanel.resx
  40. 16
      BandagedBD/Program.cs
  41. 35
      BandagedBD/Properties/AssemblyInfo.cs
  42. 125
      BandagedBD/Properties/Resources.Designer.cs
  43. 318
      BandagedBD/Properties/Resources.resx
  44. 74
      BandagedBD/Properties/Settings.Designer.cs
  45. 21
      BandagedBD/Properties/Settings.settings
  46. BIN
      BandagedBD/Resources/BBDVS.png
  47. BIN
      BandagedBD/Resources/archive_small.png
  48. BIN
      BandagedBD/Resources/build_small.png
  49. BIN
      BandagedBD/Resources/delete_small.png
  50. 152
      BandagedBD/Utilities.cs
  51. 80
      BandagedBD/app.manifest
  52. 7
      LICENSE
  53. 61
      README.md

5
.gitignore

@ -0,0 +1,5 @@
.vs/
bin/
obj/
*.user

25
BandagedBD.sln

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BandagedBD", "BandagedBD\BandagedBD.csproj", "{390615F1-CE33-4173-9E8C-4E4F3EB1758D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{390615F1-CE33-4173-9E8C-4E4F3EB1758D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C4B9CD4A-4904-43C7-BE3F-B72A35C86ADF}
EndGlobalSection
EndGlobal

37
BandagedBD/App.config

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="BandagedBD.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="BandagedBD.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
</startup>
<userSettings>
<BandagedBD.Properties.Settings>
<setting name="AgreedToTerms" serializeAs="String">
<value>False</value>
</setting>
</BandagedBD.Properties.Settings>
</userSettings>
<applicationSettings>
<BandagedBD.Properties.Settings>
<setting name="PrimaryBackground" serializeAs="String">
<value>28, 28, 28</value>
</setting>
<setting name="SecondaryBackground" serializeAs="String">
<value>42, 42, 42</value>
</setting>
<setting name="Accent" serializeAs="String">
<value>62, 130, 229</value>
</setting>
<setting name="TextColor" serializeAs="String">
<value>White</value>
</setting>
</BandagedBD.Properties.Settings>
</applicationSettings>
</configuration>

BIN
BandagedBD/BBD_small64.ico

236
BandagedBD/BandagedBD.csproj

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{390615F1-CE33-4173-9E8C-4E4F3EB1758D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>BandagedBD</RootNamespace>
<AssemblyName>BandagedBD</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>BBD_small64.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup />
<PropertyGroup>
<SignManifests>false</SignManifests>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>false</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Controls\Button.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Controls\Button.Designer.cs">
<DependentUpon>Button.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FlatCheckBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Controls\FlatProgressBar.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="FormMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormMain.Designer.cs">
<DependentUpon>FormMain.cs</DependentUpon>
</Compile>
<Compile Include="Panels\ActionPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\ActionPanel.Designer.cs">
<DependentUpon>ActionPanel.cs</DependentUpon>
</Compile>
<Compile Include="Controls\DiscordLocator.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Controls\DiscordLocator.Designer.cs">
<DependentUpon>DiscordLocator.cs</DependentUpon>
</Compile>
<Compile Include="Panels\InstallConfigPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\InstallConfigPanel.Designer.cs">
<DependentUpon>InstallConfigPanel.cs</DependentUpon>
</Compile>
<Compile Include="Panels\RepairConfigPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\RepairConfigPanel.Designer.cs">
<DependentUpon>RepairConfigPanel.cs</DependentUpon>
</Compile>
<Compile Include="Panels\RepairPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\RepairPanel.Designer.cs">
<DependentUpon>RepairPanel.cs</DependentUpon>
</Compile>
<Compile Include="Panels\UninstallPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\UninstallPanel.Designer.cs">
<DependentUpon>UninstallPanel.cs</DependentUpon>
</Compile>
<Compile Include="Panels\UninstallConfigPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\UninstallConfigPanel.Designer.cs">
<DependentUpon>UninstallConfigPanel.cs</DependentUpon>
</Compile>
<Compile Include="Panels\InstallPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\InstallPanel.Designer.cs">
<DependentUpon>InstallPanel.cs</DependentUpon>
</Compile>
<Compile Include="Panels\IPanel.cs" />
<Compile Include="Panels\LicensePanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\LicensePanel.Designer.cs">
<DependentUpon>LicensePanel.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utilities.cs" />
<EmbeddedResource Include="FormMain.resx">
<DependentUpon>FormMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\ActionPanel.resx">
<DependentUpon>ActionPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\DiscordLocator.resx">
<DependentUpon>DiscordLocator.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\InstallConfigPanel.resx">
<DependentUpon>InstallConfigPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\RepairConfigPanel.resx">
<DependentUpon>RepairConfigPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\RepairPanel.resx">
<DependentUpon>RepairPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\UninstallPanel.resx">
<DependentUpon>UninstallPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\UninstallConfigPanel.resx">
<DependentUpon>UninstallConfigPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\InstallPanel.resx">
<DependentUpon>InstallPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Panels\LicensePanel.resx">
<DependentUpon>LicensePanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.manifest">
<SubType>Designer</SubType>
</None>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config">
<SubType>Designer</SubType>
</None>
</ItemGroup>
<ItemGroup>
<Content Include="BBD_small64.ico" />
<Content Include="fork.ico" />
<None Include="Resources\BBDVS.png" />
<None Include="Resources\delete_small.png" />
<None Include="Resources\build_small.png" />
<None Include="Resources\archive_small.png" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

33
BandagedBD/Controls/Button.cs

@ -0,0 +1,33 @@
namespace BandagedBD.Controls {
public partial class Button : System.Windows.Forms.Button {
public Button HideDisable(string newText = null) {
if (newText != null) Text = newText;
Hide();
Enabled = false;
return this;
}
public Button HideEnable(string newText = null) {
if (newText != null) Text = newText;
Hide();
Enabled = true;
return this;
}
public Button ShowDisable(string newText = null) {
if (newText != null) Text = newText;
Show();
Enabled = false;
return this;
}
public Button ShowEnable(string newText = null) {
if (newText != null) Text = newText;
Show();
Enabled = true;
return this;
}
}
}

251
BandagedBD/Controls/DiscordLocator.Designer.cs

@ -0,0 +1,251 @@
namespace BandagedBD.Controls {
partial class DiscordLocator {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.titleLabel = new System.Windows.Forms.Label();
this.browsePTB = new BandagedBD.Controls.Button();
this.tbPTB = new System.Windows.Forms.TextBox();
this.panel3 = new System.Windows.Forms.Panel();
this.browseCanary = new BandagedBD.Controls.Button();
this.tbCanary = new System.Windows.Forms.TextBox();
this.panel1 = new System.Windows.Forms.Panel();
this.browseStable = new BandagedBD.Controls.Button();
this.tbStable = new System.Windows.Forms.TextBox();
this.panel2 = new System.Windows.Forms.Panel();
this.discordPTB = new BandagedBD.Controls.FlatCheckBox();
this.discordCanary = new BandagedBD.Controls.FlatCheckBox();
this.discordStable = new BandagedBD.Controls.FlatCheckBox();
this.SuspendLayout();
//
// titleLabel
//
this.titleLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
this.titleLabel.AutoSize = true;
this.titleLabel.BackColor = System.Drawing.Color.Transparent;
this.titleLabel.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.titleLabel.Location = new System.Drawing.Point(6, 9);
this.titleLabel.Name = "titleLabel";
this.titleLabel.Size = new System.Drawing.Size(533, 13);
this.titleLabel.TabIndex = 37;
this.titleLabel.Text = "BandagedBD can attempt to fix several common problems. First we need to locate al" +
"l BandagedBD installations:";
//
// browsePTB
//
this.browsePTB.Anchor = System.Windows.Forms.AnchorStyles.None;
this.browsePTB.BackColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.browsePTB.Cursor = System.Windows.Forms.Cursors.Hand;
this.browsePTB.FlatAppearance.BorderSize = 0;
this.browsePTB.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.browsePTB.ForeColor = System.Drawing.Color.White;
this.browsePTB.Location = new System.Drawing.Point(573, 120);
this.browsePTB.Name = "browsePTB";
this.browsePTB.Size = new System.Drawing.Size(75, 23);
this.browsePTB.TabIndex = 36;
this.browsePTB.Text = "Browse";
this.browsePTB.UseVisualStyleBackColor = false;
this.browsePTB.Click += new System.EventHandler(this.browsePTB_Click);
//
// tbPTB
//
this.tbPTB.Anchor = System.Windows.Forms.AnchorStyles.None;
this.tbPTB.BackColor = global::BandagedBD.Properties.Settings.Default.SecondaryBackground;
this.tbPTB.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.tbPTB.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.tbPTB.ForeColor = System.Drawing.Color.White;
this.tbPTB.Location = new System.Drawing.Point(169, 125);
this.tbPTB.Name = "tbPTB";
this.tbPTB.ReadOnly = true;
this.tbPTB.Size = new System.Drawing.Size(385, 13);
this.tbPTB.TabIndex = 34;
//
// panel3
//
this.panel3.Anchor = System.Windows.Forms.AnchorStyles.None;
this.panel3.BackColor = global::BandagedBD.Properties.Settings.Default.SecondaryBackground;
this.panel3.Location = new System.Drawing.Point(156, 120);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(411, 23);
this.panel3.TabIndex = 35;
//
// browseCanary
//
this.browseCanary.Anchor = System.Windows.Forms.AnchorStyles.None;
this.browseCanary.BackColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.browseCanary.Cursor = System.Windows.Forms.Cursors.Hand;
this.browseCanary.FlatAppearance.BorderSize = 0;
this.browseCanary.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.browseCanary.ForeColor = System.Drawing.Color.White;
this.browseCanary.Location = new System.Drawing.Point(573, 78);
this.browseCanary.Name = "browseCanary";
this.browseCanary.Size = new System.Drawing.Size(75, 23);
this.browseCanary.TabIndex = 33;
this.browseCanary.Text = "Browse";
this.browseCanary.UseVisualStyleBackColor = false;
this.browseCanary.Click += new System.EventHandler(this.browseCanary_Click);
//
// tbCanary
//
this.tbCanary.Anchor = System.Windows.Forms.AnchorStyles.None;
this.tbCanary.BackColor = global::BandagedBD.Properties.Settings.Default.SecondaryBackground;
this.tbCanary.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.tbCanary.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.tbCanary.ForeColor = System.Drawing.Color.White;
this.tbCanary.Location = new System.Drawing.Point(169, 83);
this.tbCanary.Name = "tbCanary";
this.tbCanary.ReadOnly = true;
this.tbCanary.Size = new System.Drawing.Size(385, 13);
this.tbCanary.TabIndex = 31;
//
// panel1
//
this.panel1.Anchor = System.Windows.Forms.AnchorStyles.None;
this.panel1.BackColor = global::BandagedBD.Properties.Settings.Default.SecondaryBackground;
this.panel1.Location = new System.Drawing.Point(156, 78);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(411, 23);
this.panel1.TabIndex = 32;
//
// browseStable
//
this.browseStable.Anchor = System.Windows.Forms.AnchorStyles.None;
this.browseStable.BackColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.browseStable.Cursor = System.Windows.Forms.Cursors.Hand;
this.browseStable.FlatAppearance.BorderSize = 0;
this.browseStable.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.browseStable.ForeColor = System.Drawing.Color.White;
this.browseStable.Location = new System.Drawing.Point(573, 37);
this.browseStable.Name = "browseStable";
this.browseStable.Size = new System.Drawing.Size(75, 23);
this.browseStable.TabIndex = 30;
this.browseStable.Text = "Browse";
this.browseStable.UseVisualStyleBackColor = false;
this.browseStable.Click += new System.EventHandler(this.browseStable_Click);
//
// tbStable
//
this.tbStable.Anchor = System.Windows.Forms.AnchorStyles.None;
this.tbStable.BackColor = global::BandagedBD.Properties.Settings.Default.SecondaryBackground;
this.tbStable.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.tbStable.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.tbStable.ForeColor = System.Drawing.Color.White;
this.tbStable.Location = new System.Drawing.Point(169, 42);
this.tbStable.Name = "tbStable";
this.tbStable.ReadOnly = true;
this.tbStable.Size = new System.Drawing.Size(385, 13);
this.tbStable.TabIndex = 28;
//
// panel2
//
this.panel2.Anchor = System.Windows.Forms.AnchorStyles.None;
this.panel2.BackColor = global::BandagedBD.Properties.Settings.Default.SecondaryBackground;
this.panel2.Location = new System.Drawing.Point(156, 37);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(411, 23);
this.panel2.TabIndex = 29;
//
// discordPTB
//
this.discordPTB.Anchor = System.Windows.Forms.AnchorStyles.None;
this.discordPTB.AutoSize = true;
this.discordPTB.Cursor = System.Windows.Forms.Cursors.Hand;
this.discordPTB.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.discordPTB.Location = new System.Drawing.Point(9, 124);
this.discordPTB.Name = "discordPTB";
this.discordPTB.Size = new System.Drawing.Size(98, 17);
this.discordPTB.TabIndex = 27;
this.discordPTB.Text = "Repair On PTB";
this.discordPTB.UseVisualStyleBackColor = true;
this.discordPTB.CheckedChanged += new System.EventHandler(this.discordPTB_CheckedChanged);
//
// discordCanary
//
this.discordCanary.Anchor = System.Windows.Forms.AnchorStyles.None;
this.discordCanary.AutoSize = true;
this.discordCanary.Cursor = System.Windows.Forms.Cursors.Hand;
this.discordCanary.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.discordCanary.Location = new System.Drawing.Point(9, 82);
this.discordCanary.Name = "discordCanary";
this.discordCanary.Size = new System.Drawing.Size(110, 17);
this.discordCanary.TabIndex = 26;
this.discordCanary.Text = "Repair On Canary";
this.discordCanary.UseVisualStyleBackColor = true;
this.discordCanary.CheckedChanged += new System.EventHandler(this.discordCanary_CheckedChanged);
//
// discordStable
//
this.discordStable.Anchor = System.Windows.Forms.AnchorStyles.None;
this.discordStable.AutoSize = true;
this.discordStable.Cursor = System.Windows.Forms.Cursors.Hand;
this.discordStable.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.discordStable.Location = new System.Drawing.Point(9, 41);
this.discordStable.Name = "discordStable";
this.discordStable.Size = new System.Drawing.Size(107, 17);
this.discordStable.TabIndex = 25;
this.discordStable.Text = "Repair On Stable";
this.discordStable.UseVisualStyleBackColor = true;
this.discordStable.CheckedChanged += new System.EventHandler(this.discordStable_CheckedChanged);
//
// DiscordLocator
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.Controls.Add(this.titleLabel);
this.Controls.Add(this.browsePTB);
this.Controls.Add(this.tbPTB);
this.Controls.Add(this.panel3);
this.Controls.Add(this.browseCanary);
this.Controls.Add(this.tbCanary);
this.Controls.Add(this.panel1);
this.Controls.Add(this.browseStable);
this.Controls.Add(this.tbStable);
this.Controls.Add(this.panel2);
this.Controls.Add(this.discordPTB);
this.Controls.Add(this.discordCanary);
this.Controls.Add(this.discordStable);
this.Name = "DiscordLocator";
this.Size = new System.Drawing.Size(662, 161);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Controls.Button browsePTB;
private System.Windows.Forms.TextBox tbPTB;
private System.Windows.Forms.Panel panel3;
private Controls.Button browseCanary;
private System.Windows.Forms.TextBox tbCanary;
private System.Windows.Forms.Panel panel1;
private Controls.Button browseStable;
private System.Windows.Forms.TextBox tbStable;
private System.Windows.Forms.Panel panel2;
private BandagedBD.Controls.FlatCheckBox discordPTB;
private BandagedBD.Controls.FlatCheckBox discordCanary;
private BandagedBD.Controls.FlatCheckBox discordStable;
private System.Windows.Forms.Label titleLabel;
}
}

68
BandagedBD/Controls/DiscordLocator.cs

@ -0,0 +1,68 @@
using System;
using System.Windows.Forms;
namespace BandagedBD.Controls {
public partial class DiscordLocator : UserControl {
public bool stable => discordStable.Checked;
public bool canary => discordCanary.Checked;
public bool ptb => discordPTB.Checked;
public EventHandler OnCheckedChange;
public DiscordLocator() {
InitializeComponent();
if (Utilities.CurrentStablePath != null) tbStable.Text = Utilities.CurrentStablePath;
if (Utilities.CurrentCanaryPath != null) tbCanary.Text = Utilities.CurrentCanaryPath;
if (Utilities.CurrentPtbPath != null) tbPTB.Text = Utilities.CurrentPtbPath;
Utilities.EnsureDiscord(tbStable, discordStable, Discord.Stable);
Utilities.EnsureDiscord(tbCanary, discordCanary, Discord.Canary);
Utilities.EnsureDiscord(tbPTB, discordPTB, Discord.PTB);
}
public void setLabel(string label) {
titleLabel.Text = label;
}
public void setCheckboxLabel(Discord which, string label) {
if (which == Discord.Stable) discordStable.Text = label;
if (which == Discord.Canary) discordCanary.Text = label;
if (which == Discord.PTB) discordPTB.Text = label;
}
private void browseStable_Click(object sender, EventArgs e) {
var fbd = new FolderBrowserDialog { SelectedPath = tbStable.Text };
fbd.ShowDialog();
tbStable.Text = fbd.SelectedPath;
Utilities.EnsureDiscord(tbStable, discordStable, Discord.Stable);
}
private void browseCanary_Click(object sender, EventArgs e) {
var fbd = new FolderBrowserDialog { SelectedPath = tbCanary.Text };
fbd.ShowDialog();
tbCanary.Text = fbd.SelectedPath;
Utilities.EnsureDiscord(tbCanary, discordCanary, Discord.Canary);
}
private void browsePTB_Click(object sender, EventArgs e) {
var fbd = new FolderBrowserDialog { SelectedPath = tbPTB.Text };
fbd.ShowDialog();
tbPTB.Text = fbd.SelectedPath;
Utilities.EnsureDiscord(tbPTB, discordPTB, Discord.PTB);
}
private void discordStable_CheckedChanged(object sender, EventArgs e) {
if (discordStable.Checked) Utilities.EnsureDiscord(tbStable, discordStable, Discord.Stable);
OnCheckedChange?.Invoke(sender, e);
}
private void discordCanary_CheckedChanged(object sender, EventArgs e) {
if (discordCanary.Checked) Utilities.EnsureDiscord(tbCanary, discordCanary, Discord.Canary);
OnCheckedChange?.Invoke(sender, e);
}
private void discordPTB_CheckedChanged(object sender, EventArgs e) {
if (discordPTB.Checked) Utilities.EnsureDiscord(tbPTB, discordPTB, Discord.PTB);
OnCheckedChange?.Invoke(sender, e);
}
}
}

120
BandagedBD/Controls/DiscordLocator.resx

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

21
BandagedBD/Controls/FlatCheckBox.cs

@ -0,0 +1,21 @@
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;
namespace BandagedBD.Controls {
class FlatCheckBox : CheckBox {
public FlatCheckBox() {
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
e.Graphics.FillRectangle(new SolidBrush(Properties.Settings.Default.SecondaryBackground), new Rectangle(0, 0, 13, 14));
if (Checked) {
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString("\u2714", this.Font, new SolidBrush(Properties.Settings.Default.Accent), -1, 1);
}
}
}
}

28
BandagedBD/Controls/FlatProgressBar.cs

@ -0,0 +1,28 @@
using System.Drawing;
using System.Windows.Forms;
namespace BandagedBD.Controls {
public class FlatProgressBar : ProgressBar {
public FlatProgressBar() {
SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaintBackground(PaintEventArgs pevent) {
// None... Helps control the flicker.
// No seriously, it works.
}
protected override void OnPaint(PaintEventArgs e) {
using (Image offscreenImage = new Bitmap(Width, Height)) {
using (Graphics offscreen = Graphics.FromImage(offscreenImage)) {
Rectangle rect = new Rectangle(0, 0, Width, Height);
offscreen.FillRectangle(new SolidBrush(BackColor), rect);
rect.Width = (int) (rect.Width * ((double) (Value - Minimum) / (Maximum - Minimum)));
if (rect.Width > 0) offscreen.FillRectangle(new SolidBrush(ForeColor), 0, 0, rect.Width, rect.Height);
e.Graphics.DrawImage(offscreenImage, 0, 0);
offscreenImage.Dispose();
}
}
}
}
}

190
BandagedBD/FormMain.Designer.cs

@ -0,0 +1,190 @@
using System.Drawing;
namespace BandagedBD {
partial class FormMain {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
private readonly Pen headerPen = new Pen(Color.FromArgb(32, 32, 32));
private readonly SolidBrush headerBrush = new SolidBrush(Properties.Settings.Default.SecondaryBackground);
private Rectangle headerShape => new Rectangle(0, 0, Width, 85);
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing) {
headerBrush.Dispose();
headerPen.Dispose();
if (components != null) components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
this.panelDock = new System.Windows.Forms.Panel();
this.lblTitle = new System.Windows.Forms.Label();
this.logo = new System.Windows.Forms.Panel();
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.label1 = new System.Windows.Forms.Label();
this.btnCancel = new BandagedBD.Controls.Button();
this.btnNext = new BandagedBD.Controls.Button();
this.btnBack = new BandagedBD.Controls.Button();
this.SuspendLayout();
//
// panelDock
//
this.panelDock.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panelDock.BackColor = System.Drawing.Color.Transparent;
this.panelDock.Location = new System.Drawing.Point(12, 96);
this.panelDock.Name = "panelDock";
this.panelDock.Size = new System.Drawing.Size(752, 339);
this.panelDock.TabIndex = 0;
//
// lblTitle
//
this.lblTitle.AutoSize = true;
this.lblTitle.BackColor = System.Drawing.Color.Transparent;
this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold);
this.lblTitle.ForeColor = System.Drawing.Color.White;
this.lblTitle.Location = new System.Drawing.Point(82, 37);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(145, 16);
this.lblTitle.TabIndex = 5;
this.lblTitle.Text = "BandagedBD Setup";
//
// logo
//
this.logo.BackColor = System.Drawing.Color.Transparent;
this.logo.BackgroundImage = global::BandagedBD.Properties.Resources.BBDVS;
this.logo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.logo.Cursor = System.Windows.Forms.Cursors.Hand;
this.logo.Location = new System.Drawing.Point(12, 12);
this.logo.Name = "logo";
this.logo.Size = new System.Drawing.Size(64, 64);
this.logo.TabIndex = 4;
//
// linkLabel1
//
this.linkLabel1.ActiveLinkColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.linkLabel1.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.linkLabel1.AutoSize = true;
this.linkLabel1.Cursor = System.Windows.Forms.Cursors.Hand;
this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.linkLabel1.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkLabel1.LinkColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.linkLabel1.Location = new System.Drawing.Point(132, 471);
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(95, 13);
this.linkLabel1.TabIndex = 34;
this.linkLabel1.TabStop = true;
this.linkLabel1.Text = "Consider donating.";
this.linkLabel1.VisitedLinkColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
//
// label1
//
this.label1.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
this.label1.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.label1.Location = new System.Drawing.Point(13, 471);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(120, 13);
this.label1.TabIndex = 33;
this.label1.Text = "Enjoying BandagedBD?";
//
// btnCancel
//
this.btnCancel.BackColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.btnCancel.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.FlatAppearance.BorderSize = 0;
this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnCancel.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.btnCancel.Location = new System.Drawing.Point(689, 466);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 8;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = false;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// btnNext
//
this.btnNext.BackColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.btnNext.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnNext.FlatAppearance.BorderSize = 0;
this.btnNext.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnNext.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.btnNext.Location = new System.Drawing.Point(608, 466);
this.btnNext.Name = "btnNext";
this.btnNext.Size = new System.Drawing.Size(75, 23);
this.btnNext.TabIndex = 7;
this.btnNext.Text = "Next >";
this.btnNext.UseVisualStyleBackColor = false;
this.btnNext.Click += new System.EventHandler(this.btnNext_Click);
//
// btnBack
//
this.btnBack.BackColor = global::BandagedBD.Properties.Settings.Default.Accent;
this.btnBack.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnBack.FlatAppearance.BorderSize = 0;
this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnBack.ForeColor = global::BandagedBD.Properties.Settings.Default.TextColor;
this.btnBack.Location = new System.Drawing.Point(527, 466);
this.btnBack.Name = "btnBack";
this.btnBack.Size = new System.Drawing.Size(75, 23);
this.btnBack.TabIndex = 6;
this.btnBack.Text = "< Back";
this.btnBack.UseVisualStyleBackColor = false;
this.btnBack.Click += new System.EventHandler(this.btnBack_Click);
//
// FormMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = global::BandagedBD.Properties.Settings.Default.PrimaryBackground;
this.ClientSize = new System.Drawing.Size(776, 501);
this.Controls.Add(this.linkLabel1);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnNext);
this.Controls.Add(this.btnBack);
this.Controls.Add(this.lblTitle);
this.Controls.Add(this.logo);
this.Controls.Add(this.panelDock);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "FormMain";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "BandagedBD Installer v0.3.2";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panelDock;
private System.Windows.Forms.Panel logo;
private System.Windows.Forms.Label lblTitle;
public Controls.Button btnNext;
public Controls.Button btnCancel;
public Controls.Button btnBack;
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.Label label1;
}
}

100
BandagedBD/FormMain.cs

@ -0,0 +1,100 @@
using BandagedBD.Panels;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace BandagedBD {
public enum PanelTypes { License, Action, InstallConfig, RepairConfig, UninstallConfig, Install, Repair, Uninstall, NONE };
public partial class FormMain : Form {
private PanelTypes CurrentPanel = PanelTypes.NONE;
public PanelTypes Action = PanelTypes.NONE;
private Dictionary<PanelTypes, IPanel> panelMap = new Dictionary<PanelTypes, IPanel>();
public FormMain() {
InitializeComponent();
logo.Click += Logo_Click;
panelMap[PanelTypes.License] = new LicensePanel();
panelMap[PanelTypes.Action] = new ActionPanel();
panelMap[PanelTypes.InstallConfig] = new InstallConfigPanel();
panelMap[PanelTypes.UninstallConfig] = new UninstallConfigPanel();
panelMap[PanelTypes.RepairConfig] = new RepairConfigPanel();
panelMap[PanelTypes.Install] = new InstallPanel();
panelMap[PanelTypes.Uninstall] = new UninstallPanel();
panelMap[PanelTypes.Repair] = new RepairPanel();
foreach (KeyValuePair<PanelTypes, IPanel> entry in panelMap) {
entry.Value.SetWindow(this);
entry.Value.Control.Dock = DockStyle.Fill;
}
if (!Properties.Settings.Default.AgreedToTerms) SwitchPanel(PanelTypes.License);
else SwitchPanel(PanelTypes.Action);
}
public void SetTitle(string title) => lblTitle.Text = title;
public IPanel GetPanel(PanelTypes which) {
return panelMap[which];
}
public void SwitchPanel(PanelTypes which) {
if (CurrentPanel != PanelTypes.NONE) panelDock.Controls.Remove(panelMap[CurrentPanel].Control);
CurrentPanel = which;
panelDock.Controls.Add(panelMap[which].Control);
SetTitle($"BandagedBD — {panelMap[which].Title}");
panelMap[which].OnShow();
if (panelMap[CurrentPanel].PreviousPanel == PanelTypes.NONE) btnBack.HideDisable();
if (panelMap[CurrentPanel].NextPanel == PanelTypes.NONE) {
btnBack.HideDisable();
btnNext.HideDisable();
btnCancel.ShowEnable("Exit");
}
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
var g = e.Graphics;
g.FillRectangle(headerBrush, headerShape);
g.DrawLine(headerPen, 0, 85, Width, 85);
}
private void btnNext_Click(object sender, EventArgs e) {
if (CurrentPanel == PanelTypes.License) {
Properties.Settings.Default.AgreedToTerms = true;
Properties.Settings.Default.Save();
}
SwitchPanel(panelMap[CurrentPanel].NextPanel);
}
private void btnCancel_Click(object sender, EventArgs e) {
Application.Exit();
}
private void btnBack_Click(object sender, EventArgs e) {
SwitchPanel(panelMap[CurrentPanel].PreviousPanel);
}
public void Fail() {
btnCancel.ShowEnable();
btnNext.ShowDisable();
btnBack.ShowEnable();
}
private void Logo_Click(object sender, EventArgs e) {
Utilities.OpenProcess("https://github.com/rauenzi/BetterDiscordApp");
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
Utilities.OpenProcess("https://www.paypal.me/ZackRauen");
}
}
}

479
BandagedBD/FormMain.resx

@ -0,0 +1,479 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAQEAAAAEAIAAoQgAAJgAAACAgAAABACAAqBAAAE5CAAAoAAAAQAAAAIAAAAABACAAAAAAAABA
AAATCwAAEwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABJCQkAjEx
MQIxMTECMTExAjIyMgI0NDQCNjY2AjY2NgI2NjYCNjY2Ajc3NwI3NzcCNzc3Ajg4OAI4ODgCOjo6AkRE
RAJdXV0BlZWVAeDg4AGmpqYBbGxsAmhoaAJfX18CSUlJAikpKQEODg4BAAAAAQAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5+flw8vLyrPHx8a3x8fGt8fHxrfHx
8a3x8fGt8fHxrfHx8a/x8fGw8vLysPLy8rDy8vKw8fHxsPHx8bDx8fGw8fHxsPHx8bDy8vKw8vLysPHx
8bHx8fGx8vLysPHw8K/w6uWv693TrubLuKzes5Wq1JNmq8t2PK7Tej2u0no+rsNzPK6pZjiuh1Uyrl0/
K6kqJSGcGxsbiBYWFmsTExNFCwsLGAAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////8+PX/7dfI/9+x
kf/ThlL/2ns7/+OBPf/lgj7/44E+/79wOv+LVzL/TTcn/x0cHP0XFxfUFRUVlBMTE0YBAQELAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///6r/////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////+zZzP/Um3P/03g5/+OAPf/lgj7/5YI+/+WCPv/Ldjz/eU4w/yYj
IP8YGBj/FxcX3hQUFH0KCgoZAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+q////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////+7f1P/Mil3/2Xs7/+WC
Pv/lgj7/5YI+/+WCPv/Tej3/a0gv/x0dHf8XFxf/FxcX6hQUFHUCAgINAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////v38/9auk//OdTj/5IE9/+WCPv/lgj7/5YI+/+WCPv+pZzn/Kycj/xgYGP8XFxf/FhYWyA4O
Di4AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/6r/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////38Sx/8lzOP/kgT3/5YI+/+WCPv/lgj7/5YI+/8Nz
O/8zLCb/GBgY/xcXF/8XFxfrEBAQSwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///+q////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////avKf/zHM3/+SC
Pv/lgj7/5YI+/+WCPv/lgj7/wHI7/yonJP8XFxf/FxcX/xcXF/QQEBBPAAAAAwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////8iYeP/Yejr/5YI+/+WCPv/lgj7/5YI+/+WCPv+dYjn/Hh4e/xcXF/8XFxf/FxcX7g0N
DTcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6r/////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////38u//u3E+/+KAPf/lgj7/5YI+/+WCPv/lgj7/5YI+/1hA
MP8YGBj/FxcX/xcXF/8WFhbQAwMDFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///+q////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////9Gvl//Sdzn/5YI+/+WC
Pv/lgj7/5YI+/+WCPv+6bzz/ISEh/xcXF/8XFxf/FxcX/xMTE4EAAAAFAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///28e3/ums1/+SBPv/lgj7/5YI+/+WCPv/lgj7/5YI+/0w6Lv8YGBj/FxcX/xcXF/8XFxfsBgYGIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr6+nn09PS69PT0uvT09Lr09PS69PT0uvT0
9Lr09PS69PT0uvT09Lr09PS69PT0uvT09Lr09PS69PT0uvT09Lr09PS69PT0uvT09Lr09PS69PT0uvT0
9Lr09PS69vb2wvv7++P/////////////////////////////////////////////////////////////
/////////////////////////////8CLZv/efjz/5YI+/+WCPv/lgj7/5YI+/+WCPv+OWzj/Gxsb/xcX
F/8XFxf/FxcX/xISEnsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAD4uLiLPr6+p3////+////////////////////////
///////////////////////////////////////////////////Sspz/0nc5/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/v3I8/yEhIf8XFxf/FxcX/xcXF/8WFhbMAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4Vf//
//v/////////////////////////////////////////////////////////////////////5NLG/8Zw
Nf/lgj7/5YI+/+WCPv/lgj7/5YI+/+GAPv8oKCf/FxcX/xcXF/8XFxf/FxcX/AgICCkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD9/f2B////////////////////////////////////////////////////////
//////////////Lq5P+8ajL/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/QTUt/xcXF/8XFxf/FxcX/xcX
F/8QEBBgAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT0Dv7+/vb/////////////////////////////
///////////////////////////////////8+vj/tWYv/+SBPv/lgj7/5YI+/+WCPv/lgj7/5YI+/1I+
MP8YGBj/FxcX/xcXF/8XFxf/ExMTiQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f3G////////
/////////////////////////////////////////////////////////v7+/7NlMP/kgT7/5YI+/+WC
Pv/lgj7/5YI+/+WCPv9ZQTH/GBgY/xcXF/8XFxf/FxcX/xQUFKQAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/f39u/////////////////////////////////////////////////////////////////z6
+f+1ZS//5IE+/+WCPv/lgj7/5YI+/+WCPv/lgj7/Uz4w/xgYGP8XFxf/FxcX/xcXF/8UFBS0AAAACQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAmpqaAP7+/uL/////////////////////////////////////////////
///////////////////07un/umky/+SCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/0U3Lf8XFxf/FxcX/xcX
F/8XFxf/FRUVuQAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA8PDwEy8vLIMnJyS6WlpYfAAAACwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv7+0L/////////////////////////////
////////////////////////////////////////6dvR/8JuNP/lgj7/5YI+/+WCPv/lgj7/5YI+/+WC
Pv8uKyn/FxcX/xcXF/8XFxf/FxcX/xUVFbkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAPDw8Bv6+vqY/f397f////////////////f39+LY2NiOPz8/IgAAAAMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8BH+/v7X////////
/////////////////////////////////////////////////////////////9rBr//NdDf/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/PeT3/JCQk/xcXF/8XFxf/FxcX/xcXF/8VFRW5AAAACgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPn5+Tj+/v7s//////////////////////////////////////Hx
8dtdXV08AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx
8S/+/v7S////////////////////////////////////////////////////////////////////////
///JoIP/2Ho6/+WCPv/lgj7/5YI+/+WCPv/lgj7/qWg7/x4eHv8XFxf/FxcX/xcXF/8XFxf/FRUVuQAA
AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPn5+Rn+/v7r////////////////////////
////////////////////////6urq0w4ODicAAAABAAAAAAAAAADx8fEz39/fS93d3Uzd3d1M3d3dTN3d
3Uzj4+NU8fHxdvr6+rn////9////////////////////////////////////////////////////////
////////////////////////uXlN/+F/Pf/lgj7/5YI+/+WCPv/lgj7/5YI+/3ZQNf8ZGRn/FxcX/xcX
F/8XFxf/FxcX/xUVFbkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v6b////////
//////////////////////////////////////////////////+vr6+HAAAADQAAAAAAAAAA////u///
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////7N/W/8BtM//kgj7/5YI+/+WCPv/lgj7/5YI+/+GA
Pv82Lyr/FxcX/xcXF/8XFxf/FxcX/xcXF/8VFRW5AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD29vYQ////9///////////////////////////////////////////////////////////6+vr2QAA
ACYAAAAAAAAAAP///7v/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////8icfv/Yejr/5YI+/+WC
Pv/lgj7/5YI+/+WCPv+kZTr/Hh4e/xcXF/8XFxf/FxcX/xcXF/8XFxf/FRUVuQAAAAoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/Pz8Vf//////////////////////////////////////////////////
//////////////////9OTk5LAAAAAwAAAAD///+7////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////Hn
4P++bjf/5IE9/+WCPv/lgj7/5YI+/+WCPv/hgT7/RDYs/xgYGP8XFxf/FxcX/xcXF/8XFxf/FxcX/xUV
FbkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Yj/////////////////////////////
////////////////////////////////////////mpqaeQAAAAgAAAAA////u///////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////+/v/Ci2X/23w7/+WCPv/lgj7/5YI+/+WCPv/lgj7/i1k3/xwcHP8XFxf/FxcX/xcX
F/8XFxf/FxcX/xcXF/8VFRW5AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+l////////
/////////////////////////////////////////////////////////////7Ozs5EAAAAMAAAAAP//
/7v/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////RrpX/0HY4/+WCPv/lgj7/5YI+/+WCPv/lgj7/tm07/yUj
Iv8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FRUVuQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////qv//////////////////////////////////////////////////////////////////
//+3t7eWAAAADgAAAAD///+7////////////////////////////////////////////////////////
////////////////////////////////////////////////////////0KuS/9B2OP/lgj7/5YI+/+WC
Pv/lgj7/5YI+/7RsO/8kIyL/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xUVFbkAAAAKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6r/////////////////////////////////////////////
////////////////////////uLi4lwAAAA4AAAAA////u///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////7+
/v/BiWP/3Hw7/+WCPv/lgj7/5YI+/+WCPv/lgj7/iVg2/xwcHP8XFxf/FxcX/xcXF/8XFxf/FxcX/xcX
F/8VFRW5AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+q////////////////////////
/////////////////////////////////////////////7i4uJcAAAAOAAAAAP///7v/////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////8Obf/75uNv/kgT3/5YI+/+WCPv/lgj7/5YI+/+GAPv9DNiz/GBgY/xcX
F/8XFxf/FxcX/xcXF/8XFxf/FRUVuQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//
//////////////////////////////////////////////////////////////////+5ubmYAAAADgAA
AAD///+7////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////Im3z/2Xs6/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/omQ6/x4eHv8XFxf/FxcX/xcXF/8XFxf/FxcX/xUVFbkAAAAKAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///6r/////////////////////////////////////////////////////////////
////////u7u7mQAAAA4AAAAA////u///////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////693U/8Ft
NP/lgj7/5YI+/+WCPv/lgj7/5YI+/+GAPv81Lyr/FxcX/xcXF/8XFxf/FxcX/xcXF/8VFRW5AAAACgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+q////////////////////////////////////////
/////////////////////////////7u7u5kAAAAPAAAAAPHx8TXf399N3d3dTt3d3U7d3d1O3d3dTuTk
5Ffx8fF4+vr6vP////3/////////////////////////////////////////////////////////////
//////////////////+5eEz/4X89/+WCPv/lgj7/5YI+/+WCPv/lgj7/dU81/xkZGf8XFxf/FxcX/xcX
F/8XFxf/FRUVuQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////
//////////////////////////////////////////////////+7u7uaAAAADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fEx/v7+0///////////////////////////////////
////////////////////////////////////////yZ+C/9h7Ov/lgj7/5YI+/+WCPv/lgj7/5YI+/6lo
O/8eHh7/FxcX/xcXF/8XFxf/FxcX/xUVFbkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/6r/////////////////////////////////////////////////////////////////////u7u7mgAA
AA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/v7xH+/v7Y////////
/////////////////////////////////////////////////////////////9rAr//NdDf/5YI+/+WC
Pv/lgj7/5YI+/+WCPv/PeD3/JCQk/xcXF/8XFxf/FxcX/xcXF/8VFRW5AAAACgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///+q////////////////////////////////////////////////////////
/////////////7u7u5sAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA+/v7Q///////////////////////////////////////////////////////////////////
///p2tD/wm40/+WCPv/lgj7/5YI+/+WCPv/lgj7/5YI+/y4rKf8XFxf/FxcX/xcXF/8XFxf/FRUVuQAA
AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////////////////////
//////////////////////////////////+8vLybAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOjowD+/v7i////////////////////////////////////////
////////////////////////9O3o/7ppMv/kgj7/5YI+/+WCPv/lgj7/5YI+/+WCPv9FNy3/FxcX/xcX
F/8XFxf/FxcX/xUVFbgAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6r/////////////
////////////////////////////////////////////////////////vLy8nAAAAA8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39u///////////////////
//////////////////////////////////////////////z6+f+1ZS//5IE+/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/Uz4w/xgYGP8XFxf/FxcX/xcXF/8UFBSxAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///+q/////////////////////////////////////////////////////////////////////729
vZwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39
/cX////////////////////////////////////////////////////////////////+/v7/s2Uw/+SB
Pv/lgj7/5YI+/+WCPv/lgj7/5YI+/1lBMf8YGBj/FxcX/xcXF/8XFxf/FBQUnwAAAAUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////////////////////////////////////
//////////////////+9vb2dAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAPPz8w3+/v72////////////////////////////////////////////////////////
/////////Pr4/7VmL//kgT7/5YI+/+WCPv/lgj7/5YI+/+WCPv9TPjD/GBgY/xcXF/8XFxf/FxcX/xIS
EoAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6r/////////////////////////////
////////////////////////////////////////vb29nQAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f1/////////////////////////////////////////
//////////////////////////////Lq5P+8ajL/5YI+/+WCPv/lgj7/5YI+/+WCPv/lgj7/QTUt/xcX
F/8XFxf/FxcX/xcXF/8PDw9TAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+q////////
/////////////////////////////////////////////////////////////76+vp4AAAAQAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5+flS////+///////////////////
///////////////////////////////////////////////////k08f/xXA1/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/4YA+/ykoKP8XFxf/FxcX/xcXF/8XFxf2BAQEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////qv//////////////////////////////////////////////////////////////////
//++vr6eAAAAEgAAAAIAAAACAAAAAgAAAAIAAAACBAQEAjo6OgJAQEADKioqBOHh4Sn6+vqa/////f//
////////////////////////////////////////////////////////////////////////07Od/9J3
Of/lgj7/5YI+/+WCPv/lgj7/5YI+/8ByPP8hISH/FxcX/xcXF/8XFxf/FRUVvQAAAAsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6r/////////////////////////////////////////////
////////////////////////8fHx4u/v77z09PS49PT0uPT09Lj09PS49PT0uPT09Lnz8/O89fX1wvv7
++H/////////////////////////////////////////////////////////////////////////////
/////////////8CLZ//dfTz/5YI+/+WCPv/lgj7/5YI+/+WCPv+QXDj/Gxsb/xcXF/8XFxf/FxcX/xER
EWcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+q////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////fx7v+5azb/5IE9/+WCPv/lgj7/5YI+/+WCPv/lgj7/Tjsv/xgY
GP8XFxf/FxcX/xYWFt8CAgIXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////SsJn/0nc4/+WCPv/lgj7/5YI+/+WC
Pv/lgj7/vHA8/yEhIf8XFxf/FxcX/xcXF/8SEhJqAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///6r/////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////48/D/u3I//+KA
Pf/lgj7/5YI+/+WCPv/lgj7/5YI+/1pBMP8ZGRn/FxcX/xcXF/8VFRW8AAAADgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+q////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////yZp6/9d6Ov/lgj7/5YI+/+WCPv/lgj7/5YI+/6BjOf8eHh7/FxcX/xcXF/8WFhbiCgoKKAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////276r/8tzNv/kgT7/5YI+/+WCPv/lgj7/5YI+/8JzPP8rJyX/FxcX/xcX
F/8XFxfqDg4OPAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/6r/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////4Ma1/8hzOP/jgT3/5YI+/+WCPv/lgj7/5YI+/8V0
PP81LCf/GBgY/xcXF/8WFhbgDw8POQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///+q////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////+/f3/17GX/811OP/jgT3/5YI+/+WC
Pv/lgj7/5YI+/61oOf8tKCT/GBgY/xcXF/8WFha2CwsLIgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////qv//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////v4df/zIxg/9l7
Ov/kgj7/5YI+/+WCPv/lgj7/1Xs9/29KMP8dHR3/FxcX/xcXF+ETExNjAAAACgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///6r/////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////+3c
0P/VnXf/0ng6/+KAPf/lgj7/5YI+/+WCPv/Odzz/fFAx/ygkIf8YGBj/FhYW1RQUFHAGBgYSAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///+q////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////z5
+P/u2cv/4LOU/9SIVf/Zezr/44E9/+WCPv/kgj7/wnI6/49YM/9QOCj/HR0d+xcXF88VFRWOEhISPQAA
AAkAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA+/v7cvPz87Dy8vKx8vLysfLy8rHy8vKx8vLysfLy8rHy8vKz8vLytPLy
8rTy8vK08vLytPLy8rTy8vK08vLytPLy8rTy8vK08vLytPLy8rTy8vK08vLytPLy8rTx8PCy8Ovnsuze
1bDmzbuu37WYrdSVaq7Ldz6y03o9stN6PrHEczyxq2c4sopWMrFhQSusLScinhsbG4kXFxdqExMTQwoK
ChUAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAIAAAACAAAAAgAA
AAIAAAACJiYmAjIyMgIyMjICMjIyAjMzMwIzMzMCNTU1AjY2NgI3NzcCNzc3Ajg4OAI4ODgCODg4Ajk5
OQI6OjoCOzs7AkNDQwJbW1sBjY2NAdfX1wGdnZ0BbW1tAmpqagJgYGACSUlJAisrKwIQEBACAQEBAQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////AAAAAAH///8AAAAAAA
///wAAAAAAAf//AAAAAAAAf/8AAAAAAAA//wAAAAAAAB//AAAAAAAAB/8AAAAAAAAH/wAAAAAAAAP/AA
AAAAAAAf8AAAAAAAAB/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/////8AAAAB/////4AAAAH/////wAA
AAf/////gAAAB/////+AAAAH/////wAAAAf/AP//AAAAB/wAP/4AAAAH/AA/8AAAAAf4ABgAAAAAB/gA
GAAAAAAH8AAIAAAAAAfwAAgAAAAAB/AACAAAAAAH8AAIAAAAAAfwAAgAAAAAB/AACAAAAAAH8AAIAAAA
AAfwAAgAAAAAB/AACAAAAAAH8AAIAAAAAAfwAA/wAAAAB/AAD/4AAAAH8AAP/wAAAAfwAA//AAAAB/AA
D/+AAAAH8AAP/4AAAAfwAA//AAAAB/AAD/4AAAAH8AAP/AAAAAfwAAAAAAAAD/AAAAAAAAAP8AAAAAAA
AA/wAAAAAAAAH/AAAAAAAAAf8AAAAAAAAD/wAAAAAAAAf/AAAAAAAAD/8AAAAAAAAf/wAAAAAAAD//AA
AAAAAAf/8AAAAAAAH//wAAAAAAD///AAAAAAH///////////////////////////////////KAAAACAA
AABAAAAAAQAgAAAAAAAAEAAAEwsAABMLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AAEAAAABKysrATExMQEzMzMBNjY2ATY2NgE3NzcBODg4ATk5OQFPT08Btra2AIODgwFkZGQBOjo6AQgI
CAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv7
+7H5+fnW+fn51vn5+db5+fnX+fn52Pn5+dj5+fnY+fn52Pn5+dj5+fnY+fn51/j08dfz5dvV68u21t6m
f9fJeUHXtms31ZFYMclWOierGRkZfBQUFDcBAQEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////1P//////////////////////////////////////////////////////////////////
//////////////r18v/lvKD/24JF/+WCPv/Dcjr/Xz8p/xgYGNYVFRVeAgICAwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD////U////////////////////////////////////////////////////////
///////////////////////////////////06uP/1otY/+WCPv/lgj7/n2E1/x4cG/8WFha4Dw8PFAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///9T/////////////////////////////////////////////
///////////////////////////////////////////////////27un/1IJK/+WCPv/lgj7/m182/xkZ
Gf8WFhbMDAwMDwAAAAAAAAAAAAAAAAAAAAAAAAAA////1P//////////////////////////////////
///////////////////////////////////////////////////////////////////hxLH/4H88/+WC
Pv/lgj7/Uzop/xcXF/8VFRWZAAAAAQAAAAAAAAAAAAAAAAAAAAD7+/u3+vr63fr6+t36+vrd+vr63fr6
+t36+vrd+vr63fr6+t36+vrd+vr63fv7+9/+/v74//////////////////////////////////////37
+v/PfUX/5YI+/+WCPv+pZjn/GBgY/xcXF/oPDw8oAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA
AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAdLS0gz8/Px8/////v//////////////////
/////////////9SbdP/lgj7/5YI+/9p9Pv8eHh7/FxcX/xQUFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v6h////////
////////////////////////2K2P/+WCPv/lgj7/5YI+/zAoI/8XFxf/FRUVugAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39
/WD////////////////////////////////ZsZX/5II+/+WCPv/lgj7/Nywk/xcXF/8WFhbWAAAABAAA
AAAAAAAAAAAAAAAAAAAAAAAAOTk5AcrKyhRvb28KAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/v7+if///////////////////////////////9aoiP/lgj7/5YI+/+WCPv8oJCH/FxcX/xYW
FtwAAAAFAAAAAAAAAAAAAAAAAAAAAPz8/FD+/v7h//////39/fjo6OiiU1NTEQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAPr6+kT////1////////////////////////////////0pRp/+WCPv/lgj7/0Xk9/xwc
HP8XFxf/FhYW3AAAAAUAAAAAAAAAAAAAAAD9/f0t////+v/////////////////////Z2dmgAAAAA/z8
/Dz39/el9/f3pvj4+Kj8/PzL/////v////////////////////////////////r39f/Qej//5YI+/+WC
Pv+dYDf/GBgY/xcXF/8WFhbcAAAABQAAAAAAAAAAAAAAAP7+/pf///////////////////////////v7
+/YyMjId////Xv//////////////////////////////////////////////////////////3byl/+GA
Pf/lgj7/5II+/0c0J/8XFxf/FxcX/xYWFtwAAAAFAAAAAAAAAAAAAAAA////y///////////////////
/////////////5ycnEj///9e///////////////////