From 99b1db952bd3a3b8e07b8fb0f52552094b1e803d Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 17:20:02 +0200 Subject: [PATCH 01/50] install: begin rework --- ModpackUpdater.GitLab/UpdateConfigExt.vb | 4 +- ModpackUpdater.Manager/UpdateInstaller.vb | 4 +- ModpackUpdater.Model/InstallAction.vb | 9 + ModpackUpdater.Model/InstallInfos.vb | 11 + ModpackUpdater.Model/ModpackConfig.vb | 15 + ModpackUpdater.Model/UpdateConfig.vb | 22 - ModpackUpdater.sln | 6 - ModpackUpdater/Form1.Designer.vb | 33 +- ModpackUpdater/Form1.resx | 12 +- ModpackUpdater/Form1.vb | 13 +- ModpackUpdater/FormSettings.Designer.vb | 154 -- ModpackUpdater/FormSettings.de.resx | 1938 ------------------- ModpackUpdater/FormSettings.resx | 2153 --------------------- ModpackUpdater/FormSettings.vb | 47 - ModpackUpdater/ModpackUpdater.vbproj | 1 - 15 files changed, 64 insertions(+), 4358 deletions(-) create mode 100644 ModpackUpdater.Model/InstallAction.vb create mode 100644 ModpackUpdater.Model/InstallInfos.vb create mode 100644 ModpackUpdater.Model/ModpackConfig.vb delete mode 100644 ModpackUpdater.Model/UpdateConfig.vb delete mode 100644 ModpackUpdater/FormSettings.Designer.vb delete mode 100644 ModpackUpdater/FormSettings.de.resx delete mode 100644 ModpackUpdater/FormSettings.resx delete mode 100644 ModpackUpdater/FormSettings.vb diff --git a/ModpackUpdater.GitLab/UpdateConfigExt.vb b/ModpackUpdater.GitLab/UpdateConfigExt.vb index 4e2cda3..be312ed 100644 --- a/ModpackUpdater.GitLab/UpdateConfigExt.vb +++ b/ModpackUpdater.GitLab/UpdateConfigExt.vb @@ -24,10 +24,10 @@ Public Class UpdateConfigExt ' client.Snippets.Update(update) 'End Sub - Public Shared Function LoadFromSnippet(url As String) As UpdateConfig + Public Shared Function LoadFromSnippet(url As String) As ModpackConfig Dim client As New HttpClient Dim result = client.GetStringAsync(url).Result - Return JsonConvert.DeserializeObject(Of UpdateConfig)(result) + Return JsonConvert.DeserializeObject(Of ModpackConfig)(result) End Function End Class diff --git a/ModpackUpdater.Manager/UpdateInstaller.vb b/ModpackUpdater.Manager/UpdateInstaller.vb index 37f78f4..cc12d5f 100644 --- a/ModpackUpdater.Manager/UpdateInstaller.vb +++ b/ModpackUpdater.Manager/UpdateInstaller.vb @@ -11,12 +11,12 @@ Public Class UpdateInstaller Public Event InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) Public Event CheckingProgressUpdated(toCheck As Integer, processed As Integer) - Private ReadOnly updateConfig As UpdateConfig + Private ReadOnly updateConfig As ModpackConfig Private ReadOnly localPath As String Private webdavClient As WebDavClient = Nothing Private httpClient As New HttpClient - Public Sub New(updateConfig As UpdateConfig, localPath As String) + Public Sub New(updateConfig As ModpackConfig, localPath As String) Me.updateConfig = updateConfig Me.localPath = localPath End Sub diff --git a/ModpackUpdater.Model/InstallAction.vb b/ModpackUpdater.Model/InstallAction.vb new file mode 100644 index 0000000..908f32e --- /dev/null +++ b/ModpackUpdater.Model/InstallAction.vb @@ -0,0 +1,9 @@ +Imports Newtonsoft.Json.Converters + +Public Class InstallAction + + Public Property DestPath As String + Public Property DownloadUrl As String + Public Property IsZip As Boolean + +End Class diff --git a/ModpackUpdater.Model/InstallInfos.vb b/ModpackUpdater.Model/InstallInfos.vb new file mode 100644 index 0000000..9642120 --- /dev/null +++ b/ModpackUpdater.Model/InstallInfos.vb @@ -0,0 +1,11 @@ +Imports Newtonsoft.Json + +Public Class InstallInfos + + Public ReadOnly Property Actions As New List(Of InstallAction) + + Public Shared Function Parse(content As String) As InstallInfos + Return JsonConvert.DeserializeObject(Of InstallInfos)(content) + End Function + +End Class diff --git a/ModpackUpdater.Model/ModpackConfig.vb b/ModpackUpdater.Model/ModpackConfig.vb new file mode 100644 index 0000000..4f83fc2 --- /dev/null +++ b/ModpackUpdater.Model/ModpackConfig.vb @@ -0,0 +1,15 @@ +Imports System.Net.Http + +Imports Newtonsoft.Json + +Public Class ModpackConfig + + Public Property UpdateUrl As String + Public Property InstallUrl As String + + Public Shared Function LoadFromUrl(url As String) + Dim result As String = New HttpClient().GetStringAsync(url).Result + Return JsonConvert.DeserializeObject(Of ModpackConfig)(result) + End Function + +End Class diff --git a/ModpackUpdater.Model/UpdateConfig.vb b/ModpackUpdater.Model/UpdateConfig.vb deleted file mode 100644 index 11e27f1..0000000 --- a/ModpackUpdater.Model/UpdateConfig.vb +++ /dev/null @@ -1,22 +0,0 @@ -Imports System.IO - -Imports Newtonsoft.Json - -Imports Pilz.Cryptography - -Public Class UpdateConfig - - Public Property UpdateUrl As String - Public Property WebdavURL As SecureString - Public Property WebdavUsername As SecureString - Public Property WebdavPassword As SecureString - - Public Sub SaveToFile(filePath As String) - File.WriteAllText(filePath, JsonConvert.SerializeObject(Me)) - End Sub - - Public Shared Function LoadFromFile(filePath As String) As UpdateConfig - Return JsonConvert.DeserializeObject(Of UpdateConfig)(File.ReadAllText(filePath)) - End Function - -End Class diff --git a/ModpackUpdater.sln b/ModpackUpdater.sln index 6c770eb..0009289 100644 --- a/ModpackUpdater.sln +++ b/ModpackUpdater.sln @@ -9,8 +9,6 @@ Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ModpackUpdater.Model", "Mod EndProject Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ModpackUpdater.Manager", "ModpackUpdater.Manager\ModpackUpdater.Manager.vbproj", "{618DAFD6-3336-4621-82F9-EA5C783D2D2E}" EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ModpackUpdater.GitLab", "ModpackUpdater.GitLab\ModpackUpdater.GitLab.vbproj", "{65D44991-EB3B-4AC4-9166-3E8D0BADD402}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -29,10 +27,6 @@ Global {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Debug|Any CPU.Build.0 = Debug|Any CPU {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Release|Any CPU.ActiveCfg = Release|Any CPU {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Release|Any CPU.Build.0 = Release|Any CPU - {65D44991-EB3B-4AC4-9166-3E8D0BADD402}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65D44991-EB3B-4AC4-9166-3E8D0BADD402}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65D44991-EB3B-4AC4-9166-3E8D0BADD402}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65D44991-EB3B-4AC4-9166-3E8D0BADD402}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ModpackUpdater/Form1.Designer.vb b/ModpackUpdater/Form1.Designer.vb index 1636458..bb5427c 100644 --- a/ModpackUpdater/Form1.Designer.vb +++ b/ModpackUpdater/Form1.Designer.vb @@ -34,9 +34,9 @@ Partial Class Form1 RadButton_Install = New Telerik.WinControls.UI.RadButton() RadButton_CheckForUpdates = New Telerik.WinControls.UI.RadButton() RadButton_EditModpackConfig = New Telerik.WinControls.UI.RadButton() + RadButton_PasteModpackConfig = New Telerik.WinControls.UI.RadButton() RadButton_SearchModpackConfig = New Telerik.WinControls.UI.RadButton() RadButton_SearchMinecraftProfileFolder = New Telerik.WinControls.UI.RadButton() - RadButton_PasteModpackConfig = New Telerik.WinControls.UI.RadButton() CType(RadLabel1, ComponentModel.ISupportInitialize).BeginInit() CType(RadLabel2, ComponentModel.ISupportInitialize).BeginInit() CType(RadLabel3, ComponentModel.ISupportInitialize).BeginInit() @@ -47,9 +47,9 @@ Partial Class Form1 CType(RadButton_Install, ComponentModel.ISupportInitialize).BeginInit() CType(RadButton_CheckForUpdates, ComponentModel.ISupportInitialize).BeginInit() CType(RadButton_EditModpackConfig, ComponentModel.ISupportInitialize).BeginInit() + CType(RadButton_PasteModpackConfig, ComponentModel.ISupportInitialize).BeginInit() CType(RadButton_SearchModpackConfig, ComponentModel.ISupportInitialize).BeginInit() CType(RadButton_SearchMinecraftProfileFolder, ComponentModel.ISupportInitialize).BeginInit() - CType(RadButton_PasteModpackConfig, ComponentModel.ISupportInitialize).BeginInit() CType(Me, ComponentModel.ISupportInitialize).BeginInit() SuspendLayout() ' @@ -167,6 +167,20 @@ Partial Class Form1 RadButton_EditModpackConfig.Text = "Edit modpack config" RadButton_EditModpackConfig.TextAlignment = ContentAlignment.MiddleLeft RadButton_EditModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText + RadButton_EditModpackConfig.Visible = False + ' + ' RadButton_PasteModpackConfig + ' + RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top Or AnchorStyles.Right + RadButton_PasteModpackConfig.Image = CType(resources.GetObject("RadButton_PasteModpackConfig.Image"), Image) + RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight + RadButton_PasteModpackConfig.Location = New Point(231, 89) + RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig" + RadButton_PasteModpackConfig.Size = New Size(90, 24) + RadButton_PasteModpackConfig.TabIndex = 7 + RadButton_PasteModpackConfig.Text = "Paste" + RadButton_PasteModpackConfig.TextAlignment = ContentAlignment.MiddleLeft + RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText ' ' RadButton_SearchModpackConfig ' @@ -194,19 +208,6 @@ Partial Class Form1 RadButton_SearchMinecraftProfileFolder.TextAlignment = ContentAlignment.MiddleLeft RadButton_SearchMinecraftProfileFolder.TextImageRelation = TextImageRelation.ImageBeforeText ' - ' RadButton_PasteModpackConfig - ' - RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top Or AnchorStyles.Right - RadButton_PasteModpackConfig.Image = CType(resources.GetObject("RadButton_PasteModpackConfig.Image"), Image) - RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight - RadButton_PasteModpackConfig.Location = New Point(231, 89) - RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig" - RadButton_PasteModpackConfig.Size = New Size(90, 24) - RadButton_PasteModpackConfig.TabIndex = 7 - RadButton_PasteModpackConfig.Text = "Paste" - RadButton_PasteModpackConfig.TextAlignment = ContentAlignment.MiddleLeft - RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText - ' ' Form1 ' AutoScaleBaseSize = New Size(7, 15) @@ -230,9 +231,9 @@ Partial Class Form1 CType(RadButton_Install, ComponentModel.ISupportInitialize).EndInit() CType(RadButton_CheckForUpdates, ComponentModel.ISupportInitialize).EndInit() CType(RadButton_EditModpackConfig, ComponentModel.ISupportInitialize).EndInit() + CType(RadButton_PasteModpackConfig, ComponentModel.ISupportInitialize).EndInit() CType(RadButton_SearchModpackConfig, ComponentModel.ISupportInitialize).EndInit() CType(RadButton_SearchMinecraftProfileFolder, ComponentModel.ISupportInitialize).EndInit() - CType(RadButton_PasteModpackConfig, ComponentModel.ISupportInitialize).EndInit() CType(Me, ComponentModel.ISupportInitialize).EndInit() ResumeLayout(False) diff --git a/ModpackUpdater/Form1.resx b/ModpackUpdater/Form1.resx index c628285..4522632 100644 --- a/ModpackUpdater/Form1.resx +++ b/ModpackUpdater/Form1.resx @@ -120,12 +120,12 @@ - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAADvSURBVDhPY8AFJixbowfCUC5pYNLidfoTlqxbBcJ9SzboQoXxA9eolHlA/BOo6T8I9y5a87Jv - 4ZpXMD5IDojnQJVjAqDk3x8/f/2fu247WAMynrt+x3+QHFDNH6hyTACU/E8IgNRAlWMCZAM+//z3/9bb - vxg4rn7a/wknf4aCMFQbAiAbAFI84dRPvBiqDQFoYoDDpPsYOHrpC+INyFj3BgXDbKefARR7AV0zzHas - BrhEpXzaffjY/4MnTv/feOIWimJsGKoNAVwiU4Ndo1NWukalrkrrWnoMmyZkDNWGHUw68cti4smfq/Fh - iEoGBgDk9v/D66ccygAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAO9JREFUOE9j + wAUmLFujB8JQLmlg0uJ1+hOWrFsFwn1LNuhChfED16iUeUD8E6jpPwj3Llrzsm/hmlcwPkgOiOdAlWMC + oOTfHz9//Z+7bjtYAzKeu37Hf5AcUM0fqHJMAJT8TwiA1ECVYwJkAz7//Pf/1tu/GDiuftr/CSd/hoIw + VBsCIBsAUjzh1E+8GKoNAWhigMOk+xg4eukL4g3IWPcGBcNsp58BFHsBXTPMdqwGuESlfNp9+Nj/gydO + /9944haKYmwYqg0BXCJTg12jU1a6RqWuSutaegybJmQM1YYdTDrxy2LiyZ+r8WGISgYGAOT2/8PrpxzK + AAAAAElFTkSuQmCC diff --git a/ModpackUpdater/Form1.vb b/ModpackUpdater/Form1.vb index e2bbd71..5625789 100644 --- a/ModpackUpdater/Form1.vb +++ b/ModpackUpdater/Form1.vb @@ -13,7 +13,7 @@ Imports Telerik.WinControls.UI Public Class Form1 - Private updateConfig As New UpdateConfig + Private updateConfig As New ModpackConfig Private currentUpdating As Boolean = False Private lastUpdateCheckResult As UpdateCheckResult = Nothing @@ -74,11 +74,7 @@ Public Class Form1 RadTextBoxControl_ModpackConfig.Text = filePath Try If IsUpdateConfigLoaded() Then - If filePath.StartsWith("http") Then - updateConfig = UpdateConfigExt.LoadFromSnippet(filePath) - Else - updateConfig = UpdateConfig.LoadFromFile(filePath) - End If + updateConfig = ModpackConfig.LoadFromUrl(filePath) End If Catch ex As Exception RadTextBoxControl_ModpackConfig.Text = String.Empty @@ -169,11 +165,6 @@ Public Class Form1 End If End Sub - Private Sub ButtonX_EditUpdateConfig_Click(sender As Object, e As EventArgs) Handles RadButton_EditModpackConfig.Click - Dim frm As New FormSettings(updateConfig) - frm.ShowDialog(Me) - End Sub - Private Async Sub ButtonX_CheckForUpdates_Click(sender As Object, e As EventArgs) Handles RadButton_CheckForUpdates.Click ClearStatus() If CheckStatus() Then diff --git a/ModpackUpdater/FormSettings.Designer.vb b/ModpackUpdater/FormSettings.Designer.vb deleted file mode 100644 index f040029..0000000 --- a/ModpackUpdater/FormSettings.Designer.vb +++ /dev/null @@ -1,154 +0,0 @@ - _ -Partial Class FormSettings - Inherits Telerik.WinControls.UI.RadForm - - 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Wird vom Windows Form-Designer benötigt. - Private components As System.ComponentModel.IContainer - - 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. - 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. - 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. - _ - Private Sub InitializeComponent() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(FormSettings)) - Me.Panel1 = New System.Windows.Forms.Panel() - Me.RadTextBoxControl_WebdavPassword = New Telerik.WinControls.UI.RadTextBoxControl() - Me.RadTextBoxControl_WebdavUsername = New Telerik.WinControls.UI.RadTextBoxControl() - Me.RadTextBoxControl_WebdavURL = New Telerik.WinControls.UI.RadTextBoxControl() - Me.RadButton_SaveAndClose = New Telerik.WinControls.UI.RadButton() - Me.RadButton_SaveAs = New Telerik.WinControls.UI.RadButton() - Me.RadLabel3 = New Telerik.WinControls.UI.RadLabel() - Me.RadLabel2 = New Telerik.WinControls.UI.RadLabel() - Me.RadLabel1 = New Telerik.WinControls.UI.RadLabel() - Me.RadTextBoxControl_UpdateUrl = New Telerik.WinControls.UI.RadTextBoxControl() - Me.RadLabel4 = New Telerik.WinControls.UI.RadLabel() - Me.Panel1.SuspendLayout() - CType(Me.RadTextBoxControl_WebdavPassword, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadTextBoxControl_WebdavUsername, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadTextBoxControl_WebdavURL, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadButton_SaveAndClose, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadButton_SaveAs, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadLabel3, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadLabel2, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadLabel1, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadTextBoxControl_UpdateUrl, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.RadLabel4, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me, System.ComponentModel.ISupportInitialize).BeginInit() - Me.SuspendLayout() - ' - 'Panel1 - ' - Me.Panel1.BackColor = System.Drawing.Color.Transparent - Me.Panel1.Controls.Add(Me.RadTextBoxControl_UpdateUrl) - Me.Panel1.Controls.Add(Me.RadLabel4) - Me.Panel1.Controls.Add(Me.RadTextBoxControl_WebdavPassword) - Me.Panel1.Controls.Add(Me.RadTextBoxControl_WebdavUsername) - Me.Panel1.Controls.Add(Me.RadTextBoxControl_WebdavURL) - Me.Panel1.Controls.Add(Me.RadButton_SaveAndClose) - Me.Panel1.Controls.Add(Me.RadButton_SaveAs) - Me.Panel1.Controls.Add(Me.RadLabel3) - Me.Panel1.Controls.Add(Me.RadLabel2) - Me.Panel1.Controls.Add(Me.RadLabel1) - resources.ApplyResources(Me.Panel1, "Panel1") - Me.Panel1.Name = "Panel1" - ' - 'RadTextBoxControl_WebdavPassword - ' - resources.ApplyResources(Me.RadTextBoxControl_WebdavPassword, "RadTextBoxControl_WebdavPassword") - Me.RadTextBoxControl_WebdavPassword.Name = "RadTextBoxControl_WebdavPassword" - ' - 'RadTextBoxControl_WebdavUsername - ' - resources.ApplyResources(Me.RadTextBoxControl_WebdavUsername, "RadTextBoxControl_WebdavUsername") - Me.RadTextBoxControl_WebdavUsername.Name = "RadTextBoxControl_WebdavUsername" - ' - 'RadTextBoxControl_WebdavURL - ' - resources.ApplyResources(Me.RadTextBoxControl_WebdavURL, "RadTextBoxControl_WebdavURL") - Me.RadTextBoxControl_WebdavURL.Name = "RadTextBoxControl_WebdavURL" - ' - 'RadButton_SaveAndClose - ' - resources.ApplyResources(Me.RadButton_SaveAndClose, "RadButton_SaveAndClose") - Me.RadButton_SaveAndClose.Image = Global.ModpackUpdater.My.Resources.MySymbols.icons8_save_16px - Me.RadButton_SaveAndClose.Name = "RadButton_SaveAndClose" - ' - 'RadButton_SaveAs - ' - resources.ApplyResources(Me.RadButton_SaveAs, "RadButton_SaveAs") - Me.RadButton_SaveAs.Image = Global.ModpackUpdater.My.Resources.MySymbols.icons8_opened_folder_16px - Me.RadButton_SaveAs.Name = "RadButton_SaveAs" - ' - 'RadLabel3 - ' - resources.ApplyResources(Me.RadLabel3, "RadLabel3") - Me.RadLabel3.Name = "RadLabel3" - ' - 'RadLabel2 - ' - resources.ApplyResources(Me.RadLabel2, "RadLabel2") - Me.RadLabel2.Name = "RadLabel2" - ' - 'RadLabel1 - ' - resources.ApplyResources(Me.RadLabel1, "RadLabel1") - Me.RadLabel1.Name = "RadLabel1" - ' - 'RadTextBoxControl_UpdateUrl - ' - resources.ApplyResources(Me.RadTextBoxControl_UpdateUrl, "RadTextBoxControl_UpdateUrl") - Me.RadTextBoxControl_UpdateUrl.Name = "RadTextBoxControl_UpdateUrl" - ' - 'RadLabel4 - ' - resources.ApplyResources(Me.RadLabel4, "RadLabel4") - Me.RadLabel4.Name = "RadLabel4" - ' - 'FormSettings - ' - resources.ApplyResources(Me, "$this") - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.Controls.Add(Me.Panel1) - Me.MaximizeBox = False - Me.Name = "FormSettings" - Me.Panel1.ResumeLayout(False) - Me.Panel1.PerformLayout() - CType(Me.RadTextBoxControl_WebdavPassword, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadTextBoxControl_WebdavUsername, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadTextBoxControl_WebdavURL, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadButton_SaveAndClose, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadButton_SaveAs, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadLabel3, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadLabel2, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadLabel1, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadTextBoxControl_UpdateUrl, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.RadLabel4, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me, System.ComponentModel.ISupportInitialize).EndInit() - Me.ResumeLayout(False) - - End Sub - - Friend WithEvents Panel1 As Panel - Friend WithEvents RadLabel1 As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadTextBoxControl_WebdavPassword As Telerik.WinControls.UI.RadTextBoxControl - Friend WithEvents RadTextBoxControl_WebdavUsername As Telerik.WinControls.UI.RadTextBoxControl - Friend WithEvents RadTextBoxControl_WebdavURL As Telerik.WinControls.UI.RadTextBoxControl - Friend WithEvents RadButton_SaveAndClose As Telerik.WinControls.UI.RadButton - Friend WithEvents RadButton_SaveAs As Telerik.WinControls.UI.RadButton - Friend WithEvents RadLabel3 As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadLabel2 As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadTextBoxControl_UpdateUrl As Telerik.WinControls.UI.RadTextBoxControl - Friend WithEvents RadLabel4 As Telerik.WinControls.UI.RadLabel -End Class diff --git a/ModpackUpdater/FormSettings.de.resx b/ModpackUpdater/FormSettings.de.resx deleted file mode 100644 index bdb791b..0000000 --- a/ModpackUpdater/FormSettings.de.resx +++ /dev/null @@ -1,1938 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 146, 59 - - - 361, 22 - - - 146, 31 - - - 361, 22 - - - 146, 3 - - - 361, 22 - - - 347, 87 - - - 160, 24 - - - Speichern && Schließen - - - Speichern unter ... - - - 107, 19 - - - Webdav-Passwort: - - - 137, 19 - - - Webdav-Benutzername: - - - 81, 19 - - - Webdav-URL: - - - - AAABAAYAEBAAAAEAIABoBAAAZgAAACAgAAABACAAqBAAAM4EAAAwMAAAAQAgAKglAAB2FQAAQEAAAAEA - IAAoQgAAHjsAAICAAAABACAAKAgBAEZ9AAAAAAAAAQAgAC0YAABuhQEAKAAAABAAAAAgAAAAAQAgAAAA - AAAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgGAojXtgOJJtbQcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfWCfi31g/4t9YP+LfV/bioBgGAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfV8zi31g/4p9YGKKfF8ji31g5It+ - X4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3xhQot9YP+MgGEqAAAAAIt9 - YNeMfWCdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAYAiLfWDVi31g6Yt9 - YNiLfWD/i31g8It9YTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjoBjEot8 - YH2KfV+bi31g9Yt9YP+LfWDwi31hNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIl+XkGLfWD0i31g/4t9YPCMe18+iXxdKY1+X0OLgF0WAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAin1hP4t9YPSLfWD/i31g/4t9YP+LfWD/i31g7ox7YjwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJfl5Bi31g/4t9YP+LfWD/i31g/4t9YP+KfWDdqlVVAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi4BjLIt9YP+LfWD/i31gp4+AYBCKfWCXi31g/4t9 - XjkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8YEqLfWD/i31g/4+AYBAAAAAA/wAAAYp9 - YJeLfl9LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKgGAYi31g74t9YP+KfWCX/wAAAQAA - AAD/AAABlYBqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx7YjyKfWDdi31g/4p9 - YJf/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABIt9 - YTeLfGJEj4BgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAMP/AADZ/wAA2f8AAMH/AADw/wAA/H8AAP4H - AAD/AwAA/xMAAP87AAD/HwAA/48AAP//AAD//wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAot+ - XlGLfWCVi31gp4p9X4OLgGMsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJB6 - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABIt8YM+LfWD/i31g/4t9YP+LfWD/i31gsoCA - VQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjHtjH4t8X9OLfWD/i31g/4t9 - YP+LfWD/jH1fs5JtbQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIBmCop9 - YIWLfV/zi31g/4t9YP+LfWD/jH1fs5JtbQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIh3Zg+LfV9Wi31gj4x8YKiMfWCfi3xgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////+P///+A////AP///xh///48f//+PH - ///hx///8AP///gB///8AP///8B////gP///8Bz///gAP//8AB///gAP//8AD///Aw///weH//4Px//+ - D+f//wf///8D////gf///8D////4/////////////////ygAAAAwAAAAYAAAAAEAIAAAAAAAUCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAKMfmBdin1hsYt9 - YOaLfWD/i31g5op9YbGLfWFcgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinxfI4t+ - X8uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH5gyY+AYiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACKfGAli31g7It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YOyKfF8jAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKpVVQOLfWDQi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfGDNgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A - AAGMfmCUi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/in5fjoyAZhSMe18+in1ghYt+ - X8OLfWDpi31g/4t9YOqLfWCnjH1gNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/AAABjH5glIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/Yp+YJCZZmYFAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAYt9YJWLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfV+zgICAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAKLfF+ei31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i3xheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAIh3Zg+LfmGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAI17YTqLfWD+i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31gv4t0XQsAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfWCPi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YMqPgGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAEi31grIt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDKj4BgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAYx9 - YXyLfWD9i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i35fy4d4WhEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfWA9i31gxIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YMCLdF0LAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIh9XyuKfV92i31fu4t9YNeLfV/ri31g7ot9 - YN6LfWCNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA/8H/////AAD/AH////8AAP4AP////wAA/AAf//// - AAD8DB////8AAPg+D////wAA+D8P////AAD4fw////8AAPh+D////wAA+D4P////AAD8GAf///8AAPwA - A////wAA/gAB////AAD/AAD///8AAP/AAH///wAA//4AP///AAD//wAf//8AAP//gA///wAA///ABgf/ - AAD//+AAAf8AAP//8AAA/wAA///4AAD/AAD///wAAH8AAP///gAAPwAA////AAA/AAD///8AcD8AAP// - /gD4HwAA///+AfwfAAD///4D/h8AAP///gP/HwAA///+A/+fAAD///4B/98AAP///wD//wAA////AH// - AAD///+AP/8AAP///+Af/wAA////8A//AAD////+B/8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgGAQi4BeLot8YkSLfV45jnteGwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmWZmBYp8YWmLfmDFi31g/It9YP+LfWD/i31g/4t9 - YP+KfWDdin5fjoqAYBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXtiNIt9YNmLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV/zi31hbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjHxgUot9 - YPaLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfV+b/wAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjX1eMYt9YPSLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8X3sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAmWZmBYt9X9uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD+iXtiNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8YWeLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDkjH1gn4x+YVmLgF0Win5fjot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YLoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfmDHi31g/4t9 - YP+LfWD/i31g/4t9YP+LfGJEAAAAAAAAAAAAAAAAAAAAAP8AAAGMfmCSi31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD+iYBkHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLgF0Wi31g/Yt9YP+LfWD/i31g/4t9YP+LfWDn/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAYt9 - YJWLfWD/i31g/4t9YP+LfWD/i31g/4t8YWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAjXtgOIt9YP+LfWD/i31g/4t9YP+LfWD/i31fowAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/AAABi31gzIt9YP+LfWD/i31g/4t9YP+KfmGMAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI18X06LfWD/i31g/4t9YP+LfWD/i31g/4x+ - YV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABIt9YPCLfWD/i31g/4t9YP+LfWD/i31fowAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfWE/i31g/4t9 - YP+LfWD/i31g/4t9YP+JgGQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9XjmLfWD/i31g/4t9 - YP+LfWD/i31g/4p9YZkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAj4BiIot9YP+LfWD/i31g/4t9YP+LfWD/i35gmP8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfGB9i31g/4t9YP+LfWD/i31g/4t9YP+KfV92AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfWDci31g/4t9YP+LfWD/i31g/4t9YP+KfWGZ/wAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAi31gwot9YP+LfWD/i31g/4t9YP+LfWD/i35fYwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1ghYt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YJqAgIACgIBVBox7YjyMfV9+i31gwIt9YPyLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YPaMfmBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6A - YxKLfWDti31g/4t9YP+LfWD/i31g/4t9YP+LfWD/in1g0ot9YPSLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g9ox+YEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi31gWot9YP6LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD2jH5gRQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfGB/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YPaMfmBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx9 - YGiLfWD6i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g9ox+YEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjH5eSYt9YPeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9X+uLfl9LAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfl5Ji31g94t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/It9YHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx+XkmLfWD3i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i3xhZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjHxgUIt9YPqLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPaJfF0pAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGBIi31g94t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/jH5gyf8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx8YFCLfWD6i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfmBNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAin5hV4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH1g1KpVVQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkoBbDgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi4BdFot9YPKLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDVkHpkFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfGFUi31g/ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YN2IgF4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - YHiLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g3oiAXh4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi35gZYt9YPiLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDejHtjHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNfV4xin1g0ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YN6Me2MfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA - gASLfGFni31g3It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g3ox7Yx8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKpVVQOMfmFHjH1gnYt9YOKLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfV/bh3haEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi4BdFol7 - XjaLfGJEi3xiRI1+X0OIfV8rlYBqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - //////////////////////////////////////////////////////////////////////////gH//// - ////4AP////////AAP///////4AA////////AAB///////8AwD///////gfgP//////+B/A///////4H - +B///////g/4H//////+D/gf//////4H+D///////gPwP//////+AeAf//////8AAA///////4AAB/// - ////wAAD///////gAAH///////AAAP///////3AAf///////+AA////////8AB////////4AD/////// - /wAH////////gAOAP//////AAAAf/////+AAAA//////8AAAB//////4AAAD//////wAAAH//////gAA - Af//////AAAA//////8AAAD//////wAHAH/////+AB+Af/////4AP8B//////gB/4H/////+AH/wf/// - //4A//h//////gD//H/////+AP/+f/////4Af/9//////gA/////////AB////////+AD////////8AH - ////////4AP////////wAf////////wA/////////wB///////////////////////////////////// - ////////////////////////////////////////KAAAAIAAAAAAAQAAAQAgAAAAAAAACAEAAAAAAAAA - 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 - 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 - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl2 - Yg2LfGJEjHxgb4x+YJSLfWCljH1gqox9YJ+LfmCKi35hYY19XjGqVVUDAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAioBgGIt9YHKMfmDJi31g/It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YPGLfWCtjHxgUoCAVQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjnteG4t9YJWLfWD4i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g4Yp8 - YWmZZmYFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqlVVA4t9YHKLfWDyi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8X9OKfV87AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI57XhuLfWC/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YPyLfmCAqlVVAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACKfF8ji31f24t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWClgIBVBgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjX1iL4t9YO6LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfWG+gIBgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeA - YCCLfWDni31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWCs/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAEi35fw4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV9uAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+ - YICLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YPqIfV8rAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgGIii31g94t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9Yb4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - YZmLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g6Yx9YKqMfV9mi3xdIYt9X6uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOe14bi31g+ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPCKfWCvjH1gao6AYyQAAAAAAAAAAAAAAAAAAAAAgICAAot9 - YaGLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31gvQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8 - YXmLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9Ya6Ne2E6gICABAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqlVVA4t8YKKLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD+j4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3xg0Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/in1fOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqlVVA4t9X6OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+KfWB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZ5 - XhOLfWD9i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPKZZmYFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmWZmBYt9YK2LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjXxfTot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/in1hsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAqlVVA4t9YKWLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31f8/8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfGB3i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfGBtAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqlVVA4x9 - YKqLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/iIBeHgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+X5aLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4l8XSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1fg4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+KfWA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi31hoYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDl/wAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfmDFi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p8YEoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfWCni31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9YJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4BgEIt9YPyLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/jXxfTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIp9X5uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH5gXQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfmFPi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+Me2I8AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjH1gh4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+Oe14bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YJWLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4yAYCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACLfmFhi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YKWqVVUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi31g2ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV/7i3RdCwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIqAYTKLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p8YKSqVVUDAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx7Yx+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9Yc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAqlVVA4t9YO6LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9X6OqVVUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjH1hZIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31glQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi31gpYt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YKKqVVUDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfGCoi31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhi3xdIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfF9Gi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YaGAgIACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImA - ZByKfWBii31gp4t9YPaLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDhi3xdIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKpV - VQOLfV/bi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YJX/AAABAAAAAAAAAACAgIAEjH1fM4t+YICLfWDMi31g/Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YFqLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p8YKSLfF97i31gwIt9YPmLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqlVVA4t9YMyLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi4BeLot9YPeLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAinxhaYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1gl4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABi31fk4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi3xgd4t9YPyLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1gPYx9YN+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAgIBmCop9YIWLfWD1i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJB6 - ZBeLfmCIi31g5ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqVVUDiX5eQYp9YYGLfV+7i31g5ot9 - YP+LfWD/i31g/4t9YP+LfWDxi3xf04t8YKCMfF9zi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYBqDId4WhGHeFoRmWZmBQAAAAAAAAAAAAAAAAAA - AACJfGIni31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDij4BiIgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgGAIjHtiPIt+YGWKfmGMin1hmYp9YZmKfWGZi31fk4p8 - YG2KfWE/jnFVCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDij4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAqlVVA4x7YjyLfmCAi31gwIt9 - YPeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD5i31gtIt9YFiqVVUDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACNgF4mi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDni3xiRKpV - VQOMe2MfjHxhVIx9YJ2LfWDqi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YNiKfl9TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+KfWC8i3xdIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDvjHxgUAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfV/7jH5hXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i3xheQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLgGMsi31g6Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD9i31fVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD6i3xhQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BgEAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWCnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWFcAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLgGMsi31g6Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9YN+AgGAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8 - X3sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31f84Z5XhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g6Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/jH1ffgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfl5Ji31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV/rgIBmCgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5x - VQmLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinxfI4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YLUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACMfmBdi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YO6LfGCiin1fXox9 - XzOVgGoMAAAAAIt+YIKLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g+oZ5XhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8X6aLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YOWKfF9ri3RdCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9X4OLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH5fWwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACZZmYFi31g74t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP6LfWGRkoBbDgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9X4OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfV+bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI1+X0OLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD1jHxhVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - X4OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi35fhot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g9Yt9YTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+YYSLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/46AYxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfl/Di31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP6Mfl9bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIp+X46LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31hNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi3RdC4t9YPqLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31fiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+YYSLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfV9eAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfGBAi31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YOKVgGoMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9YIWLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIx9X2aLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH1fZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - YIWLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/in5fjgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi35giIt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YOyOcVUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9YIWLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfGCcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfWGZi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i3xgnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIt+X4aLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YKcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YKWLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+KfmBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+X4aLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i3xfngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi31gpYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/459YC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YI+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfmCSAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfmCYi31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD9gIBgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+ - X4aLfWD/i31g/4t9YP+LfWD/i31g/4t+X4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8YHeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx9YIeLfWD/i31g/4t9YP+LfWD/inxfawAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinxgSot9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIx9YIeLfWD/i31g/4t9YP+KfGBKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJdmINi31f+4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9YXwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx9YIeLfWD/i31g/4p8 - YCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfWC5i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4x8YXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA/wAAAYp+YJCLfWDvgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx8YVSLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9 - YXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8 - YUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAmWZmBYt9YOKLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x8YXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjH5hX4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8X3sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACAgIACi31gyIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YHAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfF0hi31g7ot9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfmBNi31g/Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9 - YHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACKfWF0i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfWB4i31g/ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfGFpi31g/It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YHAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNfl9Di31g54t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOe14bi31guYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjH5hWYt9X+OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3RdC4t+YIKLfWD0i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4p9YHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI57XhuLfWGRi31g8Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/ox8YG8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACAgGAIi31gWIt9YLKLfWD5i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6AYxKLfWBain1fm4t9 - YNyLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g74t8 - YkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZ5YRWNe2E6in1gYIt+YIKMfmCSi3xgoox9 - YKqKfGCkjH5glIp9YIWKfGFpinxgSI6AYyT/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - 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 - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////g// - /////////////////+AA//////////////////8AAD/////////////////+AAAP//////////////// - +AAAA/////////////////AAAAH////////////////gAAAA////////////////wAAAAH////////// - /////4AAAAB///////////////8AAAAAP///////////////AAAAAB///////////////gAAMAAf//// - //////////4AA/gAD//////////////+AB/8AA///////////////AA//gAP//////////////wAP/8A - B//////////////8AD//gAf//////////////AB//8AH//////////////gAf//AB//////////////4 - AH//wAf/////////////+AB//8AH//////////////gA///AB//////////////4AP//gAf///////// - /////AB//4AH//////////////wAP/+AB//////////////8AB//gAf//////////////AAP/wAH//// - //////////4AB/4AA//////////////+AAPgAAH//////////////wABAAAA//////////////8AAAAA - AH//////////////gAAAAAA//////////////8AAAAAAH//////////////AAAAAAA////////////// - 4AAAAAAH//////////////gAAAAAA//////////////8AAAAAAH//////////////gAAAAAA//////// - //////+AAAAAAH//////////////8AIAAAA/////////////////AAAAH////////////////4AAAA// - ///////////////AAAAH////////////////4AAAA/////////////////AAAAH////////////////4 - AAAA/////////////////AAAAH////////////////4AAAA/////////////////AAAAH/+D//////// - /////4AAAA/wAD/////////////AAAAHgAAP////////////4AAAAAAAA/////////////AAAAAAAAH/ - ///////////4AAAAAAAA/////////////AAAAAAAAH////////////4AAAAAAAA/////////////AAAA - AAAAH////////////4AAAAAAAA/////////////AAAAAAAAH////////////4AAAAAAAB/////////// - //AAAAAAAAP////////////4AAAAAAAD/////////////AAAAAAAAf////////////4AAAAAAAH///// - ////////AAAAAAAA/////////////wAAAAAAAP////////////8AAAAAAAB/////////////AAAAHgAA - f////////////gAAAP8AAH////////////4AAAH/gAA////////////+AAAH/8AAP////////////AAA - D//gAD////////////wAAB//8AA////////////8AAAf//gAP////////////AAAP//8AD////////// - //wAAH///gAf///////////4AAB///8AH///////////+AAAf///gB////////////gAAP///8Af//// - ///////4AAD////gH///////////+AAA////8B////////////wAAP////g////////////8AAD////8 - P////////////AAAf////j////////////wAAD////8////////////+AAAf/////////////////gAA - D/////////////////8AAAf/////////////////AAAD/////////////////4AAAf////////////// - ///AAAD/////////////////4AAAf/////////////////AAAD/////////////////4AAAf//////// - /////////AAAD/////////////////4AAAf/////////////////gAAD/////////////////8AAAf// - ///////////////wAAD//////////////////gAAf//////////////////AAD////////////////// - /gP///////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4lQTkcNChoKAAAADUlIRFIAAAEAAAABAAgG - AAAAXHKoZgAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA - BmJLR0QA/wD/AP+gvaeTAAAXsElEQVR4Xu3dC3RdZZUH8G+fk6RtkkIBBxSG4VEBZxhRRFF8UGF4S2dk - rSkq2uamQGBgikObm5Q2Nxx7U0pz03YWrEHbWTZJwVGpMwuVUUeQl1hEnYXgQgUqFEadNYC8k7bJPWfP - 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 - - - \ No newline at end of file diff --git a/ModpackUpdater/FormSettings.resx b/ModpackUpdater/FormSettings.resx deleted file mode 100644 index df6582a..0000000 --- a/ModpackUpdater/FormSettings.resx +++ /dev/null @@ -1,2153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Top, Left, Right - - - - 118, 87 - - - 389, 22 - - - - 9 - - - RadTextBoxControl_UpdateUrl - - - Telerik.WinControls.UI.RadTextBoxControl, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 0 - - - 3, 89 - - - 70, 18 - - - 8 - - - Update-URL: - - - RadLabel4 - - - Telerik.WinControls.UI.RadLabel, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 1 - - - Top, Left, Right - - - 118, 59 - - - Obsulete! Do not use for new Modpack Configs! - - - 389, 22 - - - 7 - - - RadTextBoxControl_WebdavPassword - - - Telerik.WinControls.UI.RadTextBoxControl, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 2 - - - Top, Left, Right - - - 118, 31 - - - Obsulete! Do not use for new Modpack Configs! - - - 389, 22 - - - 6 - - - RadTextBoxControl_WebdavUsername - - - Telerik.WinControls.UI.RadTextBoxControl, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 3 - - - Top, Left, Right - - - 118, 3 - - - Obsulete! Do not use for new Modpack Configs! - - - 389, 22 - - - 5 - - - RadTextBoxControl_WebdavURL - - - Telerik.WinControls.UI.RadTextBoxControl, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 4 - - - Bottom, Right - - - MiddleRight - - - 387, 115 - - - 120, 24 - - - 4 - - - Save && Close - - - MiddleLeft - - - ImageBeforeText - - - RadButton_SaveAndClose - - - Telerik.WinControls.UI.RadButton, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 5 - - - Bottom, Left - - - MiddleRight - - - 3, 115 - - - 100, 24 - - - 3 - - - Save as ... - - - MiddleLeft - - - ImageBeforeText - - - RadButton_SaveAs - - - Telerik.WinControls.UI.RadButton, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 6 - - - 3, 61 - - - 100, 18 - - - 2 - - - Webdav Password: - - - RadLabel3 - - - Telerik.WinControls.UI.RadLabel, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 7 - - - 3, 33 - - - 103, 18 - - - 1 - - - Webdav Username: - - - RadLabel2 - - - Telerik.WinControls.UI.RadLabel, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 8 - - - 3, 5 - - - 73, 18 - - - 0 - - - Webdav URL: - - - RadLabel1 - - - Telerik.WinControls.UI.RadLabel, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - - Panel1 - - - 9 - - - Fill - - - 0, 0 - - - 510, 142 - - - 0 - - - Panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 7, 15 - - - 7, 15 - - - 510, 142 - - - - AAABAAYAEBAAAAEAIABoBAAAZgAAACAgAAABACAAqBAAAM4EAAAwMAAAAQAgAKglAAB2FQAAQEAAAAEA - IAAoQgAAHjsAAICAAAABACAAKAgBAEZ9AAAAAAAAAQAgAC0YAABuhQEAKAAAABAAAAAgAAAAAQAgAAAA - AAAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgGAojXtgOJJtbQcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfWCfi31g/4t9YP+LfV/bioBgGAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfV8zi31g/4p9YGKKfF8ji31g5It+ - X4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3xhQot9YP+MgGEqAAAAAIt9 - YNeMfWCdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAYAiLfWDVi31g6Yt9 - YNiLfWD/i31g8It9YTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjoBjEot8 - YH2KfV+bi31g9Yt9YP+LfWDwi31hNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIl+XkGLfWD0i31g/4t9YPCMe18+iXxdKY1+X0OLgF0WAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAin1hP4t9YPSLfWD/i31g/4t9YP+LfWD/i31g7ox7YjwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJfl5Bi31g/4t9YP+LfWD/i31g/4t9YP+KfWDdqlVVAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi4BjLIt9YP+LfWD/i31gp4+AYBCKfWCXi31g/4t9 - XjkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8YEqLfWD/i31g/4+AYBAAAAAA/wAAAYp9 - YJeLfl9LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKgGAYi31g74t9YP+KfWCX/wAAAQAA - AAD/AAABlYBqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx7YjyKfWDdi31g/4p9 - YJf/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABIt9 - YTeLfGJEj4BgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAMP/AADZ/wAA2f8AAMH/AADw/wAA/H8AAP4H - AAD/AwAA/xMAAP87AAD/HwAA/48AAP//AAD//wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAot+ - XlGLfWCVi31gp4p9X4OLgGMsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJB6 - ZBeLfmDFi31g/4t9YP+LfWD/i31g/4t9YP2KfWCFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACAgIACi31hxot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfGBvAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIt+YU+LfWD/i31g/4p9YNKKfWBij3pcGYt+YYSLfWD/i31g/4t9YO6SbW0HAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAjH5glIt9YP+LfWD/jH1hZAAAAAAAAAAAAAAAAIt+X5aLfWD/i31g/4x7 - YjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfV+ji31g/4t9YP+Me2MfAAAAAAAAAAAAAAAAin5hjIt9 - YP+LfWD/inxgSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+YICLfWD/i31g/4p9YIUAAAAAAAAAAAAA - AACLfWDQi31g/4t9YP+KgGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjYBeJot9X/uLfWD/i31g/4t9 - YZGLfl+Gi3xgz4t9YP6LfWD/i31g/4t9YMqPgGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3xfe4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YMqPgGAQAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi35hYYt9YOeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YMqPgGAQAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAqlVVA419Yi+LfGBAjX1iL4t9YNCLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YMqPgGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj3pcGYt9YNiLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YL+LdF0LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhnleE4t9 - Yc6LfWD/i31g/4t9YP+LfWD/i31g/4t9YMqLfF0hi31hN4t8YHeKfWGZi35flot9X1aqVVUDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjoBjEot8YM2LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t+ - X8uNe2EdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAioBgGIt9YdaLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t+X8uSbW0HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh3haEYt+X8uLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t+YYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjXthHYt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31f84h3Zg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMe2I8i31g/4t9 - YP+LfWD/i31g/4t9YP+KfmDHin1gPZWAagyLfWC1i31g/4t9YP+LfWD/in5hVwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8 - X3uLfWD/i31g/4t9YP+LfWD/i35gxZlmZgUAAAAAAAAAAICAYAiLfWC3i31g/4t9YP+KfmGMAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi3xgoIt9YP+LfWD/i31g/4t9YP+Ne2E6AAAAAAAAAAAAAAAAAAAAAICAYAiLfWC5i31g/4t9 - X6MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACLfF+ei31g/4t9YP+LfWD/i31g/4t0XQsAAAAAAAAAAAAAAAAAAAAAAAAAAI5x - VQmLfV+7in1glwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx+X1uLfWD/i31g/4t9YP+LfWD/i31gsoCAVQYAAAAAAAAAAAAA - AAAAAAAAAAAAAICAZgqJfl5BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABIt8YM+LfWD/i31g/4t9YP+LfWD/i31gsoCA - VQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjHtjH4t8X9OLfWD/i31g/4t9 - YP+LfWD/jH1fs5JtbQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIBmCop9 - YIWLfV/zi31g/4t9YP+LfWD/jH1fs5JtbQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIh3Zg+LfV9Wi31gj4x8YKiMfWCfi3xgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////+P///+A////AP///xh///48f//+PH - ///hx///8AP///gB///8AP///8B////gP///8Bz///gAP//8AB///gAP//8AD///Aw///weH//4Px//+ - D+f//wf///8D////gf///8D////4/////////////////ygAAAAwAAAAYAAAAAEAIAAAAAAAUCUAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAKMfmBdin1hsYt9 - YOaLfWD/i31g5op9YbGLfWFcgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinxfI4t+ - X8uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH5gyY+AYiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACKfGAli31g7It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YOyKfF8jAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKpVVQOLfWDQi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfGDNgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A - AAGMfmCUi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/in5fjoyAZhSMe18+in1ghYt+ - X8OLfWDpi31g/4t9YOqLfWCnjH1gNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/AAABjH5glIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/Yp+YJCZZmYFAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAYt9YJWLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfV+zgICAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAKLfF+ei31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i3xheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAIh3Zg+LfmGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAI17YTqLfWD+i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31gv4t0XQsAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfWCPi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YMqPgGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAEi31grIt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDKj4BgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAYx9 - YXyLfWD9i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i35fy4d4WhEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfWA9i31gxIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YMCLdF0LAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIh9XyuKfV92i31fu4t9YNeLfV/ri31g7ot9 - YN6LfWCNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP// - /////wAA////////AAD///////8AAP///////wAA/8H/////AAD/AH////8AAP4AP////wAA/AAf//// - AAD8DB////8AAPg+D////wAA+D8P////AAD4fw////8AAPh+D////wAA+D4P////AAD8GAf///8AAPwA - A////wAA/gAB////AAD/AAD///8AAP/AAH///wAA//4AP///AAD//wAf//8AAP//gA///wAA///ABgf/ - AAD//+AAAf8AAP//8AAA/wAA///4AAD/AAD///wAAH8AAP///gAAPwAA////AAA/AAD///8AcD8AAP// - /gD4HwAA///+AfwfAAD///4D/h8AAP///gP/HwAA///+A/+fAAD///4B/98AAP///wD//wAA////AH// - AAD///+AP/8AAP///+Af/wAA////8A//AAD////+B/8AAP///////wAA////////AAD///////8AAP// - /////wAA////////AAAoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgGAQi4BeLot8YkSLfV45jnteGwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmWZmBYp8YWmLfmDFi31g/It9YP+LfWD/i31g/4t9 - YP+KfWDdin5fjoqAYBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXtiNIt9YNmLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV/zi31hbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjHxgUot9 - YPaLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfV+b/wAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjX1eMYt9YPSLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8X3sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAmWZmBYt9X9uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD+iXtiNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8YWeLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDkjH1gn4x+YVmLgF0Win5fjot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YLoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfmDHi31g/4t9 - YP+LfWD/i31g/4t9YP+LfGJEAAAAAAAAAAAAAAAAAAAAAP8AAAGMfmCSi31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD+iYBkHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLgF0Wi31g/Yt9YP+LfWD/i31g/4t9YP+LfWDn/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAYt9 - YJWLfWD/i31g/4t9YP+LfWD/i31g/4t8YWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAjXtgOIt9YP+LfWD/i31g/4t9YP+LfWD/i31fowAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/AAABi31gzIt9YP+LfWD/i31g/4t9YP+KfmGMAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI18X06LfWD/i31g/4t9YP+LfWD/i31g/4x+ - YV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICABIt9YPCLfWD/i31g/4t9YP+LfWD/i31fowAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfWE/i31g/4t9 - YP+LfWD/i31g/4t9YP+JgGQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9XjmLfWD/i31g/4t9 - YP+LfWD/i31g/4p9YZkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAj4BiIot9YP+LfWD/i31g/4t9YP+LfWD/i35gmP8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfGB9i31g/4t9YP+LfWD/i31g/4t9YP+KfV92AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfWDci31g/4t9YP+LfWD/i31g/4t9YP+KfWGZ/wAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAi31gwot9YP+LfWD/i31g/4t9YP+LfWD/i35fYwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1ghYt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YJqAgIACgIBVBox7YjyMfV9+i31gwIt9YPyLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YPaMfmBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6A - YxKLfWDti31g/4t9YP+LfWD/i31g/4t9YP+LfWD/in1g0ot9YPSLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g9ox+YEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi31gWot9YP6LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD2jH5gRQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfGB/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YPaMfmBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx9 - YGiLfWD6i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g9ox+YEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjH5eSYt9YPeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9X+uLfl9LAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfl5Ji31g94t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/It9YHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx+XkmLfWD3i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i3xhZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjHxgUIt9YPqLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPaJfF0pAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGBIi31g94t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/jH5gyf8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx8YFCLfWD6i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfmBNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAin5hV4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH1g1KpVVQMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkoBbDgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi4BdFot9YPKLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDVkHpkFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfGFUi31g/ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YN2IgF4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - YHiLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g3oiAXh4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi35gZYt9YPiLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDejHtjHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNfV4xin1g0ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YN6Me2MfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA - gASLfGFni31g3It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g3ox7Yx8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKpVVQOMfmFHjH1gnYt9YOKLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfV/bh3haEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi4BdFol7 - XjaLfGJEi3xiRI1+X0OIfV8rlYBqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - //////////////////////////////////////////////////////////////////////////gH//// - ////4AP////////AAP///////4AA////////AAB///////8AwD///////gfgP//////+B/A///////4H - +B///////g/4H//////+D/gf//////4H+D///////gPwP//////+AeAf//////8AAA///////4AAB/// - ////wAAD///////gAAH///////AAAP///////3AAf///////+AA////////8AB////////4AD/////// - /wAH////////gAOAP//////AAAAf/////+AAAA//////8AAAB//////4AAAD//////wAAAH//////gAA - Af//////AAAA//////8AAAD//////wAHAH/////+AB+Af/////4AP8B//////gB/4H/////+AH/wf/// - //4A//h//////gD//H/////+AP/+f/////4Af/9//////gA/////////AB////////+AD////////8AH - ////////4AP////////wAf////////wA/////////wB///////////////////////////////////// - ////////////////////////////////////////KAAAAIAAAAAAAQAAAQAgAAAAAAAACAEAAAAAAAAA - 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 - 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 - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl2 - Yg2LfGJEjHxgb4x+YJSLfWCljH1gqox9YJ+LfmCKi35hYY19XjGqVVUDAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAioBgGIt9YHKMfmDJi31g/It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YPGLfWCtjHxgUoCAVQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjnteG4t9YJWLfWD4i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g4Yp8 - YWmZZmYFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqlVVA4t9YHKLfWDyi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8X9OKfV87AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI57XhuLfWC/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YPyLfmCAqlVVAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACKfF8ji31f24t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWClgIBVBgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjX1iL4t9YO6LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfWG+gIBgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeA - YCCLfWDni31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWCs/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAEi35fw4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV9uAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+ - YICLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YPqIfV8rAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPgGIii31g94t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9Yb4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - YZmLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g6Yx9YKqMfV9mi3xdIYt9X6uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOe14bi31g+ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPCKfWCvjH1gao6AYyQAAAAAAAAAAAAAAAAAAAAAgICAAot9 - YaGLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31gvQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8 - YXmLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9Ya6Ne2E6gICABAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqlVVA4t8YKKLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD+j4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3xg0Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/in1fOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqlVVA4t9X6OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+KfWB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZ5 - XhOLfWD9i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPKZZmYFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmWZmBYt9YK2LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjXxfTot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/in1hsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAqlVVA4t9YKWLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31f8/8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfGB3i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfGBtAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqlVVA4x9 - YKqLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/iIBeHgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+X5aLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4l8XSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1fg4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+KfWA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi31hoYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDl/wAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfmDFi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p8YEoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfWCni31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9YJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4BgEIt9YPyLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/jXxfTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIp9X5uLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH5gXQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfmFPi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+Me2I8AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjH1gh4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+Oe14bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YJWLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4yAYCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACLfmFhi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YKWqVVUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi31g2ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV/7i3RdCwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIqAYTKLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p8YKSqVVUDAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx7Yx+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9Yc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAqlVVA4t9YO6LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9X6OqVVUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjH1hZIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31glQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi31gpYt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YKKqVVUDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfGCoi31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhi3xdIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfF9Gi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YaGAgIACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImA - ZByKfWBii31gp4t9YPaLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDhi3xdIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKpV - VQOLfV/bi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YJX/AAABAAAAAAAAAACAgIAEjH1fM4t+YICLfWDMi31g/Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YFqLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p8YKSLfF97i31gwIt9YPmLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAqlVVA4t9YMyLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi4BeLot9YPeLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAinxhaYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1gl4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABi31fk4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi3xgd4t9YPyLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin1gPYx9YN+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAgIBmCop9YIWLfWD1i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJB6 - ZBeLfmCIi31g5ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqVVUDiX5eQYp9YYGLfV+7i31g5ot9 - YP+LfWD/i31g/4t9YP+LfWDxi3xf04t8YKCMfF9zi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYBqDId4WhGHeFoRmWZmBQAAAAAAAAAAAAAAAAAA - AACJfGIni31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BiIgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACOfWAti31g6ot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWDcjXthHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDij4BiIgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgGAIjHtiPIt+YGWKfmGMin1hmYp9YZmKfWGZi31fk4p8 - YG2KfWE/jnFVCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWDij4BiIgAAAAAAAAAAAAAAAAAAAAAAAAAAqlVVA4x7YjyLfmCAi31gwIt9 - YPeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD5i31gtIt9YFiqVVUDAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACNgF4mi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDni3xiRKpV - VQOMe2MfjHxhVIx9YJ2LfWDqi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YNiKfl9TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+KfWC8i3xdIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACNgF4mi31g5Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDvjHxgUAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfV/7jH5hXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i3xheQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLgGMsi31g6Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD9i31fVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD6i3xhQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWDhj4BgEAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWCnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWFcAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLgGMsi31g6Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9YN+AgGAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLgGMsi31g6Yt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8 - X3sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfGAli31g5It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31f84Z5XhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfGAli31g6Yt9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/jH1ffgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMfl5Ji31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfV/rgIBmCgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5x - VQmLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinxfI4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YLUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACMfmBdi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YO6LfGCiin1fXox9 - XzOVgGoMAAAAAIt+YIKLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g+oZ5XhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8X6aLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YOWKfF9ri3RdCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9X4OLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH5fWwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACZZmYFi31g74t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP6LfWGRkoBbDgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9X4OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfV+bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI1+X0OLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD1jHxhVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - X4OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi35fhot9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g9Yt9YTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+YYSLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/46AYxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfl/Di31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP6Mfl9bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIp+X46LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31hNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAi3RdC4t9YPqLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31fiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+YYSLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+KfV9eAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfGBAi31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YOKVgGoMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9YIWLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIx9X2aLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/jH1fZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9 - YIWLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/in5fjgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi35giIt9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YOyOcVUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp9YIWLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfGCcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfWGZi31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i3xgnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIt+X4aLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YKcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YKWLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+KfmBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+X4aLfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i3xfngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAi31gpYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/459YC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt9YI+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+MfmCSAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfmCYi31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD9gIBgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt+ - X4aLfWD/i31g/4t9YP+LfWD/i31g/4t+X4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt8YHeLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx9YIeLfWD/i31g/4t9YP+LfWD/inxfawAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinxgSot9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIx9YIeLfWD/i31g/4t9YP+KfGBKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJdmINi31f+4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9YXwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx9YIeLfWD/i31g/4p8 - YCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACLfWC5i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4x8YXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA/wAAAYp+YJCLfWDvgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIx8YVSLfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x9 - YXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8 - YUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAmWZmBYt9YOKLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4x8YXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjH5hX4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8X3sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACAgIACi31gyIt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YHAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfF0hi31g7ot9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLfmBNi31g/Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9 - YHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACKfWF0i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKfWB4i31g/ot9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t8YXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACKfGFpi31g/It9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YHAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNfl9Di31g54t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOe14bi31guYt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAjH5hWYt9X+OLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4p9YHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi3RdC4t+YIKLfWD0i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4p9YHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI57XhuLfWGRi31g8Yt9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/ox8YG8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACAgGAIi31gWIt9YLKLfWD5i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9 - YP+LfWD/i31g/4t9YP+LfWD/i31g/4t8YHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6AYxKLfWBain1fm4t9 - YNyLfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g/4t9YP+LfWD/i31g74t8 - YkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZ5YRWNe2E6in1gYIt+YIKMfmCSi3xgoox9 - YKqKfGCkjH5glIp9YIWKfGFpinxgSI6AYyT/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - 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 - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////g// - /////////////////+AA//////////////////8AAD/////////////////+AAAP//////////////// - +AAAA/////////////////AAAAH////////////////gAAAA////////////////wAAAAH////////// - /////4AAAAB///////////////8AAAAAP///////////////AAAAAB///////////////gAAMAAf//// - //////////4AA/gAD//////////////+AB/8AA///////////////AA//gAP//////////////wAP/8A - B//////////////8AD//gAf//////////////AB//8AH//////////////gAf//AB//////////////4 - AH//wAf/////////////+AB//8AH//////////////gA///AB//////////////4AP//gAf///////// - /////AB//4AH//////////////wAP/+AB//////////////8AB//gAf//////////////AAP/wAH//// - //////////4AB/4AA//////////////+AAPgAAH//////////////wABAAAA//////////////8AAAAA - AH//////////////gAAAAAA//////////////8AAAAAAH//////////////AAAAAAA////////////// - 4AAAAAAH//////////////gAAAAAA//////////////8AAAAAAH//////////////gAAAAAA//////// - //////+AAAAAAH//////////////8AIAAAA/////////////////AAAAH////////////////4AAAA// - ///////////////AAAAH////////////////4AAAA/////////////////AAAAH////////////////4 - AAAA/////////////////AAAAH////////////////4AAAA/////////////////AAAAH/+D//////// - /////4AAAA/wAD/////////////AAAAHgAAP////////////4AAAAAAAA/////////////AAAAAAAAH/ - ///////////4AAAAAAAA/////////////AAAAAAAAH////////////4AAAAAAAA/////////////AAAA - AAAAH////////////4AAAAAAAA/////////////AAAAAAAAH////////////4AAAAAAAB/////////// - //AAAAAAAAP////////////4AAAAAAAD/////////////AAAAAAAAf////////////4AAAAAAAH///// - ////////AAAAAAAA/////////////wAAAAAAAP////////////8AAAAAAAB/////////////AAAAHgAA - f////////////gAAAP8AAH////////////4AAAH/gAA////////////+AAAH/8AAP////////////AAA - D//gAD////////////wAAB//8AA////////////8AAAf//gAP////////////AAAP//8AD////////// - //wAAH///gAf///////////4AAB///8AH///////////+AAAf///gB////////////gAAP///8Af//// - ///////4AAD////gH///////////+AAA////8B////////////wAAP////g////////////8AAD////8 - P////////////AAAf////j////////////wAAD////8////////////+AAAf/////////////////gAA - D/////////////////8AAAf/////////////////AAAD/////////////////4AAAf////////////// - ///AAAD/////////////////4AAAf/////////////////AAAD/////////////////4AAAf//////// - /////////AAAD/////////////////4AAAf/////////////////gAAD/////////////////8AAAf// - ///////////////wAAD//////////////////gAAf//////////////////AAD////////////////// - /gP///////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////4lQTkcNChoKAAAADUlIRFIAAAEAAAABAAgG - AAAAXHKoZgAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA - BmJLR0QA/wD/AP+gvaeTAAAXsElEQVR4Xu3dC3RdZZUH8G+fk6RtkkIBBxSG4VEBZxhRRFF8UGF4S2dk - rSkq2uamQGBgikObm5Q2Nxx7U0pz03YWrEHbWTZJwVGpMwuVUUeQl1hEnYXgQgUqFEadNYC8k7bJPWfP - 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 - - - - CenterParent - - - Modpack Configs - - - FormSettings - - - Telerik.WinControls.UI.RadForm, Telerik.WinControls.UI, Culture=neutral, PublicKeyToken=5bb2a467cbec794e - - \ No newline at end of file diff --git a/ModpackUpdater/FormSettings.vb b/ModpackUpdater/FormSettings.vb deleted file mode 100644 index e378b08..0000000 --- a/ModpackUpdater/FormSettings.vb +++ /dev/null @@ -1,47 +0,0 @@ -Imports ModpackUpdater.Model -Imports ModpackUpdater.My.Resources - -Imports Telerik.WinControls.UI - -Public Class FormSettings - - Private ReadOnly updateConfig As UpdateConfig - - Public Sub New(updateConfig As UpdateConfig) - InitializeComponent() - Me.updateConfig = updateConfig - End Sub - - Private Sub LoadConfig() - RadTextBoxControl_WebdavURL.Text = updateConfig.WebdavURL - RadTextBoxControl_WebdavUsername.Text = updateConfig.WebdavUsername - RadTextBoxControl_WebdavPassword.Text = updateConfig.WebdavPassword - RadTextBoxControl_UpdateUrl.Text = updateConfig.UpdateUrl - End Sub - - Private Sub SaveConfig() - updateConfig.WebdavURL = RadTextBoxControl_WebdavURL.Text.Trim - updateConfig.WebdavUsername = RadTextBoxControl_WebdavUsername.Text.Trim - updateConfig.WebdavPassword = RadTextBoxControl_WebdavPassword.Text - updateConfig.UpdateUrl = RadTextBoxControl_UpdateUrl.Text - End Sub - - Private Sub ButtonX_SaveAs_Click(sender As Object, e As EventArgs) Handles RadButton_SaveAs.Click - Dim ofd As New RadSaveFileDialog - ofd.Filter = FiledialogFilters.JSON_Display & "|" & FiledialogFilters.JSON_Filter - - If ofd.ShowDialog(Me) = DialogResult.OK Then - updateConfig.SaveToFile(ofd.FileName) - End If - End Sub - - Private Sub ButtonX_SaveAndClose_Click(sender As Object, e As EventArgs) Handles RadButton_SaveAndClose.Click - SaveConfig() - Close() - End Sub - - Private Sub FormSettings_Load(sender As Object, e As EventArgs) Handles Me.Load - LoadConfig() - End Sub - -End Class diff --git a/ModpackUpdater/ModpackUpdater.vbproj b/ModpackUpdater/ModpackUpdater.vbproj index 3db2ee4..cfdc1cd 100644 --- a/ModpackUpdater/ModpackUpdater.vbproj +++ b/ModpackUpdater/ModpackUpdater.vbproj @@ -78,7 +78,6 @@ - From a4d5fff876ed17923df8c437245d7c54e36b899a Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 18:01:32 +0200 Subject: [PATCH 02/50] install: remove legacy code --- ModpackUpdater.Manager/ModpackInstaller.vb | 121 ++++++++ .../ModpackUpdater.Manager.vbproj | 4 - ModpackUpdater.Manager/UpdateCheckResult.vb | 9 +- ModpackUpdater.Manager/UpdateInstaller.vb | 268 ------------------ ModpackUpdater.Manager/UpdateSyncAction.vb | 11 - ModpackUpdater.Manager/UpdateSyncFile.vb | 13 - ModpackUpdater/Form1.vb | 4 +- 7 files changed, 124 insertions(+), 306 deletions(-) create mode 100644 ModpackUpdater.Manager/ModpackInstaller.vb delete mode 100644 ModpackUpdater.Manager/UpdateInstaller.vb delete mode 100644 ModpackUpdater.Manager/UpdateSyncAction.vb delete mode 100644 ModpackUpdater.Manager/UpdateSyncFile.vb diff --git a/ModpackUpdater.Manager/ModpackInstaller.vb b/ModpackUpdater.Manager/ModpackInstaller.vb new file mode 100644 index 0000000..1c3728c --- /dev/null +++ b/ModpackUpdater.Manager/ModpackInstaller.vb @@ -0,0 +1,121 @@ +Imports System.IO +Imports System.Net +Imports System.Net.Http + +Imports ModpackUpdater.Model + +Public Class ModpackInstaller + + Public Event InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) + Public Event CheckingProgressUpdated(toCheck As Integer, processed As Integer) + + Private ReadOnly updateConfig As ModpackConfig + Private ReadOnly localPath As String + Private httpClient As New HttpClient + + Public Sub New(updateConfig As ModpackConfig, localPath As String) + Me.updateConfig = updateConfig + Me.localPath = localPath + End Sub + + Protected Overrides Sub Finalize() + httpClient.Dispose() + MyBase.Finalize() + End Sub + + Private Async Function DownloadUpdateInfos() As Task(Of UpdateInfos) + Dim content As String = Await httpClient.GetStringAsync(updateConfig.UpdateUrl) + Return UpdateInfos.Parse(content) + End Function + + Public Async Function CheckForUpdates(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult) + Dim infos As UpdateInfos = Await DownloadUpdateInfos() + Dim result As New UpdateCheckResult + + If infos IsNot Nothing AndAlso infos.Updates.Any Then + Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version) + result.LatestVersion = updatesOrderes.First.Version + + If ModpackInfo.HasModpackInfo(localPath) Then + Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath) + result.CurrentVersion = modpackInfo.Version + + Dim checkingVersionIndex As Integer = 0 + Dim checkingVersion As UpdateInfo = updatesOrderes(checkingVersionIndex) + + Do While checkingVersion IsNot Nothing AndAlso checkingVersion.Version > result.CurrentVersion + Dim actionsToAdd As New List(Of UpdateAction) + + For Each action In checkingVersion.Actions + If Not result.UpdateActions.Any(Function(n) n.DestPath = action.DestPath) Then + actionsToAdd.Add(action) + End If + Next + + result.UpdateActions.InsertRange(0, actionsToAdd) + + checkingVersionIndex += 1 + checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex) + Loop + End If + End If + + Return result + End Function + + Public Async Function InstallUpdates(checkResult As UpdateCheckResult) As Task(Of Boolean?) + Dim modpackInfo As ModpackInfo + + If ModpackInfo.HasModpackInfo(localPath) Then + modpackInfo = ModpackInfo.Load(localPath) + Else + modpackInfo = New ModpackInfo + End If + + Dim processed As Integer = 0 + For Each action As UpdateAction In checkResult.UpdateActions + Dim destFilePath As String = Path.Combine(localPath, action.DestPath) + + Select Case action.Type + Case UpdateActionType.Update + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + Dim sRemote As Stream = Await httpClient.GetStreamAsync(action.DownloadUrl) + Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite) + Await sRemote.CopyToAsync(fs) + sRemote.Close() + fs.Close() + Case UpdateActionType.Delete + If action.IsDirectory Then + If Directory.Exists(destFilePath) Then + Directory.Delete(destFilePath, True) + End If + Else + If File.Exists(destFilePath) Then + File.Delete(destFilePath) + End If + End If + Case UpdateActionType.Copy + Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) + If File.Exists(srcFilePath) Then + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + File.Copy(srcFilePath, destFilePath, True) + End If + Case UpdateActionType.Move + Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) + If File.Exists(srcFilePath) Then + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + File.Move(srcFilePath, destFilePath, True) + End If + End Select + + processed += 1 + RaiseEvent InstallProgessUpdated(checkResult, processed) + Next + + modpackInfo.Version = checkResult.LatestVersion + modpackInfo.Save(localPath) + + Return True + End Function + +End Class diff --git a/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj b/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj index a5b3134..a69543d 100644 --- a/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj +++ b/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj @@ -5,10 +5,6 @@ net8.0 - - - - diff --git a/ModpackUpdater.Manager/UpdateCheckResult.vb b/ModpackUpdater.Manager/UpdateCheckResult.vb index d73f424..ae15c4d 100644 --- a/ModpackUpdater.Manager/UpdateCheckResult.vb +++ b/ModpackUpdater.Manager/UpdateCheckResult.vb @@ -2,9 +2,6 @@ Public Class UpdateCheckResult - Public Property IsLegacy As Boolean - Public ReadOnly Property SyncFiles As New List(Of UpdateSyncFile) - Public Property CurrentVersion As Version Public Property LatestVersion As Version Public ReadOnly Property UpdateActions As New List(Of UpdateAction) @@ -12,11 +9,7 @@ Public Class UpdateCheckResult Public ReadOnly Property HasUpdates As Boolean Get - If IsLegacy Then - Return SyncFiles.Where(Function(n) n.SyncAction <> UpdateSyncAction.None).Any - Else - Return CurrentVersion < LatestVersion - End If + Return CurrentVersion < LatestVersion End Get End Property diff --git a/ModpackUpdater.Manager/UpdateInstaller.vb b/ModpackUpdater.Manager/UpdateInstaller.vb deleted file mode 100644 index cc12d5f..0000000 --- a/ModpackUpdater.Manager/UpdateInstaller.vb +++ /dev/null @@ -1,268 +0,0 @@ -Imports System.IO -Imports System.Net -Imports System.Net.Http - -Imports ModpackUpdater.Model - -Imports WebDav - -Public Class UpdateInstaller - - Public Event InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) - Public Event CheckingProgressUpdated(toCheck As Integer, processed As Integer) - - Private ReadOnly updateConfig As ModpackConfig - Private ReadOnly localPath As String - Private webdavClient As WebDavClient = Nothing - Private httpClient As New HttpClient - - Public Sub New(updateConfig As ModpackConfig, localPath As String) - Me.updateConfig = updateConfig - Me.localPath = localPath - End Sub - - Protected Overrides Sub Finalize() - httpClient.Dispose() - MyBase.Finalize() - End Sub - - Private Function CreateClient() As WebDavClient - If webdavClient Is Nothing Then - Dim params As New WebDavClientParams With { - .BaseAddress = New Uri(updateConfig.WebdavURL), - .Credentials = New NetworkCredential(updateConfig.WebdavUsername, updateConfig.WebdavPassword) - } - webdavClient = New WebDavClient(params) - End If - - Return webdavClient - End Function - - Private Async Function DownloadUpdateInfos() As Task(Of UpdateInfos) - Dim content As String = Await httpClient.GetStringAsync(updateConfig.UpdateUrl) - Return UpdateInfos.Parse(content) - End Function - - Public Async Function CheckForUpdates(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult) - Dim infos As UpdateInfos = Await DownloadUpdateInfos() - Dim result As New UpdateCheckResult - - If infos IsNot Nothing AndAlso infos.Updates.Any Then - Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version) - result.LatestVersion = updatesOrderes.First.Version - - If ModpackInfo.HasModpackInfo(localPath) Then - Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath) - result.CurrentVersion = modpackInfo.Version - - Dim checkingVersionIndex As Integer = 0 - Dim checkingVersion As UpdateInfo = updatesOrderes(checkingVersionIndex) - - Do While checkingVersion IsNot Nothing AndAlso checkingVersion.Version > result.CurrentVersion - Dim actionsToAdd As New List(Of UpdateAction) - - For Each action In checkingVersion.Actions - If Not result.UpdateActions.Any(Function(n) n.DestPath = action.DestPath) Then - actionsToAdd.Add(action) - End If - Next - - result.UpdateActions.InsertRange(0, actionsToAdd) - - checkingVersionIndex += 1 - checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex) - Loop - Else - Await CheckForUpdatesLegacy(result, ignoreRevmoedFiles) - End If - End If - - Return result - End Function - - Private Async Function CheckForUpdatesLegacy(result As UpdateCheckResult, ignoreRevmoedFiles As Boolean) As Task - Dim client As WebDavClient = CreateClient() - Dim resTopFolder As WebDavResource = Nothing - Dim checkedFiles = New List(Of String)() - Dim responseSuccessfull As Boolean = False - - result.CurrentVersion = New Version("0.0.0.0") - result.IsLegacy = True - - 'Check for new & updated files - Dim response = Await client.Propfind(String.Empty, New PropfindParameters() With {.ApplyTo = ApplyTo.Propfind.ResourceAndAncestors}) - If resTopFolder Is Nothing AndAlso response.IsSuccessful AndAlso response.Resources.Any() Then - resTopFolder = response.Resources.ElementAtOrDefault(0) - responseSuccessfull = True - End If - - If responseSuccessfull AndAlso response.Resources.Count > 1 Then - Dim i As Integer = 1 - Dim loopTo As Integer = response.Resources.Count - 1 - - Do While i <= loopTo - Dim res = response.Resources.ElementAtOrDefault(i) - Dim isFolder As Boolean = res.Uri.EndsWith("/") - - If Not isFolder Then - Dim syncAction? As UpdateSyncAction = Nothing - Dim localFile As String - Dim remoteFile As String - - 'Get remote file path - remoteFile = res.Uri - - 'Get local file path - localFile = Path.Combine(localPath, Uri.UnescapeDataString(res.Uri.Substring(resTopFolder.Uri.Length)).Replace("/", "\")) - - 'Check action - If File.Exists(localFile) Then - If File.GetLastWriteTime(localFile) < res.LastModifiedDate = True Then - syncAction = UpdateSyncAction.UpdatedFile - End If - Else - syncAction = UpdateSyncAction.NewFile - End If - - 'Add to list - checkedFiles.Add(localFile) - If syncAction IsNot Nothing Then - result.SyncFiles.Add(New UpdateSyncFile(syncAction, localFile, remoteFile)) - End If - End If - - i += 1 - - RaiseEvent CheckingProgressUpdated(loopTo, i) - Loop - End If - - 'Find all old files to remove - If responseSuccessfull Then - Dim allLocalFiles = Directory.GetFiles(localPath, "*", SearchOption.AllDirectories) - For Each lf As String In allLocalFiles - Dim isKnown As Boolean = False - - For Each checkedFile As String In checkedFiles - If Not isKnown AndAlso If(checkedFile, "") = If(lf, "") Then - isKnown = True - End If - Next - - If Not isKnown Then - result.SyncFiles.Add(New UpdateSyncFile(If(ignoreRevmoedFiles, UpdateSyncAction.None, UpdateSyncAction.RemovedFile), lf, String.Empty)) - End If - Next - End If - End Function - - Public Async Function InstallUpdates(checkResult As UpdateCheckResult, Optional ignoreActions As UpdateSyncAction = UpdateSyncAction.None) As Task(Of Boolean?) - Dim isSuccessfully As Boolean - Dim modpackInfo As ModpackInfo - - If ModpackInfo.HasModpackInfo(localPath) Then - modpackInfo = ModpackInfo.Load(localPath) - Else - modpackInfo = New ModpackInfo - End If - - If checkResult.IsLegacy Then - isSuccessfully = Await InstallUpdatesLegacy(checkResult, ignoreActions) - Else - Dim processed As Integer = 0 - For Each action As UpdateAction In checkResult.UpdateActions - Dim destFilePath As String = Path.Combine(localPath, action.DestPath) - - Select Case action.Type - Case UpdateActionType.Update - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - Dim sRemote As Stream = Await httpClient.GetStreamAsync(action.DownloadUrl) - Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite) - Await sRemote.CopyToAsync(fs) - sRemote.Close() - fs.Close() - Case UpdateActionType.Delete - If action.IsDirectory Then - If Directory.Exists(destFilePath) Then - Directory.Delete(destFilePath, True) - End If - Else - If File.Exists(destFilePath) Then - File.Delete(destFilePath) - End If - End If - Case UpdateActionType.Copy - Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Copy(srcFilePath, destFilePath, True) - End If - Case UpdateActionType.Move - Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Move(srcFilePath, destFilePath, True) - End If - End Select - - processed += 1 - RaiseEvent InstallProgessUpdated(checkResult, processed) - Next - - isSuccessfully = True - End If - - If isSuccessfully Then - modpackInfo.Version = checkResult.LatestVersion - modpackInfo.Save(localPath) - End If - - Return isSuccessfully - End Function - - Private Async Function InstallUpdatesLegacy(checkResult As UpdateCheckResult, Optional ignoreActions As UpdateSyncAction = UpdateSyncAction.None) As Task(Of Boolean?) - Dim client As WebDavClient = CreateClient() - Dim success As Boolean? = False - Dim processed As Integer = 0 - - 'Init process update - RaiseEvent InstallProgessUpdated(checkResult, processed) - - For Each syncFile In checkResult.SyncFiles - If syncFile.SyncAction <> (ignoreActions And syncFile.SyncAction) Then - If syncFile.SyncAction = UpdateSyncAction.UpdatedFile OrElse - syncFile.SyncAction = UpdateSyncAction.RemovedFile Then - - If File.Exists(syncFile.LocalFile) Then - File.Delete(syncFile.LocalFile) - End If - End If - - If syncFile.SyncAction = UpdateSyncAction.UpdatedFile OrElse - syncFile.SyncAction = UpdateSyncAction.NewFile Then - - Dim response = Await client.GetProcessedFile(syncFile.RemoveFile) - Dim dirParent As New DirectoryInfo(Path.GetDirectoryName(syncFile.LocalFile)) - - If response.IsSuccessful Then - If Not dirParent.Exists Then - dirParent.Create() - End If - - Dim fs As New FileStream(syncFile.LocalFile, FileMode.Create, FileAccess.Write) - response.Stream.CopyTo(fs) - fs.Close() - - success = True - End If - End If - End If - - processed += 1 - RaiseEvent InstallProgessUpdated(checkResult, processed) - Next - - Return success - End Function - -End Class diff --git a/ModpackUpdater.Manager/UpdateSyncAction.vb b/ModpackUpdater.Manager/UpdateSyncAction.vb deleted file mode 100644 index ec6f578..0000000 --- a/ModpackUpdater.Manager/UpdateSyncAction.vb +++ /dev/null @@ -1,11 +0,0 @@ -Imports Newtonsoft.Json -Imports Newtonsoft.Json.Converters - - - -Public Enum UpdateSyncAction - None - NewFile - RemovedFile - UpdatedFile = 4 -End Enum diff --git a/ModpackUpdater.Manager/UpdateSyncFile.vb b/ModpackUpdater.Manager/UpdateSyncFile.vb deleted file mode 100644 index 669539a..0000000 --- a/ModpackUpdater.Manager/UpdateSyncFile.vb +++ /dev/null @@ -1,13 +0,0 @@ -Public Class UpdateSyncFile - - Public ReadOnly Property SyncAction As UpdateSyncAction - Public ReadOnly Property LocalFile As string - Public ReadOnly Property RemoveFile As string - - Public Sub New(syncAction As UpdateSyncAction, localFile As string, remoteFile As string) - Me.SyncAction = syncAction - Me.LocalFile = localFile - Me.RemoveFile = remoteFile - End Sub - -End Class diff --git a/ModpackUpdater/Form1.vb b/ModpackUpdater/Form1.vb index 5625789..97eb809 100644 --- a/ModpackUpdater/Form1.vb +++ b/ModpackUpdater/Form1.vb @@ -88,7 +88,7 @@ Public Class Form1 End Sub Private Async Function ExecuteUpdate(doInstall As Boolean) As Task - Dim updater As New UpdateInstaller(updateConfig, GetMinecraftProfilePath) + Dim updater As New ModpackInstaller(updateConfig, GetMinecraftProfilePath) AddHandler updater.InstallProgessUpdated, AddressOf Update_InstallProgessUpdated AddHandler updater.CheckingProgressUpdated, AddressOf Updated_CheckingProgresssUpdated @@ -132,7 +132,7 @@ Public Class Form1 End Function Private Sub Update_InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) - Dim actionCount = If(result.IsLegacy, result.SyncFiles.Count, result.UpdateActions.Count) + Dim actionCount = result.UpdateActions.Count SetStatus(Math.Round(processedSyncs / actionCount * 100, 1) & "%", MySymbols.icons8_software_installer_16px) End Sub From 9c43055580586b93ca8ec4700d686a2c7d5a8b41 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 18:30:57 +0200 Subject: [PATCH 03/50] install: rework ModpackInstaller (incomplete) --- ModpackUpdater.Manager/ModpackInstaller.vb | 123 ++++++++++++------ .../ModpackUpdater.Manager.vbproj | 4 + ModpackUpdater.Manager/UpdateCheckResult.vb | 5 +- ModpackUpdater.Model/InstallAction.vb | 7 +- ModpackUpdater.Model/UpdateAction.vb | 3 +- ModpackUpdater/Form1.vb | 6 +- 6 files changed, 95 insertions(+), 53 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.vb b/ModpackUpdater.Manager/ModpackInstaller.vb index 1c3728c..0d0950f 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.vb +++ b/ModpackUpdater.Manager/ModpackInstaller.vb @@ -1,4 +1,5 @@ Imports System.IO +Imports System.IO.Compression Imports System.Net Imports System.Net.Http @@ -28,17 +29,23 @@ Public Class ModpackInstaller Return UpdateInfos.Parse(content) End Function - Public Async Function CheckForUpdates(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult) - Dim infos As UpdateInfos = Await DownloadUpdateInfos() + Private Async Function DownloadInstallInfos() As Task(Of InstallInfos) + Dim content As String = Await httpClient.GetStringAsync(updateConfig.InstallUrl) + Return InstallInfos.Parse(content) + End Function + + Public Async Function Check(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult) Dim result As New UpdateCheckResult - If infos IsNot Nothing AndAlso infos.Updates.Any Then - Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version) - result.LatestVersion = updatesOrderes.First.Version + If ModpackInfo.HasModpackInfo(localPath) Then + Dim infos As UpdateInfos = Await DownloadUpdateInfos() + Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath) - If ModpackInfo.HasModpackInfo(localPath) Then - Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath) + If infos IsNot Nothing AndAlso infos.Updates.Count <> 0 Then + Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version) + result.LatestVersion = updatesOrderes.First.Version result.CurrentVersion = modpackInfo.Version + result.IsInstalled = True Dim checkingVersionIndex As Integer = 0 Dim checkingVersion As UpdateInfo = updatesOrderes(checkingVersionIndex) @@ -47,24 +54,37 @@ Public Class ModpackInstaller Dim actionsToAdd As New List(Of UpdateAction) For Each action In checkingVersion.Actions - If Not result.UpdateActions.Any(Function(n) n.DestPath = action.DestPath) Then + If Not result.Actions.Any(Function(n) n.DestPath = action.DestPath) Then actionsToAdd.Add(action) End If Next - result.UpdateActions.InsertRange(0, actionsToAdd) + result.Actions.InsertRange(0, actionsToAdd) checkingVersionIndex += 1 checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex) Loop + Else + result.HasError = True + End If + End If + + If Not result.IsInstalled Then + Dim infos As InstallInfos = Await DownloadInstallInfos() + + If infos IsNot Nothing AndAlso infos.Actions.Count <> 0 Then + result.Actions.AddRange(infos.Actions) + Else + result.HasError = True End If End If Return result End Function - Public Async Function InstallUpdates(checkResult As UpdateCheckResult) As Task(Of Boolean?) + Public Async Function Install(checkResult As UpdateCheckResult) As Task(Of Boolean?) Dim modpackInfo As ModpackInfo + Dim processed As Integer = 0 If ModpackInfo.HasModpackInfo(localPath) Then modpackInfo = ModpackInfo.Load(localPath) @@ -72,41 +92,41 @@ Public Class ModpackInstaller modpackInfo = New ModpackInfo End If - Dim processed As Integer = 0 - For Each action As UpdateAction In checkResult.UpdateActions - Dim destFilePath As String = Path.Combine(localPath, action.DestPath) + For Each iaction As InstallAction In checkResult.Actions + Dim destFilePath As String = Path.Combine(localPath, iaction.DestPath) - Select Case action.Type - Case UpdateActionType.Update - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - Dim sRemote As Stream = Await httpClient.GetStreamAsync(action.DownloadUrl) - Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite) - Await sRemote.CopyToAsync(fs) - sRemote.Close() - fs.Close() - Case UpdateActionType.Delete - If action.IsDirectory Then - If Directory.Exists(destFilePath) Then - Directory.Delete(destFilePath, True) + If TypeOf iaction Is UpdateAction Then + Dim uaction As UpdateAction = iaction + + Select Case uaction.Type + Case UpdateActionType.Update + Await InstallFile(destFilePath, uaction.DownloadUrl, uaction.IsZip, uaction.ZipPath) + Case UpdateActionType.Delete + If uaction.IsDirectory Then + If Directory.Exists(destFilePath) Then + Directory.Delete(destFilePath, True) + End If + Else + If File.Exists(destFilePath) Then + File.Delete(destFilePath) + End If End If - Else - If File.Exists(destFilePath) Then - File.Delete(destFilePath) + Case UpdateActionType.Copy + Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath) + If File.Exists(srcFilePath) Then + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + File.Copy(srcFilePath, destFilePath, True) End If - End If - Case UpdateActionType.Copy - Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Copy(srcFilePath, destFilePath, True) - End If - Case UpdateActionType.Move - Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Move(srcFilePath, destFilePath, True) - End If - End Select + Case UpdateActionType.Move + Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath) + If File.Exists(srcFilePath) Then + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + File.Move(srcFilePath, destFilePath, True) + End If + End Select + Else + Await InstallFile(destFilePath, iaction.DownloadUrl, iaction.IsZip, iaction.ZipPath) + End If processed += 1 RaiseEvent InstallProgessUpdated(checkResult, processed) @@ -118,4 +138,23 @@ Public Class ModpackInstaller Return True End Function + Private Async Function InstallFile(destFilePath As String, sourceUrl As String, isZip As Boolean, zipPath As String) As Task + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + + Dim fsDestinationPath As String = If(isZip, Path.Combine(Path.GetTempPath(), $"mc_update_file_{Date.Now.ToBinary}.zip"), destFilePath) + Dim sRemote As Stream = Await httpClient.GetStreamAsync(sourceUrl) + Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite) + Await sRemote.CopyToAsync(fs) + sRemote.Close() + fs.Close() + + If isZip Then + Dim zipDir As String = $"{Path.GetFileNameWithoutExtension(fsDestinationPath)}_extracted" + ZipFile.ExtractToDirectory(fsDestinationPath, zipDir) + '... + File.Delete(fsDestinationPath) + Directory.Delete(zipDir, True) + End If + End Function + End Class diff --git a/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj b/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj index a69543d..c976e8f 100644 --- a/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj +++ b/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj @@ -5,6 +5,10 @@ net8.0 + + + + diff --git a/ModpackUpdater.Manager/UpdateCheckResult.vb b/ModpackUpdater.Manager/UpdateCheckResult.vb index ae15c4d..09b33fd 100644 --- a/ModpackUpdater.Manager/UpdateCheckResult.vb +++ b/ModpackUpdater.Manager/UpdateCheckResult.vb @@ -4,12 +4,13 @@ Public Class UpdateCheckResult Public Property CurrentVersion As Version Public Property LatestVersion As Version - Public ReadOnly Property UpdateActions As New List(Of UpdateAction) + Public ReadOnly Property Actions As New List(Of InstallAction) + Public Property IsInstalled As Boolean Public Property HasError As Boolean Public ReadOnly Property HasUpdates As Boolean Get - Return CurrentVersion < LatestVersion + Return Not IsInstalled OrElse CurrentVersion < LatestVersion End Get End Property diff --git a/ModpackUpdater.Model/InstallAction.vb b/ModpackUpdater.Model/InstallAction.vb index 908f32e..16aecd9 100644 --- a/ModpackUpdater.Model/InstallAction.vb +++ b/ModpackUpdater.Model/InstallAction.vb @@ -1,9 +1,8 @@ -Imports Newtonsoft.Json.Converters - -Public Class InstallAction +Public Class InstallAction + Public Property IsZip As Boolean + Public Property ZipPath As String Public Property DestPath As String Public Property DownloadUrl As String - Public Property IsZip As Boolean End Class diff --git a/ModpackUpdater.Model/UpdateAction.vb b/ModpackUpdater.Model/UpdateAction.vb index a5cb520..0de1622 100644 --- a/ModpackUpdater.Model/UpdateAction.vb +++ b/ModpackUpdater.Model/UpdateAction.vb @@ -2,12 +2,11 @@ Imports Newtonsoft.Json.Converters Public Class UpdateAction + Inherits InstallAction Public Property Type As UpdateActionType - Public Property DestPath As String Public Property SrcPath As String - Public Property DownloadUrl As String Public Property IsDirectory As Boolean End Class diff --git a/ModpackUpdater/Form1.vb b/ModpackUpdater/Form1.vb index 97eb809..4cd3638 100644 --- a/ModpackUpdater/Form1.vb +++ b/ModpackUpdater/Form1.vb @@ -97,7 +97,7 @@ Public Class Form1 SetStatus(LangRes.StatusText_CheckingForUpdates, MySymbols.icons8_update_16px) Try - lastUpdateCheckResult = Await updater.CheckForUpdates(Not AppConfig.Instance.AllowRemoveLocalFiles) + lastUpdateCheckResult = Await updater.Check(Not AppConfig.Instance.AllowRemoveLocalFiles) Catch ex As Exception SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px) Finally @@ -112,7 +112,7 @@ Public Class Form1 currentUpdating = True Try - If Await updater.InstallUpdates(lastUpdateCheckResult) Then + If Await updater.Install(lastUpdateCheckResult) Then lastUpdateCheckResult = Nothing 'Reset last update check, a new one would be needed now. SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px) Else @@ -132,7 +132,7 @@ Public Class Form1 End Function Private Sub Update_InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) - Dim actionCount = result.UpdateActions.Count + Dim actionCount = result.Actions.Count SetStatus(Math.Round(processedSyncs / actionCount * 100, 1) & "%", MySymbols.icons8_software_installer_16px) End Sub From 54ab66fba07e46ccb116b79db3875ece2975c282 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 18:32:12 +0200 Subject: [PATCH 04/50] add property for modpack name --- ModpackUpdater.Model/ModpackConfig.vb | 1 + 1 file changed, 1 insertion(+) diff --git a/ModpackUpdater.Model/ModpackConfig.vb b/ModpackUpdater.Model/ModpackConfig.vb index 4f83fc2..4d411b6 100644 --- a/ModpackUpdater.Model/ModpackConfig.vb +++ b/ModpackUpdater.Model/ModpackConfig.vb @@ -4,6 +4,7 @@ Imports Newtonsoft.Json Public Class ModpackConfig + Public Property Name As String Public Property UpdateUrl As String Public Property InstallUrl As String From f1b11ea3c6addd4eea33fea7f0ab2d8514a6d0b0 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 18:40:30 +0200 Subject: [PATCH 05/50] install: use local zip cache --- ModpackUpdater.Manager/ModpackInstaller.vb | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.vb b/ModpackUpdater.Manager/ModpackInstaller.vb index 0d0950f..980420a 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.vb +++ b/ModpackUpdater.Manager/ModpackInstaller.vb @@ -1,12 +1,16 @@ Imports System.IO Imports System.IO.Compression -Imports System.Net Imports System.Net.Http Imports ModpackUpdater.Model Public Class ModpackInstaller + Private Class LocalZipCacheEntry + Public Property DownloadUrl As String + Public Property ExtractedZipPath As String + End Class + Public Event InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) Public Event CheckingProgressUpdated(toCheck As Integer, processed As Integer) @@ -85,6 +89,7 @@ Public Class ModpackInstaller Public Async Function Install(checkResult As UpdateCheckResult) As Task(Of Boolean?) Dim modpackInfo As ModpackInfo Dim processed As Integer = 0 + Dim localZipCache As New List(Of LocalZipCacheEntry) If ModpackInfo.HasModpackInfo(localPath) Then modpackInfo = ModpackInfo.Load(localPath) @@ -100,7 +105,7 @@ Public Class ModpackInstaller Select Case uaction.Type Case UpdateActionType.Update - Await InstallFile(destFilePath, uaction.DownloadUrl, uaction.IsZip, uaction.ZipPath) + Await InstallFile(destFilePath, uaction.DownloadUrl, uaction.IsZip, uaction.ZipPath, localZipCache) Case UpdateActionType.Delete If uaction.IsDirectory Then If Directory.Exists(destFilePath) Then @@ -125,7 +130,7 @@ Public Class ModpackInstaller End If End Select Else - Await InstallFile(destFilePath, iaction.DownloadUrl, iaction.IsZip, iaction.ZipPath) + Await InstallFile(destFilePath, iaction.DownloadUrl, iaction.IsZip, iaction.ZipPath, localZipCache) End If processed += 1 @@ -135,10 +140,14 @@ Public Class ModpackInstaller modpackInfo.Version = checkResult.LatestVersion modpackInfo.Save(localPath) + For Each task In localZipCache + Directory.Delete(task.ExtractedZipPath, True) + Next + Return True End Function - Private Async Function InstallFile(destFilePath As String, sourceUrl As String, isZip As Boolean, zipPath As String) As Task + Private Async Function InstallFile(destFilePath As String, sourceUrl As String, isZip As Boolean, zipPath As String, localZipCache As List(Of LocalZipCacheEntry)) As Task Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) Dim fsDestinationPath As String = If(isZip, Path.Combine(Path.GetTempPath(), $"mc_update_file_{Date.Now.ToBinary}.zip"), destFilePath) @@ -153,7 +162,10 @@ Public Class ModpackInstaller ZipFile.ExtractToDirectory(fsDestinationPath, zipDir) '... File.Delete(fsDestinationPath) - Directory.Delete(zipDir, True) + localZipCache?.Add(New LocalZipCacheEntry With { + .DownloadUrl = sourceUrl, + .ExtractedZipPath = zipDir + }) End If End Function From af58f0d8ea03239a7e7bba2f555b903db31a13b4 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 18:46:49 +0200 Subject: [PATCH 06/50] install: more directory power --- ModpackUpdater.Manager/Extensions.vb | 35 +++++++++++++++++++++ ModpackUpdater.Manager/ModpackInstaller.vb | 36 +++++++++++++++++----- 2 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 ModpackUpdater.Manager/Extensions.vb diff --git a/ModpackUpdater.Manager/Extensions.vb b/ModpackUpdater.Manager/Extensions.vb new file mode 100644 index 0000000..3654c35 --- /dev/null +++ b/ModpackUpdater.Manager/Extensions.vb @@ -0,0 +1,35 @@ +Imports System.IO + +Public Module Extensions + + Public Sub CopyDirectory(sourceDir As String, destinationDir As String, recursive As Boolean) + ' Get information about the source directory + Dim dir As New DirectoryInfo(sourceDir) + + ' Check if the source directory exists + If Not dir.Exists Then + Throw New DirectoryNotFoundException($"Source directory not found: {dir.FullName}") + End If + + ' Cache directories before we start copying + Dim dirs As DirectoryInfo() = dir.GetDirectories() + + ' Create the destination directory + Directory.CreateDirectory(destinationDir) + + ' Get the files in the source directory and copy to the destination directory + For Each file As FileInfo In dir.GetFiles() + Dim targetFilePath As String = Path.Combine(destinationDir, file.Name) + file.CopyTo(targetFilePath) + Next + + ' If recursive and copying subdirectories, recursively call this method + If recursive Then + For Each subDir As DirectoryInfo In dirs + Dim newDestinationDir As String = Path.Combine(destinationDir, subDir.Name) + CopyDirectory(subDir.FullName, newDestinationDir, True) + Next + End If + End Sub + +End Module diff --git a/ModpackUpdater.Manager/ModpackInstaller.vb b/ModpackUpdater.Manager/ModpackInstaller.vb index 980420a..874360b 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.vb +++ b/ModpackUpdater.Manager/ModpackInstaller.vb @@ -118,15 +118,27 @@ Public Class ModpackInstaller End If Case UpdateActionType.Copy Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath) - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Copy(srcFilePath, destFilePath, True) + If uaction.IsDirectory Then + If Directory.Exists(srcFilePath) Then + CopyDirectory(srcFilePath, destFilePath, True) + End If + Else + If File.Exists(srcFilePath) Then + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + File.Copy(srcFilePath, destFilePath, True) + End If End If Case UpdateActionType.Move Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath) - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Move(srcFilePath, destFilePath, True) + If uaction.IsDirectory Then + If Directory.Exists(srcFilePath) Then + Directory.Move(srcFilePath, destFilePath) + End If + Else + If File.Exists(srcFilePath) Then + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + File.Move(srcFilePath, destFilePath, True) + End If End If End Select Else @@ -137,9 +149,11 @@ Public Class ModpackInstaller RaiseEvent InstallProgessUpdated(checkResult, processed) Next + 'Save new modpack info modpackInfo.Version = checkResult.LatestVersion modpackInfo.Save(localPath) + 'Delete cached zip files For Each task In localZipCache Directory.Delete(task.ExtractedZipPath, True) Next @@ -150,6 +164,7 @@ Public Class ModpackInstaller Private Async Function InstallFile(destFilePath As String, sourceUrl As String, isZip As Boolean, zipPath As String, localZipCache As List(Of LocalZipCacheEntry)) As Task Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) + 'Download Dim fsDestinationPath As String = If(isZip, Path.Combine(Path.GetTempPath(), $"mc_update_file_{Date.Now.ToBinary}.zip"), destFilePath) Dim sRemote As Stream = Await httpClient.GetStreamAsync(sourceUrl) Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite) @@ -157,10 +172,17 @@ Public Class ModpackInstaller sRemote.Close() fs.Close() + 'Handle zip file If isZip Then + 'Extract Dim zipDir As String = $"{Path.GetFileNameWithoutExtension(fsDestinationPath)}_extracted" ZipFile.ExtractToDirectory(fsDestinationPath, zipDir) - '... + + 'Copy content + Dim zipSrc As String = Path.Combine(zipDir, zipPath) + CopyDirectory(zipSrc, destFilePath, True) + + 'Delete/cache temporary files File.Delete(fsDestinationPath) localZipCache?.Add(New LocalZipCacheEntry With { .DownloadUrl = sourceUrl, From 4dd112cd8ca747b939446dcbc5307df4791756ec Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 19:02:04 +0200 Subject: [PATCH 07/50] rework updater --- ModpackUpdater/AppUpdater.vb | 43 ++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/ModpackUpdater/AppUpdater.vb b/ModpackUpdater/AppUpdater.vb index adb2e11..29377bb 100644 --- a/ModpackUpdater/AppUpdater.vb +++ b/ModpackUpdater/AppUpdater.vb @@ -1,44 +1,39 @@ Imports System.IO -Imports System.Net Imports System.Net.Http -Imports WebDav +Imports Newtonsoft.Json +Imports Newtonsoft.Json.Converters Public Class AppUpdater - Private Const WEBDAV_URL As String = "https://cloud.pilzinsel64.de/public.php/webdav" - Private Const WEBDAV_KEY As String = "z4dGicDYmG2neG9" - Private Const DOWNLOAD_URL As String = "https://cloud.pilzinsel64.de/s/z4dGicDYmG2neG9/download" + Private Class UpdateInfo + + Public Property Version As Version + Public Property DownloadUrl As String + End Class - Public Shared Async Function Check() As Task(Of Boolean) + Private Const UPDATE_URL As String = "https://git.pilzinsel64.de/gaming/minecraft/minecraft-modpack-updater/-/snippets/3/raw??????????" + Private ReadOnly httpClient As New HttpClient + Private info As UpdateInfo + + Public Async Function Check() As Task(Of Boolean) Dim appFileName = Pilz.IO.Extensions.GetExecutablePath() Dim hasUpdate As Boolean = False - Dim params As New WebDavClientParams With { - .BaseAddress = New Uri(WEBDAV_URL), - .Credentials = New NetworkCredential(WEBDAV_KEY, String.Empty) - } Try - Using client As New WebDavClient(params) - Dim result = Await client.Propfind(String.Empty) + Dim result = Await httpClient.GetStringAsync(UPDATE_URL) + info = JsonConvert.DeserializeObject(Of UpdateInfo)(result) - If result.IsSuccessful AndAlso result.Resources.Count <> 0 Then - Dim resource = result.Resources(0) - Dim appModificationDate = File.GetLastWriteTimeUtc(appFileName) - Dim remoteModificationDate = resource.LastModifiedDate?.ToUniversalTime - - If remoteModificationDate > appModificationDate Then - hasUpdate = True - End If - End If - End Using + If info IsNot Nothing AndAlso info.Version < New Version(Application.ProductVersion) Then + hasUpdate = True + End If Catch ex As Exception End Try Return hasUpdate End Function - Public Shared Async Function Install() As Task + Public Async Function Install() As Task Dim client As New HttpClient Dim tempFileName = Path.GetTempFileName Dim appFileName = Pilz.IO.Extensions.GetExecutablePath() @@ -54,7 +49,7 @@ Public Class AppUpdater Using tempFileStream As New FileStream(tempFileName, FileMode.Create, FileAccess.ReadWrite) Dim downloadStream As Stream = Nothing Try - downloadStream = Await client.GetStreamAsync(DOWNLOAD_URL) + downloadStream = Await client.GetStreamAsync(info.DownloadUrl) Await downloadStream.CopyToAsync(tempFileStream) Catch Finally From a7a3abf6e5c9b2935f07bf0aab208d01c3888d8a Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 20:02:08 +0200 Subject: [PATCH 08/50] update update url --- ModpackUpdater/AppUpdater.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/AppUpdater.vb b/ModpackUpdater/AppUpdater.vb index 29377bb..0aa1deb 100644 --- a/ModpackUpdater/AppUpdater.vb +++ b/ModpackUpdater/AppUpdater.vb @@ -12,7 +12,7 @@ Public Class AppUpdater Public Property DownloadUrl As String End Class - Private Const UPDATE_URL As String = "https://git.pilzinsel64.de/gaming/minecraft/minecraft-modpack-updater/-/snippets/3/raw??????????" + Private Const UPDATE_URL As String = "https://git.pilzinsel64.de/gaming/minecraft/minecraft-modpack-updater/-/snippets/3/raw/main/updates.json" Private ReadOnly httpClient As New HttpClient Private info As UpdateInfo From e303b6c38163cc95fb27e3df508f00ddb71ecf9c Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 20:11:29 +0200 Subject: [PATCH 09/50] fix AppUpdater using --- ModpackUpdater/Form1.vb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ModpackUpdater/Form1.vb b/ModpackUpdater/Form1.vb index 4cd3638..19f9e55 100644 --- a/ModpackUpdater/Form1.vb +++ b/ModpackUpdater/Form1.vb @@ -195,10 +195,11 @@ Public Class Form1 End Sub Private Async Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown - If Await AppUpdater.Check AndAlso RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) = DialogResult.Yes Then + Dim updater As New AppUpdater + If Await updater.Check AndAlso RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) = DialogResult.Yes Then SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px) Enabled = False - Await AppUpdater.Install() + Await updater.Install Application.Restart() End If End Sub From b32d2c551215665da864e01dc1996c0484b91490 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 20:11:58 +0200 Subject: [PATCH 10/50] remove unused imports --- ModpackUpdater/Form1.vb | 2 -- 1 file changed, 2 deletions(-) diff --git a/ModpackUpdater/Form1.vb b/ModpackUpdater/Form1.vb index 19f9e55..667fe03 100644 --- a/ModpackUpdater/Form1.vb +++ b/ModpackUpdater/Form1.vb @@ -1,7 +1,5 @@ Imports System.IO -Imports ModpackUpdater.GitLab - Imports ModpackUpdater.Manager Imports ModpackUpdater.Model From b21d33237f735ab33c23c4433c6fc5de76b4dffc Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 20:13:45 +0200 Subject: [PATCH 11/50] fix converter for UpdateInfo.Version --- ModpackUpdater/AppUpdater.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/AppUpdater.vb b/ModpackUpdater/AppUpdater.vb index 0aa1deb..83a8240 100644 --- a/ModpackUpdater/AppUpdater.vb +++ b/ModpackUpdater/AppUpdater.vb @@ -7,7 +7,7 @@ Imports Newtonsoft.Json.Converters Public Class AppUpdater Private Class UpdateInfo - + Public Property Version As Version Public Property DownloadUrl As String End Class From f07fad0a80712f5ac66025af3157531e0ff236d5 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 17 Jun 2024 20:20:13 +0200 Subject: [PATCH 12/50] use assembly file version instead of product version for update check --- ModpackUpdater/AppUpdater.vb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ModpackUpdater/AppUpdater.vb b/ModpackUpdater/AppUpdater.vb index 83a8240..d132e51 100644 --- a/ModpackUpdater/AppUpdater.vb +++ b/ModpackUpdater/AppUpdater.vb @@ -1,5 +1,6 @@ Imports System.IO Imports System.Net.Http +Imports System.Reflection Imports Newtonsoft.Json Imports Newtonsoft.Json.Converters @@ -21,10 +22,11 @@ Public Class AppUpdater Dim hasUpdate As Boolean = False Try + Dim appVersion As Version = Assembly.GetExecutingAssembly().GetName().Version Dim result = Await httpClient.GetStringAsync(UPDATE_URL) info = JsonConvert.DeserializeObject(Of UpdateInfo)(result) - If info IsNot Nothing AndAlso info.Version < New Version(Application.ProductVersion) Then + If info IsNot Nothing AndAlso info.Version < appVersion Then hasUpdate = True End If Catch ex As Exception From deb14caf24caf69c7099fbe0aad5b68ae31b7de4 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Tue, 18 Jun 2024 10:56:32 +0200 Subject: [PATCH 13/50] convert to c# --- .../ModpackUpdater.GitLab.vbproj | 12 - ModpackUpdater.GitLab/UpdateConfigExt.vb | 33 --- ModpackUpdater.Manager/Extensions.cs | 40 +++ ModpackUpdater.Manager/Extensions.vb | 35 --- .../MinecraftProfileChecker.cs | 11 + .../MinecraftProfileChecker.vb | 8 - ModpackUpdater.Manager/ModpackInstaller.cs | 211 ++++++++++++++ ModpackUpdater.Manager/ModpackInstaller.vb | 194 ------------- ...r.vbproj => ModpackUpdater.Manager.csproj} | 14 +- ModpackUpdater.Manager/UpdateCheckResult.cs | 13 + ModpackUpdater.Manager/UpdateCheckResult.vb | 17 -- ModpackUpdater.Model/InstallAction.cs | 9 + ModpackUpdater.Model/InstallAction.vb | 8 - ModpackUpdater.Model/InstallInfos.cs | 13 + ModpackUpdater.Model/InstallInfos.vb | 11 - ModpackUpdater.Model/ModpackConfig.cs | 16 + ModpackUpdater.Model/ModpackConfig.vb | 16 - ModpackUpdater.Model/ModpackInfo.cs | 33 +++ ModpackUpdater.Model/ModpackInfo.vb | 29 -- ...del.vbproj => ModpackUpdater.Model.csproj} | 8 +- ModpackUpdater.Model/UpdateAction.cs | 12 + ModpackUpdater.Model/UpdateAction.vb | 12 - ModpackUpdater.Model/UpdateActionType.cs | 10 + ModpackUpdater.Model/UpdateActionType.vb | 7 - ModpackUpdater.Model/UpdateInfo.cs | 11 + ModpackUpdater.Model/UpdateInfo.vb | 10 - ModpackUpdater.Model/UpdateInfos.cs | 13 + ModpackUpdater.Model/UpdateInfos.vb | 11 - ModpackUpdater.sln | 30 +- ModpackUpdater.sln.bak | 37 +++ ModpackUpdater/AppConfig.cs | 69 +++++ ModpackUpdater/AppConfig.vb | 59 ---- ModpackUpdater/AppUpdater.cs | 78 +++++ ModpackUpdater/AppUpdater.vb | 67 ----- ModpackUpdater/ApplicationEvents.vb | 40 --- ModpackUpdater/FiledialogFilters.Designer.cs | 95 ++++++ ModpackUpdater/FiledialogFilters.Designer.vb | 85 ------ ModpackUpdater/Form1.Designer.cs | 274 ++++++++++++++++++ ModpackUpdater/Form1.Designer.vb | 254 ---------------- ModpackUpdater/Form1.cs | 248 ++++++++++++++++ ModpackUpdater/Form1.vb | 205 ------------- ModpackUpdater/LangRes.Designer.cs | 183 ++++++++++++ ModpackUpdater/LangRes.Designer.vb | 157 ---------- ...ckUpdater.vbproj => ModpackUpdater.csproj} | 53 ++-- .../My Project/Application.Designer.vb | 38 --- ModpackUpdater/My Project/Application.myapp | 10 - ModpackUpdater/MySymbols.Designer.cs | 182 ++++++++++++ ModpackUpdater/MySymbols.Designer.vb | 157 ---------- ModpackUpdater/Program.cs | 18 ++ 49 files changed, 1622 insertions(+), 1534 deletions(-) delete mode 100644 ModpackUpdater.GitLab/ModpackUpdater.GitLab.vbproj delete mode 100644 ModpackUpdater.GitLab/UpdateConfigExt.vb create mode 100644 ModpackUpdater.Manager/Extensions.cs delete mode 100644 ModpackUpdater.Manager/Extensions.vb create mode 100644 ModpackUpdater.Manager/MinecraftProfileChecker.cs delete mode 100644 ModpackUpdater.Manager/MinecraftProfileChecker.vb create mode 100644 ModpackUpdater.Manager/ModpackInstaller.cs delete mode 100644 ModpackUpdater.Manager/ModpackInstaller.vb rename ModpackUpdater.Manager/{ModpackUpdater.Manager.vbproj => ModpackUpdater.Manager.csproj} (77%) create mode 100644 ModpackUpdater.Manager/UpdateCheckResult.cs delete mode 100644 ModpackUpdater.Manager/UpdateCheckResult.vb create mode 100644 ModpackUpdater.Model/InstallAction.cs delete mode 100644 ModpackUpdater.Model/InstallAction.vb create mode 100644 ModpackUpdater.Model/InstallInfos.cs delete mode 100644 ModpackUpdater.Model/InstallInfos.vb create mode 100644 ModpackUpdater.Model/ModpackConfig.cs delete mode 100644 ModpackUpdater.Model/ModpackConfig.vb create mode 100644 ModpackUpdater.Model/ModpackInfo.cs delete mode 100644 ModpackUpdater.Model/ModpackInfo.vb rename ModpackUpdater.Model/{ModpackUpdater.Model.vbproj => ModpackUpdater.Model.csproj} (76%) create mode 100644 ModpackUpdater.Model/UpdateAction.cs delete mode 100644 ModpackUpdater.Model/UpdateAction.vb create mode 100644 ModpackUpdater.Model/UpdateActionType.cs delete mode 100644 ModpackUpdater.Model/UpdateActionType.vb create mode 100644 ModpackUpdater.Model/UpdateInfo.cs delete mode 100644 ModpackUpdater.Model/UpdateInfo.vb create mode 100644 ModpackUpdater.Model/UpdateInfos.cs delete mode 100644 ModpackUpdater.Model/UpdateInfos.vb create mode 100644 ModpackUpdater.sln.bak create mode 100644 ModpackUpdater/AppConfig.cs delete mode 100644 ModpackUpdater/AppConfig.vb create mode 100644 ModpackUpdater/AppUpdater.cs delete mode 100644 ModpackUpdater/AppUpdater.vb delete mode 100644 ModpackUpdater/ApplicationEvents.vb create mode 100644 ModpackUpdater/FiledialogFilters.Designer.cs delete mode 100644 ModpackUpdater/FiledialogFilters.Designer.vb create mode 100644 ModpackUpdater/Form1.Designer.cs delete mode 100644 ModpackUpdater/Form1.Designer.vb create mode 100644 ModpackUpdater/Form1.cs delete mode 100644 ModpackUpdater/Form1.vb create mode 100644 ModpackUpdater/LangRes.Designer.cs delete mode 100644 ModpackUpdater/LangRes.Designer.vb rename ModpackUpdater/{ModpackUpdater.vbproj => ModpackUpdater.csproj} (59%) delete mode 100644 ModpackUpdater/My Project/Application.Designer.vb delete mode 100644 ModpackUpdater/My Project/Application.myapp create mode 100644 ModpackUpdater/MySymbols.Designer.cs delete mode 100644 ModpackUpdater/MySymbols.Designer.vb create mode 100644 ModpackUpdater/Program.cs diff --git a/ModpackUpdater.GitLab/ModpackUpdater.GitLab.vbproj b/ModpackUpdater.GitLab/ModpackUpdater.GitLab.vbproj deleted file mode 100644 index 36ae3a6..0000000 --- a/ModpackUpdater.GitLab/ModpackUpdater.GitLab.vbproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - ModpackUpdater.GitLab - net8.0 - - - - - - - diff --git a/ModpackUpdater.GitLab/UpdateConfigExt.vb b/ModpackUpdater.GitLab/UpdateConfigExt.vb deleted file mode 100644 index be312ed..0000000 --- a/ModpackUpdater.GitLab/UpdateConfigExt.vb +++ /dev/null @@ -1,33 +0,0 @@ -Imports System.Net.Http - -Imports ModpackUpdater.Model - -Imports Newtonsoft.Json - -Public Class UpdateConfigExt - - ' - 'Public Sub SaveToSnippet(config As UpdateConfig, gitlabUrl As String, gitlabToken As String, projectId As Integer, snippetId As Integer, snippetFilePath As String) - ' Dim client As New GitLabClient(gitlabUrl, gitlabToken) - ' Dim update As New SnippetProjectUpdate With { - ' .Visibility = VisibilityLevel.Public, - ' .ProjectId = projectId, - ' .SnippetId = snippetId, - ' .Files = { - ' New SnippetUpdateFile With { - ' .Action = SnippetUpdateFileAction.Update.Create, - ' .FilePath = snippetFilePath, - ' .Content = JsonConvert.SerializeObject(config) - ' } - ' } - ' } - ' client.Snippets.Update(update) - 'End Sub - - Public Shared Function LoadFromSnippet(url As String) As ModpackConfig - Dim client As New HttpClient - Dim result = client.GetStringAsync(url).Result - Return JsonConvert.DeserializeObject(Of ModpackConfig)(result) - End Function - -End Class diff --git a/ModpackUpdater.Manager/Extensions.cs b/ModpackUpdater.Manager/Extensions.cs new file mode 100644 index 0000000..3c6c9f8 --- /dev/null +++ b/ModpackUpdater.Manager/Extensions.cs @@ -0,0 +1,40 @@ +namespace ModpackUpdater.Manager; + + +public static class Extensions +{ + + public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive) + { + // Get information about the source directory + var dir = new DirectoryInfo(sourceDir); + + // Check if the source directory exists + if (!dir.Exists) + throw new DirectoryNotFoundException($"Source directory not found: {dir.FullName}"); + + // Cache directories before we start copying + DirectoryInfo[] dirs = dir.GetDirectories(); + + // Create the destination directory + Directory.CreateDirectory(destinationDir); + + // Get the files in the source directory and copy to the destination directory + foreach (FileInfo @file in dir.GetFiles()) + { + string targetFilePath = Path.Combine(destinationDir, @file.Name); + @file.CopyTo(targetFilePath); + } + + // If recursive and copying subdirectories, recursively call this method + if (recursive) + { + foreach (DirectoryInfo subDir in dirs) + { + string newDestinationDir = Path.Combine(destinationDir, subDir.Name); + CopyDirectory(subDir.FullName, newDestinationDir, true); + } + } + } + +} \ No newline at end of file diff --git a/ModpackUpdater.Manager/Extensions.vb b/ModpackUpdater.Manager/Extensions.vb deleted file mode 100644 index 3654c35..0000000 --- a/ModpackUpdater.Manager/Extensions.vb +++ /dev/null @@ -1,35 +0,0 @@ -Imports System.IO - -Public Module Extensions - - Public Sub CopyDirectory(sourceDir As String, destinationDir As String, recursive As Boolean) - ' Get information about the source directory - Dim dir As New DirectoryInfo(sourceDir) - - ' Check if the source directory exists - If Not dir.Exists Then - Throw New DirectoryNotFoundException($"Source directory not found: {dir.FullName}") - End If - - ' Cache directories before we start copying - Dim dirs As DirectoryInfo() = dir.GetDirectories() - - ' Create the destination directory - Directory.CreateDirectory(destinationDir) - - ' Get the files in the source directory and copy to the destination directory - For Each file As FileInfo In dir.GetFiles() - Dim targetFilePath As String = Path.Combine(destinationDir, file.Name) - file.CopyTo(targetFilePath) - Next - - ' If recursive and copying subdirectories, recursively call this method - If recursive Then - For Each subDir As DirectoryInfo In dirs - Dim newDestinationDir As String = Path.Combine(destinationDir, subDir.Name) - CopyDirectory(subDir.FullName, newDestinationDir, True) - Next - End If - End Sub - -End Module diff --git a/ModpackUpdater.Manager/MinecraftProfileChecker.cs b/ModpackUpdater.Manager/MinecraftProfileChecker.cs new file mode 100644 index 0000000..e7deed7 --- /dev/null +++ b/ModpackUpdater.Manager/MinecraftProfileChecker.cs @@ -0,0 +1,11 @@ + +namespace ModpackUpdater.Manager; + +public class MinecraftProfileChecker +{ + public static bool CheckProfile(string folderPath) + { + // Todo: Adds some checks to verify, if the current folder is a minecraft folder. + return true; + } +} \ No newline at end of file diff --git a/ModpackUpdater.Manager/MinecraftProfileChecker.vb b/ModpackUpdater.Manager/MinecraftProfileChecker.vb deleted file mode 100644 index 3bf389e..0000000 --- a/ModpackUpdater.Manager/MinecraftProfileChecker.vb +++ /dev/null @@ -1,8 +0,0 @@ -Public Class MinecraftProfileChecker - - Public Shared Function CheckProfile(folderPath As string) As Boolean - 'Todo: Adds some checks to verify, if the current folder is a minecraft folder. - Return True - End Function - -End Class diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs new file mode 100644 index 0000000..ed1e0d9 --- /dev/null +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -0,0 +1,211 @@ +using ModpackUpdater.Model; +using System.IO.Compression; + +namespace ModpackUpdater.Manager; + +public class ModpackInstaller(ModpackConfig updateConfig, string localPath) +{ + private class LocalZipCacheEntry + { + public string DownloadUrl { get; set; } + public string ExtractedZipPath { get; set; } + } + + public event InstallProgessUpdatedEventHandler InstallProgessUpdated; + + public delegate void InstallProgessUpdatedEventHandler(UpdateCheckResult result, int processedSyncs); + public event CheckingProgressUpdatedEventHandler CheckingProgressUpdated; + + public delegate void CheckingProgressUpdatedEventHandler(int toCheck, int processed); + + private HttpClient httpClient = new(); + + ~ModpackInstaller() + { + httpClient.Dispose(); + } + + private async Task DownloadUpdateInfos() + { + var content = await httpClient.GetStringAsync(updateConfig.UpdateUrl); + return UpdateInfos.Parse(content); + } + + private async Task DownloadInstallInfos() + { + var content = await httpClient.GetStringAsync(updateConfig.InstallUrl); + return InstallInfos.Parse(content); + } + + public async Task Check(bool ignoreRevmoedFiles) + { + var result = new UpdateCheckResult(); + + if (ModpackInfo.HasModpackInfo(localPath)) + { + var infos = await DownloadUpdateInfos(); + var modpackInfo = ModpackInfo.Load(localPath); + + if (infos is not null && infos.Updates.Count != 0) + { + var updatesOrderes = infos.Updates.OrderByDescending(n => n.Version); + result.LatestVersion = updatesOrderes.First().Version; + result.CurrentVersion = modpackInfo.Version; + result.IsInstalled = true; + + var checkingVersionIndex = 0; + var checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex); + + while (checkingVersion is not null && checkingVersion.Version > result.CurrentVersion) + { + var actionsToAdd = new List(); + + foreach (var action in checkingVersion.Actions) + { + if (!result.Actions.Any(n => n.DestPath == action.DestPath)) + actionsToAdd.Add(action); + } + + result.Actions.InsertRange(0, actionsToAdd); + + checkingVersionIndex += 1; + checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex); + } + } + else + result.HasError = true; + } + + if (!result.IsInstalled) + { + var infos = await DownloadInstallInfos(); + + if (infos is not null && infos.Actions.Count != 0) + result.Actions.AddRange(infos.Actions); + else + result.HasError = true; + } + + return result; + } + + public async Task Install(UpdateCheckResult checkResult) + { + ModpackInfo modpackInfo; + int processed = 0; + var localZipCache = new List(); + + if (ModpackInfo.HasModpackInfo(localPath)) + modpackInfo = ModpackInfo.Load(localPath); + else + { + modpackInfo = new ModpackInfo(); + } + + foreach (InstallAction iaction in checkResult.Actions) + { + string destFilePath = Path.Combine(localPath, iaction.DestPath); + + if (iaction is UpdateAction) + { + UpdateAction uaction = (UpdateAction)iaction; + + switch (uaction.Type) + { + case UpdateActionType.Update: + await InstallFile(destFilePath, uaction.DownloadUrl, uaction.IsZip, uaction.ZipPath, localZipCache); + break; + case UpdateActionType.Delete: + { + if (uaction.IsDirectory) + { + if (Directory.Exists(destFilePath)) + Directory.Delete(destFilePath, true); + } + else if (File.Exists(destFilePath)) + File.Delete(destFilePath); + } + break; + case UpdateActionType.Copy: + { + var srcFilePath = Path.Combine(localPath, uaction.SrcPath); + if (uaction.IsDirectory) + { + if (Directory.Exists(srcFilePath)) + Extensions.CopyDirectory(srcFilePath, destFilePath, true); + } + else if (File.Exists(srcFilePath)) + { + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)); + File.Copy(srcFilePath, destFilePath, true); + } + } + break; + case UpdateActionType.Move: + { + var srcFilePath = Path.Combine(localPath, uaction.SrcPath); + if (uaction.IsDirectory) + { + if (Directory.Exists(srcFilePath)) + Directory.Move(srcFilePath, destFilePath); + } + else if (File.Exists(srcFilePath)) + { + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)); + File.Move(srcFilePath, destFilePath, true); + } + } + break; + } + } + else + await InstallFile(destFilePath, iaction.DownloadUrl, iaction.IsZip, iaction.ZipPath, localZipCache); + + processed += 1; + InstallProgessUpdated?.Invoke(checkResult, processed); + } + + // Save new modpack info + modpackInfo.Version = checkResult.LatestVersion; + modpackInfo.Save(localPath); + + // Delete cached zip files + foreach (var task in localZipCache) + Directory.Delete(task.ExtractedZipPath, true); + + return true; + } + + private async Task InstallFile(string destFilePath, string sourceUrl, bool isZip, string zipPath, List localZipCache) + { + Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)); + + // Download + var fsDestinationPath = isZip ? Path.Combine(Path.GetTempPath(), $"mc_update_file_{DateTime.Now.ToBinary()}.zip") : destFilePath; + var sRemote = await httpClient.GetStreamAsync(sourceUrl); + var fs = new FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite); + await sRemote.CopyToAsync(fs); + sRemote.Close(); + fs.Close(); + + // Handle zip file + if (isZip) + { + // Extract + var zipDir = $"{Path.GetFileNameWithoutExtension(fsDestinationPath)}_extracted"; + ZipFile.ExtractToDirectory(fsDestinationPath, zipDir); + + // Copy content + var zipSrc = Path.Combine(zipDir, zipPath); + Extensions.CopyDirectory(zipSrc, destFilePath, true); + + // Delete/cache temporary files + File.Delete(fsDestinationPath); + localZipCache?.Add(new LocalZipCacheEntry + { + DownloadUrl = sourceUrl, + ExtractedZipPath = zipDir + }); + } + } +} \ No newline at end of file diff --git a/ModpackUpdater.Manager/ModpackInstaller.vb b/ModpackUpdater.Manager/ModpackInstaller.vb deleted file mode 100644 index 874360b..0000000 --- a/ModpackUpdater.Manager/ModpackInstaller.vb +++ /dev/null @@ -1,194 +0,0 @@ -Imports System.IO -Imports System.IO.Compression -Imports System.Net.Http - -Imports ModpackUpdater.Model - -Public Class ModpackInstaller - - Private Class LocalZipCacheEntry - Public Property DownloadUrl As String - Public Property ExtractedZipPath As String - End Class - - Public Event InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) - Public Event CheckingProgressUpdated(toCheck As Integer, processed As Integer) - - Private ReadOnly updateConfig As ModpackConfig - Private ReadOnly localPath As String - Private httpClient As New HttpClient - - Public Sub New(updateConfig As ModpackConfig, localPath As String) - Me.updateConfig = updateConfig - Me.localPath = localPath - End Sub - - Protected Overrides Sub Finalize() - httpClient.Dispose() - MyBase.Finalize() - End Sub - - Private Async Function DownloadUpdateInfos() As Task(Of UpdateInfos) - Dim content As String = Await httpClient.GetStringAsync(updateConfig.UpdateUrl) - Return UpdateInfos.Parse(content) - End Function - - Private Async Function DownloadInstallInfos() As Task(Of InstallInfos) - Dim content As String = Await httpClient.GetStringAsync(updateConfig.InstallUrl) - Return InstallInfos.Parse(content) - End Function - - Public Async Function Check(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult) - Dim result As New UpdateCheckResult - - If ModpackInfo.HasModpackInfo(localPath) Then - Dim infos As UpdateInfos = Await DownloadUpdateInfos() - Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath) - - If infos IsNot Nothing AndAlso infos.Updates.Count <> 0 Then - Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version) - result.LatestVersion = updatesOrderes.First.Version - result.CurrentVersion = modpackInfo.Version - result.IsInstalled = True - - Dim checkingVersionIndex As Integer = 0 - Dim checkingVersion As UpdateInfo = updatesOrderes(checkingVersionIndex) - - Do While checkingVersion IsNot Nothing AndAlso checkingVersion.Version > result.CurrentVersion - Dim actionsToAdd As New List(Of UpdateAction) - - For Each action In checkingVersion.Actions - If Not result.Actions.Any(Function(n) n.DestPath = action.DestPath) Then - actionsToAdd.Add(action) - End If - Next - - result.Actions.InsertRange(0, actionsToAdd) - - checkingVersionIndex += 1 - checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex) - Loop - Else - result.HasError = True - End If - End If - - If Not result.IsInstalled Then - Dim infos As InstallInfos = Await DownloadInstallInfos() - - If infos IsNot Nothing AndAlso infos.Actions.Count <> 0 Then - result.Actions.AddRange(infos.Actions) - Else - result.HasError = True - End If - End If - - Return result - End Function - - Public Async Function Install(checkResult As UpdateCheckResult) As Task(Of Boolean?) - Dim modpackInfo As ModpackInfo - Dim processed As Integer = 0 - Dim localZipCache As New List(Of LocalZipCacheEntry) - - If ModpackInfo.HasModpackInfo(localPath) Then - modpackInfo = ModpackInfo.Load(localPath) - Else - modpackInfo = New ModpackInfo - End If - - For Each iaction As InstallAction In checkResult.Actions - Dim destFilePath As String = Path.Combine(localPath, iaction.DestPath) - - If TypeOf iaction Is UpdateAction Then - Dim uaction As UpdateAction = iaction - - Select Case uaction.Type - Case UpdateActionType.Update - Await InstallFile(destFilePath, uaction.DownloadUrl, uaction.IsZip, uaction.ZipPath, localZipCache) - Case UpdateActionType.Delete - If uaction.IsDirectory Then - If Directory.Exists(destFilePath) Then - Directory.Delete(destFilePath, True) - End If - Else - If File.Exists(destFilePath) Then - File.Delete(destFilePath) - End If - End If - Case UpdateActionType.Copy - Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath) - If uaction.IsDirectory Then - If Directory.Exists(srcFilePath) Then - CopyDirectory(srcFilePath, destFilePath, True) - End If - Else - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Copy(srcFilePath, destFilePath, True) - End If - End If - Case UpdateActionType.Move - Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath) - If uaction.IsDirectory Then - If Directory.Exists(srcFilePath) Then - Directory.Move(srcFilePath, destFilePath) - End If - Else - If File.Exists(srcFilePath) Then - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - File.Move(srcFilePath, destFilePath, True) - End If - End If - End Select - Else - Await InstallFile(destFilePath, iaction.DownloadUrl, iaction.IsZip, iaction.ZipPath, localZipCache) - End If - - processed += 1 - RaiseEvent InstallProgessUpdated(checkResult, processed) - Next - - 'Save new modpack info - modpackInfo.Version = checkResult.LatestVersion - modpackInfo.Save(localPath) - - 'Delete cached zip files - For Each task In localZipCache - Directory.Delete(task.ExtractedZipPath, True) - Next - - Return True - End Function - - Private Async Function InstallFile(destFilePath As String, sourceUrl As String, isZip As Boolean, zipPath As String, localZipCache As List(Of LocalZipCacheEntry)) As Task - Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) - - 'Download - Dim fsDestinationPath As String = If(isZip, Path.Combine(Path.GetTempPath(), $"mc_update_file_{Date.Now.ToBinary}.zip"), destFilePath) - Dim sRemote As Stream = Await httpClient.GetStreamAsync(sourceUrl) - Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite) - Await sRemote.CopyToAsync(fs) - sRemote.Close() - fs.Close() - - 'Handle zip file - If isZip Then - 'Extract - Dim zipDir As String = $"{Path.GetFileNameWithoutExtension(fsDestinationPath)}_extracted" - ZipFile.ExtractToDirectory(fsDestinationPath, zipDir) - - 'Copy content - Dim zipSrc As String = Path.Combine(zipDir, zipPath) - CopyDirectory(zipSrc, destFilePath, True) - - 'Delete/cache temporary files - File.Delete(fsDestinationPath) - localZipCache?.Add(New LocalZipCacheEntry With { - .DownloadUrl = sourceUrl, - .ExtractedZipPath = zipDir - }) - End If - End Function - -End Class diff --git a/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj b/ModpackUpdater.Manager/ModpackUpdater.Manager.csproj similarity index 77% rename from ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj rename to ModpackUpdater.Manager/ModpackUpdater.Manager.csproj index c976e8f..5fc9312 100644 --- a/ModpackUpdater.Manager/ModpackUpdater.Manager.vbproj +++ b/ModpackUpdater.Manager/ModpackUpdater.Manager.csproj @@ -1,16 +1,16 @@  - + - ModpackUpdater.Manager net8.0 + true - + - + - + - - + + \ No newline at end of file diff --git a/ModpackUpdater.Manager/UpdateCheckResult.cs b/ModpackUpdater.Manager/UpdateCheckResult.cs new file mode 100644 index 0000000..77c8335 --- /dev/null +++ b/ModpackUpdater.Manager/UpdateCheckResult.cs @@ -0,0 +1,13 @@ +using ModpackUpdater.Model; + +namespace ModpackUpdater.Manager; + +public class UpdateCheckResult +{ + public Version CurrentVersion { get; set; } + public Version LatestVersion { get; set; } + public List Actions { get; private set; } = []; + public bool IsInstalled { get; set; } + public bool HasError { get; set; } + public bool HasUpdates => !IsInstalled || CurrentVersion < LatestVersion; +} \ No newline at end of file diff --git a/ModpackUpdater.Manager/UpdateCheckResult.vb b/ModpackUpdater.Manager/UpdateCheckResult.vb deleted file mode 100644 index 09b33fd..0000000 --- a/ModpackUpdater.Manager/UpdateCheckResult.vb +++ /dev/null @@ -1,17 +0,0 @@ -Imports ModpackUpdater.Model - -Public Class UpdateCheckResult - - Public Property CurrentVersion As Version - Public Property LatestVersion As Version - Public ReadOnly Property Actions As New List(Of InstallAction) - Public Property IsInstalled As Boolean - Public Property HasError As Boolean - - Public ReadOnly Property HasUpdates As Boolean - Get - Return Not IsInstalled OrElse CurrentVersion < LatestVersion - End Get - End Property - -End Class diff --git a/ModpackUpdater.Model/InstallAction.cs b/ModpackUpdater.Model/InstallAction.cs new file mode 100644 index 0000000..b7e3283 --- /dev/null +++ b/ModpackUpdater.Model/InstallAction.cs @@ -0,0 +1,9 @@ +namespace ModpackUpdater.Model; + +public class InstallAction +{ + public bool IsZip { get; set; } + public string ZipPath { get; set; } + public string DestPath { get; set; } + public string DownloadUrl { get; set; } +} \ No newline at end of file diff --git a/ModpackUpdater.Model/InstallAction.vb b/ModpackUpdater.Model/InstallAction.vb deleted file mode 100644 index 16aecd9..0000000 --- a/ModpackUpdater.Model/InstallAction.vb +++ /dev/null @@ -1,8 +0,0 @@ -Public Class InstallAction - - Public Property IsZip As Boolean - Public Property ZipPath As String - Public Property DestPath As String - Public Property DownloadUrl As String - -End Class diff --git a/ModpackUpdater.Model/InstallInfos.cs b/ModpackUpdater.Model/InstallInfos.cs new file mode 100644 index 0000000..fc543d3 --- /dev/null +++ b/ModpackUpdater.Model/InstallInfos.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace ModpackUpdater.Model; + +public class InstallInfos +{ + public List Actions { get; private set; } = []; + + public static InstallInfos Parse(string content) + { + return JsonConvert.DeserializeObject(content); + } +} \ No newline at end of file diff --git a/ModpackUpdater.Model/InstallInfos.vb b/ModpackUpdater.Model/InstallInfos.vb deleted file mode 100644 index 9642120..0000000 --- a/ModpackUpdater.Model/InstallInfos.vb +++ /dev/null @@ -1,11 +0,0 @@ -Imports Newtonsoft.Json - -Public Class InstallInfos - - Public ReadOnly Property Actions As New List(Of InstallAction) - - Public Shared Function Parse(content As String) As InstallInfos - Return JsonConvert.DeserializeObject(Of InstallInfos)(content) - End Function - -End Class diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs new file mode 100644 index 0000000..30191a9 --- /dev/null +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace ModpackUpdater.Model; + +public class ModpackConfig +{ + public string Name { get; set; } + public string UpdateUrl { get; set; } + public string InstallUrl { get; set; } + + public static object LoadFromUrl(string url) + { + string result = new HttpClient().GetStringAsync(url).Result; + return JsonConvert.DeserializeObject(result); + } +} \ No newline at end of file diff --git a/ModpackUpdater.Model/ModpackConfig.vb b/ModpackUpdater.Model/ModpackConfig.vb deleted file mode 100644 index 4d411b6..0000000 --- a/ModpackUpdater.Model/ModpackConfig.vb +++ /dev/null @@ -1,16 +0,0 @@ -Imports System.Net.Http - -Imports Newtonsoft.Json - -Public Class ModpackConfig - - Public Property Name As String - Public Property UpdateUrl As String - Public Property InstallUrl As String - - Public Shared Function LoadFromUrl(url As String) - Dim result As String = New HttpClient().GetStringAsync(url).Result - Return JsonConvert.DeserializeObject(Of ModpackConfig)(result) - End Function - -End Class diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs new file mode 100644 index 0000000..7aba881 --- /dev/null +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -0,0 +1,33 @@ +using Microsoft.VisualBasic.CompilerServices; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace ModpackUpdater.Model; + +public class ModpackInfo +{ + private const string FILENAME_MODPACKINFO = "modpack-info.json"; + + [JsonConverter(typeof(VersionConverter))] + public Version Version { get; set; } + + public void Save(string mcRoot) + { + File.WriteAllText(Conversions.ToString(GetFilePath(mcRoot)), JsonConvert.SerializeObject(this)); + } + + public static ModpackInfo Load(string mcRoot) + { + return JsonConvert.DeserializeObject(File.ReadAllText(Conversions.ToString(GetFilePath(mcRoot)))); + } + + public static bool HasModpackInfo(string mcRoot) + { + return File.Exists(Conversions.ToString(GetFilePath(mcRoot))); + } + + private static object GetFilePath(string mcRoot) + { + return Path.Combine(mcRoot, FILENAME_MODPACKINFO); + } +} \ No newline at end of file diff --git a/ModpackUpdater.Model/ModpackInfo.vb b/ModpackUpdater.Model/ModpackInfo.vb deleted file mode 100644 index 35fd3ac..0000000 --- a/ModpackUpdater.Model/ModpackInfo.vb +++ /dev/null @@ -1,29 +0,0 @@ -Imports System.IO - -Imports Newtonsoft.Json -Imports Newtonsoft.Json.Converters - -Public Class ModpackInfo - - Private Const FILENAME_MODPACKINFO = "modpack-info.json" - - - Public Property Version As Version - - Public Sub Save(mcRoot As String) - File.WriteAllText(GetFilePath(mcRoot), JsonConvert.SerializeObject(Me)) - End Sub - - Public Shared Function Load(mcRoot As String) As ModpackInfo - Return JsonConvert.DeserializeObject(Of ModpackInfo)(File.ReadAllText(GetFilePath(mcRoot))) - End Function - - Public Shared Function HasModpackInfo(mcRoot As String) As Boolean - Return File.Exists(GetFilePath(mcRoot)) - End Function - - Private Shared Function GetFilePath(mcRoot As String) - Return Path.Combine(mcRoot, FILENAME_MODPACKINFO) - End Function - -End Class diff --git a/ModpackUpdater.Model/ModpackUpdater.Model.vbproj b/ModpackUpdater.Model/ModpackUpdater.Model.csproj similarity index 76% rename from ModpackUpdater.Model/ModpackUpdater.Model.vbproj rename to ModpackUpdater.Model/ModpackUpdater.Model.csproj index f65a20d..d3204d0 100644 --- a/ModpackUpdater.Model/ModpackUpdater.Model.vbproj +++ b/ModpackUpdater.Model/ModpackUpdater.Model.csproj @@ -1,12 +1,12 @@  - + - ModpackUpdater.Model net8.0 + true - + - + \ No newline at end of file diff --git a/ModpackUpdater.Model/UpdateAction.cs b/ModpackUpdater.Model/UpdateAction.cs new file mode 100644 index 0000000..e1de794 --- /dev/null +++ b/ModpackUpdater.Model/UpdateAction.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace ModpackUpdater.Model; + +public class UpdateAction : InstallAction +{ + [JsonConverter(typeof(StringEnumConverter))] + public UpdateActionType Type { get; set; } + public string SrcPath { get; set; } + public bool IsDirectory { get; set; } +} \ No newline at end of file diff --git a/ModpackUpdater.Model/UpdateAction.vb b/ModpackUpdater.Model/UpdateAction.vb deleted file mode 100644 index 0de1622..0000000 --- a/ModpackUpdater.Model/UpdateAction.vb +++ /dev/null @@ -1,12 +0,0 @@ -Imports Newtonsoft.Json -Imports Newtonsoft.Json.Converters - -Public Class UpdateAction - Inherits InstallAction - - - Public Property Type As UpdateActionType - Public Property SrcPath As String - Public Property IsDirectory As Boolean - -End Class diff --git a/ModpackUpdater.Model/UpdateActionType.cs b/ModpackUpdater.Model/UpdateActionType.cs new file mode 100644 index 0000000..329030d --- /dev/null +++ b/ModpackUpdater.Model/UpdateActionType.cs @@ -0,0 +1,10 @@ +namespace ModpackUpdater.Model; + +public enum UpdateActionType +{ + None, + Update, + Delete, + Move, + Copy +} \ No newline at end of file diff --git a/ModpackUpdater.Model/UpdateActionType.vb b/ModpackUpdater.Model/UpdateActionType.vb deleted file mode 100644 index 2408c01..0000000 --- a/ModpackUpdater.Model/UpdateActionType.vb +++ /dev/null @@ -1,7 +0,0 @@ -Public Enum UpdateActionType - None - Update - Delete - Move - Copy -End Enum diff --git a/ModpackUpdater.Model/UpdateInfo.cs b/ModpackUpdater.Model/UpdateInfo.cs new file mode 100644 index 0000000..853b6ad --- /dev/null +++ b/ModpackUpdater.Model/UpdateInfo.cs @@ -0,0 +1,11 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace ModpackUpdater.Model; + +public class UpdateInfo +{ + [JsonConverter(typeof(VersionConverter))] + public Version Version { get; set; } + public List Actions { get; private set; } = []; +} \ No newline at end of file diff --git a/ModpackUpdater.Model/UpdateInfo.vb b/ModpackUpdater.Model/UpdateInfo.vb deleted file mode 100644 index 1e09bc6..0000000 --- a/ModpackUpdater.Model/UpdateInfo.vb +++ /dev/null @@ -1,10 +0,0 @@ -Imports Newtonsoft.Json -Imports Newtonsoft.Json.Converters - -Public Class UpdateInfo - - - Public Property Version As Version - Public ReadOnly Property Actions As New List(Of UpdateAction) - -End Class diff --git a/ModpackUpdater.Model/UpdateInfos.cs b/ModpackUpdater.Model/UpdateInfos.cs new file mode 100644 index 0000000..b583bfb --- /dev/null +++ b/ModpackUpdater.Model/UpdateInfos.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace ModpackUpdater.Model; + +public class UpdateInfos +{ + public List Updates { get; private set; } = []; + + public static UpdateInfos Parse(string content) + { + return JsonConvert.DeserializeObject(content); + } +} \ No newline at end of file diff --git a/ModpackUpdater.Model/UpdateInfos.vb b/ModpackUpdater.Model/UpdateInfos.vb deleted file mode 100644 index 04e4256..0000000 --- a/ModpackUpdater.Model/UpdateInfos.vb +++ /dev/null @@ -1,11 +0,0 @@ -Imports Newtonsoft.Json - -Public Class UpdateInfos - - Public ReadOnly Property Updates As New List(Of UpdateInfo) - - Public Shared Function Parse(content As String) As UpdateInfos - Return JsonConvert.DeserializeObject(Of UpdateInfos)(content) - End Function - -End Class diff --git a/ModpackUpdater.sln b/ModpackUpdater.sln index 0009289..1e4a085 100644 --- a/ModpackUpdater.sln +++ b/ModpackUpdater.sln @@ -3,11 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32526.322 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ModpackUpdater", "ModpackUpdater\ModpackUpdater.vbproj", "{33DD239C-1F33-40F9-908F-54BC02FBA420}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModpackUpdater", "ModpackUpdater\ModpackUpdater.csproj", "{81F9A2F7-D36B-0F08-12D7-9EC2606C9080}" EndProject -Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ModpackUpdater.Model", "ModpackUpdater.Model\ModpackUpdater.Model.vbproj", "{BC4FE51B-4045-432C-B4D9-8C6CF5372DC0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModpackUpdater.Model", "ModpackUpdater.Model\ModpackUpdater.Model.csproj", "{0E6B6470-8C1D-0CDD-3681-461297A01960}" EndProject -Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ModpackUpdater.Manager", "ModpackUpdater.Manager\ModpackUpdater.Manager.vbproj", "{618DAFD6-3336-4621-82F9-EA5C783D2D2E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModpackUpdater.Manager", "ModpackUpdater.Manager\ModpackUpdater.Manager.csproj", "{D3A92EBD-FF6E-09D0-00A1-20221AAA198E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,18 +15,18 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {33DD239C-1F33-40F9-908F-54BC02FBA420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33DD239C-1F33-40F9-908F-54BC02FBA420}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33DD239C-1F33-40F9-908F-54BC02FBA420}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33DD239C-1F33-40F9-908F-54BC02FBA420}.Release|Any CPU.Build.0 = Release|Any CPU - {BC4FE51B-4045-432C-B4D9-8C6CF5372DC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BC4FE51B-4045-432C-B4D9-8C6CF5372DC0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BC4FE51B-4045-432C-B4D9-8C6CF5372DC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BC4FE51B-4045-432C-B4D9-8C6CF5372DC0}.Release|Any CPU.Build.0 = Release|Any CPU - {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {618DAFD6-3336-4621-82F9-EA5C783D2D2E}.Release|Any CPU.Build.0 = Release|Any CPU + {81F9A2F7-D36B-0F08-12D7-9EC2606C9080}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81F9A2F7-D36B-0F08-12D7-9EC2606C9080}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81F9A2F7-D36B-0F08-12D7-9EC2606C9080}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81F9A2F7-D36B-0F08-12D7-9EC2606C9080}.Release|Any CPU.Build.0 = Release|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Release|Any CPU.Build.0 = Release|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ModpackUpdater.sln.bak b/ModpackUpdater.sln.bak new file mode 100644 index 0000000..a701e48 --- /dev/null +++ b/ModpackUpdater.sln.bak @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32526.322 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ModpackUpdater", "ModpackUpdater\ModpackUpdater.vbproj", "{33DD239C-1F33-40F9-908F-54BC02FBA420}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModpackUpdater.Model", "ModpackUpdater.Model\ModpackUpdater.Model.csproj", "{0E6B6470-8C1D-0CDD-3681-461297A01960}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModpackUpdater.Manager", "ModpackUpdater.Manager\ModpackUpdater.Manager.csproj", "{D3A92EBD-FF6E-09D0-00A1-20221AAA198E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {33DD239C-1F33-40F9-908F-54BC02FBA420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33DD239C-1F33-40F9-908F-54BC02FBA420}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33DD239C-1F33-40F9-908F-54BC02FBA420}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33DD239C-1F33-40F9-908F-54BC02FBA420}.Release|Any CPU.Build.0 = Release|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E6B6470-8C1D-0CDD-3681-461297A01960}.Release|Any CPU.Build.0 = Release|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3A92EBD-FF6E-09D0-00A1-20221AAA198E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {322E6A6B-9F3E-4E88-8945-C98A9EF613BF} + EndGlobalSection +EndGlobal diff --git a/ModpackUpdater/AppConfig.cs b/ModpackUpdater/AppConfig.cs new file mode 100644 index 0000000..329d1ca --- /dev/null +++ b/ModpackUpdater/AppConfig.cs @@ -0,0 +1,69 @@ +using Newtonsoft.Json; + +namespace ModpackUpdater; + +public class AppConfig +{ + public string LastMinecraftProfilePath { get; set; } + public string LastConfigFilePath { get; set; } + public List KeepLocalFiles { get; set; } = []; + public bool AllowRemoveLocalFiles { get; set; } + + public void Reset() + { + KeepLocalFiles.Clear(); + KeepLocalFiles.Add("OptiFine_1.7.10_HD_U_E7.jar"); + AllowRemoveLocalFiles = false; + } + + private static AppConfig instance = null; + + public static AppConfig Instance + { + get + { + + if (instance is null) + { + if (File.Exists(SettingsPath)) + instance = LoadConfig(SettingsPath); + else + { + instance = new AppConfig(); + instance.Reset(); + } + } + + return instance; + } + } + private static string settingsPath = string.Empty; + + private static string SettingsPath + { + get + { + const string AppDataDirectoryName = "MinecraftModpackUpdater"; + const string SettingsFileName = "Settings.json"; + + if (string.IsNullOrEmpty(settingsPath)) + { + settingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AppDataDirectoryName); + Directory.CreateDirectory(settingsPath); + settingsPath = Path.Combine(settingsPath, SettingsFileName); + } + + return settingsPath; + } + } + + public void SaveConfig() + { + File.WriteAllText(SettingsPath, JsonConvert.SerializeObject(this)); + } + + private static AppConfig LoadConfig(string filePath) + { + return JsonConvert.DeserializeObject(File.ReadAllText(filePath)); + } +} \ No newline at end of file diff --git a/ModpackUpdater/AppConfig.vb b/ModpackUpdater/AppConfig.vb deleted file mode 100644 index 5752e1f..0000000 --- a/ModpackUpdater/AppConfig.vb +++ /dev/null @@ -1,59 +0,0 @@ -Imports System.IO - -Imports Newtonsoft.Json.Linq - -Public Class AppConfig - - Public Property LastMinecraftProfilePath As String - Public Property LastConfigFilePath As String - Public Property KeepLocalFiles As New List(Of String) - Public Property AllowRemoveLocalFiles As Boolean - - Public Sub Reset() - KeepLocalFiles.Clear() - KeepLocalFiles.Add("OptiFine_1.7.10_HD_U_E7.jar") - AllowRemoveLocalFiles = False - End Sub - - Public Shared ReadOnly Property Instance As AppConfig - Get - Static myInstance As AppConfig = Nothing - - If myInstance Is Nothing Then - If File.Exists(SettingsPath) Then - myInstance = LoadConfig(SettingsPath) - Else - myInstance = New AppConfig - myInstance.Reset() - End If - End If - - Return myInstance - End Get - End Property - - Private Shared ReadOnly Property SettingsPath As string - Get - Static myPath As String = String.Empty - Const AppDataDirectoryName As String = "MinecraftModpackUpdater" - Const SettingsFileName As String = "Settings.json" - - If String.IsNullOrEmpty(myPath) Then - myPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AppDataDirectoryName) - Directory.CreateDirectory(myPath) - myPath = Path.Combine(myPath, SettingsFileName) - End If - - Return myPath - End Get - End Property - - Public Sub SaveConfig() - File.WriteAllText(SettingsPath, JObject.FromObject(Me).ToString) - End Sub - - Private Shared Function LoadConfig(filePath As String) As AppConfig - Return JObject.Parse(File.ReadAllText(filePath)).ToObject(Of AppConfig) - End Function - -End Class diff --git a/ModpackUpdater/AppUpdater.cs b/ModpackUpdater/AppUpdater.cs new file mode 100644 index 0000000..3488926 --- /dev/null +++ b/ModpackUpdater/AppUpdater.cs @@ -0,0 +1,78 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System.Reflection; + +namespace ModpackUpdater; + +public class AppUpdater +{ + private class UpdateInfo + { + [JsonConverter(typeof(VersionConverter))] + public Version Version { get; set; } + public string DownloadUrl { get; set; } + } + + private const string UPDATE_URL = "https://git.pilzinsel64.de/gaming/minecraft/minecraft-modpack-updater/-/snippets/3/raw/main/updates.json"; + private readonly HttpClient httpClient = new(); + private UpdateInfo info; + + public async Task Check() + { + var hasUpdate = false; + + try + { + var appVersion = Assembly.GetExecutingAssembly().GetName().Version; + string result = await httpClient.GetStringAsync(UPDATE_URL); + info = JsonConvert.DeserializeObject(result); + + if (info is not null && info.Version < appVersion) + hasUpdate = true; + } + catch + { + } + + return hasUpdate; + } + + public async Task Install() + { + var client = new HttpClient(); + var tempFileName = Path.GetTempFileName(); + var appFileName = Pilz.IO.Extensions.GetExecutablePath(); + var oldFileName = appFileName + ".old"; + + // Delete old file + try + { + File.Delete(oldFileName); + } + catch + { + } + + // Download the new file + using (var tempFileStream = new FileStream(tempFileName, FileMode.Create, FileAccess.ReadWrite)) + { + Stream downloadStream = null; + try + { + downloadStream = await client.GetStreamAsync(info.DownloadUrl); + await downloadStream.CopyToAsync(tempFileStream); + } + catch + { + } + finally + { + downloadStream?.Dispose(); + } + } + + // Replace current application file with new file + File.Move(appFileName, oldFileName, true); + File.Move(tempFileName, appFileName); + } +} \ No newline at end of file diff --git a/ModpackUpdater/AppUpdater.vb b/ModpackUpdater/AppUpdater.vb deleted file mode 100644 index d132e51..0000000 --- a/ModpackUpdater/AppUpdater.vb +++ /dev/null @@ -1,67 +0,0 @@ -Imports System.IO -Imports System.Net.Http -Imports System.Reflection - -Imports Newtonsoft.Json -Imports Newtonsoft.Json.Converters - -Public Class AppUpdater - - Private Class UpdateInfo - - Public Property Version As Version - Public Property DownloadUrl As String - End Class - - Private Const UPDATE_URL As String = "https://git.pilzinsel64.de/gaming/minecraft/minecraft-modpack-updater/-/snippets/3/raw/main/updates.json" - Private ReadOnly httpClient As New HttpClient - Private info As UpdateInfo - - Public Async Function Check() As Task(Of Boolean) - Dim appFileName = Pilz.IO.Extensions.GetExecutablePath() - Dim hasUpdate As Boolean = False - - Try - Dim appVersion As Version = Assembly.GetExecutingAssembly().GetName().Version - Dim result = Await httpClient.GetStringAsync(UPDATE_URL) - info = JsonConvert.DeserializeObject(Of UpdateInfo)(result) - - If info IsNot Nothing AndAlso info.Version < appVersion Then - hasUpdate = True - End If - Catch ex As Exception - End Try - - Return hasUpdate - End Function - - Public Async Function Install() As Task - Dim client As New HttpClient - Dim tempFileName = Path.GetTempFileName - Dim appFileName = Pilz.IO.Extensions.GetExecutablePath() - Dim oldFileName = appFileName & ".old" - - 'Delete old file - Try - File.Delete(oldFileName) - Catch ex As Exception - End Try - - 'Download the new file - Using tempFileStream As New FileStream(tempFileName, FileMode.Create, FileAccess.ReadWrite) - Dim downloadStream As Stream = Nothing - Try - downloadStream = Await client.GetStreamAsync(info.DownloadUrl) - Await downloadStream.CopyToAsync(tempFileStream) - Catch - Finally - downloadStream?.Dispose() - End Try - End Using - - 'Replace current application file with new file - File.Move(appFileName, oldFileName, True) - File.Move(tempFileName, appFileName) - End Function - -End Class diff --git a/ModpackUpdater/ApplicationEvents.vb b/ModpackUpdater/ApplicationEvents.vb deleted file mode 100644 index f5dc3fb..0000000 --- a/ModpackUpdater/ApplicationEvents.vb +++ /dev/null @@ -1,40 +0,0 @@ -Imports Microsoft.VisualBasic.ApplicationServices - -Imports Telerik.WinControls - -Namespace My - ' The following events are available for MyApplication: - ' Startup: Raised when the application starts, before the startup form is created. - ' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. - ' UnhandledException: Raised if the application encounters an unhandled exception. - ' StartupNextInstance: Raised when launching a single-instance application and the application is already active. - ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. - - ' **NEW** ApplyApplicationDefaults: Raised when the application queries default values to be set for the application. - - ' Example: - ' Private Sub MyApplication_ApplyApplicationDefaults(sender As Object, e As ApplyApplicationDefaultsEventArgs) Handles Me.ApplyApplicationDefaults - ' - ' ' Setting the application-wide default Font: - ' e.Font = New Font(FontFamily.GenericSansSerif, 12, FontStyle.Regular) - ' - ' ' Setting the HighDpiMode for the Application: - ' e.HighDpiMode = HighDpiMode.PerMonitorV2 - ' - ' ' If a splash dialog is used, this sets the minimum display time: - ' e.MinimumSplashScreenDisplayTime = 4000 - ' End Sub - - Partial Friend Class MyApplication - - Private Sub MyApplication_ApplyApplicationDefaults(sender As Object, e As ApplyApplicationDefaultsEventArgs) Handles Me.ApplyApplicationDefaults - Dim validTheme As Boolean = - ThemeResolutionService.LoadPackageResource("ModpackUpdater.Office2019DarkBluePurple.tssp") - - If validTheme Then - ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple" - End If - End Sub - - End Class -End Namespace diff --git a/ModpackUpdater/FiledialogFilters.Designer.cs b/ModpackUpdater/FiledialogFilters.Designer.cs new file mode 100644 index 0000000..b6de0b4 --- /dev/null +++ b/ModpackUpdater/FiledialogFilters.Designer.cs @@ -0,0 +1,95 @@ +// ------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +// ------------------------------------------------------------------------------ + + +using System.Diagnostics; + +namespace ModpackUpdater.My.Resources +{ + + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + [System.CodeDom.Compiler.GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal class FiledialogFilters + { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal FiledialogFilters() : base() + { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager + { + get + { + if (ReferenceEquals(resourceMan, null)) + { + var temp = new System.Resources.ResourceManager("ModpackUpdater.FiledialogFilters", typeof(FiledialogFilters).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Json files (*.json) ähnelt. + /// + internal static string JSON_Display + { + get + { + return ResourceManager.GetString("JSON_Display", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die *.json ähnelt. + /// + internal static string JSON_Filter + { + get + { + return ResourceManager.GetString("JSON_Filter", resourceCulture); + } + } + } +} \ No newline at end of file diff --git a/ModpackUpdater/FiledialogFilters.Designer.vb b/ModpackUpdater/FiledialogFilters.Designer.vb deleted file mode 100644 index 78e35f1..0000000 --- a/ModpackUpdater/FiledialogFilters.Designer.vb +++ /dev/null @@ -1,85 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - ''' - ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - ''' - _ - Friend Class FiledialogFilters - - Private Shared resourceMan As Global.System.Resources.ResourceManager - - Private Shared resourceCulture As Global.System.Globalization.CultureInfo - - _ - Friend Sub New() - MyBase.New - End Sub - - ''' - ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - ''' - _ - Friend Shared ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("ModpackUpdater.FiledialogFilters", GetType(FiledialogFilters).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - ''' - _ - Friend Shared Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Json files (*.json) ähnelt. - ''' - Friend Shared ReadOnly Property JSON_Display() As String - Get - Return ResourceManager.GetString("JSON_Display", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die *.json ähnelt. - ''' - Friend Shared ReadOnly Property JSON_Filter() As String - Get - Return ResourceManager.GetString("JSON_Filter", resourceCulture) - End Get - End Property - End Class -End Namespace diff --git a/ModpackUpdater/Form1.Designer.cs b/ModpackUpdater/Form1.Designer.cs new file mode 100644 index 0000000..150ffd3 --- /dev/null +++ b/ModpackUpdater/Form1.Designer.cs @@ -0,0 +1,274 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.Windows.Forms; + +namespace ModpackUpdater +{ + [Microsoft.VisualBasic.CompilerServices.DesignerGenerated()] + + public partial class Form1 : Telerik.WinControls.UI.RadForm + { + + // Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + [DebuggerNonUserCode()] + protected override void Dispose(bool disposing) + { + try + { + if (disposing && components is not null) + components.Dispose(); + } + finally + { + base.Dispose(disposing); + } + } + + // Wird vom Windows Form-Designer benötigt. + private System.ComponentModel.IContainer components = new System.ComponentModel.Container(); + + // Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + // Das Bearbeiten ist mit dem Windows Form-Designer möglich. + // Das Bearbeiten mit dem Code-Editor ist nicht möglich. + [DebuggerStepThrough()] + private void InitializeComponent() + { + var resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + RadLabel1 = new Telerik.WinControls.UI.RadLabel(); + RadLabel2 = new Telerik.WinControls.UI.RadLabel(); + RadLabel3 = new Telerik.WinControls.UI.RadLabel(); + RadLabel_Status = new Telerik.WinControls.UI.RadLabel(); + RadTextBoxControl_MinecraftProfileFolder = new Telerik.WinControls.UI.RadTextBoxControl(); + RadTextBoxControl_ModpackConfig = new Telerik.WinControls.UI.RadTextBoxControl(); + Panel1 = new Panel(); + RadButton_Install = new Telerik.WinControls.UI.RadButton(); + RadButton_Install.Click += new EventHandler(ButtonX_StartUpdate_Click); + RadButton_CheckForUpdates = new Telerik.WinControls.UI.RadButton(); + RadButton_CheckForUpdates.Click += new EventHandler(ButtonX_CheckForUpdates_Click); + RadButton_EditModpackConfig = new Telerik.WinControls.UI.RadButton(); + RadButton_PasteModpackConfig = new Telerik.WinControls.UI.RadButton(); + RadButton_PasteModpackConfig.Click += new EventHandler(RadButton_PasteModpackConfig_Click); + RadButton_SearchModpackConfig = new Telerik.WinControls.UI.RadButton(); + RadButton_SearchModpackConfig.Click += new EventHandler(ButtonX_SearchUpdateConfig_Click); + RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); + RadButton_SearchMinecraftProfileFolder.Click += new EventHandler(ButtonX_SearchMinecraftProfile_Click); + ((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadLabel3).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadLabel_Status).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_MinecraftProfileFolder).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_ModpackConfig).BeginInit(); + Panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)RadButton_Install).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_EditModpackConfig).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).BeginInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit(); + ((System.ComponentModel.ISupportInitialize)this).BeginInit(); + SuspendLayout(); + // + // RadLabel1 + // + RadLabel1.Location = new Point(3, 5); + RadLabel1.Name = "RadLabel1"; + RadLabel1.Size = new Size(124, 18); + RadLabel1.TabIndex = 0; + RadLabel1.Text = "Minecraft profile folder:"; + // + // RadLabel2 + // + RadLabel2.Location = new Point(3, 63); + RadLabel2.Name = "RadLabel2"; + RadLabel2.Size = new Size(90, 18); + RadLabel2.TabIndex = 1; + RadLabel2.Text = "Modpack config:"; + // + // RadLabel3 + // + RadLabel3.Location = new Point(3, 121); + RadLabel3.Name = "RadLabel3"; + RadLabel3.Size = new Size(39, 18); + RadLabel3.TabIndex = 2; + RadLabel3.Text = "Status:"; + // + // RadLabel_Status + // + RadLabel_Status.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + RadLabel_Status.AutoSize = false; + RadLabel_Status.Location = new Point(144, 119); + RadLabel_Status.Name = "RadLabel_Status"; + RadLabel_Status.Size = new Size(273, 22); + RadLabel_Status.TabIndex = 3; + RadLabel_Status.Text = "-"; + RadLabel_Status.TextImageRelation = TextImageRelation.ImageBeforeText; + // + // RadTextBoxControl_MinecraftProfileFolder + // + RadTextBoxControl_MinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + RadTextBoxControl_MinecraftProfileFolder.IsReadOnly = true; + RadTextBoxControl_MinecraftProfileFolder.Location = new Point(144, 3); + RadTextBoxControl_MinecraftProfileFolder.Name = "RadTextBoxControl_MinecraftProfileFolder"; + RadTextBoxControl_MinecraftProfileFolder.NullText = "No file loaded!"; + RadTextBoxControl_MinecraftProfileFolder.Size = new Size(273, 22); + RadTextBoxControl_MinecraftProfileFolder.TabIndex = 4; + // + // RadTextBoxControl_ModpackConfig + // + RadTextBoxControl_ModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + RadTextBoxControl_ModpackConfig.IsReadOnly = true; + RadTextBoxControl_ModpackConfig.Location = new Point(144, 61); + RadTextBoxControl_ModpackConfig.Name = "RadTextBoxControl_ModpackConfig"; + RadTextBoxControl_ModpackConfig.NullText = "No file loaded!"; + RadTextBoxControl_ModpackConfig.Size = new Size(273, 22); + RadTextBoxControl_ModpackConfig.TabIndex = 5; + // + // Panel1 + // + Panel1.BackColor = Color.Transparent; + Panel1.Controls.Add(RadButton_Install); + Panel1.Controls.Add(RadButton_CheckForUpdates); + Panel1.Controls.Add(RadButton_EditModpackConfig); + Panel1.Controls.Add(RadButton_PasteModpackConfig); + Panel1.Controls.Add(RadButton_SearchModpackConfig); + Panel1.Controls.Add(RadButton_SearchMinecraftProfileFolder); + Panel1.Controls.Add(RadLabel1); + Panel1.Controls.Add(RadTextBoxControl_ModpackConfig); + Panel1.Controls.Add(RadLabel2); + Panel1.Controls.Add(RadTextBoxControl_MinecraftProfileFolder); + Panel1.Controls.Add(RadLabel3); + Panel1.Controls.Add(RadLabel_Status); + Panel1.Dock = DockStyle.Fill; + Panel1.Location = new Point(0, 0); + Panel1.Name = "Panel1"; + Panel1.Size = new Size(420, 176); + Panel1.TabIndex = 6; + // + // RadButton_Install + // + RadButton_Install.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + RadButton_Install.Image = My.Resources.MySymbols.icons8_software_installer_16px; + RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_Install.Location = new Point(337, 149); + RadButton_Install.Name = "RadButton_Install"; + RadButton_Install.Size = new Size(80, 24); + RadButton_Install.TabIndex = 10; + RadButton_Install.Text = "Install"; + RadButton_Install.TextAlignment = ContentAlignment.MiddleLeft; + RadButton_Install.TextImageRelation = TextImageRelation.ImageBeforeText; + // + // RadButton_CheckForUpdates + // + RadButton_CheckForUpdates.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + RadButton_CheckForUpdates.Image = My.Resources.MySymbols.icons8_update_16px; + RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_CheckForUpdates.Location = new Point(191, 149); + RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates"; + RadButton_CheckForUpdates.Size = new Size(140, 24); + RadButton_CheckForUpdates.TabIndex = 0; + RadButton_CheckForUpdates.Text = "Check for Updates"; + RadButton_CheckForUpdates.TextAlignment = ContentAlignment.MiddleLeft; + RadButton_CheckForUpdates.TextImageRelation = TextImageRelation.ImageBeforeText; + // + // RadButton_EditModpackConfig + // + RadButton_EditModpackConfig.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + RadButton_EditModpackConfig.Image = My.Resources.MySymbols.icons8_wrench_16px; + RadButton_EditModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_EditModpackConfig.Location = new Point(3, 149); + RadButton_EditModpackConfig.Name = "RadButton_EditModpackConfig"; + RadButton_EditModpackConfig.Size = new Size(150, 24); + RadButton_EditModpackConfig.TabIndex = 8; + RadButton_EditModpackConfig.Text = "Edit modpack config"; + RadButton_EditModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; + RadButton_EditModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; + RadButton_EditModpackConfig.Visible = false; + // + // RadButton_PasteModpackConfig + // + RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right; + RadButton_PasteModpackConfig.Image = (Image)resources.GetObject("RadButton_PasteModpackConfig.Image"); + RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_PasteModpackConfig.Location = new Point(231, 89); + RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig"; + RadButton_PasteModpackConfig.Size = new Size(90, 24); + RadButton_PasteModpackConfig.TabIndex = 7; + RadButton_PasteModpackConfig.Text = "Paste"; + RadButton_PasteModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; + RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; + // + // RadButton_SearchModpackConfig + // + RadButton_SearchModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right; + RadButton_SearchModpackConfig.Image = (Image)resources.GetObject("RadButton_SearchModpackConfig.Image"); + RadButton_SearchModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_SearchModpackConfig.Location = new Point(327, 89); + RadButton_SearchModpackConfig.Name = "RadButton_SearchModpackConfig"; + RadButton_SearchModpackConfig.Size = new Size(90, 24); + RadButton_SearchModpackConfig.TabIndex = 7; + RadButton_SearchModpackConfig.Text = "Search"; + RadButton_SearchModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; + RadButton_SearchModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; + // + // RadButton_SearchMinecraftProfileFolder + // + RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Right; + RadButton_SearchMinecraftProfileFolder.Image = (Image)resources.GetObject("RadButton_SearchMinecraftProfileFolder.Image"); + RadButton_SearchMinecraftProfileFolder.ImageAlignment = ContentAlignment.MiddleRight; + RadButton_SearchMinecraftProfileFolder.Location = new Point(327, 31); + RadButton_SearchMinecraftProfileFolder.Name = "RadButton_SearchMinecraftProfileFolder"; + RadButton_SearchMinecraftProfileFolder.Size = new Size(90, 24); + RadButton_SearchMinecraftProfileFolder.TabIndex = 6; + RadButton_SearchMinecraftProfileFolder.Text = "Search"; + RadButton_SearchMinecraftProfileFolder.TextAlignment = ContentAlignment.MiddleLeft; + RadButton_SearchMinecraftProfileFolder.TextImageRelation = TextImageRelation.ImageBeforeText; + // + // Form1 + // + AutoScaleBaseSize = new Size(7, 15); + AutoScaleDimensions = new SizeF(7f, 15f); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(420, 176); + Controls.Add(Panel1); + Icon = (Icon)resources.GetObject("$this.Icon"); + MaximizeBox = false; + Name = "Form1"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Minecraft Modpack Updater"; + ((System.ComponentModel.ISupportInitialize)RadLabel1).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadLabel2).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadLabel3).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadLabel_Status).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_MinecraftProfileFolder).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_ModpackConfig).EndInit(); + Panel1.ResumeLayout(false); + Panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)RadButton_Install).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_EditModpackConfig).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).EndInit(); + ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit(); + ((System.ComponentModel.ISupportInitialize)this).EndInit(); + FormClosing += new FormClosingEventHandler(Form1_FormClosing); + Load += new EventHandler(Form1_Load); + Shown += new EventHandler(Form1_Shown); + ResumeLayout(false); + + } + internal Telerik.WinControls.UI.RadLabel RadLabel1; + internal Telerik.WinControls.UI.RadLabel RadLabel2; + internal Telerik.WinControls.UI.RadLabel RadLabel3; + internal Telerik.WinControls.UI.RadLabel RadLabel_Status; + internal Telerik.WinControls.UI.RadTextBoxControl RadTextBoxControl_MinecraftProfileFolder; + internal Telerik.WinControls.UI.RadTextBoxControl RadTextBoxControl_ModpackConfig; + internal Panel Panel1; + internal Telerik.WinControls.UI.RadButton RadButton_Install; + internal Telerik.WinControls.UI.RadButton RadButton_CheckForUpdates; + internal Telerik.WinControls.UI.RadButton RadButton_EditModpackConfig; + internal Telerik.WinControls.UI.RadButton RadButton_SearchModpackConfig; + internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder; + internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; + } +} \ No newline at end of file diff --git a/ModpackUpdater/Form1.Designer.vb b/ModpackUpdater/Form1.Designer.vb deleted file mode 100644 index bb5427c..0000000 --- a/ModpackUpdater/Form1.Designer.vb +++ /dev/null @@ -1,254 +0,0 @@ - _ -Partial Class Form1 - - Inherits Telerik.WinControls.UI.RadForm - - 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Wird vom Windows Form-Designer benötigt. - Private components As System.ComponentModel.IContainer - - 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. - 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. - 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. - _ - Private Sub InitializeComponent() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) - RadLabel1 = New Telerik.WinControls.UI.RadLabel() - RadLabel2 = New Telerik.WinControls.UI.RadLabel() - RadLabel3 = New Telerik.WinControls.UI.RadLabel() - RadLabel_Status = New Telerik.WinControls.UI.RadLabel() - RadTextBoxControl_MinecraftProfileFolder = New Telerik.WinControls.UI.RadTextBoxControl() - RadTextBoxControl_ModpackConfig = New Telerik.WinControls.UI.RadTextBoxControl() - Panel1 = New Panel() - RadButton_Install = New Telerik.WinControls.UI.RadButton() - RadButton_CheckForUpdates = New Telerik.WinControls.UI.RadButton() - RadButton_EditModpackConfig = New Telerik.WinControls.UI.RadButton() - RadButton_PasteModpackConfig = New Telerik.WinControls.UI.RadButton() - RadButton_SearchModpackConfig = New Telerik.WinControls.UI.RadButton() - RadButton_SearchMinecraftProfileFolder = New Telerik.WinControls.UI.RadButton() - CType(RadLabel1, ComponentModel.ISupportInitialize).BeginInit() - CType(RadLabel2, ComponentModel.ISupportInitialize).BeginInit() - CType(RadLabel3, ComponentModel.ISupportInitialize).BeginInit() - CType(RadLabel_Status, ComponentModel.ISupportInitialize).BeginInit() - CType(RadTextBoxControl_MinecraftProfileFolder, ComponentModel.ISupportInitialize).BeginInit() - CType(RadTextBoxControl_ModpackConfig, ComponentModel.ISupportInitialize).BeginInit() - Panel1.SuspendLayout() - CType(RadButton_Install, ComponentModel.ISupportInitialize).BeginInit() - CType(RadButton_CheckForUpdates, ComponentModel.ISupportInitialize).BeginInit() - CType(RadButton_EditModpackConfig, ComponentModel.ISupportInitialize).BeginInit() - CType(RadButton_PasteModpackConfig, ComponentModel.ISupportInitialize).BeginInit() - CType(RadButton_SearchModpackConfig, ComponentModel.ISupportInitialize).BeginInit() - CType(RadButton_SearchMinecraftProfileFolder, ComponentModel.ISupportInitialize).BeginInit() - CType(Me, ComponentModel.ISupportInitialize).BeginInit() - SuspendLayout() - ' - ' RadLabel1 - ' - RadLabel1.Location = New Point(3, 5) - RadLabel1.Name = "RadLabel1" - RadLabel1.Size = New Size(124, 18) - RadLabel1.TabIndex = 0 - RadLabel1.Text = "Minecraft profile folder:" - ' - ' RadLabel2 - ' - RadLabel2.Location = New Point(3, 63) - RadLabel2.Name = "RadLabel2" - RadLabel2.Size = New Size(90, 18) - RadLabel2.TabIndex = 1 - RadLabel2.Text = "Modpack config:" - ' - ' RadLabel3 - ' - RadLabel3.Location = New Point(3, 121) - RadLabel3.Name = "RadLabel3" - RadLabel3.Size = New Size(39, 18) - RadLabel3.TabIndex = 2 - RadLabel3.Text = "Status:" - ' - ' RadLabel_Status - ' - RadLabel_Status.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right - RadLabel_Status.AutoSize = False - RadLabel_Status.Location = New Point(144, 119) - RadLabel_Status.Name = "RadLabel_Status" - RadLabel_Status.Size = New Size(273, 22) - RadLabel_Status.TabIndex = 3 - RadLabel_Status.Text = "-" - RadLabel_Status.TextImageRelation = TextImageRelation.ImageBeforeText - ' - ' RadTextBoxControl_MinecraftProfileFolder - ' - RadTextBoxControl_MinecraftProfileFolder.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right - RadTextBoxControl_MinecraftProfileFolder.IsReadOnly = True - RadTextBoxControl_MinecraftProfileFolder.Location = New Point(144, 3) - RadTextBoxControl_MinecraftProfileFolder.Name = "RadTextBoxControl_MinecraftProfileFolder" - RadTextBoxControl_MinecraftProfileFolder.NullText = "No file loaded!" - RadTextBoxControl_MinecraftProfileFolder.Size = New Size(273, 22) - RadTextBoxControl_MinecraftProfileFolder.TabIndex = 4 - ' - ' RadTextBoxControl_ModpackConfig - ' - RadTextBoxControl_ModpackConfig.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right - RadTextBoxControl_ModpackConfig.IsReadOnly = True - RadTextBoxControl_ModpackConfig.Location = New Point(144, 61) - RadTextBoxControl_ModpackConfig.Name = "RadTextBoxControl_ModpackConfig" - RadTextBoxControl_ModpackConfig.NullText = "No file loaded!" - RadTextBoxControl_ModpackConfig.Size = New Size(273, 22) - RadTextBoxControl_ModpackConfig.TabIndex = 5 - ' - ' Panel1 - ' - Panel1.BackColor = Color.Transparent - Panel1.Controls.Add(RadButton_Install) - Panel1.Controls.Add(RadButton_CheckForUpdates) - Panel1.Controls.Add(RadButton_EditModpackConfig) - Panel1.Controls.Add(RadButton_PasteModpackConfig) - Panel1.Controls.Add(RadButton_SearchModpackConfig) - Panel1.Controls.Add(RadButton_SearchMinecraftProfileFolder) - Panel1.Controls.Add(RadLabel1) - Panel1.Controls.Add(RadTextBoxControl_ModpackConfig) - Panel1.Controls.Add(RadLabel2) - Panel1.Controls.Add(RadTextBoxControl_MinecraftProfileFolder) - Panel1.Controls.Add(RadLabel3) - Panel1.Controls.Add(RadLabel_Status) - Panel1.Dock = DockStyle.Fill - Panel1.Location = New Point(0, 0) - Panel1.Name = "Panel1" - Panel1.Size = New Size(420, 176) - Panel1.TabIndex = 6 - ' - ' RadButton_Install - ' - RadButton_Install.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right - RadButton_Install.Image = My.Resources.MySymbols.icons8_software_installer_16px - RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight - RadButton_Install.Location = New Point(337, 149) - RadButton_Install.Name = "RadButton_Install" - RadButton_Install.Size = New Size(80, 24) - RadButton_Install.TabIndex = 10 - RadButton_Install.Text = "Install" - RadButton_Install.TextAlignment = ContentAlignment.MiddleLeft - RadButton_Install.TextImageRelation = TextImageRelation.ImageBeforeText - ' - ' RadButton_CheckForUpdates - ' - RadButton_CheckForUpdates.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right - RadButton_CheckForUpdates.Image = My.Resources.MySymbols.icons8_update_16px - RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight - RadButton_CheckForUpdates.Location = New Point(191, 149) - RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates" - RadButton_CheckForUpdates.Size = New Size(140, 24) - RadButton_CheckForUpdates.TabIndex = 0 - RadButton_CheckForUpdates.Text = "Check for Updates" - RadButton_CheckForUpdates.TextAlignment = ContentAlignment.MiddleLeft - RadButton_CheckForUpdates.TextImageRelation = TextImageRelation.ImageBeforeText - ' - ' RadButton_EditModpackConfig - ' - RadButton_EditModpackConfig.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left - RadButton_EditModpackConfig.Image = My.Resources.MySymbols.icons8_wrench_16px - RadButton_EditModpackConfig.ImageAlignment = ContentAlignment.MiddleRight - RadButton_EditModpackConfig.Location = New Point(3, 149) - RadButton_EditModpackConfig.Name = "RadButton_EditModpackConfig" - RadButton_EditModpackConfig.Size = New Size(150, 24) - RadButton_EditModpackConfig.TabIndex = 8 - RadButton_EditModpackConfig.Text = "Edit modpack config" - RadButton_EditModpackConfig.TextAlignment = ContentAlignment.MiddleLeft - RadButton_EditModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText - RadButton_EditModpackConfig.Visible = False - ' - ' RadButton_PasteModpackConfig - ' - RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top Or AnchorStyles.Right - RadButton_PasteModpackConfig.Image = CType(resources.GetObject("RadButton_PasteModpackConfig.Image"), Image) - RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight - RadButton_PasteModpackConfig.Location = New Point(231, 89) - RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig" - RadButton_PasteModpackConfig.Size = New Size(90, 24) - RadButton_PasteModpackConfig.TabIndex = 7 - RadButton_PasteModpackConfig.Text = "Paste" - RadButton_PasteModpackConfig.TextAlignment = ContentAlignment.MiddleLeft - RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText - ' - ' RadButton_SearchModpackConfig - ' - RadButton_SearchModpackConfig.Anchor = AnchorStyles.Top Or AnchorStyles.Right - RadButton_SearchModpackConfig.Image = CType(resources.GetObject("RadButton_SearchModpackConfig.Image"), Image) - RadButton_SearchModpackConfig.ImageAlignment = ContentAlignment.MiddleRight - RadButton_SearchModpackConfig.Location = New Point(327, 89) - RadButton_SearchModpackConfig.Name = "RadButton_SearchModpackConfig" - RadButton_SearchModpackConfig.Size = New Size(90, 24) - RadButton_SearchModpackConfig.TabIndex = 7 - RadButton_SearchModpackConfig.Text = "Search" - RadButton_SearchModpackConfig.TextAlignment = ContentAlignment.MiddleLeft - RadButton_SearchModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText - ' - ' RadButton_SearchMinecraftProfileFolder - ' - RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top Or AnchorStyles.Right - RadButton_SearchMinecraftProfileFolder.Image = CType(resources.GetObject("RadButton_SearchMinecraftProfileFolder.Image"), Image) - RadButton_SearchMinecraftProfileFolder.ImageAlignment = ContentAlignment.MiddleRight - RadButton_SearchMinecraftProfileFolder.Location = New Point(327, 31) - RadButton_SearchMinecraftProfileFolder.Name = "RadButton_SearchMinecraftProfileFolder" - RadButton_SearchMinecraftProfileFolder.Size = New Size(90, 24) - RadButton_SearchMinecraftProfileFolder.TabIndex = 6 - RadButton_SearchMinecraftProfileFolder.Text = "Search" - RadButton_SearchMinecraftProfileFolder.TextAlignment = ContentAlignment.MiddleLeft - RadButton_SearchMinecraftProfileFolder.TextImageRelation = TextImageRelation.ImageBeforeText - ' - ' Form1 - ' - AutoScaleBaseSize = New Size(7, 15) - AutoScaleDimensions = New SizeF(7F, 15F) - AutoScaleMode = AutoScaleMode.Font - ClientSize = New Size(420, 176) - Controls.Add(Panel1) - Icon = CType(resources.GetObject("$this.Icon"), Icon) - MaximizeBox = False - Name = "Form1" - StartPosition = FormStartPosition.CenterScreen - Text = "Minecraft Modpack Updater" - CType(RadLabel1, ComponentModel.ISupportInitialize).EndInit() - CType(RadLabel2, ComponentModel.ISupportInitialize).EndInit() - CType(RadLabel3, ComponentModel.ISupportInitialize).EndInit() - CType(RadLabel_Status, ComponentModel.ISupportInitialize).EndInit() - CType(RadTextBoxControl_MinecraftProfileFolder, ComponentModel.ISupportInitialize).EndInit() - CType(RadTextBoxControl_ModpackConfig, ComponentModel.ISupportInitialize).EndInit() - Panel1.ResumeLayout(False) - Panel1.PerformLayout() - CType(RadButton_Install, ComponentModel.ISupportInitialize).EndInit() - CType(RadButton_CheckForUpdates, ComponentModel.ISupportInitialize).EndInit() - CType(RadButton_EditModpackConfig, ComponentModel.ISupportInitialize).EndInit() - CType(RadButton_PasteModpackConfig, ComponentModel.ISupportInitialize).EndInit() - CType(RadButton_SearchModpackConfig, ComponentModel.ISupportInitialize).EndInit() - CType(RadButton_SearchMinecraftProfileFolder, ComponentModel.ISupportInitialize).EndInit() - CType(Me, ComponentModel.ISupportInitialize).EndInit() - ResumeLayout(False) - - End Sub - Friend WithEvents RadLabel1 As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadLabel2 As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadLabel3 As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadLabel_Status As Telerik.WinControls.UI.RadLabel - Friend WithEvents RadTextBoxControl_MinecraftProfileFolder As Telerik.WinControls.UI.RadTextBoxControl - Friend WithEvents RadTextBoxControl_ModpackConfig As Telerik.WinControls.UI.RadTextBoxControl - Friend WithEvents Panel1 As System.Windows.Forms.Panel - Friend WithEvents RadButton_Install As Telerik.WinControls.UI.RadButton - Friend WithEvents RadButton_CheckForUpdates As Telerik.WinControls.UI.RadButton - Friend WithEvents RadButton_EditModpackConfig As Telerik.WinControls.UI.RadButton - Friend WithEvents RadButton_SearchModpackConfig As Telerik.WinControls.UI.RadButton - Friend WithEvents RadButton_SearchMinecraftProfileFolder As Telerik.WinControls.UI.RadButton - Friend WithEvents RadButton_PasteModpackConfig As Telerik.WinControls.UI.RadButton -End Class diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs new file mode 100644 index 0000000..b77f481 --- /dev/null +++ b/ModpackUpdater/Form1.cs @@ -0,0 +1,248 @@ +using ModpackUpdater.Manager; +using ModpackUpdater.Model; +using ModpackUpdater.My.Resources; +using Telerik.WinControls; +using Telerik.WinControls.UI; + +namespace ModpackUpdater; + +public partial class Form1 +{ + private ModpackConfig updateConfig = new(); + private bool currentUpdating = false; + private UpdateCheckResult lastUpdateCheckResult = null; + + public Form1() + { + InitializeComponent(); + Text = $"{Text} (v{Application.ProductVersion})"; + } + + private bool IsMinecaftProfileLoaded() + { + return !string.IsNullOrEmpty(GetMinecraftProfilePath()); + } + + private string GetMinecraftProfilePath() + { + return RadTextBoxControl_MinecraftProfileFolder.Text.Trim(); + } + + private bool IsUpdateConfigLoaded() + { + return !string.IsNullOrEmpty(GetUpdateconfigPath()); + } + + private string GetUpdateconfigPath() + { + return RadTextBoxControl_ModpackConfig.Text.Trim(); + } + + private bool CheckStatus() + { + bool CheckStatusRet = default; + if (!IsMinecaftProfileLoaded() || !MinecraftProfileChecker.CheckProfile(GetMinecraftProfilePath())) + { + SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px); + CheckStatusRet = false; + } + else if (!IsUpdateConfigLoaded()) + { + SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px); + CheckStatusRet = false; + } + else + { + CheckStatusRet = true; + } + + return CheckStatusRet; + } + + private void SetStatus(string statusText, Image image) + { + RadLabel_Status.Text = statusText; + RadLabel_Status.Image = image; + } + + private void ClearStatus() + { + RadLabel_Status.Text = "-"; + RadLabel_Status.Image = null; + } + + private void LoadMinecraftProfile(string folderPath) + { + RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; + + if (IsUpdateConfigLoaded()) + RadButton_CheckForUpdates.PerformClick(); + else + { + ClearStatus(); + } + } + + private void LoadUpdateConfigFile(string filePath) + { + RadTextBoxControl_ModpackConfig.Text = filePath; + try + { + if (IsUpdateConfigLoaded()) + updateConfig = (ModpackConfig)ModpackConfig.LoadFromUrl(filePath); + } + catch (Exception ex) + { + RadTextBoxControl_ModpackConfig.Text = string.Empty; + } + + if (IsMinecaftProfileLoaded()) + RadButton_CheckForUpdates.PerformClick(); + else + { + ClearStatus(); + } + } + + private async Task ExecuteUpdate(bool doInstall) + { + var updater = new ModpackInstaller(updateConfig, GetMinecraftProfilePath()); + updater.InstallProgessUpdated += Update_InstallProgessUpdated; + updater.CheckingProgressUpdated += Updated_CheckingProgresssUpdated; + + // Check only if not pressed "install", not really needed otherwise. + if (lastUpdateCheckResult is null || !doInstall) + { + SetStatus(LangRes.StatusText_CheckingForUpdates, MySymbols.icons8_update_16px); + + try + { + lastUpdateCheckResult = await updater.Check(!AppConfig.Instance.AllowRemoveLocalFiles); + } + catch (Exception ex) + { + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + } + finally + { + } + } + + if (lastUpdateCheckResult is null || lastUpdateCheckResult.HasError) + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + else if (lastUpdateCheckResult.HasUpdates) + { + if (doInstall) + { + SetStatus(LangRes.StatusText_Installing, MySymbols.icons8_software_installer_16px); + currentUpdating = true; + + try + { + if (await updater.Install(lastUpdateCheckResult) == true) + { + lastUpdateCheckResult = null; // Reset last update check, a new one would be needed now. + SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px); + } + else + { + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + } + } + catch + { + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + } + finally + { + currentUpdating = false; + } + } + else + { + SetStatus(LangRes.StatusText_UpdateAvailable, MySymbols.icons8_software_installer_16px); + } + } + else + { + SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px); + } + } + + private void Update_InstallProgessUpdated(UpdateCheckResult result, int processedSyncs) + { + int actionCount = result.Actions.Count; + SetStatus(Math.Round(processedSyncs / (double)actionCount * 100d, 1) + "%", MySymbols.icons8_software_installer_16px); + } + + private void Updated_CheckingProgresssUpdated(int toCheck, int processed) + { + SetStatus(Math.Round(processed / (double)toCheck * 100d, 1) + "%", MySymbols.icons8_update_16px); + } + + private void ButtonX_SearchMinecraftProfile_Click(object sender, EventArgs e) + { + var ofd = new RadOpenFolderDialog(); + + if (ofd.ShowDialog(this) == DialogResult.OK) + LoadMinecraftProfile(ofd.FileName); + } + + private void ButtonX_SearchUpdateConfig_Click(object sender, EventArgs e) + { + var ofd = new RadOpenFileDialog() { Filter = FiledialogFilters.JSON_Display + "|" + FiledialogFilters.JSON_Filter }; + + if (ofd.ShowDialog(this) == DialogResult.OK) + LoadUpdateConfigFile(ofd.FileName); + } + + private void RadButton_PasteModpackConfig_Click(object sender, EventArgs e) + { + string text = Clipboard.GetText(); + if (text.StartsWith("http")) + LoadUpdateConfigFile(text); + } + + private async void ButtonX_CheckForUpdates_Click(object sender, EventArgs e) + { + ClearStatus(); + if (CheckStatus()) + await ExecuteUpdate(false); + } + + private async void ButtonX_StartUpdate_Click(object sender, EventArgs e) + { + if (!currentUpdating) + { + ClearStatus(); + if (CheckStatus()) + await ExecuteUpdate(true); + } + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + AppConfig.Instance.LastMinecraftProfilePath = RadTextBoxControl_MinecraftProfileFolder.Text; + AppConfig.Instance.LastConfigFilePath = RadTextBoxControl_ModpackConfig.Text; + AppConfig.Instance.SaveConfig(); + } + + private void Form1_Load(object sender, EventArgs e) + { + if (Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath)) + LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath); + LoadUpdateConfigFile(AppConfig.Instance.LastConfigFilePath); + } + + private async void Form1_Shown(object sender, EventArgs e) + { + var updater = new AppUpdater(); + if (await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) + { + SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px); + Enabled = false; + await updater.Install(); + Application.Restart(); + } + } +} \ No newline at end of file diff --git a/ModpackUpdater/Form1.vb b/ModpackUpdater/Form1.vb deleted file mode 100644 index 667fe03..0000000 --- a/ModpackUpdater/Form1.vb +++ /dev/null @@ -1,205 +0,0 @@ -Imports System.IO - -Imports ModpackUpdater.Manager - -Imports ModpackUpdater.Model - -Imports ModpackUpdater.My.Resources - -Imports Telerik.WinControls -Imports Telerik.WinControls.UI - -Public Class Form1 - - Private updateConfig As New ModpackConfig - Private currentUpdating As Boolean = False - Private lastUpdateCheckResult As UpdateCheckResult = Nothing - - Public Sub New() - InitializeComponent() - Text = $"{Text} (v{Application.ProductVersion})" - End Sub - - Private Function IsMinecaftProfileLoaded() As Boolean - Return Not String.IsNullOrEmpty(GetMinecraftProfilePath) - End Function - - Private Function GetMinecraftProfilePath() As String - Return RadTextBoxControl_MinecraftProfileFolder.Text.Trim - End Function - - Private Function IsUpdateConfigLoaded() As Boolean - Return Not String.IsNullOrEmpty(GetUpdateconfigPath) - End Function - - Private Function GetUpdateconfigPath() As String - Return RadTextBoxControl_ModpackConfig.Text.Trim - End Function - - Private Function CheckStatus() As Boolean - If Not IsMinecaftProfileLoaded() OrElse Not MinecraftProfileChecker.CheckProfile(GetMinecraftProfilePath) Then - SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px) - CheckStatus = False - ElseIf Not IsUpdateConfigLoaded() Then - SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px) - CheckStatus = False - Else - CheckStatus = True - End If - End Function - - Private Sub SetStatus(statusText As String, image As Image) - RadLabel_Status.Text = statusText - RadLabel_Status.Image = image - End Sub - - Private Sub ClearStatus() - RadLabel_Status.Text = "-" - RadLabel_Status.Image = Nothing - End Sub - - Private Sub LoadMinecraftProfile(folderPath As String) - RadTextBoxControl_MinecraftProfileFolder.Text = folderPath - - If IsUpdateConfigLoaded() Then - RadButton_CheckForUpdates.PerformClick() - Else - ClearStatus() - End If - End Sub - - Private Sub LoadUpdateConfigFile(filePath As String) - RadTextBoxControl_ModpackConfig.Text = filePath - Try - If IsUpdateConfigLoaded() Then - updateConfig = ModpackConfig.LoadFromUrl(filePath) - End If - Catch ex As Exception - RadTextBoxControl_ModpackConfig.Text = String.Empty - End Try - - If IsMinecaftProfileLoaded() Then - RadButton_CheckForUpdates.PerformClick() - Else - ClearStatus() - End If - End Sub - - Private Async Function ExecuteUpdate(doInstall As Boolean) As Task - Dim updater As New ModpackInstaller(updateConfig, GetMinecraftProfilePath) - AddHandler updater.InstallProgessUpdated, AddressOf Update_InstallProgessUpdated - AddHandler updater.CheckingProgressUpdated, AddressOf Updated_CheckingProgresssUpdated - - 'Check only if not pressed "install", not really needed otherwise. - If lastUpdateCheckResult Is Nothing OrElse Not doInstall Then - SetStatus(LangRes.StatusText_CheckingForUpdates, MySymbols.icons8_update_16px) - - Try - lastUpdateCheckResult = Await updater.Check(Not AppConfig.Instance.AllowRemoveLocalFiles) - Catch ex As Exception - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px) - Finally - End Try - End If - - If lastUpdateCheckResult Is Nothing OrElse lastUpdateCheckResult.HasError Then - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px) - ElseIf lastUpdateCheckResult.HasUpdates Then - If doInstall Then - SetStatus(LangRes.StatusText_Installing, MySymbols.icons8_software_installer_16px) - currentUpdating = True - - Try - If Await updater.Install(lastUpdateCheckResult) Then - lastUpdateCheckResult = Nothing 'Reset last update check, a new one would be needed now. - SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px) - Else - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px) - End If - Catch - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px) - Finally - currentUpdating = False - End Try - Else - SetStatus(LangRes.StatusText_UpdateAvailable, MySymbols.icons8_software_installer_16px) - End If - Else - SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px) - End If - End Function - - Private Sub Update_InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) - Dim actionCount = result.Actions.Count - SetStatus(Math.Round(processedSyncs / actionCount * 100, 1) & "%", MySymbols.icons8_software_installer_16px) - End Sub - - Private Sub Updated_CheckingProgresssUpdated(toCheck As Integer, processed As Integer) - SetStatus(Math.Round(processed / toCheck * 100, 1) & "%", MySymbols.icons8_update_16px) - End Sub - - Private Sub ButtonX_SearchMinecraftProfile_Click(sender As Object, e As EventArgs) Handles RadButton_SearchMinecraftProfileFolder.Click - Dim ofd As New RadOpenFolderDialog - - If ofd.ShowDialog(Me) = DialogResult.OK Then - LoadMinecraftProfile(ofd.FileName) - End If - End Sub - - Private Sub ButtonX_SearchUpdateConfig_Click(sender As Object, e As EventArgs) Handles RadButton_SearchModpackConfig.Click - Dim ofd As New RadOpenFileDialog With { - .Filter = FiledialogFilters.JSON_Display & "|" & FiledialogFilters.JSON_Filter - } - - If ofd.ShowDialog(Me) = DialogResult.OK Then - LoadUpdateConfigFile(ofd.FileName) - End If - End Sub - - Private Sub RadButton_PasteModpackConfig_Click(sender As Object, e As EventArgs) Handles RadButton_PasteModpackConfig.Click - Dim text = Clipboard.GetText - If text.StartsWith("http") Then - LoadUpdateConfigFile(text) - End If - End Sub - - Private Async Sub ButtonX_CheckForUpdates_Click(sender As Object, e As EventArgs) Handles RadButton_CheckForUpdates.Click - ClearStatus() - If CheckStatus() Then - Await ExecuteUpdate(False) - End If - End Sub - - Private Async Sub ButtonX_StartUpdate_Click(sender As Object, e As EventArgs) Handles RadButton_Install.Click - If Not currentUpdating Then - ClearStatus() - If CheckStatus() Then - Await ExecuteUpdate(True) - End If - End If - End Sub - - Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing - AppConfig.Instance.LastMinecraftProfilePath = RadTextBoxControl_MinecraftProfileFolder.Text - AppConfig.Instance.LastConfigFilePath = RadTextBoxControl_ModpackConfig.Text - AppConfig.Instance.SaveConfig() - End Sub - - Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load - If Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath) Then - LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath) - End If - LoadUpdateConfigFile(AppConfig.Instance.LastConfigFilePath) - End Sub - - Private Async Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown - Dim updater As New AppUpdater - If Await updater.Check AndAlso RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) = DialogResult.Yes Then - SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px) - Enabled = False - Await updater.Install - Application.Restart() - End If - End Sub - -End Class diff --git a/ModpackUpdater/LangRes.Designer.cs b/ModpackUpdater/LangRes.Designer.cs new file mode 100644 index 0000000..78993dd --- /dev/null +++ b/ModpackUpdater/LangRes.Designer.cs @@ -0,0 +1,183 @@ +// ------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +// ------------------------------------------------------------------------------ + + +using System.Diagnostics; + +namespace ModpackUpdater.My.Resources +{ + + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + [System.CodeDom.Compiler.GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal class LangRes + { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal LangRes() : base() + { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager + { + get + { + if (ReferenceEquals(resourceMan, null)) + { + var temp = new System.Resources.ResourceManager("ModpackUpdater.LangRes", typeof(LangRes).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die A new version of this program is available. If you confirm, the update will be installed automatically. It takes just a few seconds. Continue? ähnelt. + /// + internal static string MsgBox_UpdateAvailable + { + get + { + return ResourceManager.GetString("MsgBox_UpdateAvailable", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die New program version available ähnelt. + /// + internal static string MsgBox_UpdateAvailable_Title + { + get + { + return ResourceManager.GetString("MsgBox_UpdateAvailable_Title", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Everything is right and up-to-date. ähnelt. + /// + internal static string StatusTest_EverythingOk + { + get + { + return ResourceManager.GetString("StatusTest_EverythingOk", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Checking for Updates... ähnelt. + /// + internal static string StatusText_CheckingForUpdates + { + get + { + return ResourceManager.GetString("StatusText_CheckingForUpdates", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Config incomplete or not loaded! ähnelt. + /// + internal static string StatusText_ConfigIncompleteOrNotLoaded + { + get + { + return ResourceManager.GetString("StatusText_ConfigIncompleteOrNotLoaded", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Error on update check or while updating! ähnelt. + /// + internal static string StatusText_ErrorWhileUpdateCheckOrUpdate + { + get + { + return ResourceManager.GetString("StatusText_ErrorWhileUpdateCheckOrUpdate", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Installing... ähnelt. + /// + internal static string StatusText_Installing + { + get + { + return ResourceManager.GetString("StatusText_Installing", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Downloading program update... ähnelt. + /// + internal static string StatusText_InstallingAppUpdate + { + get + { + return ResourceManager.GetString("StatusText_InstallingAppUpdate", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Minecraft profile folder seems to be not valid. ähnelt. + /// + internal static string StatusText_MinecraftProfileWarning + { + get + { + return ResourceManager.GetString("StatusText_MinecraftProfileWarning", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die An update is available! ähnelt. + /// + internal static string StatusText_UpdateAvailable + { + get + { + return ResourceManager.GetString("StatusText_UpdateAvailable", resourceCulture); + } + } + } +} \ No newline at end of file diff --git a/ModpackUpdater/LangRes.Designer.vb b/ModpackUpdater/LangRes.Designer.vb deleted file mode 100644 index 40c1e7a..0000000 --- a/ModpackUpdater/LangRes.Designer.vb +++ /dev/null @@ -1,157 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - ''' - ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - ''' - _ - Friend Class LangRes - - Private Shared resourceMan As Global.System.Resources.ResourceManager - - Private Shared resourceCulture As Global.System.Globalization.CultureInfo - - _ - Friend Sub New() - MyBase.New - End Sub - - ''' - ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - ''' - _ - Friend Shared ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("ModpackUpdater.LangRes", GetType(LangRes).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - ''' - _ - Friend Shared Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die A new version of this program is available. If you confirm, the update will be installed automatically. It takes just a few seconds. Continue? ähnelt. - ''' - Friend Shared ReadOnly Property MsgBox_UpdateAvailable() As String - Get - Return ResourceManager.GetString("MsgBox_UpdateAvailable", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die New program version available ähnelt. - ''' - Friend Shared ReadOnly Property MsgBox_UpdateAvailable_Title() As String - Get - Return ResourceManager.GetString("MsgBox_UpdateAvailable_Title", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Everything is right and up-to-date. ähnelt. - ''' - Friend Shared ReadOnly Property StatusTest_EverythingOk() As String - Get - Return ResourceManager.GetString("StatusTest_EverythingOk", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Checking for Updates... ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_CheckingForUpdates() As String - Get - Return ResourceManager.GetString("StatusText_CheckingForUpdates", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Config incomplete or not loaded! ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_ConfigIncompleteOrNotLoaded() As String - Get - Return ResourceManager.GetString("StatusText_ConfigIncompleteOrNotLoaded", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Error on update check or while updating! ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_ErrorWhileUpdateCheckOrUpdate() As String - Get - Return ResourceManager.GetString("StatusText_ErrorWhileUpdateCheckOrUpdate", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Installing... ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_Installing() As String - Get - Return ResourceManager.GetString("StatusText_Installing", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Downloading program update... ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_InstallingAppUpdate() As String - Get - Return ResourceManager.GetString("StatusText_InstallingAppUpdate", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die Minecraft profile folder seems to be not valid. ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_MinecraftProfileWarning() As String - Get - Return ResourceManager.GetString("StatusText_MinecraftProfileWarning", resourceCulture) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Zeichenfolge, die An update is available! ähnelt. - ''' - Friend Shared ReadOnly Property StatusText_UpdateAvailable() As String - Get - Return ResourceManager.GetString("StatusText_UpdateAvailable", resourceCulture) - End Get - End Property - End Class -End Namespace diff --git a/ModpackUpdater/ModpackUpdater.vbproj b/ModpackUpdater/ModpackUpdater.csproj similarity index 59% rename from ModpackUpdater/ModpackUpdater.vbproj rename to ModpackUpdater/ModpackUpdater.csproj index cfdc1cd..527da51 100644 --- a/ModpackUpdater/ModpackUpdater.vbproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -1,75 +1,60 @@  + WinExe net8.0-windows - Sub Main true - WindowsForms icons8_download_from_ftp.ico Minecraft Modpack Updater + true true 1.4.1.0 - - true - embedded - + + + - - - - - - + True True FiledialogFilters.resx - + True True LangRes.resx - - True - True - Application.myapp - - + True True MySymbols.resx - - - MyApplicationCodeGenerator - Application.Designer.vb - - + ResXFileCodeGenerator - My.Resources - FiledialogFilters.Designer.vb + ModpackUpdater.My.Resources + FiledialogFilters.Designer.cs ResXFileCodeGenerator - My.Resources - LangRes.Designer.vb + ModpackUpdater.My.Resources + LangRes.Designer.cs ResXFileCodeGenerator - My.Resources - MySymbols.Designer.vb + ModpackUpdater.My.Resources + MySymbols.Designer.cs + @@ -77,8 +62,10 @@ + - - + + + \ No newline at end of file diff --git a/ModpackUpdater/My Project/Application.Designer.vb b/ModpackUpdater/My Project/Application.Designer.vb deleted file mode 100644 index 7296a3c..0000000 --- a/ModpackUpdater/My Project/Application.Designer.vb +++ /dev/null @@ -1,38 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - 'HINWEIS: Diese Datei wird automatisch generiert und darf nicht direkt bearbeitet werden. Wenn Sie Änderungen vornehmen möchten - ' oder in dieser Datei Buildfehler auftreten, wechseln Sie zum Projekt-Designer. - ' (Wechseln Sie dazu zu den Projekteigenschaften, oder doppelklicken Sie auf den Knoten "Mein Projekt" im - ' Projektmappen-Explorer). Nehmen Sie auf der Registerkarte "Anwendung" entsprechende Änderungen vor. - ' - Partial Friend Class MyApplication - - _ - Public Sub New() - MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) - Me.IsSingleInstance = false - Me.EnableVisualStyles = true - Me.SaveMySettingsOnExit = true - Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses - End Sub - - _ - Protected Overrides Sub OnCreateMainForm() - Me.MainForm = Global.ModpackUpdater.Form1 - End Sub - End Class -End Namespace diff --git a/ModpackUpdater/My Project/Application.myapp b/ModpackUpdater/My Project/Application.myapp deleted file mode 100644 index 0f12f32..0000000 --- a/ModpackUpdater/My Project/Application.myapp +++ /dev/null @@ -1,10 +0,0 @@ - - - true - Form1 - false - 0 - true - 0 - true - \ No newline at end of file diff --git a/ModpackUpdater/MySymbols.Designer.cs b/ModpackUpdater/MySymbols.Designer.cs new file mode 100644 index 0000000..ca7dc7f --- /dev/null +++ b/ModpackUpdater/MySymbols.Designer.cs @@ -0,0 +1,182 @@ +// ------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +// ------------------------------------------------------------------------------ + + +using System.Diagnostics; +using System.Drawing; + +namespace ModpackUpdater.My.Resources +{ + + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + [System.CodeDom.Compiler.GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal class MySymbols + { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal MySymbols() : base() + { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager + { + get + { + if (ReferenceEquals(resourceMan, null)) + { + var temp = new System.Resources.ResourceManager("ModpackUpdater.MySymbols", typeof(MySymbols).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_checkmark_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_checkmark_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_delete_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_delete_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_download_from_ftp_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_download_from_ftp_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_general_warning_sign_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_general_warning_sign_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_opened_folder_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_opened_folder_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_save_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_save_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_software_installer_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_software_installer_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_update_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_update_16px", resourceCulture); + return (Bitmap)obj; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static Bitmap icons8_wrench_16px + { + get + { + var obj = ResourceManager.GetObject("icons8_wrench_16px", resourceCulture); + return (Bitmap)obj; + } + } + } +} \ No newline at end of file diff --git a/ModpackUpdater/MySymbols.Designer.vb b/ModpackUpdater/MySymbols.Designer.vb deleted file mode 100644 index d6b4b8e..0000000 --- a/ModpackUpdater/MySymbols.Designer.vb +++ /dev/null @@ -1,157 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - ''' - ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - ''' - _ - Friend Class MySymbols - - Private Shared resourceMan As Global.System.Resources.ResourceManager - - Private Shared resourceCulture As Global.System.Globalization.CultureInfo - - _ - Friend Sub New() - MyBase.New - End Sub - - ''' - ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - ''' - _ - Friend Shared ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("ModpackUpdater.MySymbols", GetType(MySymbols).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - ''' - _ - Friend Shared Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_checkmark_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_checkmark_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_delete_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_delete_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_download_from_ftp_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_download_from_ftp_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_general_warning_sign_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_general_warning_sign_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_opened_folder_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_opened_folder_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_save_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_save_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_software_installer_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_software_installer_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_update_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_update_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - ''' - Friend Shared ReadOnly Property icons8_wrench_16px() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("icons8_wrench_16px", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - End Class -End Namespace diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs new file mode 100644 index 0000000..3c1e48c --- /dev/null +++ b/ModpackUpdater/Program.cs @@ -0,0 +1,18 @@ +using Telerik.WinControls; + +namespace ModpackUpdater; + +internal static class Program +{ + public static void Main(string[] args) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.SetHighDpiMode(HighDpiMode.PerMonitorV2); + + if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp")) + ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple"; + + Application.Run(new Form1()); + } +} From 0f3e93bfff820606b30f01ab06f6aeb7c014c8ae Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Tue, 18 Jun 2024 10:59:08 +0200 Subject: [PATCH 14/50] code cosmetic --- ModpackUpdater.Manager/ModpackInstaller.cs | 8 +++----- ModpackUpdater/AppConfig.cs | 2 -- ModpackUpdater/Form1.cs | 11 +++++------ ModpackUpdater/ModpackUpdater.csproj | 1 + 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index ed1e0d9..bbacb43 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -18,7 +18,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) public delegate void CheckingProgressUpdatedEventHandler(int toCheck, int processed); - private HttpClient httpClient = new(); + private readonly HttpClient httpClient = new(); ~ModpackInstaller() { @@ -37,7 +37,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) return InstallInfos.Parse(content); } - public async Task Check(bool ignoreRevmoedFiles) + public async Task Check() { var result = new UpdateCheckResult(); @@ -106,10 +106,8 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) { string destFilePath = Path.Combine(localPath, iaction.DestPath); - if (iaction is UpdateAction) + if (iaction is UpdateAction uaction) { - UpdateAction uaction = (UpdateAction)iaction; - switch (uaction.Type) { case UpdateActionType.Update: diff --git a/ModpackUpdater/AppConfig.cs b/ModpackUpdater/AppConfig.cs index 329d1ca..c2828ed 100644 --- a/ModpackUpdater/AppConfig.cs +++ b/ModpackUpdater/AppConfig.cs @@ -7,13 +7,11 @@ public class AppConfig public string LastMinecraftProfilePath { get; set; } public string LastConfigFilePath { get; set; } public List KeepLocalFiles { get; set; } = []; - public bool AllowRemoveLocalFiles { get; set; } public void Reset() { KeepLocalFiles.Clear(); KeepLocalFiles.Add("OptiFine_1.7.10_HD_U_E7.jar"); - AllowRemoveLocalFiles = false; } private static AppConfig instance = null; diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index b77f481..7870f9f 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -40,7 +40,8 @@ public partial class Form1 private bool CheckStatus() { - bool CheckStatusRet = default; + bool CheckStatusRet; + if (!IsMinecaftProfileLoaded() || !MinecraftProfileChecker.CheckProfile(GetMinecraftProfilePath())) { SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px); @@ -52,9 +53,7 @@ public partial class Form1 CheckStatusRet = false; } else - { CheckStatusRet = true; - } return CheckStatusRet; } @@ -91,7 +90,7 @@ public partial class Form1 if (IsUpdateConfigLoaded()) updateConfig = (ModpackConfig)ModpackConfig.LoadFromUrl(filePath); } - catch (Exception ex) + catch { RadTextBoxControl_ModpackConfig.Text = string.Empty; } @@ -117,9 +116,9 @@ public partial class Form1 try { - lastUpdateCheckResult = await updater.Check(!AppConfig.Instance.AllowRemoveLocalFiles); + lastUpdateCheckResult = await updater.Check(); } - catch (Exception ex) + catch { SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); } diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 527da51..3901c19 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -57,6 +57,7 @@ + From 40279ba6b95b69e3d219a9fae59917a74ac4d4d0 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Tue, 18 Jun 2024 11:17:57 +0200 Subject: [PATCH 15/50] migrate settings --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 +- ModpackUpdater/AppConfig.cs | 61 +++------------------- ModpackUpdater/Form1.cs | 11 ---- ModpackUpdater/Program.cs | 49 +++++++++++++++-- 4 files changed, 55 insertions(+), 70 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index bbacb43..1f32809 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -98,9 +98,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) if (ModpackInfo.HasModpackInfo(localPath)) modpackInfo = ModpackInfo.Load(localPath); else - { - modpackInfo = new ModpackInfo(); - } + modpackInfo = new(); foreach (InstallAction iaction in checkResult.Actions) { diff --git a/ModpackUpdater/AppConfig.cs b/ModpackUpdater/AppConfig.cs index c2828ed..d4d578f 100644 --- a/ModpackUpdater/AppConfig.cs +++ b/ModpackUpdater/AppConfig.cs @@ -1,67 +1,22 @@ using Newtonsoft.Json; +using Pilz.Configuration; namespace ModpackUpdater; -public class AppConfig +public class AppConfig : IChildSettings, ISettingsIdentifier { + public static string Identifier => "pilz.appconfig"; + public string LastMinecraftProfilePath { get; set; } public string LastConfigFilePath { get; set; } - public List KeepLocalFiles { get; set; } = []; + public List KeepLocalFiles { get; } = []; public void Reset() { + LastMinecraftProfilePath = null; + LastConfigFilePath = null; KeepLocalFiles.Clear(); - KeepLocalFiles.Add("OptiFine_1.7.10_HD_U_E7.jar"); } - private static AppConfig instance = null; - - public static AppConfig Instance - { - get - { - - if (instance is null) - { - if (File.Exists(SettingsPath)) - instance = LoadConfig(SettingsPath); - else - { - instance = new AppConfig(); - instance.Reset(); - } - } - - return instance; - } - } - private static string settingsPath = string.Empty; - - private static string SettingsPath - { - get - { - const string AppDataDirectoryName = "MinecraftModpackUpdater"; - const string SettingsFileName = "Settings.json"; - - if (string.IsNullOrEmpty(settingsPath)) - { - settingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AppDataDirectoryName); - Directory.CreateDirectory(settingsPath); - settingsPath = Path.Combine(settingsPath, SettingsFileName); - } - - return settingsPath; - } - } - - public void SaveConfig() - { - File.WriteAllText(SettingsPath, JsonConvert.SerializeObject(this)); - } - - private static AppConfig LoadConfig(string filePath) - { - return JsonConvert.DeserializeObject(File.ReadAllText(filePath)); - } + public static AppConfig Instance => Program.Settings.Get(); } \ No newline at end of file diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 7870f9f..c01b56e 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -77,9 +77,7 @@ public partial class Form1 if (IsUpdateConfigLoaded()) RadButton_CheckForUpdates.PerformClick(); else - { ClearStatus(); - } } private void LoadUpdateConfigFile(string filePath) @@ -98,9 +96,7 @@ public partial class Form1 if (IsMinecaftProfileLoaded()) RadButton_CheckForUpdates.PerformClick(); else - { ClearStatus(); - } } private async Task ExecuteUpdate(bool doInstall) @@ -144,9 +140,7 @@ public partial class Form1 SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px); } else - { SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); - } } catch { @@ -158,14 +152,10 @@ public partial class Form1 } } else - { SetStatus(LangRes.StatusText_UpdateAvailable, MySymbols.icons8_software_installer_16px); - } } else - { SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px); - } } private void Update_InstallProgessUpdated(UpdateCheckResult result, int processedSyncs) @@ -223,7 +213,6 @@ public partial class Form1 { AppConfig.Instance.LastMinecraftProfilePath = RadTextBoxControl_MinecraftProfileFolder.Text; AppConfig.Instance.LastConfigFilePath = RadTextBoxControl_ModpackConfig.Text; - AppConfig.Instance.SaveConfig(); } private void Form1_Load(object sender, EventArgs e) diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index 3c1e48c..bd5938e 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -1,10 +1,22 @@ -using Telerik.WinControls; +using Newtonsoft.Json; +using Pilz.Configuration; +using Telerik.WinControls; namespace ModpackUpdater; -internal static class Program +public static class Program { - public static void Main(string[] args) + private static readonly SettingsManager settingsManager; + + public static ISettings Settings => settingsManager.Instance; + + static Program() + { + settingsManager = new(GetSettingsPath(2), true); + MigrateLegacySettings(GetSettingsPath(null)); + } + + internal static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -15,4 +27,35 @@ internal static class Program Application.Run(new Form1()); } + + private static string GetSettingsPath(int? settingsVersion = 2) + { + const string AppDataDirectoryName = "MinecraftModpackUpdater"; + var fileNamePostfix = settingsVersion == null ? string.Empty : $"V{settingsVersion}"; + var SettingsFileName = $"Settings{fileNamePostfix}.json"; + + var settingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), AppDataDirectoryName); + Directory.CreateDirectory(settingsPath); + settingsPath = Path.Combine(settingsPath, SettingsFileName); + + return settingsPath; + } + + private static void MigrateLegacySettings(string settingsPath) + { + // Try load legacy config file + if (!File.Exists(settingsPath) || JsonConvert.DeserializeObject(File.ReadAllText(settingsPath)) is not AppConfig legacyConfig) + return; + + // Migrate + var newConfig = Settings.Get(); + newConfig.LastMinecraftProfilePath = legacyConfig.LastMinecraftProfilePath; + newConfig.LastConfigFilePath = legacyConfig.LastConfigFilePath; + + // Ensure save settings + settingsManager.Save(); + + // Delete legacy config file + File.Delete(settingsPath); + } } From c95e73be4850e152e98246d32434548dc154b8e4 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Tue, 18 Jun 2024 11:41:40 +0200 Subject: [PATCH 16/50] rework ui --- ModpackUpdater/Form1.Designer.cs | 165 ++++++++++++++++++------------- ModpackUpdater/Form1.resx | 26 ++--- 2 files changed, 109 insertions(+), 82 deletions(-) diff --git a/ModpackUpdater/Form1.Designer.cs b/ModpackUpdater/Form1.Designer.cs index 150ffd3..f8ed450 100644 --- a/ModpackUpdater/Form1.Designer.cs +++ b/ModpackUpdater/Form1.Designer.cs @@ -34,62 +34,63 @@ namespace ModpackUpdater [DebuggerStepThrough()] private void InitializeComponent() { - var resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); RadLabel1 = new Telerik.WinControls.UI.RadLabel(); RadLabel2 = new Telerik.WinControls.UI.RadLabel(); RadLabel3 = new Telerik.WinControls.UI.RadLabel(); RadLabel_Status = new Telerik.WinControls.UI.RadLabel(); RadTextBoxControl_MinecraftProfileFolder = new Telerik.WinControls.UI.RadTextBoxControl(); RadTextBoxControl_ModpackConfig = new Telerik.WinControls.UI.RadTextBoxControl(); - Panel1 = new Panel(); RadButton_Install = new Telerik.WinControls.UI.RadButton(); - RadButton_Install.Click += new EventHandler(ButtonX_StartUpdate_Click); RadButton_CheckForUpdates = new Telerik.WinControls.UI.RadButton(); - RadButton_CheckForUpdates.Click += new EventHandler(ButtonX_CheckForUpdates_Click); RadButton_EditModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_PasteModpackConfig = new Telerik.WinControls.UI.RadButton(); - RadButton_PasteModpackConfig.Click += new EventHandler(RadButton_PasteModpackConfig_Click); RadButton_SearchModpackConfig = new Telerik.WinControls.UI.RadButton(); - RadButton_SearchModpackConfig.Click += new EventHandler(ButtonX_SearchUpdateConfig_Click); RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); - RadButton_SearchMinecraftProfileFolder.Click += new EventHandler(ButtonX_SearchMinecraftProfile_Click); + tableLayoutPanel1 = new TableLayoutPanel(); ((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel3).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel_Status).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_MinecraftProfileFolder).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_ModpackConfig).BeginInit(); - Panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)RadButton_Install).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_EditModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit(); + tableLayoutPanel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)this).BeginInit(); SuspendLayout(); // // RadLabel1 // - RadLabel1.Location = new Point(3, 5); + RadLabel1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + RadLabel1.AutoSize = false; + RadLabel1.Location = new Point(3, 3); RadLabel1.Name = "RadLabel1"; - RadLabel1.Size = new Size(124, 18); + RadLabel1.Size = new Size(144, 22); RadLabel1.TabIndex = 0; RadLabel1.Text = "Minecraft profile folder:"; // // RadLabel2 // - RadLabel2.Location = new Point(3, 63); + RadLabel2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + RadLabel2.AutoSize = false; + RadLabel2.Location = new Point(3, 61); RadLabel2.Name = "RadLabel2"; - RadLabel2.Size = new Size(90, 18); + RadLabel2.Size = new Size(144, 22); RadLabel2.TabIndex = 1; RadLabel2.Text = "Modpack config:"; // // RadLabel3 // - RadLabel3.Location = new Point(3, 121); + RadLabel3.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + RadLabel3.AutoSize = false; + RadLabel3.Location = new Point(3, 119); RadLabel3.Name = "RadLabel3"; - RadLabel3.Size = new Size(39, 18); + RadLabel3.Size = new Size(144, 22); RadLabel3.TabIndex = 2; RadLabel3.Text = "Status:"; // @@ -97,9 +98,10 @@ namespace ModpackUpdater // RadLabel_Status.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; RadLabel_Status.AutoSize = false; - RadLabel_Status.Location = new Point(144, 119); + tableLayoutPanel1.SetColumnSpan(RadLabel_Status, 6); + RadLabel_Status.Location = new Point(153, 119); RadLabel_Status.Name = "RadLabel_Status"; - RadLabel_Status.Size = new Size(273, 22); + RadLabel_Status.Size = new Size(266, 22); RadLabel_Status.TabIndex = 3; RadLabel_Status.Text = "-"; RadLabel_Status.TextImageRelation = TextImageRelation.ImageBeforeText; @@ -107,78 +109,63 @@ namespace ModpackUpdater // RadTextBoxControl_MinecraftProfileFolder // RadTextBoxControl_MinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadTextBoxControl_MinecraftProfileFolder, 6); RadTextBoxControl_MinecraftProfileFolder.IsReadOnly = true; - RadTextBoxControl_MinecraftProfileFolder.Location = new Point(144, 3); + RadTextBoxControl_MinecraftProfileFolder.Location = new Point(153, 3); RadTextBoxControl_MinecraftProfileFolder.Name = "RadTextBoxControl_MinecraftProfileFolder"; RadTextBoxControl_MinecraftProfileFolder.NullText = "No file loaded!"; - RadTextBoxControl_MinecraftProfileFolder.Size = new Size(273, 22); + RadTextBoxControl_MinecraftProfileFolder.Size = new Size(266, 22); RadTextBoxControl_MinecraftProfileFolder.TabIndex = 4; // // RadTextBoxControl_ModpackConfig // RadTextBoxControl_ModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadTextBoxControl_ModpackConfig, 6); RadTextBoxControl_ModpackConfig.IsReadOnly = true; - RadTextBoxControl_ModpackConfig.Location = new Point(144, 61); + RadTextBoxControl_ModpackConfig.Location = new Point(153, 61); RadTextBoxControl_ModpackConfig.Name = "RadTextBoxControl_ModpackConfig"; RadTextBoxControl_ModpackConfig.NullText = "No file loaded!"; - RadTextBoxControl_ModpackConfig.Size = new Size(273, 22); + RadTextBoxControl_ModpackConfig.Size = new Size(266, 22); RadTextBoxControl_ModpackConfig.TabIndex = 5; // - // Panel1 - // - Panel1.BackColor = Color.Transparent; - Panel1.Controls.Add(RadButton_Install); - Panel1.Controls.Add(RadButton_CheckForUpdates); - Panel1.Controls.Add(RadButton_EditModpackConfig); - Panel1.Controls.Add(RadButton_PasteModpackConfig); - Panel1.Controls.Add(RadButton_SearchModpackConfig); - Panel1.Controls.Add(RadButton_SearchMinecraftProfileFolder); - Panel1.Controls.Add(RadLabel1); - Panel1.Controls.Add(RadTextBoxControl_ModpackConfig); - Panel1.Controls.Add(RadLabel2); - Panel1.Controls.Add(RadTextBoxControl_MinecraftProfileFolder); - Panel1.Controls.Add(RadLabel3); - Panel1.Controls.Add(RadLabel_Status); - Panel1.Dock = DockStyle.Fill; - Panel1.Location = new Point(0, 0); - Panel1.Name = "Panel1"; - Panel1.Size = new Size(420, 176); - Panel1.TabIndex = 6; - // // RadButton_Install // - RadButton_Install.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + RadButton_Install.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadButton_Install, 2); RadButton_Install.Image = My.Resources.MySymbols.icons8_software_installer_16px; RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_Install.Location = new Point(337, 149); + RadButton_Install.Location = new Point(325, 147); RadButton_Install.Name = "RadButton_Install"; - RadButton_Install.Size = new Size(80, 24); + RadButton_Install.Size = new Size(94, 24); RadButton_Install.TabIndex = 10; RadButton_Install.Text = "Install"; RadButton_Install.TextAlignment = ContentAlignment.MiddleLeft; RadButton_Install.TextImageRelation = TextImageRelation.ImageBeforeText; + RadButton_Install.Click += ButtonX_StartUpdate_Click; // // RadButton_CheckForUpdates // - RadButton_CheckForUpdates.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + RadButton_CheckForUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadButton_CheckForUpdates, 3); RadButton_CheckForUpdates.Image = My.Resources.MySymbols.icons8_update_16px; RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_CheckForUpdates.Location = new Point(191, 149); + RadButton_CheckForUpdates.Location = new Point(175, 147); RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates"; - RadButton_CheckForUpdates.Size = new Size(140, 24); + RadButton_CheckForUpdates.Size = new Size(144, 24); RadButton_CheckForUpdates.TabIndex = 0; RadButton_CheckForUpdates.Text = "Check for Updates"; RadButton_CheckForUpdates.TextAlignment = ContentAlignment.MiddleLeft; RadButton_CheckForUpdates.TextImageRelation = TextImageRelation.ImageBeforeText; + RadButton_CheckForUpdates.Click += ButtonX_CheckForUpdates_Click; // // RadButton_EditModpackConfig // - RadButton_EditModpackConfig.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + RadButton_EditModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; RadButton_EditModpackConfig.Image = My.Resources.MySymbols.icons8_wrench_16px; RadButton_EditModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_EditModpackConfig.Location = new Point(3, 149); + RadButton_EditModpackConfig.Location = new Point(3, 147); RadButton_EditModpackConfig.Name = "RadButton_EditModpackConfig"; - RadButton_EditModpackConfig.Size = new Size(150, 24); + RadButton_EditModpackConfig.Size = new Size(144, 24); RadButton_EditModpackConfig.TabIndex = 8; RadButton_EditModpackConfig.Text = "Edit modpack config"; RadButton_EditModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; @@ -187,88 +174,128 @@ namespace ModpackUpdater // // RadButton_PasteModpackConfig // - RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right; + RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadButton_PasteModpackConfig, 2); RadButton_PasteModpackConfig.Image = (Image)resources.GetObject("RadButton_PasteModpackConfig.Image"); RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_PasteModpackConfig.Location = new Point(231, 89); + RadButton_PasteModpackConfig.Location = new Point(225, 89); RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig"; - RadButton_PasteModpackConfig.Size = new Size(90, 24); + RadButton_PasteModpackConfig.Size = new Size(94, 24); RadButton_PasteModpackConfig.TabIndex = 7; RadButton_PasteModpackConfig.Text = "Paste"; RadButton_PasteModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; + RadButton_PasteModpackConfig.Click += RadButton_PasteModpackConfig_Click; // // RadButton_SearchModpackConfig // - RadButton_SearchModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right; + RadButton_SearchModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadButton_SearchModpackConfig, 2); RadButton_SearchModpackConfig.Image = (Image)resources.GetObject("RadButton_SearchModpackConfig.Image"); RadButton_SearchModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_SearchModpackConfig.Location = new Point(327, 89); + RadButton_SearchModpackConfig.Location = new Point(325, 89); RadButton_SearchModpackConfig.Name = "RadButton_SearchModpackConfig"; - RadButton_SearchModpackConfig.Size = new Size(90, 24); + RadButton_SearchModpackConfig.Size = new Size(94, 24); RadButton_SearchModpackConfig.TabIndex = 7; RadButton_SearchModpackConfig.Text = "Search"; RadButton_SearchModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; RadButton_SearchModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; + RadButton_SearchModpackConfig.Click += ButtonX_SearchUpdateConfig_Click; // // RadButton_SearchMinecraftProfileFolder // - RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Right; + RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(RadButton_SearchMinecraftProfileFolder, 2); RadButton_SearchMinecraftProfileFolder.Image = (Image)resources.GetObject("RadButton_SearchMinecraftProfileFolder.Image"); RadButton_SearchMinecraftProfileFolder.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_SearchMinecraftProfileFolder.Location = new Point(327, 31); + RadButton_SearchMinecraftProfileFolder.Location = new Point(325, 31); RadButton_SearchMinecraftProfileFolder.Name = "RadButton_SearchMinecraftProfileFolder"; - RadButton_SearchMinecraftProfileFolder.Size = new Size(90, 24); + RadButton_SearchMinecraftProfileFolder.Size = new Size(94, 24); RadButton_SearchMinecraftProfileFolder.TabIndex = 6; RadButton_SearchMinecraftProfileFolder.Text = "Search"; RadButton_SearchMinecraftProfileFolder.TextAlignment = ContentAlignment.MiddleLeft; RadButton_SearchMinecraftProfileFolder.TextImageRelation = TextImageRelation.ImageBeforeText; + RadButton_SearchMinecraftProfileFolder.Click += ButtonX_SearchMinecraftProfile_Click; + // + // tableLayoutPanel1 + // + tableLayoutPanel1.ColumnCount = 7; + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 150F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); + tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 2, 5); + tableLayoutPanel1.Controls.Add(RadLabel1, 0, 0); + tableLayoutPanel1.Controls.Add(RadLabel2, 0, 2); + tableLayoutPanel1.Controls.Add(RadButton_EditModpackConfig, 0, 5); + tableLayoutPanel1.Controls.Add(RadTextBoxControl_MinecraftProfileFolder, 1, 0); + tableLayoutPanel1.Controls.Add(RadTextBoxControl_ModpackConfig, 1, 2); + tableLayoutPanel1.Controls.Add(RadLabel_Status, 1, 4); + tableLayoutPanel1.Controls.Add(RadLabel3, 0, 4); + tableLayoutPanel1.Controls.Add(RadButton_SearchMinecraftProfileFolder, 5, 1); + tableLayoutPanel1.Controls.Add(RadButton_SearchModpackConfig, 5, 3); + tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 3, 3); + tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 5); + tableLayoutPanel1.Dock = DockStyle.Fill; + tableLayoutPanel1.Location = new Point(0, 0); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 6; + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.Size = new Size(422, 174); + tableLayoutPanel1.TabIndex = 7; // // Form1 // AutoScaleBaseSize = new Size(7, 15); - AutoScaleDimensions = new SizeF(7f, 15f); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(420, 176); - Controls.Add(Panel1); + ClientSize = new Size(422, 174); + Controls.Add(tableLayoutPanel1); Icon = (Icon)resources.GetObject("$this.Icon"); MaximizeBox = false; Name = "Form1"; StartPosition = FormStartPosition.CenterScreen; Text = "Minecraft Modpack Updater"; + FormClosing += Form1_FormClosing; + Load += Form1_Load; + Shown += Form1_Shown; ((System.ComponentModel.ISupportInitialize)RadLabel1).EndInit(); ((System.ComponentModel.ISupportInitialize)RadLabel2).EndInit(); ((System.ComponentModel.ISupportInitialize)RadLabel3).EndInit(); ((System.ComponentModel.ISupportInitialize)RadLabel_Status).EndInit(); ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_MinecraftProfileFolder).EndInit(); ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_ModpackConfig).EndInit(); - Panel1.ResumeLayout(false); - Panel1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)RadButton_Install).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_EditModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit(); + tableLayoutPanel1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)this).EndInit(); - FormClosing += new FormClosingEventHandler(Form1_FormClosing); - Load += new EventHandler(Form1_Load); - Shown += new EventHandler(Form1_Shown); ResumeLayout(false); - } + internal Telerik.WinControls.UI.RadLabel RadLabel1; internal Telerik.WinControls.UI.RadLabel RadLabel2; internal Telerik.WinControls.UI.RadLabel RadLabel3; internal Telerik.WinControls.UI.RadLabel RadLabel_Status; internal Telerik.WinControls.UI.RadTextBoxControl RadTextBoxControl_MinecraftProfileFolder; internal Telerik.WinControls.UI.RadTextBoxControl RadTextBoxControl_ModpackConfig; - internal Panel Panel1; internal Telerik.WinControls.UI.RadButton RadButton_Install; internal Telerik.WinControls.UI.RadButton RadButton_CheckForUpdates; internal Telerik.WinControls.UI.RadButton RadButton_EditModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_SearchModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder; internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; + private TableLayoutPanel tableLayoutPanel1; } } \ No newline at end of file diff --git a/ModpackUpdater/Form1.resx b/ModpackUpdater/Form1.resx index 4522632..ae1db40 100644 --- a/ModpackUpdater/Form1.resx +++ b/ModpackUpdater/Form1.resx @@ -118,14 +118,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAO9JREFUOE9j - wAUmLFujB8JQLmlg0uJ1+hOWrFsFwn1LNuhChfED16iUeUD8E6jpPwj3Llrzsm/hmlcwPkgOiOdAlWMC - oOTfHz9//Z+7bjtYAzKeu37Hf5AcUM0fqHJMAJT8TwiA1ECVYwJkAz7//Pf/1tu/GDiuftr/CSd/hoIw - VBsCIBsAUjzh1E+8GKoNAWhigMOk+xg4eukL4g3IWPcGBcNsp58BFHsBXTPMdqwGuESlfNp9+Nj/gydO - /9944haKYmwYqg0BXCJTg12jU1a6RqWuSutaegybJmQM1YYdTDrxy2LiyZ+r8WGISgYGAOT2/8PrpxzK - AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE9j + GBzg/34Glv8LGNz+z2cIheNFDNxQacIAqLkZiP+j4PkMB4g25P9ChlUYBuDGP4F4DlQrBJBoAAj/gWqF + ALgBi5j+/z+o8P//SY3//08RxHf/n9GWQzVgNTc2hXiwZjiqAZuFsSjCg09rGaIasFsKu0Ls+Pf/2yrs + qAYcVsSmEBe+CtYMAmADFjICBdXRFeHB6iug2oEGLGBo+b+CA4sifFgzC6odaAAoKa/lDPy/S6KMKLxf + Kvz/fwZGqPYBBQwMAFjinO6ZYVu0AAAAAElFTkSuQmCC @@ -137,13 +136,14 @@ Kvz/fwZGqPYBBQwMAFjinO6ZYVu0AAAAAElFTkSuQmCC - + - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE9j - GBzg/34Glv8LGNz+z2cIheNFDNxQacIAqLkZiP+j4PkMB4g25P9ChlUYBuDGP4F4DlQrBJBoAAj/gWqF - ALgBi5j+/z+o8P//SY3//08RxHf/n9GWQzVgNTc2hXiwZjiqAZuFsSjCg09rGaIasFsKu0Ls+Pf/2yrs - qAYcVsSmEBe+CtYMAmADFjICBdXRFeHB6iug2oEGLGBo+b+CA4sifFgzC6odaAAoKa/lDPy/S6KMKLxf - Kvz/fwZGqPYBBQwMAFjinO6ZYVu0AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAO9JREFUOE9j + wAUmLFujB8JQLmlg0uJ1+hOWrFsFwn1LNuhChfED16iUeUD8E6jpPwj3Llrzsm/hmlcwPkgOiOdAlWMC + oOTfHz9//Z+7bjtYAzKeu37Hf5AcUM0fqHJMAJT8TwiA1ECVYwJkAz7//Pf/1tu/GDiuftr/CSd/hoIw + VBsCIBsAUjzh1E+8GKoNAWhigMOk+xg4eukL4g3IWPcGBcNsp58BFHsBXTPMdqwGuESlfNp9+Nj/gydO + /9944haKYmwYqg0BXCJTg12jU1a6RqWuSutaegybJmQM1YYdTDrxy2LiyZ+r8WGISgYGAOT2/8PrpxzK + AAAAAElFTkSuQmCC From 0f4ba96963a9a906187c454c3305303ccecefc7b Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Tue, 18 Jun 2024 11:58:49 +0200 Subject: [PATCH 17/50] cmd tools --- ModpackUpdater/ModpackUpdater.csproj | 1 + ModpackUpdater/Options.cs | 25 +++++++++++++++++++++++++ ModpackUpdater/Program.cs | 17 ++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 ModpackUpdater/Options.cs diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 3901c19..17e02a8 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -56,6 +56,7 @@ + diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs new file mode 100644 index 0000000..08e63c8 --- /dev/null +++ b/ModpackUpdater/Options.cs @@ -0,0 +1,25 @@ +using Mono.Options; + +namespace ModpackUpdater; + +internal class Options +{ + private readonly List additionals = []; + + public IReadOnlyList Additionals => additionals; + public bool InstallWithoutUi { get; private set; } + public string ProfileFolder { get; private set; } + public string ModpackConfig { get; private set; } + + public Options(string[] args) + { + var options = new OptionSet + { + { "i", "Install without user interface.", n => InstallWithoutUi = n != null }, + { "p|profile=", "Sets the minecraft profile folder.", p => ProfileFolder = p }, + { "c|config=", "Sets the minecraft profile folder.", c => ModpackConfig = c }, + }; + + var additional = options.Parse(args); + } +} diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index bd5938e..a60a921 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using Mono.Options; +using Newtonsoft.Json; using Pilz.Configuration; using Telerik.WinControls; @@ -17,6 +18,15 @@ public static class Program } internal static void Main(string[] args) + { + var options = new Options(args); + if (options.InstallWithoutUi) + InstallWithoutGui(options.ProfileFolder, options.ModpackConfig); + else + RunApp(); + } + + private static void RunApp() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -58,4 +68,9 @@ public static class Program // Delete legacy config file File.Delete(settingsPath); } + + private static void InstallWithoutGui(string profileFolder, string modpackConfig) + { + + } } From 6808f772c168a42e5929d243cb21e4807527417c Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Wed, 19 Jun 2024 20:08:00 +0200 Subject: [PATCH 18/50] some bugfixing & more --- ModpackUpdater.Manager/ModpackInstaller.cs | 62 ++++++++++++++-------- ModpackUpdater.Model/InstallInfos.cs | 5 +- ModpackUpdater/Form1.cs | 5 +- ModpackUpdater/Program.cs | 1 + 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 1f32809..11ec1c1 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -81,7 +81,10 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) var infos = await DownloadInstallInfos(); if (infos is not null && infos.Actions.Count != 0) + { result.Actions.AddRange(infos.Actions); + result.LatestVersion = infos.Version; + } else result.HasError = true; } @@ -176,32 +179,45 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) { Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)); - // Download - var fsDestinationPath = isZip ? Path.Combine(Path.GetTempPath(), $"mc_update_file_{DateTime.Now.ToBinary()}.zip") : destFilePath; - var sRemote = await httpClient.GetStreamAsync(sourceUrl); - var fs = new FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite); - await sRemote.CopyToAsync(fs); - sRemote.Close(); - fs.Close(); - - // Handle zip file - if (isZip) + if (!isZip || localZipCache.FirstOrDefault(n => n.DownloadUrl == sourceUrl) is not LocalZipCacheEntry cachedZipInfo) { + // Download + var fsDestinationPath = isZip ? Path.Combine(Path.GetTempPath(), $"mc_update_file_{DateTime.Now.ToBinary()}.zip") : destFilePath; + var sRemote = await httpClient.GetStreamAsync(sourceUrl); + var fs = new FileStream(fsDestinationPath, FileMode.Create, FileAccess.ReadWrite); + await sRemote.CopyToAsync(fs); + await fs.FlushAsync(); + sRemote.Close(); + fs.Close(); + // Extract - var zipDir = $"{Path.GetFileNameWithoutExtension(fsDestinationPath)}_extracted"; - ZipFile.ExtractToDirectory(fsDestinationPath, zipDir); - - // Copy content - var zipSrc = Path.Combine(zipDir, zipPath); - Extensions.CopyDirectory(zipSrc, destFilePath, true); - - // Delete/cache temporary files - File.Delete(fsDestinationPath); - localZipCache?.Add(new LocalZipCacheEntry + if (isZip) { - DownloadUrl = sourceUrl, - ExtractedZipPath = zipDir - }); + // Extract files + var zipDir = Path.Combine(Path.GetDirectoryName(fsDestinationPath), Path.GetFileNameWithoutExtension(fsDestinationPath)); + ZipFile.ExtractToDirectory(fsDestinationPath, zipDir); + + // Create cache entry + cachedZipInfo = new() + { + DownloadUrl = sourceUrl, + ExtractedZipPath = zipDir + }; + localZipCache.Add(cachedZipInfo); + + // Remofe temp zip file + File.Delete(fsDestinationPath); + } + else + cachedZipInfo = null; + } + + // Handle zip file content + if (cachedZipInfo != null) + { + // Copy content + var zipSrc = Path.Combine(cachedZipInfo.ExtractedZipPath, zipPath); + Extensions.CopyDirectory(zipSrc, destFilePath, true); } } } \ No newline at end of file diff --git a/ModpackUpdater.Model/InstallInfos.cs b/ModpackUpdater.Model/InstallInfos.cs index fc543d3..14d29f3 100644 --- a/ModpackUpdater.Model/InstallInfos.cs +++ b/ModpackUpdater.Model/InstallInfos.cs @@ -1,10 +1,13 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace ModpackUpdater.Model; public class InstallInfos { - public List Actions { get; private set; } = []; + [JsonConverter(typeof(VersionConverter))] + public Version Version { get; set; } + public List Actions { get; } = []; public static InstallInfos Parse(string content) { diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index c01b56e..9b39587 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -1,6 +1,7 @@ using ModpackUpdater.Manager; using ModpackUpdater.Model; using ModpackUpdater.My.Resources; +using System.Diagnostics; using Telerik.WinControls; using Telerik.WinControls.UI; @@ -142,9 +143,11 @@ public partial class Form1 else SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); } - catch + catch(Exception) { SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + if (Debugger.IsAttached) + throw; } finally { diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index a60a921..4444ff2 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -17,6 +17,7 @@ public static class Program MigrateLegacySettings(GetSettingsPath(null)); } + [STAThread] internal static void Main(string[] args) { var options = new Options(args); From f3b2d07117a9214ddd1e2e79018e76ea53847314 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 06:11:41 +0200 Subject: [PATCH 19/50] allow update after install --- ModpackUpdater.Manager/ModpackInstaller.cs | 41 ++++++++++++---------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 11ec1c1..7fbf338 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -37,18 +37,34 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) return InstallInfos.Parse(content); } - public async Task Check() + public async Task Check(bool allowUpdaterAfterInstall = true) { var result = new UpdateCheckResult(); + var hasConfig = ModpackInfo.HasModpackInfo(localPath); + InstallInfos installInfos = null; + UpdateInfos updateInfos = null; - if (ModpackInfo.HasModpackInfo(localPath)) + if (!hasConfig) { - var infos = await DownloadUpdateInfos(); - var modpackInfo = ModpackInfo.Load(localPath); + installInfos = await DownloadInstallInfos(); - if (infos is not null && infos.Updates.Count != 0) + if (installInfos is not null && installInfos.Actions.Count != 0) { - var updatesOrderes = infos.Updates.OrderByDescending(n => n.Version); + result.Actions.AddRange(installInfos.Actions); + result.LatestVersion = installInfos.Version; + } + else + result.HasError = true; + } + + if (allowUpdaterAfterInstall) + { + updateInfos = await DownloadUpdateInfos(); + var modpackInfo = ModpackInfo.HasModpackInfo(localPath) ? ModpackInfo.Load(localPath) : new(); + + if (updateInfos is not null && updateInfos.Updates.Count != 0) + { + var updatesOrderes = updateInfos.Updates.OrderByDescending(n => n.Version); result.LatestVersion = updatesOrderes.First().Version; result.CurrentVersion = modpackInfo.Version; result.IsInstalled = true; @@ -76,19 +92,6 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) result.HasError = true; } - if (!result.IsInstalled) - { - var infos = await DownloadInstallInfos(); - - if (infos is not null && infos.Actions.Count != 0) - { - result.Actions.AddRange(infos.Actions); - result.LatestVersion = infos.Version; - } - else - result.HasError = true; - } - return result; } From 00de4d8708955b327b6ac6ff055d031956f21902 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 06:12:28 +0200 Subject: [PATCH 20/50] add installation without gui & pass arguments to gui --- ModpackUpdater.Model/ModpackConfig.cs | 2 +- ModpackUpdater/Form1.cs | 15 +++++++++++++-- ModpackUpdater/Options.cs | 6 ++++-- ModpackUpdater/Program.cs | 27 ++++++++++++++++++++------- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs index 30191a9..afaffd2 100644 --- a/ModpackUpdater.Model/ModpackConfig.cs +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -8,7 +8,7 @@ public class ModpackConfig public string UpdateUrl { get; set; } public string InstallUrl { get; set; } - public static object LoadFromUrl(string url) + public static ModpackConfig LoadFromUrl(string url) { string result = new HttpClient().GetStringAsync(url).Result; return JsonConvert.DeserializeObject(result); diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 9b39587..ded2573 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -13,6 +13,15 @@ public partial class Form1 private bool currentUpdating = false; private UpdateCheckResult lastUpdateCheckResult = null; + public Form1(string modpackConfig, string profilePath) : this() + { + if (!string.IsNullOrWhiteSpace(modpackConfig)) + LoadUpdateConfigFile(modpackConfig); + + if (!string.IsNullOrWhiteSpace(profilePath)) + LoadMinecraftProfile(profilePath); + } + public Form1() { InitializeComponent(); @@ -84,10 +93,11 @@ public partial class Form1 private void LoadUpdateConfigFile(string filePath) { RadTextBoxControl_ModpackConfig.Text = filePath; + try { if (IsUpdateConfigLoaded()) - updateConfig = (ModpackConfig)ModpackConfig.LoadFromUrl(filePath); + updateConfig = ModpackConfig.LoadFromUrl(filePath); } catch { @@ -222,7 +232,8 @@ public partial class Form1 { if (Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath)) LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath); - LoadUpdateConfigFile(AppConfig.Instance.LastConfigFilePath); + if (!string.IsNullOrWhiteSpace(AppConfig.Instance.LastConfigFilePath)) + LoadUpdateConfigFile(AppConfig.Instance.LastConfigFilePath); } private async void Form1_Shown(object sender, EventArgs e) diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs index 08e63c8..348e4fa 100644 --- a/ModpackUpdater/Options.cs +++ b/ModpackUpdater/Options.cs @@ -7,7 +7,8 @@ internal class Options private readonly List additionals = []; public IReadOnlyList Additionals => additionals; - public bool InstallWithoutUi { get; private set; } + public bool Silent { get; private set; } + public bool NoUi { get; private set; } public string ProfileFolder { get; private set; } public string ModpackConfig { get; private set; } @@ -15,7 +16,8 @@ internal class Options { var options = new OptionSet { - { "i", "Install without user interface.", n => InstallWithoutUi = n != null }, + { "s|silent", "Do not output anything.", s => Silent = s != null }, + { "n|noui", "Install without user interface.", n => NoUi = n != null }, { "p|profile=", "Sets the minecraft profile folder.", p => ProfileFolder = p }, { "c|config=", "Sets the minecraft profile folder.", c => ModpackConfig = c }, }; diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index 4444ff2..567d549 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -1,4 +1,6 @@ -using Mono.Options; +using ModpackUpdater.Manager; +using ModpackUpdater.Model; +using Mono.Options; using Newtonsoft.Json; using Pilz.Configuration; using Telerik.WinControls; @@ -21,13 +23,13 @@ public static class Program internal static void Main(string[] args) { var options = new Options(args); - if (options.InstallWithoutUi) - InstallWithoutGui(options.ProfileFolder, options.ModpackConfig); + if (options.NoUi) + InstallWithoutGui(options.ModpackConfig, options.ProfileFolder, options.Silent); else - RunApp(); + RunApp(options.ModpackConfig, options.ProfileFolder); } - private static void RunApp() + private static void RunApp(string modpackConfig, string profileFolder) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -36,7 +38,7 @@ public static class Program if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp")) ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple"; - Application.Run(new Form1()); + Application.Run(new Form1(modpackConfig, profileFolder)); } private static string GetSettingsPath(int? settingsVersion = 2) @@ -70,8 +72,19 @@ public static class Program File.Delete(settingsPath); } - private static void InstallWithoutGui(string profileFolder, string modpackConfig) + private static void InstallWithoutGui(string modpackConfig, string profileFolder, bool silent) { + var config = ModpackConfig.LoadFromUrl(modpackConfig); + var installer = new ModpackInstaller(config, profileFolder); + var result = installer.Check().Result; + if (result.HasUpdates) + { + var success = installer.Install(result).Result; + if (!silent) + Console.WriteLine($"Installation {(success ?? false ? "completed successfully" : "failed")}!"); + } + else if (!silent) + Console.WriteLine("No updates available"); } } From c31cc3aa20a0a29512a3fa5af2a1402f60199f21 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 06:30:24 +0200 Subject: [PATCH 21/50] add side --- ModpackUpdater.Manager/ModpackInstaller.cs | 7 ++++++- ModpackUpdater.Model/InstallAction.cs | 1 + ModpackUpdater.Model/Side.cs | 12 ++++++++++++ ModpackUpdater/Form1.cs | 12 +++++++++--- ModpackUpdater/Options.cs | 11 +++++++++-- ModpackUpdater/Program.cs | 12 ++++++------ 6 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 ModpackUpdater.Model/Side.cs diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 7fbf338..3b74731 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -37,7 +37,12 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) return InstallInfos.Parse(content); } - public async Task Check(bool allowUpdaterAfterInstall = true) + public Task Check() + { + return Check(Side.Client, true); + } + + public async Task Check(Side side, bool allowUpdaterAfterInstall) { var result = new UpdateCheckResult(); var hasConfig = ModpackInfo.HasModpackInfo(localPath); diff --git a/ModpackUpdater.Model/InstallAction.cs b/ModpackUpdater.Model/InstallAction.cs index b7e3283..7ec563f 100644 --- a/ModpackUpdater.Model/InstallAction.cs +++ b/ModpackUpdater.Model/InstallAction.cs @@ -6,4 +6,5 @@ public class InstallAction public string ZipPath { get; set; } public string DestPath { get; set; } public string DownloadUrl { get; set; } + public Side Side { get; set; } = Side.Both; } \ No newline at end of file diff --git a/ModpackUpdater.Model/Side.cs b/ModpackUpdater.Model/Side.cs new file mode 100644 index 0000000..55cbd6b --- /dev/null +++ b/ModpackUpdater.Model/Side.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace ModpackUpdater.Model; + +[JsonConverter(typeof(StringEnumConverter)), Flags] +public enum Side +{ + Client = 1, + Server = 2, + Both = Client | Server, +} diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index ded2573..178617e 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -12,9 +12,15 @@ public partial class Form1 private ModpackConfig updateConfig = new(); private bool currentUpdating = false; private UpdateCheckResult lastUpdateCheckResult = null; + private readonly bool allowUpdateCheck; + private readonly bool allowUpdaterAfterInstall; + private readonly Side side; - public Form1(string modpackConfig, string profilePath) : this() + public Form1(string modpackConfig, string profilePath, Side side, bool allowUpdaterAfterInstall, bool allowUpdateCheck) : this() { + this.allowUpdaterAfterInstall = allowUpdaterAfterInstall; + this.side = side; + if (!string.IsNullOrWhiteSpace(modpackConfig)) LoadUpdateConfigFile(modpackConfig); @@ -123,7 +129,7 @@ public partial class Form1 try { - lastUpdateCheckResult = await updater.Check(); + lastUpdateCheckResult = await updater.Check(side, allowUpdaterAfterInstall); } catch { @@ -239,7 +245,7 @@ public partial class Form1 private async void Form1_Shown(object sender, EventArgs e) { var updater = new AppUpdater(); - if (await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) + if (allowUpdateCheck && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) { SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px); Enabled = false; diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs index 348e4fa..e462f26 100644 --- a/ModpackUpdater/Options.cs +++ b/ModpackUpdater/Options.cs @@ -1,4 +1,5 @@ -using Mono.Options; +using ModpackUpdater.Model; +using Mono.Options; namespace ModpackUpdater; @@ -9,6 +10,9 @@ internal class Options public IReadOnlyList Additionals => additionals; public bool Silent { get; private set; } public bool NoUi { get; private set; } + public bool NoUpdate { get; private set; }; + public bool AllowUpdaterAfterInstall { get; private set; } = true; + public Side Side { get; private set; } = Side.Client; public string ProfileFolder { get; private set; } public string ModpackConfig { get; private set; } @@ -16,10 +20,13 @@ internal class Options { var options = new OptionSet { - { "s|silent", "Do not output anything.", s => Silent = s != null }, + { "silent", "Do not output anything.", s => Silent = s != null }, { "n|noui", "Install without user interface.", n => NoUi = n != null }, { "p|profile=", "Sets the minecraft profile folder.", p => ProfileFolder = p }, { "c|config=", "Sets the minecraft profile folder.", c => ModpackConfig = c }, + { "s|side=", "Sets the minecraft profile folder.\nDefault side is Client.\nAvailable: Client, Server", s => Side = Enum.Parse(s)}, + { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => AllowUpdaterAfterInstall = uai != null}, + { "noupdate", "Skip the update check wich happens when opening the user interface.", noupdate => NoUpdate = noupdate != null}, }; var additional = options.Parse(args); diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index 567d549..a8e4456 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -24,12 +24,12 @@ public static class Program { var options = new Options(args); if (options.NoUi) - InstallWithoutGui(options.ModpackConfig, options.ProfileFolder, options.Silent); + InstallWithoutGui(options.ModpackConfig, options.ProfileFolder, options.Silent, options.Side, options.AllowUpdaterAfterInstall); else - RunApp(options.ModpackConfig, options.ProfileFolder); + RunApp(options.ModpackConfig, options.ProfileFolder, options.Side, options.AllowUpdaterAfterInstall, !options.NoUpdate); } - private static void RunApp(string modpackConfig, string profileFolder) + private static void RunApp(string modpackConfig, string profileFolder, Side side, bool allowUpdaterAfterInstall, bool allowUpdateCheck) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -38,7 +38,7 @@ public static class Program if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp")) ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple"; - Application.Run(new Form1(modpackConfig, profileFolder)); + Application.Run(new Form1(modpackConfig, profileFolder, side, allowUpdaterAfterInstall, allowUpdateCheck)); } private static string GetSettingsPath(int? settingsVersion = 2) @@ -72,11 +72,11 @@ public static class Program File.Delete(settingsPath); } - private static void InstallWithoutGui(string modpackConfig, string profileFolder, bool silent) + private static void InstallWithoutGui(string modpackConfig, string profileFolder, bool silent, Side side, bool allowUpdaterAfterInstall) { var config = ModpackConfig.LoadFromUrl(modpackConfig); var installer = new ModpackInstaller(config, profileFolder); - var result = installer.Check().Result; + var result = installer.Check(side, allowUpdaterAfterInstall).Result; if (result.HasUpdates) { From fc27fc1c34750bc04c7d848fbeae2ea1c7f1a0d6 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 06:55:25 +0200 Subject: [PATCH 22/50] add maintenance mode & improve & bugfixing --- ModpackUpdater.Manager/Extensions.cs | 9 ++++++- ModpackUpdater.Manager/ModpackInstaller.cs | 28 ++++++++++++-------- ModpackUpdater.Manager/UpdateCheckOptions.cs | 10 +++++++ ModpackUpdater.Manager/UpdateCheckResult.cs | 1 + ModpackUpdater.Model/ModpackConfig.cs | 1 + ModpackUpdater/Form1.cs | 21 +++++++-------- ModpackUpdater/Options.cs | 19 ++++++------- ModpackUpdater/Program.cs | 20 +++++++------- ModpackUpdater/UpdateCheckOptionsAdv.cs | 10 +++++++ 9 files changed, 75 insertions(+), 44 deletions(-) create mode 100644 ModpackUpdater.Manager/UpdateCheckOptions.cs create mode 100644 ModpackUpdater/UpdateCheckOptionsAdv.cs diff --git a/ModpackUpdater.Manager/Extensions.cs b/ModpackUpdater.Manager/Extensions.cs index 3c6c9f8..6b4b7d3 100644 --- a/ModpackUpdater.Manager/Extensions.cs +++ b/ModpackUpdater.Manager/Extensions.cs @@ -1,8 +1,15 @@ -namespace ModpackUpdater.Manager; +using ModpackUpdater.Model; + +namespace ModpackUpdater.Manager; public static class Extensions { + public static bool IsSide(this Side @this, Side side) + { + return @this.HasFlag(side) || side.HasFlag(@this); + } + public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive) { diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 3b74731..bb9332b 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -37,32 +37,38 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) return InstallInfos.Parse(content); } - public Task Check() - { - return Check(Side.Client, true); - } - - public async Task Check(Side side, bool allowUpdaterAfterInstall) + public async Task Check(UpdateCheckOptions options) { var result = new UpdateCheckResult(); var hasConfig = ModpackInfo.HasModpackInfo(localPath); InstallInfos installInfos = null; UpdateInfos updateInfos = null; + if (updateConfig.Maintenance && !options.IgnoreMaintenance) + { + result.IsInMaintenance = true; + return result; + } + if (!hasConfig) { installInfos = await DownloadInstallInfos(); if (installInfos is not null && installInfos.Actions.Count != 0) { - result.Actions.AddRange(installInfos.Actions); - result.LatestVersion = installInfos.Version; + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side)); + if (actions.Any()) + { + result.Actions.AddRange(installInfos.Actions); + result.LatestVersion = installInfos.Version; + } } - else + + if (result.Actions.Count == 0) result.HasError = true; } - if (allowUpdaterAfterInstall) + if (options.AllowUpdaterAfterInstall) { updateInfos = await DownloadUpdateInfos(); var modpackInfo = ModpackInfo.HasModpackInfo(localPath) ? ModpackInfo.Load(localPath) : new(); @@ -83,7 +89,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) foreach (var action in checkingVersion.Actions) { - if (!result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Manager/UpdateCheckOptions.cs b/ModpackUpdater.Manager/UpdateCheckOptions.cs new file mode 100644 index 0000000..bf28bbd --- /dev/null +++ b/ModpackUpdater.Manager/UpdateCheckOptions.cs @@ -0,0 +1,10 @@ +using ModpackUpdater.Model; + +namespace ModpackUpdater.Manager; + +public class UpdateCheckOptions +{ + public bool IgnoreMaintenance { get; set; } + public bool AllowUpdaterAfterInstall { get; set; } = true; + public Side Side { get; set; } = Side.Client; +} diff --git a/ModpackUpdater.Manager/UpdateCheckResult.cs b/ModpackUpdater.Manager/UpdateCheckResult.cs index 77c8335..658f208 100644 --- a/ModpackUpdater.Manager/UpdateCheckResult.cs +++ b/ModpackUpdater.Manager/UpdateCheckResult.cs @@ -9,5 +9,6 @@ public class UpdateCheckResult public List Actions { get; private set; } = []; public bool IsInstalled { get; set; } public bool HasError { get; set; } + public bool IsInMaintenance { get; set; } public bool HasUpdates => !IsInstalled || CurrentVersion < LatestVersion; } \ No newline at end of file diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs index afaffd2..3e7bdfa 100644 --- a/ModpackUpdater.Model/ModpackConfig.cs +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -4,6 +4,7 @@ namespace ModpackUpdater.Model; public class ModpackConfig { + public bool Maintenance { get; set; } public string Name { get; set; } public string UpdateUrl { get; set; } public string InstallUrl { get; set; } diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 178617e..73b498a 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -12,20 +12,17 @@ public partial class Form1 private ModpackConfig updateConfig = new(); private bool currentUpdating = false; private UpdateCheckResult lastUpdateCheckResult = null; - private readonly bool allowUpdateCheck; - private readonly bool allowUpdaterAfterInstall; - private readonly Side side; + private readonly UpdateCheckOptionsAdv updateOptions; - public Form1(string modpackConfig, string profilePath, Side side, bool allowUpdaterAfterInstall, bool allowUpdateCheck) : this() + public Form1(UpdateCheckOptionsAdv updateOptions) : this() { - this.allowUpdaterAfterInstall = allowUpdaterAfterInstall; - this.side = side; + this.updateOptions = updateOptions; - if (!string.IsNullOrWhiteSpace(modpackConfig)) - LoadUpdateConfigFile(modpackConfig); + if (!string.IsNullOrWhiteSpace(updateOptions.ModpackConfig)) + LoadUpdateConfigFile(updateOptions.ModpackConfig); - if (!string.IsNullOrWhiteSpace(profilePath)) - LoadMinecraftProfile(profilePath); + if (!string.IsNullOrWhiteSpace(updateOptions.ProfileFolder)) + LoadMinecraftProfile(updateOptions.ProfileFolder); } public Form1() @@ -129,7 +126,7 @@ public partial class Form1 try { - lastUpdateCheckResult = await updater.Check(side, allowUpdaterAfterInstall); + lastUpdateCheckResult = await updater.Check(updateOptions); } catch { @@ -245,7 +242,7 @@ public partial class Form1 private async void Form1_Shown(object sender, EventArgs e) { var updater = new AppUpdater(); - if (allowUpdateCheck && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) + if (!updateOptions.NoUpdate && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) { SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px); Enabled = false; diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs index e462f26..e4c4fac 100644 --- a/ModpackUpdater/Options.cs +++ b/ModpackUpdater/Options.cs @@ -10,11 +10,7 @@ internal class Options public IReadOnlyList Additionals => additionals; public bool Silent { get; private set; } public bool NoUi { get; private set; } - public bool NoUpdate { get; private set; }; - public bool AllowUpdaterAfterInstall { get; private set; } = true; - public Side Side { get; private set; } = Side.Client; - public string ProfileFolder { get; private set; } - public string ModpackConfig { get; private set; } + public UpdateCheckOptionsAdv UpdateOptions { get; } = new(); public Options(string[] args) { @@ -22,13 +18,14 @@ internal class Options { { "silent", "Do not output anything.", s => Silent = s != null }, { "n|noui", "Install without user interface.", n => NoUi = n != null }, - { "p|profile=", "Sets the minecraft profile folder.", p => ProfileFolder = p }, - { "c|config=", "Sets the minecraft profile folder.", c => ModpackConfig = c }, - { "s|side=", "Sets the minecraft profile folder.\nDefault side is Client.\nAvailable: Client, Server", s => Side = Enum.Parse(s)}, - { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => AllowUpdaterAfterInstall = uai != null}, - { "noupdate", "Skip the update check wich happens when opening the user interface.", noupdate => NoUpdate = noupdate != null}, + { "p|profile=", "Sets the minecraft profile folder.", p => UpdateOptions.ProfileFolder = p }, + { "c|config=", "Sets the minecraft profile folder.", c => UpdateOptions.ModpackConfig = c }, + { "s|side=", "Sets the minecraft profile folder.\nDefault side is Client.\nAvailable: Client, Server", s => UpdateOptions.Side = Enum.Parse(s)}, + { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => UpdateOptions.AllowUpdaterAfterInstall = uai != null}, + { "noupdate", "Skip the update check.", noupdate => UpdateOptions.NoUpdate = noupdate != null}, + { "m|maintenance", "Ignores the maintenance mode.", m => UpdateOptions.IgnoreMaintenance = m != null}, }; - var additional = options.Parse(args); + additionals.AddRange(options.Parse(args)); } } diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index a8e4456..7e0c00b 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -1,6 +1,5 @@ using ModpackUpdater.Manager; using ModpackUpdater.Model; -using Mono.Options; using Newtonsoft.Json; using Pilz.Configuration; using Telerik.WinControls; @@ -24,12 +23,12 @@ public static class Program { var options = new Options(args); if (options.NoUi) - InstallWithoutGui(options.ModpackConfig, options.ProfileFolder, options.Silent, options.Side, options.AllowUpdaterAfterInstall); + InstallWithoutGui(options.UpdateOptions, options.Silent); else - RunApp(options.ModpackConfig, options.ProfileFolder, options.Side, options.AllowUpdaterAfterInstall, !options.NoUpdate); + RunApp(options.UpdateOptions); } - private static void RunApp(string modpackConfig, string profileFolder, Side side, bool allowUpdaterAfterInstall, bool allowUpdateCheck) + private static void RunApp(UpdateCheckOptionsAdv updateOptions) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -38,7 +37,7 @@ public static class Program if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp")) ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple"; - Application.Run(new Form1(modpackConfig, profileFolder, side, allowUpdaterAfterInstall, allowUpdateCheck)); + Application.Run(new Form1(updateOptions)); } private static string GetSettingsPath(int? settingsVersion = 2) @@ -72,11 +71,14 @@ public static class Program File.Delete(settingsPath); } - private static void InstallWithoutGui(string modpackConfig, string profileFolder, bool silent, Side side, bool allowUpdaterAfterInstall) + private static void InstallWithoutGui(UpdateCheckOptionsAdv updateOptions, bool silent) { - var config = ModpackConfig.LoadFromUrl(modpackConfig); - var installer = new ModpackInstaller(config, profileFolder); - var result = installer.Check(side, allowUpdaterAfterInstall).Result; + var config = ModpackConfig.LoadFromUrl(updateOptions.ModpackConfig); + var installer = new ModpackInstaller(config, updateOptions.ProfileFolder); + var result = installer.Check(updateOptions).Result; + + if (!silent && !updateOptions.NoUpdate && new AppUpdater().Check().Result) + Console.WriteLine("A new version is available!"); if (result.HasUpdates) { diff --git a/ModpackUpdater/UpdateCheckOptionsAdv.cs b/ModpackUpdater/UpdateCheckOptionsAdv.cs new file mode 100644 index 0000000..cbe6b61 --- /dev/null +++ b/ModpackUpdater/UpdateCheckOptionsAdv.cs @@ -0,0 +1,10 @@ +using ModpackUpdater.Manager; + +namespace ModpackUpdater; + +public class UpdateCheckOptionsAdv : UpdateCheckOptions +{ + public string ProfileFolder { get; set; } + public string ModpackConfig { get; set; } + public bool NoUpdate { get; set; } +} From 3dc69a4f26ca1c30ee5a4df54d0e76b43aa2446f Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 07:24:23 +0200 Subject: [PATCH 23/50] migrate to svg symbols & add maintenance info --- ModpackUpdater/AppSymbolFactory.cs | 19 ++ ModpackUpdater/AppSymbols.cs | 20 ++ ModpackUpdater/Form1.Designer.cs | 23 +- ModpackUpdater/Form1.cs | 55 +++-- ModpackUpdater/Form1.resx | 28 --- ModpackUpdater/LangRes.Designer.cs | 199 ++++++++---------- ModpackUpdater/LangRes.resx | 3 + ModpackUpdater/ModpackUpdater.csproj | 15 +- ModpackUpdater/MySymbols.Designer.cs | 182 ---------------- ModpackUpdater/MySymbols.resx | 148 ------------- .../Resources/icons8_checkmark_16px.png | Bin 337 -> 0 bytes .../Resources/icons8_delete_16px.png | Bin 417 -> 0 bytes .../icons8_download_from_ftp_16px.png | Bin 494 -> 0 bytes .../icons8_general_warning_sign_16px.png | Bin 588 -> 0 bytes .../Resources/icons8_opened_folder_16px.png | Bin 334 -> 0 bytes ModpackUpdater/Resources/icons8_save_16px.png | Bin 321 -> 0 bytes .../icons8_software_installer_16px.png | Bin 430 -> 0 bytes .../Resources/icons8_update_16px.png | Bin 631 -> 0 bytes .../Resources/icons8_wrench_16px.png | Bin 490 -> 0 bytes ModpackUpdater/Symbols/checkmark.svg | 5 + ModpackUpdater/Symbols/close.svg | 5 + ModpackUpdater/Symbols/delete.svg | 6 + ModpackUpdater/Symbols/done.svg | 4 + ModpackUpdater/Symbols/download_from_ftp.svg | 11 + .../Symbols/general_warning_sign.svg | 7 + ModpackUpdater/Symbols/opened_folder.svg | 5 + ModpackUpdater/Symbols/paste.svg | 11 + ModpackUpdater/Symbols/refresh.svg | 7 + ModpackUpdater/Symbols/replay.svg | 5 + ModpackUpdater/Symbols/save.svg | 9 + ModpackUpdater/Symbols/services.svg | 5 + ModpackUpdater/Symbols/software_installer.svg | 8 + ModpackUpdater/Symbols/update_done.svg | 7 + ModpackUpdater/Symbols/wrench.svg | 4 + 34 files changed, 288 insertions(+), 503 deletions(-) create mode 100644 ModpackUpdater/AppSymbolFactory.cs create mode 100644 ModpackUpdater/AppSymbols.cs delete mode 100644 ModpackUpdater/MySymbols.Designer.cs delete mode 100644 ModpackUpdater/MySymbols.resx delete mode 100644 ModpackUpdater/Resources/icons8_checkmark_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_delete_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_download_from_ftp_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_general_warning_sign_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_opened_folder_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_save_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_software_installer_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_update_16px.png delete mode 100644 ModpackUpdater/Resources/icons8_wrench_16px.png create mode 100644 ModpackUpdater/Symbols/checkmark.svg create mode 100644 ModpackUpdater/Symbols/close.svg create mode 100644 ModpackUpdater/Symbols/delete.svg create mode 100644 ModpackUpdater/Symbols/done.svg create mode 100644 ModpackUpdater/Symbols/download_from_ftp.svg create mode 100644 ModpackUpdater/Symbols/general_warning_sign.svg create mode 100644 ModpackUpdater/Symbols/opened_folder.svg create mode 100644 ModpackUpdater/Symbols/paste.svg create mode 100644 ModpackUpdater/Symbols/refresh.svg create mode 100644 ModpackUpdater/Symbols/replay.svg create mode 100644 ModpackUpdater/Symbols/save.svg create mode 100644 ModpackUpdater/Symbols/services.svg create mode 100644 ModpackUpdater/Symbols/software_installer.svg create mode 100644 ModpackUpdater/Symbols/update_done.svg create mode 100644 ModpackUpdater/Symbols/wrench.svg diff --git a/ModpackUpdater/AppSymbolFactory.cs b/ModpackUpdater/AppSymbolFactory.cs new file mode 100644 index 0000000..f219305 --- /dev/null +++ b/ModpackUpdater/AppSymbolFactory.cs @@ -0,0 +1,19 @@ +using Pilz.UI.Telerik; +using System.Reflection; + +namespace ModpackUpdater; + +public class AppSymbolFactory : SymbolFactory +{ + public static AppSymbolFactory Instance { get; } = new(); + + public override Assembly GetSvgImageResourceAssembly() + { + return Assembly.GetExecutingAssembly(); + } + + public override string GetSvgImageRessourcePath(AppSymbols svgImage) + { + return $"{GetType().Namespace}.Symbols.{svgImage}.svg"; + } +} diff --git a/ModpackUpdater/AppSymbols.cs b/ModpackUpdater/AppSymbols.cs new file mode 100644 index 0000000..fdb37f1 --- /dev/null +++ b/ModpackUpdater/AppSymbols.cs @@ -0,0 +1,20 @@ +namespace ModpackUpdater; + +public enum AppSymbols +{ + checkmark, + close, + delete, + done, + download_from_ftp, + general_warning_sign, + opened_folder, + paste, + refresh, + reload, + save, + services, + software_installer, + update_done, + wrench, +} diff --git a/ModpackUpdater/Form1.Designer.cs b/ModpackUpdater/Form1.Designer.cs index f8ed450..11979be 100644 --- a/ModpackUpdater/Form1.Designer.cs +++ b/ModpackUpdater/Form1.Designer.cs @@ -48,6 +48,7 @@ namespace ModpackUpdater RadButton_SearchModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); tableLayoutPanel1 = new TableLayoutPanel(); + radButton_RefreshConfig = new Telerik.WinControls.UI.RadButton(); ((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel3).BeginInit(); @@ -61,6 +62,7 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit(); tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)this).BeginInit(); SuspendLayout(); // @@ -132,7 +134,6 @@ namespace ModpackUpdater // RadButton_Install.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_Install, 2); - RadButton_Install.Image = My.Resources.MySymbols.icons8_software_installer_16px; RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight; RadButton_Install.Location = new Point(325, 147); RadButton_Install.Name = "RadButton_Install"; @@ -147,7 +148,6 @@ namespace ModpackUpdater // RadButton_CheckForUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_CheckForUpdates, 3); - RadButton_CheckForUpdates.Image = My.Resources.MySymbols.icons8_update_16px; RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight; RadButton_CheckForUpdates.Location = new Point(175, 147); RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates"; @@ -161,7 +161,6 @@ namespace ModpackUpdater // RadButton_EditModpackConfig // RadButton_EditModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - RadButton_EditModpackConfig.Image = My.Resources.MySymbols.icons8_wrench_16px; RadButton_EditModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; RadButton_EditModpackConfig.Location = new Point(3, 147); RadButton_EditModpackConfig.Name = "RadButton_EditModpackConfig"; @@ -176,7 +175,6 @@ namespace ModpackUpdater // RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_PasteModpackConfig, 2); - RadButton_PasteModpackConfig.Image = (Image)resources.GetObject("RadButton_PasteModpackConfig.Image"); RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; RadButton_PasteModpackConfig.Location = new Point(225, 89); RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig"; @@ -191,7 +189,6 @@ namespace ModpackUpdater // RadButton_SearchModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_SearchModpackConfig, 2); - RadButton_SearchModpackConfig.Image = (Image)resources.GetObject("RadButton_SearchModpackConfig.Image"); RadButton_SearchModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; RadButton_SearchModpackConfig.Location = new Point(325, 89); RadButton_SearchModpackConfig.Name = "RadButton_SearchModpackConfig"; @@ -206,7 +203,6 @@ namespace ModpackUpdater // RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_SearchMinecraftProfileFolder, 2); - RadButton_SearchMinecraftProfileFolder.Image = (Image)resources.GetObject("RadButton_SearchMinecraftProfileFolder.Image"); RadButton_SearchMinecraftProfileFolder.ImageAlignment = ContentAlignment.MiddleRight; RadButton_SearchMinecraftProfileFolder.Location = new Point(325, 31); RadButton_SearchMinecraftProfileFolder.Name = "RadButton_SearchMinecraftProfileFolder"; @@ -239,6 +235,7 @@ namespace ModpackUpdater tableLayoutPanel1.Controls.Add(RadButton_SearchModpackConfig, 5, 3); tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 3, 3); tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 5); + tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 2, 3); tableLayoutPanel1.Dock = DockStyle.Fill; tableLayoutPanel1.Location = new Point(0, 0); tableLayoutPanel1.Name = "tableLayoutPanel1"; @@ -252,6 +249,18 @@ namespace ModpackUpdater tableLayoutPanel1.Size = new Size(422, 174); tableLayoutPanel1.TabIndex = 7; // + // radButton_RefreshConfig + // + radButton_RefreshConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right; + radButton_RefreshConfig.DisplayStyle = Telerik.WinControls.DisplayStyle.Image; + radButton_RefreshConfig.ImageAlignment = ContentAlignment.MiddleCenter; + radButton_RefreshConfig.Location = new Point(195, 89); + radButton_RefreshConfig.Name = "radButton_RefreshConfig"; + radButton_RefreshConfig.Size = new Size(24, 24); + radButton_RefreshConfig.TabIndex = 11; + radButton_RefreshConfig.Text = "Reload"; + radButton_RefreshConfig.Click += RadButton_RefreshConfig_Click; + // // Form1 // AutoScaleBaseSize = new Size(7, 15); @@ -280,6 +289,7 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit(); tableLayoutPanel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)this).EndInit(); ResumeLayout(false); } @@ -297,5 +307,6 @@ namespace ModpackUpdater internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder; internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; private TableLayoutPanel tableLayoutPanel1; + private Telerik.WinControls.UI.RadButton radButton_RefreshConfig; } } \ No newline at end of file diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 73b498a..2877a03 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -1,6 +1,7 @@ using ModpackUpdater.Manager; using ModpackUpdater.Model; using ModpackUpdater.My.Resources; +using Pilz.UI.Telerik; using System.Diagnostics; using Telerik.WinControls; using Telerik.WinControls.UI; @@ -28,7 +29,16 @@ public partial class Form1 public Form1() { InitializeComponent(); + Text = $"{Text} (v{Application.ProductVersion})"; + + RadButton_Install.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small); + RadButton_CheckForUpdates.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small); + RadButton_EditModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.wrench, SvgImageSize.Small); + radButton_RefreshConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.refresh, SvgImageSize.Small); + RadButton_SearchMinecraftProfileFolder.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.opened_folder, SvgImageSize.Small); + RadButton_SearchModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.opened_folder, SvgImageSize.Small); + RadButton_PasteModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.paste, SvgImageSize.Small); } private bool IsMinecaftProfileLoaded() @@ -57,12 +67,12 @@ public partial class Form1 if (!IsMinecaftProfileLoaded() || !MinecraftProfileChecker.CheckProfile(GetMinecraftProfilePath())) { - SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px); + SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); CheckStatusRet = false; } else if (!IsUpdateConfigLoaded()) { - SetStatus(LangRes.StatusText_MinecraftProfileWarning, MySymbols.icons8_general_warning_sign_16px); + SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); CheckStatusRet = false; } else @@ -71,16 +81,16 @@ public partial class Form1 return CheckStatusRet; } - private void SetStatus(string statusText, Image image) + private void SetStatus(string statusText, RadSvgImage image) { RadLabel_Status.Text = statusText; - RadLabel_Status.Image = image; + RadLabel_Status.SvgImage = image; } private void ClearStatus() { RadLabel_Status.Text = "-"; - RadLabel_Status.Image = null; + RadLabel_Status.SvgImage = null; } private void LoadMinecraftProfile(string folderPath) @@ -107,7 +117,9 @@ public partial class Form1 RadTextBoxControl_ModpackConfig.Text = string.Empty; } - if (IsMinecaftProfileLoaded()) + if (updateConfig != null && updateConfig.Maintenance && !updateOptions.IgnoreMaintenance) + SetStatus(LangRes.StatusText_Maintenance, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.services, SvgImageSize.Small)); + else if (IsMinecaftProfileLoaded()) RadButton_CheckForUpdates.PerformClick(); else ClearStatus(); @@ -122,7 +134,7 @@ public partial class Form1 // Check only if not pressed "install", not really needed otherwise. if (lastUpdateCheckResult is null || !doInstall) { - SetStatus(LangRes.StatusText_CheckingForUpdates, MySymbols.icons8_update_16px); + SetStatus(LangRes.StatusText_CheckingForUpdates, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small)); try { @@ -130,7 +142,7 @@ public partial class Form1 } catch { - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); } finally { @@ -138,12 +150,12 @@ public partial class Form1 } if (lastUpdateCheckResult is null || lastUpdateCheckResult.HasError) - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); else if (lastUpdateCheckResult.HasUpdates) { if (doInstall) { - SetStatus(LangRes.StatusText_Installing, MySymbols.icons8_software_installer_16px); + SetStatus(LangRes.StatusText_Installing, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); currentUpdating = true; try @@ -151,14 +163,14 @@ public partial class Form1 if (await updater.Install(lastUpdateCheckResult) == true) { lastUpdateCheckResult = null; // Reset last update check, a new one would be needed now. - SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px); + SetStatus(LangRes.StatusTest_EverythingOk, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.done, SvgImageSize.Small)); } else - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); } - catch(Exception) + catch (Exception) { - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px); + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); if (Debugger.IsAttached) throw; } @@ -168,21 +180,21 @@ public partial class Form1 } } else - SetStatus(LangRes.StatusText_UpdateAvailable, MySymbols.icons8_software_installer_16px); + SetStatus(LangRes.StatusText_UpdateAvailable, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); } else - SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px); + SetStatus(LangRes.StatusTest_EverythingOk, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.done, SvgImageSize.Small)); } private void Update_InstallProgessUpdated(UpdateCheckResult result, int processedSyncs) { int actionCount = result.Actions.Count; - SetStatus(Math.Round(processedSyncs / (double)actionCount * 100d, 1) + "%", MySymbols.icons8_software_installer_16px); + SetStatus(Math.Round(processedSyncs / (double)actionCount * 100d, 1) + "%", AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); } private void Updated_CheckingProgresssUpdated(int toCheck, int processed) { - SetStatus(Math.Round(processed / (double)toCheck * 100d, 1) + "%", MySymbols.icons8_update_16px); + SetStatus(Math.Round(processed / (double)toCheck * 100d, 1) + "%", AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small)); } private void ButtonX_SearchMinecraftProfile_Click(object sender, EventArgs e) @@ -208,6 +220,11 @@ public partial class Form1 LoadUpdateConfigFile(text); } + private void RadButton_RefreshConfig_Click(object sender, EventArgs e) + { + LoadUpdateConfigFile(RadTextBoxControl_ModpackConfig.Text); + } + private async void ButtonX_CheckForUpdates_Click(object sender, EventArgs e) { ClearStatus(); @@ -244,7 +261,7 @@ public partial class Form1 var updater = new AppUpdater(); if (!updateOptions.NoUpdate && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) { - SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px); + SetStatus(LangRes.StatusText_InstallingAppUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); Enabled = false; await updater.Install(); Application.Restart(); diff --git a/ModpackUpdater/Form1.resx b/ModpackUpdater/Form1.resx index ae1db40..7abadd4 100644 --- a/ModpackUpdater/Form1.resx +++ b/ModpackUpdater/Form1.resx @@ -118,34 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE9j - GBzg/34Glv8LGNz+z2cIheNFDNxQacIAqLkZiP+j4PkMB4g25P9ChlUYBuDGP4F4DlQrBJBoAAj/gWqF - ALgBi5j+/z+o8P//SY3//08RxHf/n9GWQzVgNTc2hXiwZjiqAZuFsSjCg09rGaIasFsKu0Ls+Pf/2yrs - qAYcVsSmEBe+CtYMAmADFjICBdXRFeHB6iug2oEGLGBo+b+CA4sifFgzC6odaAAoKa/lDPy/S6KMKLxf - Kvz/fwZGqPYBBQwMAFjinO6ZYVu0AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAMhJREFUOE9j - GBzg/34Glv8LGNz+z2cIheNFDNxQacIAqLkZiP+j4PkMB4g25P9ChlUYBuDGP4F4DlQrBJBoAAj/gWqF - ALgBi5j+/z+o8P//SY3//08RxHf/n9GWQzVgNTc2hXiwZjiqAZuFsSjCg09rGaIasFsKu0Ls+Pf/2yrs - qAYcVsSmEBe+CtYMAmADFjICBdXRFeHB6iug2oEGLGBo+b+CA4sifFgzC6odaAAoKa/lDPy/S6KMKLxf - Kvz/fwZGqPYBBQwMAFjinO6ZYVu0AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAO9JREFUOE9j - wAUmLFujB8JQLmlg0uJ1+hOWrFsFwn1LNuhChfED16iUeUD8E6jpPwj3Llrzsm/hmlcwPkgOiOdAlWMC - oOTfHz9//Z+7bjtYAzKeu37Hf5AcUM0fqHJMAJT8TwiA1ECVYwJkAz7//Pf/1tu/GDiuftr/CSd/hoIw - VBsCIBsAUjzh1E+8GKoNAWhigMOk+xg4eukL4g3IWPcGBcNsp58BFHsBXTPMdqwGuESlfNp9+Nj/gydO - /9944haKYmwYqg0BXCJTg12jU1a6RqWuSutaegybJmQM1YYdTDrxy2LiyZ+r8WGISgYGAOT2/8PrpxzK - AAAAAElFTkSuQmCC - - AAABAAYAEBAAAAEAIABoBAAAZgAAACAgAAABACAAqBAAAM4EAAAwMAAAAQAgAKglAAB2FQAAQEAAAAEA diff --git a/ModpackUpdater/LangRes.Designer.cs b/ModpackUpdater/LangRes.Designer.cs index 78993dd..0b29250 100644 --- a/ModpackUpdater/LangRes.Designer.cs +++ b/ModpackUpdater/LangRes.Designer.cs @@ -1,183 +1,162 @@ -// ------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. // -// ------------------------------------------------------------------------------ - - -using System.Diagnostics; - -namespace ModpackUpdater.My.Resources -{ +//------------------------------------------------------------------------------ +namespace ModpackUpdater.My.Resources { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - [System.CodeDom.Compiler.GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [DebuggerNonUserCode()] - [System.Runtime.CompilerServices.CompilerGenerated()] - internal class LangRes - { - - private static System.Resources.ResourceManager resourceMan; - - private static System.Globalization.CultureInfo resourceCulture; - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal LangRes() : base() - { + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class LangRes { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal LangRes() { } - + /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. /// - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static System.Resources.ResourceManager ResourceManager - { - get - { - if (ReferenceEquals(resourceMan, null)) - { - var temp = new System.Resources.ResourceManager("ModpackUpdater.LangRes", typeof(LangRes).Assembly); + [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("ModpackUpdater.LangRes", typeof(LangRes).Assembly); resourceMan = temp; } return resourceMan; } } - + /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. /// - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static System.Globalization.CultureInfo Culture - { - get - { + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die A new version of this program is available. If you confirm, the update will be installed automatically. It takes just a few seconds. Continue? ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die A new version of this program is available. If you confirm, the update will be installed automatically. It takes just a few seconds. Continue? ähnelt. /// - internal static string MsgBox_UpdateAvailable - { - get - { + internal static string MsgBox_UpdateAvailable { + get { return ResourceManager.GetString("MsgBox_UpdateAvailable", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die New program version available ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die New program version available ähnelt. /// - internal static string MsgBox_UpdateAvailable_Title - { - get - { + internal static string MsgBox_UpdateAvailable_Title { + get { return ResourceManager.GetString("MsgBox_UpdateAvailable_Title", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Everything is right and up-to-date. ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die Everything is right and up-to-date. ähnelt. /// - internal static string StatusTest_EverythingOk - { - get - { + internal static string StatusTest_EverythingOk { + get { return ResourceManager.GetString("StatusTest_EverythingOk", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Checking for Updates... ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die Checking for Updates... ähnelt. /// - internal static string StatusText_CheckingForUpdates - { - get - { + internal static string StatusText_CheckingForUpdates { + get { return ResourceManager.GetString("StatusText_CheckingForUpdates", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Config incomplete or not loaded! ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die Config incomplete or not loaded! ähnelt. /// - internal static string StatusText_ConfigIncompleteOrNotLoaded - { - get - { + internal static string StatusText_ConfigIncompleteOrNotLoaded { + get { return ResourceManager.GetString("StatusText_ConfigIncompleteOrNotLoaded", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Error on update check or while updating! ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die Error on update check or while updating! ähnelt. /// - internal static string StatusText_ErrorWhileUpdateCheckOrUpdate - { - get - { + internal static string StatusText_ErrorWhileUpdateCheckOrUpdate { + get { return ResourceManager.GetString("StatusText_ErrorWhileUpdateCheckOrUpdate", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Installing... ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die Installing... ähnelt. /// - internal static string StatusText_Installing - { - get - { + internal static string StatusText_Installing { + get { return ResourceManager.GetString("StatusText_Installing", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Downloading program update... ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die Downloading program update... ähnelt. /// - internal static string StatusText_InstallingAppUpdate - { - get - { + internal static string StatusText_InstallingAppUpdate { + get { return ResourceManager.GetString("StatusText_InstallingAppUpdate", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die Minecraft profile folder seems to be not valid. ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die The update server is currently in maintenance mode. ähnelt. /// - internal static string StatusText_MinecraftProfileWarning - { - get - { + internal static string StatusText_Maintenance { + get { + return ResourceManager.GetString("StatusText_Maintenance", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Minecraft profile folder seems to be not valid. ähnelt. + /// + internal static string StatusText_MinecraftProfileWarning { + get { return ResourceManager.GetString("StatusText_MinecraftProfileWarning", resourceCulture); } } - + /// - /// Sucht eine lokalisierte Zeichenfolge, die An update is available! ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die An update is available! ähnelt. /// - internal static string StatusText_UpdateAvailable - { - get - { + internal static string StatusText_UpdateAvailable { + get { return ResourceManager.GetString("StatusText_UpdateAvailable", resourceCulture); } } } -} \ No newline at end of file +} diff --git a/ModpackUpdater/LangRes.resx b/ModpackUpdater/LangRes.resx index 6c0d2ec..513032f 100644 --- a/ModpackUpdater/LangRes.resx +++ b/ModpackUpdater/LangRes.resx @@ -141,6 +141,9 @@ Downloading program update... + + The update server is currently in maintenance mode. + Minecraft profile folder seems to be not valid. diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 17e02a8..79fab66 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -30,11 +30,6 @@ True LangRes.resx - - True - True - MySymbols.resx - @@ -48,11 +43,6 @@ ModpackUpdater.My.Resources LangRes.Designer.cs - - ResXFileCodeGenerator - ModpackUpdater.My.Resources - MySymbols.Designer.cs - @@ -61,6 +51,7 @@ + @@ -69,5 +60,9 @@ + + + + \ No newline at end of file diff --git a/ModpackUpdater/MySymbols.Designer.cs b/ModpackUpdater/MySymbols.Designer.cs deleted file mode 100644 index ca7dc7f..0000000 --- a/ModpackUpdater/MySymbols.Designer.cs +++ /dev/null @@ -1,182 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -// ------------------------------------------------------------------------------ - - -using System.Diagnostics; -using System.Drawing; - -namespace ModpackUpdater.My.Resources -{ - - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - [System.CodeDom.Compiler.GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [DebuggerNonUserCode()] - [System.Runtime.CompilerServices.CompilerGenerated()] - internal class MySymbols - { - - private static System.Resources.ResourceManager resourceMan; - - private static System.Globalization.CultureInfo resourceCulture; - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal MySymbols() : base() - { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static System.Resources.ResourceManager ResourceManager - { - get - { - if (ReferenceEquals(resourceMan, null)) - { - var temp = new System.Resources.ResourceManager("ModpackUpdater.MySymbols", typeof(MySymbols).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_checkmark_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_checkmark_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_delete_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_delete_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_download_from_ftp_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_download_from_ftp_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_general_warning_sign_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_general_warning_sign_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_opened_folder_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_opened_folder_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_save_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_save_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_software_installer_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_software_installer_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_update_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_update_16px", resourceCulture); - return (Bitmap)obj; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static Bitmap icons8_wrench_16px - { - get - { - var obj = ResourceManager.GetObject("icons8_wrench_16px", resourceCulture); - return (Bitmap)obj; - } - } - } -} \ No newline at end of file diff --git a/ModpackUpdater/MySymbols.resx b/ModpackUpdater/MySymbols.resx deleted file mode 100644 index 5ab8ecc..0000000 --- a/ModpackUpdater/MySymbols.resx +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Resources\icons8_checkmark_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_delete_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_download_from_ftp_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_general_warning_sign_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_opened_folder_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_save_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_software_installer_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_update_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - Resources\icons8_wrench_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/ModpackUpdater/Resources/icons8_checkmark_16px.png b/ModpackUpdater/Resources/icons8_checkmark_16px.png deleted file mode 100644 index 15b6e2c3873bc02fbd87f9f51480336d6507560f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmV-X0j~auP)wAzcARk2G$G9|ubiuvgw#ZEkB!G?~ ze*V7=DE|G=e`X(;%|JdFfemn4=x+A+ALCue`5sW6n}sySExTg#rShHS}OPv zMf?Za2U6M_JBtL1WEF&r^Y+}^xj&ym`AjcSKY5NVOVCmd#8$6mrlE=Z#-T zwl-(YSEJu;Uqa}4AHnrI?JH=Y^?YGK53fH&@}Y@++kISe5 zDV0Yz3lZCm^i-IRnB+139PA=t7ot01*=C`7{MNt)5cW3HGc`N(jpbHLzZf#wp*(0?)!ps#w=;^>-Q8Iyo@5fPu==eV z7_Fh}c)4<-K57-$_RP54dm$Cc<}i5xTqF%{q!^+uO0ew&6q00000 LNkvXXu0mjf+qbc$ diff --git a/ModpackUpdater/Resources/icons8_download_from_ftp_16px.png b/ModpackUpdater/Resources/icons8_download_from_ftp_16px.png deleted file mode 100644 index 5a7b062e3e420f5a6352c944dd3c18d09b79c6ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmVC;rBX$`3xQm9PHZ}*x6v}Av7!7W(F3PJ0Q-xH#$NWPgRA;OHJ8!bY-ZAu*#L9=zl1?bvKyojAHH!ShT+E-5e6aQT@1(O2mJr~f$svtU&aC^26hf9d>UbL zYNjg~n3#SsJbM(u;83uKk)4~R_CGtrO~(I+6jOj+m<>}%h<^3ZnBmDy2ZlFKbYCzs zGUl-W{r-`VCS-Xr`Lhfl%xHE)5+u$9BCz4d#JFfx4o#TL4- zsdz6owO9?v&7H*lP5ArGY_HQ&|Nk@opSIQHIoEqm^~sa-exe(~gf0N$f9C(0ry%-~ z!%*=#tC7+(HU+T{9A5-}@Kl$u>Aqc z^KbzT;QR|_gTx~3F0-*P|DW2>&;Zv5XK-siOcE3LDr%$om;NbmqP^KktGvLMJ- z>k)?t-&cu;e|eH1A`A>nAVyqen=muu|E@Imvto>l|3N}vtSI%9K|vA`b0E2N_p>5Q z%zrx)8u|r5iogc2u(H&fs66{4FZux`R>TBAJ_rt6PIGJpZku<+VrQNe4E#h8)giD3T!`|sbsg+wUC auLJ;9ilZSml(U8a0000|NVPo$*mX-#9WcC_{2`e(rLXO~+i<93PA_kUa@4sh_8mIW{<-)x-z z^S_aYRMLU^wrHL=3eTB&89RkqXYw^pX)JA+{K?uco-M8}bb^B8nNwdT9DI0FYr*3G e!Xe(ptPED)weRzaAMOAK5QC?ypUXO@geCxv-G4Ly diff --git a/ModpackUpdater/Resources/icons8_save_16px.png b/ModpackUpdater/Resources/icons8_save_16px.png deleted file mode 100644 index 0e5165754bb8ae87263f3036ae1236224f8389fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl;P)WgKmPm=ra^?foIFEJTpYuH21bTYe^8Wzq!}POz)S`PE-^VUYw|-d1tr877&z1z zHr;}9(I`wK(G(EkqPXBlvN8iZ3nN}VKmYt^u$g-ot_H;bkmlF#KQMg#{u8bMnZeD; z&LAo%fGos7T`z!)=HlRBU}ZsZ7)Th5v58aH1(}#fSMF~?3;NrZ}#2Y-U0u5HTf8VUvAWtHwjX726hu`N^_~2TpNtB?J;8i-0Rk(Go82Lf zv!PYoL3jFTXf!q;+zlz;6jRq_B;IDVLbp1Ycp>RLs0^aFwq8p>jY!kYSc2c@9l^7cv|V;$)LCP({qyuC&WK5D1gWV z=1rpei0F>_qjHH3&e~$@)k>hq^T(5mOn!7)?&Vd(q{k}IQk!HBGLV;^MJP{a zP-vzqCz)l4z@G}V1}SV=`4^!pkoTUIr`pd9L#og>-<~9uNp&q$md=Sk4md?JoUw`Y zM3KayFVP^(NPi<%V)}{lt;FE1L6@)FpA+9sL34d0Hh1Yu>`qP<81ztZgR_zK&4{M# z>++uwy+z*Y--tt-6MamLt2%)k!sV`viY(WOU)OVy!>S#z^)ktcuXTHojvmE8Ac(Wu zQ+QW?ug>D6_9oOcb{gfo3%#*N-@QHQ=n=&F2XJlj0p=DzDw?#dL>ufE+aiWz3^TI~ z3@~R~#nI1!i$tcczc+x=(ihDjh76xp|Go{~I}l@bu1lmUyXX)uKRfmG_HP8&w@ZTQ RstN!A002ovPDHLkV1mc2CFuYF diff --git a/ModpackUpdater/Resources/icons8_wrench_16px.png b/ModpackUpdater/Resources/icons8_wrench_16px.png deleted file mode 100644 index ef9d803ff03c0871f4c75089e30180a3728eb06e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmV_AHcGNE4;w~_npwz4 zw`L(jl*z|N9^1*vpJ0Q?!iJKt!(xm=^6ov(eT^MxupC4gOx)ZxgH%vWyC1h!06XhGWmSOY+- zPCOQ2%()07a;exP5@zys7wS1y!VVB97|V+7$=T%x{n%pmEi?Ifz``q~-lNK0vE{-b zsM%>wG(ZHKCXzG3i`L}=gy9+Q0_AqGm@%C{omB5L0N(_?lZh50 + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/close.svg b/ModpackUpdater/Symbols/close.svg new file mode 100644 index 0000000..fb5ed9c --- /dev/null +++ b/ModpackUpdater/Symbols/close.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/delete.svg b/ModpackUpdater/Symbols/delete.svg new file mode 100644 index 0000000..72b0583 --- /dev/null +++ b/ModpackUpdater/Symbols/delete.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/done.svg b/ModpackUpdater/Symbols/done.svg new file mode 100644 index 0000000..126184a --- /dev/null +++ b/ModpackUpdater/Symbols/done.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/download_from_ftp.svg b/ModpackUpdater/Symbols/download_from_ftp.svg new file mode 100644 index 0000000..340a861 --- /dev/null +++ b/ModpackUpdater/Symbols/download_from_ftp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/general_warning_sign.svg b/ModpackUpdater/Symbols/general_warning_sign.svg new file mode 100644 index 0000000..78eca79 --- /dev/null +++ b/ModpackUpdater/Symbols/general_warning_sign.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/opened_folder.svg b/ModpackUpdater/Symbols/opened_folder.svg new file mode 100644 index 0000000..9cb2635 --- /dev/null +++ b/ModpackUpdater/Symbols/opened_folder.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/paste.svg b/ModpackUpdater/Symbols/paste.svg new file mode 100644 index 0000000..cee7a6a --- /dev/null +++ b/ModpackUpdater/Symbols/paste.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/refresh.svg b/ModpackUpdater/Symbols/refresh.svg new file mode 100644 index 0000000..e762078 --- /dev/null +++ b/ModpackUpdater/Symbols/refresh.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/replay.svg b/ModpackUpdater/Symbols/replay.svg new file mode 100644 index 0000000..65e6af4 --- /dev/null +++ b/ModpackUpdater/Symbols/replay.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/save.svg b/ModpackUpdater/Symbols/save.svg new file mode 100644 index 0000000..b5040fc --- /dev/null +++ b/ModpackUpdater/Symbols/save.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/services.svg b/ModpackUpdater/Symbols/services.svg new file mode 100644 index 0000000..4c45fd3 --- /dev/null +++ b/ModpackUpdater/Symbols/services.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/software_installer.svg b/ModpackUpdater/Symbols/software_installer.svg new file mode 100644 index 0000000..ca6fe34 --- /dev/null +++ b/ModpackUpdater/Symbols/software_installer.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/update_done.svg b/ModpackUpdater/Symbols/update_done.svg new file mode 100644 index 0000000..f9a2318 --- /dev/null +++ b/ModpackUpdater/Symbols/update_done.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ModpackUpdater/Symbols/wrench.svg b/ModpackUpdater/Symbols/wrench.svg new file mode 100644 index 0000000..92b079d --- /dev/null +++ b/ModpackUpdater/Symbols/wrench.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 604d35856f7df6db889f9e58225890f84391f734 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 07:47:26 +0200 Subject: [PATCH 24/50] adjust maintenance text to be not too long --- ModpackUpdater/LangRes.Designer.cs | 2 +- ModpackUpdater/LangRes.resx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ModpackUpdater/LangRes.Designer.cs b/ModpackUpdater/LangRes.Designer.cs index 0b29250..0f71b98 100644 --- a/ModpackUpdater/LangRes.Designer.cs +++ b/ModpackUpdater/LangRes.Designer.cs @@ -133,7 +133,7 @@ namespace ModpackUpdater.My.Resources { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The update server is currently in maintenance mode. ähnelt. + /// Sucht eine lokalisierte Zeichenfolge, die The update servers are in maintenance. ähnelt. /// internal static string StatusText_Maintenance { get { diff --git a/ModpackUpdater/LangRes.resx b/ModpackUpdater/LangRes.resx index 513032f..26c1eba 100644 --- a/ModpackUpdater/LangRes.resx +++ b/ModpackUpdater/LangRes.resx @@ -142,7 +142,7 @@ Downloading program update... - The update server is currently in maintenance mode. + The update servers are in maintenance. Minecraft profile folder seems to be not valid. From c97a04c4ce80caabd26afbb308b9ade462386bc3 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 15:05:01 +0200 Subject: [PATCH 25/50] load modpack info before modpack installer --- .../MinecraftProfileChecker.cs | 11 -------- ModpackUpdater.Manager/ModpackInstaller.cs | 20 +++++--------- ModpackUpdater.Model/ModpackConfig.cs | 7 ++++- ModpackUpdater.Model/ModpackInfo.cs | 26 ++++++++++++++++--- ModpackUpdater/Form1.cs | 21 ++++++++++++--- ModpackUpdater/Program.cs | 12 +++++++-- 6 files changed, 64 insertions(+), 33 deletions(-) delete mode 100644 ModpackUpdater.Manager/MinecraftProfileChecker.cs diff --git a/ModpackUpdater.Manager/MinecraftProfileChecker.cs b/ModpackUpdater.Manager/MinecraftProfileChecker.cs deleted file mode 100644 index e7deed7..0000000 --- a/ModpackUpdater.Manager/MinecraftProfileChecker.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace ModpackUpdater.Manager; - -public class MinecraftProfileChecker -{ - public static bool CheckProfile(string folderPath) - { - // Todo: Adds some checks to verify, if the current folder is a minecraft folder. - return true; - } -} \ No newline at end of file diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index bb9332b..20db81e 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -3,7 +3,7 @@ using System.IO.Compression; namespace ModpackUpdater.Manager; -public class ModpackInstaller(ModpackConfig updateConfig, string localPath) +public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInfo) { private class LocalZipCacheEntry { @@ -40,7 +40,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) public async Task Check(UpdateCheckOptions options) { var result = new UpdateCheckResult(); - var hasConfig = ModpackInfo.HasModpackInfo(localPath); + var hasConfig = modpackInfo.Exists; InstallInfos installInfos = null; UpdateInfos updateInfos = null; @@ -71,7 +71,6 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) if (options.AllowUpdaterAfterInstall) { updateInfos = await DownloadUpdateInfos(); - var modpackInfo = ModpackInfo.HasModpackInfo(localPath) ? ModpackInfo.Load(localPath) : new(); if (updateInfos is not null && updateInfos.Updates.Count != 0) { @@ -108,18 +107,12 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) public async Task Install(UpdateCheckResult checkResult) { - ModpackInfo modpackInfo; int processed = 0; var localZipCache = new List(); - if (ModpackInfo.HasModpackInfo(localPath)) - modpackInfo = ModpackInfo.Load(localPath); - else - modpackInfo = new(); - foreach (InstallAction iaction in checkResult.Actions) { - string destFilePath = Path.Combine(localPath, iaction.DestPath); + string destFilePath = Path.Combine(modpackInfo.LocaLPath, iaction.DestPath); if (iaction is UpdateAction uaction) { @@ -141,7 +134,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) break; case UpdateActionType.Copy: { - var srcFilePath = Path.Combine(localPath, uaction.SrcPath); + var srcFilePath = Path.Combine(modpackInfo.LocaLPath, uaction.SrcPath); if (uaction.IsDirectory) { if (Directory.Exists(srcFilePath)) @@ -156,7 +149,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) break; case UpdateActionType.Move: { - var srcFilePath = Path.Combine(localPath, uaction.SrcPath); + var srcFilePath = Path.Combine(modpackInfo.LocaLPath, uaction.SrcPath); if (uaction.IsDirectory) { if (Directory.Exists(srcFilePath)) @@ -180,7 +173,8 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath) // Save new modpack info modpackInfo.Version = checkResult.LatestVersion; - modpackInfo.Save(localPath); + modpackInfo.ConfigUrl = updateConfig.ConfigUrl; + modpackInfo.Save(); // Delete cached zip files foreach (var task in localZipCache) diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs index 3e7bdfa..b30e30c 100644 --- a/ModpackUpdater.Model/ModpackConfig.cs +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -9,9 +9,14 @@ public class ModpackConfig public string UpdateUrl { get; set; } public string InstallUrl { get; set; } + [JsonIgnore] + public string ConfigUrl { get; set; } + public static ModpackConfig LoadFromUrl(string url) { string result = new HttpClient().GetStringAsync(url).Result; - return JsonConvert.DeserializeObject(result); + var config = JsonConvert.DeserializeObject(result); + config.ConfigUrl = url; + return config; } } \ No newline at end of file diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs index 7aba881..5ca74b1 100644 --- a/ModpackUpdater.Model/ModpackInfo.cs +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -10,15 +10,35 @@ public class ModpackInfo [JsonConverter(typeof(VersionConverter))] public Version Version { get; set; } + public string ConfigUrl { get; set; } + [JsonIgnore] + public string LocaLPath { get; private set; } + [JsonIgnore] + public bool Exists => Directory.Exists(LocaLPath); + + public void Save() + { + File.WriteAllText(Conversions.ToString(GetFilePath(LocaLPath)), JsonConvert.SerializeObject(this)); + } public void Save(string mcRoot) { - File.WriteAllText(Conversions.ToString(GetFilePath(mcRoot)), JsonConvert.SerializeObject(this)); + LocaLPath = mcRoot; + Save(); + } + + public static ModpackInfo TryLoad(string mcRoot) + { + if (HasModpackInfo(mcRoot)) + return Load(mcRoot); + return new(); } public static ModpackInfo Load(string mcRoot) { - return JsonConvert.DeserializeObject(File.ReadAllText(Conversions.ToString(GetFilePath(mcRoot)))); + var info = JsonConvert.DeserializeObject(File.ReadAllText(GetFilePath(mcRoot))); + info.LocaLPath = mcRoot; + return info; } public static bool HasModpackInfo(string mcRoot) @@ -26,7 +46,7 @@ public class ModpackInfo return File.Exists(Conversions.ToString(GetFilePath(mcRoot))); } - private static object GetFilePath(string mcRoot) + private static string GetFilePath(string mcRoot) { return Path.Combine(mcRoot, FILENAME_MODPACKINFO); } diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 2877a03..e3edda5 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -10,6 +10,7 @@ namespace ModpackUpdater; public partial class Form1 { + private ModpackInfo modpackInfo = null; private ModpackConfig updateConfig = new(); private bool currentUpdating = false; private UpdateCheckResult lastUpdateCheckResult = null; @@ -65,7 +66,7 @@ public partial class Form1 { bool CheckStatusRet; - if (!IsMinecaftProfileLoaded() || !MinecraftProfileChecker.CheckProfile(GetMinecraftProfilePath())) + if (!IsMinecaftProfileLoaded()) { SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); CheckStatusRet = false; @@ -98,7 +99,21 @@ public partial class Form1 RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; if (IsUpdateConfigLoaded()) - RadButton_CheckForUpdates.PerformClick(); + { + try + { + modpackInfo = ModpackInfo.TryLoad(folderPath); + } + catch + { + RadTextBoxControl_MinecraftProfileFolder.Text = string.Empty; + } + + if (string.IsNullOrWhiteSpace(RadTextBoxControl_ModpackConfig.Text) && !string.IsNullOrWhiteSpace(modpackInfo?.ConfigUrl)) + LoadUpdateConfigFile(modpackInfo.ConfigUrl); + else + RadButton_CheckForUpdates.PerformClick(); + } else ClearStatus(); } @@ -127,7 +142,7 @@ public partial class Form1 private async Task ExecuteUpdate(bool doInstall) { - var updater = new ModpackInstaller(updateConfig, GetMinecraftProfilePath()); + var updater = new ModpackInstaller(updateConfig, modpackInfo); updater.InstallProgessUpdated += Update_InstallProgessUpdated; updater.CheckingProgressUpdated += Updated_CheckingProgresssUpdated; diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index 7e0c00b..eb96ee9 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -73,8 +73,9 @@ public static class Program private static void InstallWithoutGui(UpdateCheckOptionsAdv updateOptions, bool silent) { - var config = ModpackConfig.LoadFromUrl(updateOptions.ModpackConfig); - var installer = new ModpackInstaller(config, updateOptions.ProfileFolder); + var info = ModpackInfo.TryLoad(updateOptions.ProfileFolder); + var config = ModpackConfig.LoadFromUrl(CheckModpackConfigUrl(updateOptions.ModpackConfig, info)); + var installer = new ModpackInstaller(config, info); var result = installer.Check(updateOptions).Result; if (!silent && !updateOptions.NoUpdate && new AppUpdater().Check().Result) @@ -89,4 +90,11 @@ public static class Program else if (!silent) Console.WriteLine("No updates available"); } + + private static string CheckModpackConfigUrl(string configUrl, ModpackInfo info) + { + if (string.IsNullOrWhiteSpace(configUrl) && !string.IsNullOrWhiteSpace(info.ConfigUrl)) + return info.ConfigUrl; + return configUrl; + } } From 4ea4a70e50d96b01e3ce00268c2a77afef8bfebf Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 22:19:18 +0200 Subject: [PATCH 26/50] add option to include/exclude extra files --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 ++-- ModpackUpdater.Manager/UpdateCheckOptions.cs | 1 + ModpackUpdater.Model/InstallAction.cs | 1 + ModpackUpdater/Options.cs | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 20db81e..0c2f3f4 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -56,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf if (installInfos is not null && installInfos.Actions.Count != 0) { - var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side)); + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || options.IncludeExtraActions)); if (actions.Any()) { result.Actions.AddRange(installInfos.Actions); @@ -88,7 +88,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf foreach (var action in checkingVersion.Actions) { - if (action.Side.IsSide(options.Side) && !result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && (!action.IsExtra || options.IncludeExtraActions) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Manager/UpdateCheckOptions.cs b/ModpackUpdater.Manager/UpdateCheckOptions.cs index bf28bbd..e0c0993 100644 --- a/ModpackUpdater.Manager/UpdateCheckOptions.cs +++ b/ModpackUpdater.Manager/UpdateCheckOptions.cs @@ -7,4 +7,5 @@ public class UpdateCheckOptions public bool IgnoreMaintenance { get; set; } public bool AllowUpdaterAfterInstall { get; set; } = true; public Side Side { get; set; } = Side.Client; + public bool IncludeExtraActions { get; set; } } diff --git a/ModpackUpdater.Model/InstallAction.cs b/ModpackUpdater.Model/InstallAction.cs index 7ec563f..4343378 100644 --- a/ModpackUpdater.Model/InstallAction.cs +++ b/ModpackUpdater.Model/InstallAction.cs @@ -7,4 +7,5 @@ public class InstallAction public string DestPath { get; set; } public string DownloadUrl { get; set; } public Side Side { get; set; } = Side.Both; + public bool IsExtra { get; set; } } \ No newline at end of file diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs index e4c4fac..488774a 100644 --- a/ModpackUpdater/Options.cs +++ b/ModpackUpdater/Options.cs @@ -24,6 +24,7 @@ internal class Options { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => UpdateOptions.AllowUpdaterAfterInstall = uai != null}, { "noupdate", "Skip the update check.", noupdate => UpdateOptions.NoUpdate = noupdate != null}, { "m|maintenance", "Ignores the maintenance mode.", m => UpdateOptions.IgnoreMaintenance = m != null}, + { "e|extraactions", "Include extra actions.", e => UpdateOptions.IncludeExtraActions = e != null}, }; additionals.AddRange(options.Parse(args)); From 3be25d7070784f6546e0567d9be8215a273dc850 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 22:34:38 +0200 Subject: [PATCH 27/50] include extras --- ModpackUpdater.Manager/ModpackInstaller.cs | 8 +++-- ModpackUpdater.Manager/UpdateCheckResult.cs | 1 + ModpackUpdater.Model/ModpackInfo.cs | 1 + ModpackUpdater/AppConfig.cs | 1 + ModpackUpdater/Form1.Designer.cs | 34 ++++++++++----------- ModpackUpdater/Form1.cs | 8 +++++ 6 files changed, 33 insertions(+), 20 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 0c2f3f4..a7f0a52 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -39,10 +39,13 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf public async Task Check(UpdateCheckOptions options) { - var result = new UpdateCheckResult(); - var hasConfig = modpackInfo.Exists; InstallInfos installInfos = null; UpdateInfos updateInfos = null; + var hasConfig = modpackInfo.Exists; + var result = new UpdateCheckResult + { + HasExtras = options.IncludeExtraActions + }; if (updateConfig.Maintenance && !options.IgnoreMaintenance) { @@ -174,6 +177,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf // Save new modpack info modpackInfo.Version = checkResult.LatestVersion; modpackInfo.ConfigUrl = updateConfig.ConfigUrl; + modpackInfo.IncludeExtras = checkResult.HasExtras; modpackInfo.Save(); // Delete cached zip files diff --git a/ModpackUpdater.Manager/UpdateCheckResult.cs b/ModpackUpdater.Manager/UpdateCheckResult.cs index 658f208..49f1b62 100644 --- a/ModpackUpdater.Manager/UpdateCheckResult.cs +++ b/ModpackUpdater.Manager/UpdateCheckResult.cs @@ -11,4 +11,5 @@ public class UpdateCheckResult public bool HasError { get; set; } public bool IsInMaintenance { get; set; } public bool HasUpdates => !IsInstalled || CurrentVersion < LatestVersion; + public bool HasExtras { get; set; } } \ No newline at end of file diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs index 5ca74b1..eb09a51 100644 --- a/ModpackUpdater.Model/ModpackInfo.cs +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -11,6 +11,7 @@ public class ModpackInfo [JsonConverter(typeof(VersionConverter))] public Version Version { get; set; } public string ConfigUrl { get; set; } + public bool IncludeExtras { get; set; } [JsonIgnore] public string LocaLPath { get; private set; } [JsonIgnore] diff --git a/ModpackUpdater/AppConfig.cs b/ModpackUpdater/AppConfig.cs index d4d578f..70f7c72 100644 --- a/ModpackUpdater/AppConfig.cs +++ b/ModpackUpdater/AppConfig.cs @@ -9,6 +9,7 @@ public class AppConfig : IChildSettings, ISettingsIdentifier public string LastMinecraftProfilePath { get; set; } public string LastConfigFilePath { get; set; } + public bool LastIncludeExtras { get; set; } public List KeepLocalFiles { get; } = []; public void Reset() diff --git a/ModpackUpdater/Form1.Designer.cs b/ModpackUpdater/Form1.Designer.cs index 11979be..552dea5 100644 --- a/ModpackUpdater/Form1.Designer.cs +++ b/ModpackUpdater/Form1.Designer.cs @@ -43,12 +43,12 @@ namespace ModpackUpdater RadTextBoxControl_ModpackConfig = new Telerik.WinControls.UI.RadTextBoxControl(); RadButton_Install = new Telerik.WinControls.UI.RadButton(); RadButton_CheckForUpdates = new Telerik.WinControls.UI.RadButton(); - RadButton_EditModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_PasteModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_SearchModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); tableLayoutPanel1 = new TableLayoutPanel(); radButton_RefreshConfig = new Telerik.WinControls.UI.RadButton(); + radCheckBox_IncludeExtras = new Telerik.WinControls.UI.RadCheckBox(); ((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel3).BeginInit(); @@ -57,12 +57,12 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_ModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_Install).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).BeginInit(); - ((System.ComponentModel.ISupportInitialize)RadButton_EditModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit(); tableLayoutPanel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).BeginInit(); + ((System.ComponentModel.ISupportInitialize)radCheckBox_IncludeExtras).BeginInit(); ((System.ComponentModel.ISupportInitialize)this).BeginInit(); SuspendLayout(); // @@ -158,19 +158,6 @@ namespace ModpackUpdater RadButton_CheckForUpdates.TextImageRelation = TextImageRelation.ImageBeforeText; RadButton_CheckForUpdates.Click += ButtonX_CheckForUpdates_Click; // - // RadButton_EditModpackConfig - // - RadButton_EditModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - RadButton_EditModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_EditModpackConfig.Location = new Point(3, 147); - RadButton_EditModpackConfig.Name = "RadButton_EditModpackConfig"; - RadButton_EditModpackConfig.Size = new Size(144, 24); - RadButton_EditModpackConfig.TabIndex = 8; - RadButton_EditModpackConfig.Text = "Edit modpack config"; - RadButton_EditModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; - RadButton_EditModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; - RadButton_EditModpackConfig.Visible = false; - // // RadButton_PasteModpackConfig // RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; @@ -226,7 +213,6 @@ namespace ModpackUpdater tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 2, 5); tableLayoutPanel1.Controls.Add(RadLabel1, 0, 0); tableLayoutPanel1.Controls.Add(RadLabel2, 0, 2); - tableLayoutPanel1.Controls.Add(RadButton_EditModpackConfig, 0, 5); tableLayoutPanel1.Controls.Add(RadTextBoxControl_MinecraftProfileFolder, 1, 0); tableLayoutPanel1.Controls.Add(RadTextBoxControl_ModpackConfig, 1, 2); tableLayoutPanel1.Controls.Add(RadLabel_Status, 1, 4); @@ -236,6 +222,7 @@ namespace ModpackUpdater tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 3, 3); tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 5); tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 2, 3); + tableLayoutPanel1.Controls.Add(radCheckBox_IncludeExtras, 0, 5); tableLayoutPanel1.Dock = DockStyle.Fill; tableLayoutPanel1.Location = new Point(0, 0); tableLayoutPanel1.Name = "tableLayoutPanel1"; @@ -261,6 +248,17 @@ namespace ModpackUpdater radButton_RefreshConfig.Text = "Reload"; radButton_RefreshConfig.Click += RadButton_RefreshConfig_Click; // + // radCheckBox_IncludeExtras + // + radCheckBox_IncludeExtras.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + radCheckBox_IncludeExtras.AutoSize = false; + radCheckBox_IncludeExtras.Location = new Point(3, 147); + radCheckBox_IncludeExtras.Name = "radCheckBox_IncludeExtras"; + radCheckBox_IncludeExtras.Size = new Size(144, 24); + radCheckBox_IncludeExtras.TabIndex = 12; + radCheckBox_IncludeExtras.Text = "Include extra files"; + radCheckBox_IncludeExtras.ToggleStateChanged += RadCheckBox_IncludeExtras_ToggleStateChanged; + // // Form1 // AutoScaleBaseSize = new Size(7, 15); @@ -284,12 +282,12 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadTextBoxControl_ModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_Install).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).EndInit(); - ((System.ComponentModel.ISupportInitialize)RadButton_EditModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit(); tableLayoutPanel1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).EndInit(); + ((System.ComponentModel.ISupportInitialize)radCheckBox_IncludeExtras).EndInit(); ((System.ComponentModel.ISupportInitialize)this).EndInit(); ResumeLayout(false); } @@ -302,11 +300,11 @@ namespace ModpackUpdater internal Telerik.WinControls.UI.RadTextBoxControl RadTextBoxControl_ModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_Install; internal Telerik.WinControls.UI.RadButton RadButton_CheckForUpdates; - internal Telerik.WinControls.UI.RadButton RadButton_EditModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_SearchModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder; internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; private TableLayoutPanel tableLayoutPanel1; private Telerik.WinControls.UI.RadButton radButton_RefreshConfig; + private Telerik.WinControls.UI.RadCheckBox radCheckBox_IncludeExtras; } } \ No newline at end of file diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index e3edda5..c772d0d 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -113,6 +113,7 @@ public partial class Form1 LoadUpdateConfigFile(modpackInfo.ConfigUrl); else RadButton_CheckForUpdates.PerformClick(); + radCheckBox_IncludeExtras.Checked = modpackInfo.IncludeExtras; } else ClearStatus(); @@ -261,10 +262,12 @@ public partial class Form1 { AppConfig.Instance.LastMinecraftProfilePath = RadTextBoxControl_MinecraftProfileFolder.Text; AppConfig.Instance.LastConfigFilePath = RadTextBoxControl_ModpackConfig.Text; + AppConfig.Instance.LastIncludeExtras = radCheckBox_IncludeExtras.Checked; } private void Form1_Load(object sender, EventArgs e) { + radCheckBox_IncludeExtras.Checked = updateOptions.IncludeExtraActions || AppConfig.Instance.LastIncludeExtras; if (Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath)) LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath); if (!string.IsNullOrWhiteSpace(AppConfig.Instance.LastConfigFilePath)) @@ -282,4 +285,9 @@ public partial class Form1 Application.Restart(); } } + + private void RadCheckBox_IncludeExtras_ToggleStateChanged(object sender, StateChangedEventArgs args) + { + updateOptions.IncludeExtraActions = radCheckBox_IncludeExtras.Checked; + } } \ No newline at end of file From ee46f7272e4de1dcd1720adf2bff13add2518c64 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 22:37:54 +0200 Subject: [PATCH 28/50] remove extras toogle from ui --- ModpackUpdater.Manager/ModpackInstaller.cs | 6 +----- ModpackUpdater.Manager/UpdateCheckResult.cs | 1 - ModpackUpdater.Model/ModpackInfo.cs | 1 - ModpackUpdater/Form1.Designer.cs | 16 ---------------- ModpackUpdater/Form1.cs | 9 --------- 5 files changed, 1 insertion(+), 32 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index a7f0a52..fdab3b4 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -42,10 +42,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf InstallInfos installInfos = null; UpdateInfos updateInfos = null; var hasConfig = modpackInfo.Exists; - var result = new UpdateCheckResult - { - HasExtras = options.IncludeExtraActions - }; + var result = new UpdateCheckResult(); if (updateConfig.Maintenance && !options.IgnoreMaintenance) { @@ -177,7 +174,6 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf // Save new modpack info modpackInfo.Version = checkResult.LatestVersion; modpackInfo.ConfigUrl = updateConfig.ConfigUrl; - modpackInfo.IncludeExtras = checkResult.HasExtras; modpackInfo.Save(); // Delete cached zip files diff --git a/ModpackUpdater.Manager/UpdateCheckResult.cs b/ModpackUpdater.Manager/UpdateCheckResult.cs index 49f1b62..658f208 100644 --- a/ModpackUpdater.Manager/UpdateCheckResult.cs +++ b/ModpackUpdater.Manager/UpdateCheckResult.cs @@ -11,5 +11,4 @@ public class UpdateCheckResult public bool HasError { get; set; } public bool IsInMaintenance { get; set; } public bool HasUpdates => !IsInstalled || CurrentVersion < LatestVersion; - public bool HasExtras { get; set; } } \ No newline at end of file diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs index eb09a51..5ca74b1 100644 --- a/ModpackUpdater.Model/ModpackInfo.cs +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -11,7 +11,6 @@ public class ModpackInfo [JsonConverter(typeof(VersionConverter))] public Version Version { get; set; } public string ConfigUrl { get; set; } - public bool IncludeExtras { get; set; } [JsonIgnore] public string LocaLPath { get; private set; } [JsonIgnore] diff --git a/ModpackUpdater/Form1.Designer.cs b/ModpackUpdater/Form1.Designer.cs index 552dea5..0f3eddc 100644 --- a/ModpackUpdater/Form1.Designer.cs +++ b/ModpackUpdater/Form1.Designer.cs @@ -48,7 +48,6 @@ namespace ModpackUpdater RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); tableLayoutPanel1 = new TableLayoutPanel(); radButton_RefreshConfig = new Telerik.WinControls.UI.RadButton(); - radCheckBox_IncludeExtras = new Telerik.WinControls.UI.RadCheckBox(); ((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel3).BeginInit(); @@ -62,7 +61,6 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit(); tableLayoutPanel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).BeginInit(); - ((System.ComponentModel.ISupportInitialize)radCheckBox_IncludeExtras).BeginInit(); ((System.ComponentModel.ISupportInitialize)this).BeginInit(); SuspendLayout(); // @@ -222,7 +220,6 @@ namespace ModpackUpdater tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 3, 3); tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 5); tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 2, 3); - tableLayoutPanel1.Controls.Add(radCheckBox_IncludeExtras, 0, 5); tableLayoutPanel1.Dock = DockStyle.Fill; tableLayoutPanel1.Location = new Point(0, 0); tableLayoutPanel1.Name = "tableLayoutPanel1"; @@ -248,17 +245,6 @@ namespace ModpackUpdater radButton_RefreshConfig.Text = "Reload"; radButton_RefreshConfig.Click += RadButton_RefreshConfig_Click; // - // radCheckBox_IncludeExtras - // - radCheckBox_IncludeExtras.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - radCheckBox_IncludeExtras.AutoSize = false; - radCheckBox_IncludeExtras.Location = new Point(3, 147); - radCheckBox_IncludeExtras.Name = "radCheckBox_IncludeExtras"; - radCheckBox_IncludeExtras.Size = new Size(144, 24); - radCheckBox_IncludeExtras.TabIndex = 12; - radCheckBox_IncludeExtras.Text = "Include extra files"; - radCheckBox_IncludeExtras.ToggleStateChanged += RadCheckBox_IncludeExtras_ToggleStateChanged; - // // Form1 // AutoScaleBaseSize = new Size(7, 15); @@ -287,7 +273,6 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit(); tableLayoutPanel1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).EndInit(); - ((System.ComponentModel.ISupportInitialize)radCheckBox_IncludeExtras).EndInit(); ((System.ComponentModel.ISupportInitialize)this).EndInit(); ResumeLayout(false); } @@ -305,6 +290,5 @@ namespace ModpackUpdater internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; private TableLayoutPanel tableLayoutPanel1; private Telerik.WinControls.UI.RadButton radButton_RefreshConfig; - private Telerik.WinControls.UI.RadCheckBox radCheckBox_IncludeExtras; } } \ No newline at end of file diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index c772d0d..c52a5d7 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -35,7 +35,6 @@ public partial class Form1 RadButton_Install.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small); RadButton_CheckForUpdates.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small); - RadButton_EditModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.wrench, SvgImageSize.Small); radButton_RefreshConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.refresh, SvgImageSize.Small); RadButton_SearchMinecraftProfileFolder.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.opened_folder, SvgImageSize.Small); RadButton_SearchModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.opened_folder, SvgImageSize.Small); @@ -113,7 +112,6 @@ public partial class Form1 LoadUpdateConfigFile(modpackInfo.ConfigUrl); else RadButton_CheckForUpdates.PerformClick(); - radCheckBox_IncludeExtras.Checked = modpackInfo.IncludeExtras; } else ClearStatus(); @@ -262,12 +260,10 @@ public partial class Form1 { AppConfig.Instance.LastMinecraftProfilePath = RadTextBoxControl_MinecraftProfileFolder.Text; AppConfig.Instance.LastConfigFilePath = RadTextBoxControl_ModpackConfig.Text; - AppConfig.Instance.LastIncludeExtras = radCheckBox_IncludeExtras.Checked; } private void Form1_Load(object sender, EventArgs e) { - radCheckBox_IncludeExtras.Checked = updateOptions.IncludeExtraActions || AppConfig.Instance.LastIncludeExtras; if (Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath)) LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath); if (!string.IsNullOrWhiteSpace(AppConfig.Instance.LastConfigFilePath)) @@ -285,9 +281,4 @@ public partial class Form1 Application.Restart(); } } - - private void RadCheckBox_IncludeExtras_ToggleStateChanged(object sender, StateChangedEventArgs args) - { - updateOptions.IncludeExtraActions = radCheckBox_IncludeExtras.Checked; - } } \ No newline at end of file From 87cfacfdbb5d17b649588778d6f17e4f697a0e40 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 22:40:19 +0200 Subject: [PATCH 29/50] remove allow extras from option -> controlled by update config --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 ++-- ModpackUpdater.Manager/UpdateCheckOptions.cs | 1 - ModpackUpdater.Model/ModpackConfig.cs | 1 + ModpackUpdater/Options.cs | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index fdab3b4..09005ca 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -56,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf if (installInfos is not null && installInfos.Actions.Count != 0) { - var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || options.IncludeExtraActions)); + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || updateConfig.IncludeExtras)); if (actions.Any()) { result.Actions.AddRange(installInfos.Actions); @@ -88,7 +88,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf foreach (var action in checkingVersion.Actions) { - if (action.Side.IsSide(options.Side) && (!action.IsExtra || options.IncludeExtraActions) && !result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && (!action.IsExtra || updateConfig.IncludeExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Manager/UpdateCheckOptions.cs b/ModpackUpdater.Manager/UpdateCheckOptions.cs index e0c0993..bf28bbd 100644 --- a/ModpackUpdater.Manager/UpdateCheckOptions.cs +++ b/ModpackUpdater.Manager/UpdateCheckOptions.cs @@ -7,5 +7,4 @@ public class UpdateCheckOptions public bool IgnoreMaintenance { get; set; } public bool AllowUpdaterAfterInstall { get; set; } = true; public Side Side { get; set; } = Side.Client; - public bool IncludeExtraActions { get; set; } } diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs index b30e30c..3b8bb6a 100644 --- a/ModpackUpdater.Model/ModpackConfig.cs +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -8,6 +8,7 @@ public class ModpackConfig public string Name { get; set; } public string UpdateUrl { get; set; } public string InstallUrl { get; set; } + public bool IncludeExtras { get; set; } [JsonIgnore] public string ConfigUrl { get; set; } diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs index 488774a..e4c4fac 100644 --- a/ModpackUpdater/Options.cs +++ b/ModpackUpdater/Options.cs @@ -24,7 +24,6 @@ internal class Options { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => UpdateOptions.AllowUpdaterAfterInstall = uai != null}, { "noupdate", "Skip the update check.", noupdate => UpdateOptions.NoUpdate = noupdate != null}, { "m|maintenance", "Ignores the maintenance mode.", m => UpdateOptions.IgnoreMaintenance = m != null}, - { "e|extraactions", "Include extra actions.", e => UpdateOptions.IncludeExtraActions = e != null}, }; additionals.AddRange(options.Parse(args)); From 68b940fddd715e8bf3b075cb08f34bbf0812b823 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 20 Jun 2024 22:42:46 +0200 Subject: [PATCH 30/50] AllowExtras --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 ++-- ModpackUpdater.Model/ModpackConfig.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 09005ca..2aa2f49 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -56,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf if (installInfos is not null && installInfos.Actions.Count != 0) { - var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || updateConfig.IncludeExtras)); + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || updateConfig.AllowExtras)); if (actions.Any()) { result.Actions.AddRange(installInfos.Actions); @@ -88,7 +88,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf foreach (var action in checkingVersion.Actions) { - if (action.Side.IsSide(options.Side) && (!action.IsExtra || updateConfig.IncludeExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && (!action.IsExtra || updateConfig.AllowExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs index 3b8bb6a..76e0abb 100644 --- a/ModpackUpdater.Model/ModpackConfig.cs +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -8,7 +8,7 @@ public class ModpackConfig public string Name { get; set; } public string UpdateUrl { get; set; } public string InstallUrl { get; set; } - public bool IncludeExtras { get; set; } + public bool AllowExtras { get; set; } [JsonIgnore] public string ConfigUrl { get; set; } From 1746bb6442aee2ecdfae85c075f02b14839d60e5 Mon Sep 17 00:00:00 2001 From: Schedel Pascal Date: Fri, 21 Jun 2024 06:07:30 +0200 Subject: [PATCH 31/50] completely revert extra property --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 ++-- ModpackUpdater.Model/InstallAction.cs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 2aa2f49..0e2bd29 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -56,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf if (installInfos is not null && installInfos.Actions.Count != 0) { - var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || updateConfig.AllowExtras)); + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side)); if (actions.Any()) { result.Actions.AddRange(installInfos.Actions); @@ -88,7 +88,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf foreach (var action in checkingVersion.Actions) { - if (action.Side.IsSide(options.Side) && (!action.IsExtra || updateConfig.AllowExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Model/InstallAction.cs b/ModpackUpdater.Model/InstallAction.cs index 4343378..7ec563f 100644 --- a/ModpackUpdater.Model/InstallAction.cs +++ b/ModpackUpdater.Model/InstallAction.cs @@ -7,5 +7,4 @@ public class InstallAction public string DestPath { get; set; } public string DownloadUrl { get; set; } public Side Side { get; set; } = Side.Both; - public bool IsExtra { get; set; } } \ No newline at end of file From ab1d3f38b011008c69ddbd3f1df82bd5f85c2616 Mon Sep 17 00:00:00 2001 From: Schedel Pascal Date: Fri, 21 Jun 2024 06:16:35 +0200 Subject: [PATCH 32/50] include release configuration --- .gitignore | 2 +- .../PublishProfiles/FolderProfile.pubxml | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 ModpackUpdater/Properties/PublishProfiles/FolderProfile.pubxml diff --git a/.gitignore b/.gitignore index dfcfd56..98ee568 100644 --- a/.gitignore +++ b/.gitignore @@ -174,7 +174,7 @@ publish/ *.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 +# *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to diff --git a/ModpackUpdater/Properties/PublishProfiles/FolderProfile.pubxml b/ModpackUpdater/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..078acc0 --- /dev/null +++ b/ModpackUpdater/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + bin\publish\general\ + FileSystem + <_TargetId>Folder + net8.0-windows + win-x86 + true + true + false + + \ No newline at end of file From f1185c242cfbd1c154f7f61bde677f316ad335f2 Mon Sep 17 00:00:00 2001 From: Schedel Pascal Date: Fri, 21 Jun 2024 06:45:33 +0200 Subject: [PATCH 33/50] Revert "completely revert extra property" This reverts commit 1746bb6442aee2ecdfae85c075f02b14839d60e5. --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 ++-- ModpackUpdater.Model/InstallAction.cs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 0e2bd29..2aa2f49 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -56,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf if (installInfos is not null && installInfos.Actions.Count != 0) { - var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side)); + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || updateConfig.AllowExtras)); if (actions.Any()) { result.Actions.AddRange(installInfos.Actions); @@ -88,7 +88,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf foreach (var action in checkingVersion.Actions) { - if (action.Side.IsSide(options.Side) && !result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && (!action.IsExtra || updateConfig.AllowExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Model/InstallAction.cs b/ModpackUpdater.Model/InstallAction.cs index 7ec563f..4343378 100644 --- a/ModpackUpdater.Model/InstallAction.cs +++ b/ModpackUpdater.Model/InstallAction.cs @@ -7,4 +7,5 @@ public class InstallAction public string DestPath { get; set; } public string DownloadUrl { get; set; } public Side Side { get; set; } = Side.Both; + public bool IsExtra { get; set; } } \ No newline at end of file From 20c1e5dc8e2bf9e6a14e2e0172109891b1ed9063 Mon Sep 17 00:00:00 2001 From: Schedel Pascal Date: Fri, 21 Jun 2024 08:55:46 +0200 Subject: [PATCH 34/50] install keys --- ModpackUpdater.Manager/ModpackInstaller.cs | 4 +- ModpackUpdater.Manager/UpdateCheckOptions.cs | 1 + ModpackUpdater.Model/ModpackConfig.cs | 2 +- ModpackUpdater.Model/ModpackInfo.cs | 2 + ModpackUpdater/AppConfig.cs | 13 ++- ModpackUpdater/AppFeatures.cs | 81 +++++++++++++++ ModpackUpdater/Form1.Designer.cs | 103 ++++++++++++------- ModpackUpdater/Form1.cs | 64 ++++++------ ModpackUpdater/ModpackUpdater.csproj | 1 + ModpackUpdater/Options.cs | 3 +- ModpackUpdater/Program.cs | 16 ++- ModpackUpdater/UpdateCheckOptionsAdv.cs | 1 + 12 files changed, 216 insertions(+), 75 deletions(-) create mode 100644 ModpackUpdater/AppFeatures.cs diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 2aa2f49..8b444eb 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -56,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf if (installInfos is not null && installInfos.Actions.Count != 0) { - var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || updateConfig.AllowExtras)); + var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side) && (!n.IsExtra || options.IncludeExtras)); if (actions.Any()) { result.Actions.AddRange(installInfos.Actions); @@ -88,7 +88,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf foreach (var action in checkingVersion.Actions) { - if (action.Side.IsSide(options.Side) && (!action.IsExtra || updateConfig.AllowExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) + if (action.Side.IsSide(options.Side) && (!action.IsExtra || options.IncludeExtras) && !result.Actions.Any(n => n.DestPath == action.DestPath)) actionsToAdd.Add(action); } diff --git a/ModpackUpdater.Manager/UpdateCheckOptions.cs b/ModpackUpdater.Manager/UpdateCheckOptions.cs index bf28bbd..c643ef2 100644 --- a/ModpackUpdater.Manager/UpdateCheckOptions.cs +++ b/ModpackUpdater.Manager/UpdateCheckOptions.cs @@ -7,4 +7,5 @@ public class UpdateCheckOptions public bool IgnoreMaintenance { get; set; } public bool AllowUpdaterAfterInstall { get; set; } = true; public Side Side { get; set; } = Side.Client; + public bool IncludeExtras { get; set; } } diff --git a/ModpackUpdater.Model/ModpackConfig.cs b/ModpackUpdater.Model/ModpackConfig.cs index 76e0abb..1040a64 100644 --- a/ModpackUpdater.Model/ModpackConfig.cs +++ b/ModpackUpdater.Model/ModpackConfig.cs @@ -6,9 +6,9 @@ public class ModpackConfig { public bool Maintenance { get; set; } public string Name { get; set; } + public string Key { get; set; } public string UpdateUrl { get; set; } public string InstallUrl { get; set; } - public bool AllowExtras { get; set; } [JsonIgnore] public string ConfigUrl { get; set; } diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs index 5ca74b1..91de060 100644 --- a/ModpackUpdater.Model/ModpackInfo.cs +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -11,6 +11,8 @@ public class ModpackInfo [JsonConverter(typeof(VersionConverter))] public Version Version { get; set; } public string ConfigUrl { get; set; } + public string ExtrasKey { get; set; } + [JsonIgnore] public string LocaLPath { get; private set; } [JsonIgnore] diff --git a/ModpackUpdater/AppConfig.cs b/ModpackUpdater/AppConfig.cs index 70f7c72..a249e01 100644 --- a/ModpackUpdater/AppConfig.cs +++ b/ModpackUpdater/AppConfig.cs @@ -8,15 +8,18 @@ public class AppConfig : IChildSettings, ISettingsIdentifier public static string Identifier => "pilz.appconfig"; public string LastMinecraftProfilePath { get; set; } - public string LastConfigFilePath { get; set; } - public bool LastIncludeExtras { get; set; } - public List KeepLocalFiles { get; } = []; + + [JsonIgnore, Obsolete] + public string ConfigFilePath { get; private set; } + [JsonProperty("ConfigFilePath"), Obsolete] + private string ConfigFilePathLegacy + { + set => ConfigFilePath = value; + } public void Reset() { LastMinecraftProfilePath = null; - LastConfigFilePath = null; - KeepLocalFiles.Clear(); } public static AppConfig Instance => Program.Settings.Get(); diff --git a/ModpackUpdater/AppFeatures.cs b/ModpackUpdater/AppFeatures.cs new file mode 100644 index 0000000..2f138c4 --- /dev/null +++ b/ModpackUpdater/AppFeatures.cs @@ -0,0 +1,81 @@ +using ModpackUpdater.Model; +using Unleash; + +namespace ModpackUpdater; + +public enum AppFeatures +{ + AllowExtras +} + +public static class AppFeaturesExtensions +{ + private const string apiUrl = "https://git.pilzinsel64.de/api/v4/feature_flags/unleash/2"; + private const string instanceId = "glffct-3vCzJXChAnxjsgvoHijR"; + + private static IUnleash api; + private static UnleashContext context; + private static UnleashSettings settings; + + public static bool IsEnabled(this AppFeatures feature, AppFeatureContext context) + { + return feature switch + { + AppFeatures.AllowExtras => CheckFeature("allow-extras", false, context), + _ => throw new NotSupportedException(), + }; + } + + public static bool IsEnabled(this AppFeatures feature) + { + return feature switch + { + _ => throw new NotSupportedException(), + }; + } + + private static bool InitializeApi() + { + if (api == null) + { + settings = new UnleashSettings + { + AppName = "Modpack Updater", + UnleashApi = new Uri(apiUrl), + FetchTogglesInterval = TimeSpan.FromSeconds(60 * 5), + InstanceTag = instanceId, + }; + + api = new DefaultUnleash(settings); + } + + return api != null; + } + + private static bool CheckFeature(string name, bool defaultValue, AppFeatureContext context) + { + return InitializeApi() && api.IsEnabled(name, GetContext(context), defaultValue); + } + + private static UnleashContext GetContext(AppFeatureContext ccontext) + { + context ??= new(); + context.CurrentTime = DateTime.Now; + ccontext?.Apply(context); + return context; + } +} + +public abstract class AppFeatureContext +{ + public abstract void Apply(UnleashContext context); +} + +public class AllowExtrasFeatureContext(ModpackInfo info, ModpackConfig config) : AppFeatureContext +{ + public override void Apply(UnleashContext context) + { + context.UserId = info.ExtrasKey; + context.Environment = config.Key; + } +} \ No newline at end of file diff --git a/ModpackUpdater/Form1.Designer.cs b/ModpackUpdater/Form1.Designer.cs index 0f3eddc..7de264d 100644 --- a/ModpackUpdater/Form1.Designer.cs +++ b/ModpackUpdater/Form1.Designer.cs @@ -44,9 +44,11 @@ namespace ModpackUpdater RadButton_Install = new Telerik.WinControls.UI.RadButton(); RadButton_CheckForUpdates = new Telerik.WinControls.UI.RadButton(); RadButton_PasteModpackConfig = new Telerik.WinControls.UI.RadButton(); - RadButton_SearchModpackConfig = new Telerik.WinControls.UI.RadButton(); RadButton_SearchMinecraftProfileFolder = new Telerik.WinControls.UI.RadButton(); tableLayoutPanel1 = new TableLayoutPanel(); + radLabel4 = new Telerik.WinControls.UI.RadLabel(); + radTextBoxControl_InstallKey = new Telerik.WinControls.UI.RadTextBoxControl(); + radButton_PasteInstallKey = new Telerik.WinControls.UI.RadButton(); radButton_RefreshConfig = new Telerik.WinControls.UI.RadButton(); ((System.ComponentModel.ISupportInitialize)RadLabel1).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadLabel2).BeginInit(); @@ -57,9 +59,11 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadButton_Install).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).BeginInit(); - ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).BeginInit(); tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)radLabel4).BeginInit(); + ((System.ComponentModel.ISupportInitialize)radTextBoxControl_InstallKey).BeginInit(); + ((System.ComponentModel.ISupportInitialize)radButton_PasteInstallKey).BeginInit(); ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).BeginInit(); ((System.ComponentModel.ISupportInitialize)this).BeginInit(); SuspendLayout(); @@ -88,7 +92,7 @@ namespace ModpackUpdater // RadLabel3.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; RadLabel3.AutoSize = false; - RadLabel3.Location = new Point(3, 119); + RadLabel3.Location = new Point(3, 177); RadLabel3.Name = "RadLabel3"; RadLabel3.Size = new Size(144, 22); RadLabel3.TabIndex = 2; @@ -99,7 +103,7 @@ namespace ModpackUpdater RadLabel_Status.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; RadLabel_Status.AutoSize = false; tableLayoutPanel1.SetColumnSpan(RadLabel_Status, 6); - RadLabel_Status.Location = new Point(153, 119); + RadLabel_Status.Location = new Point(153, 177); RadLabel_Status.Name = "RadLabel_Status"; RadLabel_Status.Size = new Size(266, 22); RadLabel_Status.TabIndex = 3; @@ -124,7 +128,7 @@ namespace ModpackUpdater RadTextBoxControl_ModpackConfig.IsReadOnly = true; RadTextBoxControl_ModpackConfig.Location = new Point(153, 61); RadTextBoxControl_ModpackConfig.Name = "RadTextBoxControl_ModpackConfig"; - RadTextBoxControl_ModpackConfig.NullText = "No file loaded!"; + RadTextBoxControl_ModpackConfig.NullText = "No config url provided."; RadTextBoxControl_ModpackConfig.Size = new Size(266, 22); RadTextBoxControl_ModpackConfig.TabIndex = 5; // @@ -133,7 +137,7 @@ namespace ModpackUpdater RadButton_Install.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_Install, 2); RadButton_Install.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_Install.Location = new Point(325, 147); + RadButton_Install.Location = new Point(325, 205); RadButton_Install.Name = "RadButton_Install"; RadButton_Install.Size = new Size(94, 24); RadButton_Install.TabIndex = 10; @@ -147,7 +151,7 @@ namespace ModpackUpdater RadButton_CheckForUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_CheckForUpdates, 3); RadButton_CheckForUpdates.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_CheckForUpdates.Location = new Point(175, 147); + RadButton_CheckForUpdates.Location = new Point(175, 205); RadButton_CheckForUpdates.Name = "RadButton_CheckForUpdates"; RadButton_CheckForUpdates.Size = new Size(144, 24); RadButton_CheckForUpdates.TabIndex = 0; @@ -161,7 +165,7 @@ namespace ModpackUpdater RadButton_PasteModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; tableLayoutPanel1.SetColumnSpan(RadButton_PasteModpackConfig, 2); RadButton_PasteModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_PasteModpackConfig.Location = new Point(225, 89); + RadButton_PasteModpackConfig.Location = new Point(325, 89); RadButton_PasteModpackConfig.Name = "RadButton_PasteModpackConfig"; RadButton_PasteModpackConfig.Size = new Size(94, 24); RadButton_PasteModpackConfig.TabIndex = 7; @@ -170,20 +174,6 @@ namespace ModpackUpdater RadButton_PasteModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; RadButton_PasteModpackConfig.Click += RadButton_PasteModpackConfig_Click; // - // RadButton_SearchModpackConfig - // - RadButton_SearchModpackConfig.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - tableLayoutPanel1.SetColumnSpan(RadButton_SearchModpackConfig, 2); - RadButton_SearchModpackConfig.ImageAlignment = ContentAlignment.MiddleRight; - RadButton_SearchModpackConfig.Location = new Point(325, 89); - RadButton_SearchModpackConfig.Name = "RadButton_SearchModpackConfig"; - RadButton_SearchModpackConfig.Size = new Size(94, 24); - RadButton_SearchModpackConfig.TabIndex = 7; - RadButton_SearchModpackConfig.Text = "Search"; - RadButton_SearchModpackConfig.TextAlignment = ContentAlignment.MiddleLeft; - RadButton_SearchModpackConfig.TextImageRelation = TextImageRelation.ImageBeforeText; - RadButton_SearchModpackConfig.Click += ButtonX_SearchUpdateConfig_Click; - // // RadButton_SearchMinecraftProfileFolder // RadButton_SearchMinecraftProfileFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; @@ -208,37 +198,76 @@ namespace ModpackUpdater tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); - tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 2, 5); + tableLayoutPanel1.Controls.Add(RadButton_CheckForUpdates, 2, 7); tableLayoutPanel1.Controls.Add(RadLabel1, 0, 0); tableLayoutPanel1.Controls.Add(RadLabel2, 0, 2); tableLayoutPanel1.Controls.Add(RadTextBoxControl_MinecraftProfileFolder, 1, 0); tableLayoutPanel1.Controls.Add(RadTextBoxControl_ModpackConfig, 1, 2); - tableLayoutPanel1.Controls.Add(RadLabel_Status, 1, 4); - tableLayoutPanel1.Controls.Add(RadLabel3, 0, 4); + tableLayoutPanel1.Controls.Add(RadLabel_Status, 1, 6); + tableLayoutPanel1.Controls.Add(RadLabel3, 0, 6); tableLayoutPanel1.Controls.Add(RadButton_SearchMinecraftProfileFolder, 5, 1); - tableLayoutPanel1.Controls.Add(RadButton_SearchModpackConfig, 5, 3); - tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 3, 3); - tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 5); - tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 2, 3); + tableLayoutPanel1.Controls.Add(RadButton_Install, 5, 7); + tableLayoutPanel1.Controls.Add(radLabel4, 0, 4); + tableLayoutPanel1.Controls.Add(radTextBoxControl_InstallKey, 1, 4); + tableLayoutPanel1.Controls.Add(radButton_PasteInstallKey, 5, 5); + tableLayoutPanel1.Controls.Add(RadButton_PasteModpackConfig, 5, 3); + tableLayoutPanel1.Controls.Add(radButton_RefreshConfig, 4, 3); tableLayoutPanel1.Dock = DockStyle.Fill; tableLayoutPanel1.Location = new Point(0, 0); tableLayoutPanel1.Name = "tableLayoutPanel1"; - tableLayoutPanel1.RowCount = 6; + tableLayoutPanel1.RowCount = 8; tableLayoutPanel1.RowStyles.Add(new RowStyle()); tableLayoutPanel1.RowStyles.Add(new RowStyle()); tableLayoutPanel1.RowStyles.Add(new RowStyle()); tableLayoutPanel1.RowStyles.Add(new RowStyle()); tableLayoutPanel1.RowStyles.Add(new RowStyle()); tableLayoutPanel1.RowStyles.Add(new RowStyle()); - tableLayoutPanel1.Size = new Size(422, 174); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.Size = new Size(422, 232); tableLayoutPanel1.TabIndex = 7; // + // radLabel4 + // + radLabel4.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + radLabel4.AutoSize = false; + radLabel4.Location = new Point(3, 119); + radLabel4.Name = "radLabel4"; + radLabel4.Size = new Size(144, 22); + radLabel4.TabIndex = 12; + radLabel4.Text = "Installation key:"; + // + // radTextBoxControl_InstallKey + // + radTextBoxControl_InstallKey.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(radTextBoxControl_InstallKey, 6); + radTextBoxControl_InstallKey.IsReadOnly = true; + radTextBoxControl_InstallKey.Location = new Point(153, 119); + radTextBoxControl_InstallKey.Name = "radTextBoxControl_InstallKey"; + radTextBoxControl_InstallKey.NullText = "No key provided. Only for private servers."; + radTextBoxControl_InstallKey.Size = new Size(266, 22); + radTextBoxControl_InstallKey.TabIndex = 13; + // + // radButton_PasteInstallKey + // + radButton_PasteInstallKey.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.SetColumnSpan(radButton_PasteInstallKey, 2); + radButton_PasteInstallKey.ImageAlignment = ContentAlignment.MiddleRight; + radButton_PasteInstallKey.Location = new Point(325, 147); + radButton_PasteInstallKey.Name = "radButton_PasteInstallKey"; + radButton_PasteInstallKey.Size = new Size(94, 24); + radButton_PasteInstallKey.TabIndex = 14; + radButton_PasteInstallKey.Text = "Paste"; + radButton_PasteInstallKey.TextAlignment = ContentAlignment.MiddleLeft; + radButton_PasteInstallKey.TextImageRelation = TextImageRelation.ImageBeforeText; + radButton_PasteInstallKey.Click += RadButton_PasteInstallKey_Click; + // // radButton_RefreshConfig // radButton_RefreshConfig.Anchor = AnchorStyles.Top | AnchorStyles.Right; radButton_RefreshConfig.DisplayStyle = Telerik.WinControls.DisplayStyle.Image; radButton_RefreshConfig.ImageAlignment = ContentAlignment.MiddleCenter; - radButton_RefreshConfig.Location = new Point(195, 89); + radButton_RefreshConfig.Location = new Point(295, 89); radButton_RefreshConfig.Name = "radButton_RefreshConfig"; radButton_RefreshConfig.Size = new Size(24, 24); radButton_RefreshConfig.TabIndex = 11; @@ -250,7 +279,7 @@ namespace ModpackUpdater AutoScaleBaseSize = new Size(7, 15); AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(422, 174); + ClientSize = new Size(422, 232); Controls.Add(tableLayoutPanel1); Icon = (Icon)resources.GetObject("$this.Icon"); MaximizeBox = false; @@ -269,9 +298,11 @@ namespace ModpackUpdater ((System.ComponentModel.ISupportInitialize)RadButton_Install).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_CheckForUpdates).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_PasteModpackConfig).EndInit(); - ((System.ComponentModel.ISupportInitialize)RadButton_SearchModpackConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)RadButton_SearchMinecraftProfileFolder).EndInit(); tableLayoutPanel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)radLabel4).EndInit(); + ((System.ComponentModel.ISupportInitialize)radTextBoxControl_InstallKey).EndInit(); + ((System.ComponentModel.ISupportInitialize)radButton_PasteInstallKey).EndInit(); ((System.ComponentModel.ISupportInitialize)radButton_RefreshConfig).EndInit(); ((System.ComponentModel.ISupportInitialize)this).EndInit(); ResumeLayout(false); @@ -285,10 +316,12 @@ namespace ModpackUpdater internal Telerik.WinControls.UI.RadTextBoxControl RadTextBoxControl_ModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_Install; internal Telerik.WinControls.UI.RadButton RadButton_CheckForUpdates; - internal Telerik.WinControls.UI.RadButton RadButton_SearchModpackConfig; internal Telerik.WinControls.UI.RadButton RadButton_SearchMinecraftProfileFolder; internal Telerik.WinControls.UI.RadButton RadButton_PasteModpackConfig; private TableLayoutPanel tableLayoutPanel1; private Telerik.WinControls.UI.RadButton radButton_RefreshConfig; + internal Telerik.WinControls.UI.RadLabel radLabel4; + internal Telerik.WinControls.UI.RadTextBoxControl radTextBoxControl_InstallKey; + internal Telerik.WinControls.UI.RadButton radButton_PasteInstallKey; } } \ No newline at end of file diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index c52a5d7..aaf8664 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -20,9 +20,6 @@ public partial class Form1 { this.updateOptions = updateOptions; - if (!string.IsNullOrWhiteSpace(updateOptions.ModpackConfig)) - LoadUpdateConfigFile(updateOptions.ModpackConfig); - if (!string.IsNullOrWhiteSpace(updateOptions.ProfileFolder)) LoadMinecraftProfile(updateOptions.ProfileFolder); } @@ -37,7 +34,7 @@ public partial class Form1 RadButton_CheckForUpdates.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small); radButton_RefreshConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.refresh, SvgImageSize.Small); RadButton_SearchMinecraftProfileFolder.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.opened_folder, SvgImageSize.Small); - RadButton_SearchModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.opened_folder, SvgImageSize.Small); + radButton_PasteInstallKey.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.paste, SvgImageSize.Small); RadButton_PasteModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.paste, SvgImageSize.Small); } @@ -102,6 +99,7 @@ public partial class Form1 try { modpackInfo = ModpackInfo.TryLoad(folderPath); + radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; } catch { @@ -110,7 +108,7 @@ public partial class Form1 if (string.IsNullOrWhiteSpace(RadTextBoxControl_ModpackConfig.Text) && !string.IsNullOrWhiteSpace(modpackInfo?.ConfigUrl)) LoadUpdateConfigFile(modpackInfo.ConfigUrl); - else + else if (IsUpdateConfigLoaded()) RadButton_CheckForUpdates.PerformClick(); } else @@ -119,24 +117,31 @@ public partial class Form1 private void LoadUpdateConfigFile(string filePath) { + static ModpackConfig loadConfig(string filePath) + { + try + { + return ModpackConfig.LoadFromUrl(filePath); + } + catch (Exception) + { + } + return null; + } + RadTextBoxControl_ModpackConfig.Text = filePath; - try + if (!string.IsNullOrWhiteSpace(filePath) && loadConfig(filePath) is ModpackConfig modpackConfig) { - if (IsUpdateConfigLoaded()) - updateConfig = ModpackConfig.LoadFromUrl(filePath); + if (updateConfig.Maintenance && !updateOptions.IgnoreMaintenance) + SetStatus(LangRes.StatusText_Maintenance, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.services, SvgImageSize.Small)); + else + RadButton_CheckForUpdates.PerformClick(); } - catch - { - RadTextBoxControl_ModpackConfig.Text = string.Empty; - } - - if (updateConfig != null && updateConfig.Maintenance && !updateOptions.IgnoreMaintenance) - SetStatus(LangRes.StatusText_Maintenance, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.services, SvgImageSize.Small)); - else if (IsMinecaftProfileLoaded()) - RadButton_CheckForUpdates.PerformClick(); else + { ClearStatus(); + } } private async Task ExecuteUpdate(bool doInstall) @@ -150,6 +155,10 @@ public partial class Form1 { SetStatus(LangRes.StatusText_CheckingForUpdates, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small)); + // Check for extras once again + modpackInfo.ExtrasKey = radTextBoxControl_InstallKey.Text.Trim(); + updateOptions.IncludeExtras = AppFeatures.AllowExtras.IsEnabled(new AllowExtrasFeatureContext(modpackInfo, updateConfig)); + try { lastUpdateCheckResult = await updater.Check(updateOptions); @@ -214,26 +223,24 @@ public partial class Form1 private void ButtonX_SearchMinecraftProfile_Click(object sender, EventArgs e) { var ofd = new RadOpenFolderDialog(); - if (ofd.ShowDialog(this) == DialogResult.OK) LoadMinecraftProfile(ofd.FileName); } - private void ButtonX_SearchUpdateConfig_Click(object sender, EventArgs e) - { - var ofd = new RadOpenFileDialog() { Filter = FiledialogFilters.JSON_Display + "|" + FiledialogFilters.JSON_Filter }; - - if (ofd.ShowDialog(this) == DialogResult.OK) - LoadUpdateConfigFile(ofd.FileName); - } - private void RadButton_PasteModpackConfig_Click(object sender, EventArgs e) { - string text = Clipboard.GetText(); + var text = Clipboard.GetText(); if (text.StartsWith("http")) LoadUpdateConfigFile(text); } + private void RadButton_PasteInstallKey_Click(object sender, EventArgs e) + { + if (modpackInfo == null) + return; + radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey = Clipboard.GetText(); + } + private void RadButton_RefreshConfig_Click(object sender, EventArgs e) { LoadUpdateConfigFile(RadTextBoxControl_ModpackConfig.Text); @@ -259,15 +266,12 @@ public partial class Form1 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { AppConfig.Instance.LastMinecraftProfilePath = RadTextBoxControl_MinecraftProfileFolder.Text; - AppConfig.Instance.LastConfigFilePath = RadTextBoxControl_ModpackConfig.Text; } private void Form1_Load(object sender, EventArgs e) { if (Directory.Exists(AppConfig.Instance.LastMinecraftProfilePath)) LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath); - if (!string.IsNullOrWhiteSpace(AppConfig.Instance.LastConfigFilePath)) - LoadUpdateConfigFile(AppConfig.Instance.LastConfigFilePath); } private async void Form1_Shown(object sender, EventArgs e) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 79fab66..fcdd258 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -54,6 +54,7 @@ + diff --git a/ModpackUpdater/Options.cs b/ModpackUpdater/Options.cs index e4c4fac..6f2fd1d 100644 --- a/ModpackUpdater/Options.cs +++ b/ModpackUpdater/Options.cs @@ -21,9 +21,10 @@ internal class Options { "p|profile=", "Sets the minecraft profile folder.", p => UpdateOptions.ProfileFolder = p }, { "c|config=", "Sets the minecraft profile folder.", c => UpdateOptions.ModpackConfig = c }, { "s|side=", "Sets the minecraft profile folder.\nDefault side is Client.\nAvailable: Client, Server", s => UpdateOptions.Side = Enum.Parse(s)}, - { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => UpdateOptions.AllowUpdaterAfterInstall = uai != null}, + { "u|uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => UpdateOptions.AllowUpdaterAfterInstall = uai != null}, { "noupdate", "Skip the update check.", noupdate => UpdateOptions.NoUpdate = noupdate != null}, { "m|maintenance", "Ignores the maintenance mode.", m => UpdateOptions.IgnoreMaintenance = m != null}, + { "k|key=", "An key for retriving extra files on updates.", k => UpdateOptions.ExtrasKey = k}, }; additionals.AddRange(options.Parse(args)); diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index eb96ee9..f4694de 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -62,7 +62,13 @@ public static class Program // Migrate var newConfig = Settings.Get(); newConfig.LastMinecraftProfilePath = legacyConfig.LastMinecraftProfilePath; - newConfig.LastConfigFilePath = legacyConfig.LastConfigFilePath; + + if (ModpackInfo.TryLoad(legacyConfig.LastMinecraftProfilePath) is ModpackInfo info) + { +#pragma warning disable CS0612 // Typ oder Element ist veraltet + info.ConfigUrl = legacyConfig.ConfigFilePath; +#pragma warning restore CS0612 // Typ oder Element ist veraltet + } // Ensure save settings settingsManager.Save(); @@ -75,6 +81,14 @@ public static class Program { var info = ModpackInfo.TryLoad(updateOptions.ProfileFolder); var config = ModpackConfig.LoadFromUrl(CheckModpackConfigUrl(updateOptions.ModpackConfig, info)); + + // Check features + if (!string.IsNullOrWhiteSpace(updateOptions.ExtrasKey)) + info.ExtrasKey = updateOptions.ExtrasKey; + if (!string.IsNullOrWhiteSpace(info.ExtrasKey)) + updateOptions.IncludeExtras = AppFeatures.AllowExtras.IsEnabled(new AllowExtrasFeatureContext(info, config)); + + // Check for update var installer = new ModpackInstaller(config, info); var result = installer.Check(updateOptions).Result; diff --git a/ModpackUpdater/UpdateCheckOptionsAdv.cs b/ModpackUpdater/UpdateCheckOptionsAdv.cs index cbe6b61..c5429c6 100644 --- a/ModpackUpdater/UpdateCheckOptionsAdv.cs +++ b/ModpackUpdater/UpdateCheckOptionsAdv.cs @@ -7,4 +7,5 @@ public class UpdateCheckOptionsAdv : UpdateCheckOptions public string ProfileFolder { get; set; } public string ModpackConfig { get; set; } public bool NoUpdate { get; set; } + public string ExtrasKey { get; set; } } From 4b78ce1b6f6a274be32b9c4726adb5451fe4e3b5 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 11:22:02 +0200 Subject: [PATCH 35/50] some fixes --- ModpackUpdater.Manager/ModpackInstaller.cs | 9 +++++++-- ModpackUpdater.Model/ModpackInfo.cs | 5 ++++- ModpackUpdater/Form1.cs | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 8b444eb..50b3157 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -41,7 +41,6 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf { InstallInfos installInfos = null; UpdateInfos updateInfos = null; - var hasConfig = modpackInfo.Exists; var result = new UpdateCheckResult(); if (updateConfig.Maintenance && !options.IgnoreMaintenance) @@ -50,7 +49,13 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf return result; } - if (!hasConfig) + if (modpackInfo == null || !Directory.Exists(modpackInfo.LocaLPath)) + { + result.HasError = true; + return result; + } + + if (!modpackInfo.Exists) { installInfos = await DownloadInstallInfos(); diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs index 91de060..832f2a7 100644 --- a/ModpackUpdater.Model/ModpackInfo.cs +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -33,7 +33,10 @@ public class ModpackInfo { if (HasModpackInfo(mcRoot)) return Load(mcRoot); - return new(); + return new() + { + LocaLPath = mcRoot + }; } public static ModpackInfo Load(string mcRoot) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index aaf8664..6a3e2f8 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -10,7 +10,7 @@ namespace ModpackUpdater; public partial class Form1 { - private ModpackInfo modpackInfo = null; + private ModpackInfo modpackInfo = new(); private ModpackConfig updateConfig = new(); private bool currentUpdating = false; private UpdateCheckResult lastUpdateCheckResult = null; @@ -94,7 +94,7 @@ public partial class Form1 { RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; - if (IsUpdateConfigLoaded()) + if (IsMinecaftProfileLoaded()) { try { From 11e9290fc86d3745c0b7815f8b20a208660455ac Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 13:39:17 +0200 Subject: [PATCH 36/50] some more bugfixes & cleanup --- ModpackUpdater.Manager/Extensions.cs | 4 +- ModpackUpdater.Manager/ModpackInstaller.cs | 12 +- ModpackUpdater.Model/ModpackInfo.cs | 2 +- ModpackUpdater/Form1.cs | 254 +++++++++++---------- ModpackUpdater/Program.cs | 2 +- 5 files changed, 150 insertions(+), 124 deletions(-) diff --git a/ModpackUpdater.Manager/Extensions.cs b/ModpackUpdater.Manager/Extensions.cs index 6b4b7d3..61e6d00 100644 --- a/ModpackUpdater.Manager/Extensions.cs +++ b/ModpackUpdater.Manager/Extensions.cs @@ -2,7 +2,6 @@ namespace ModpackUpdater.Manager; - public static class Extensions { public static bool IsSide(this Side @this, Side side) @@ -30,7 +29,7 @@ public static class Extensions foreach (FileInfo @file in dir.GetFiles()) { string targetFilePath = Path.Combine(destinationDir, @file.Name); - @file.CopyTo(targetFilePath); + @file.CopyTo(targetFilePath, true); } // If recursive and copying subdirectories, recursively call this method @@ -43,5 +42,4 @@ public static class Extensions } } } - } \ No newline at end of file diff --git a/ModpackUpdater.Manager/ModpackInstaller.cs b/ModpackUpdater.Manager/ModpackInstaller.cs index 50b3157..a03a35f 100644 --- a/ModpackUpdater.Manager/ModpackInstaller.cs +++ b/ModpackUpdater.Manager/ModpackInstaller.cs @@ -42,6 +42,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf InstallInfos installInfos = null; UpdateInfos updateInfos = null; var result = new UpdateCheckResult(); + var exists = modpackInfo.Exists; if (updateConfig.Maintenance && !options.IgnoreMaintenance) { @@ -55,7 +56,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf return result; } - if (!modpackInfo.Exists) + if (!exists) { installInfos = await DownloadInstallInfos(); @@ -66,6 +67,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf { result.Actions.AddRange(installInfos.Actions); result.LatestVersion = installInfos.Version; + result.CurrentVersion = installInfos.Version; } } @@ -73,7 +75,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf result.HasError = true; } - if (options.AllowUpdaterAfterInstall) + if (exists || options.AllowUpdaterAfterInstall) { updateInfos = await DownloadUpdateInfos(); @@ -81,11 +83,13 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf { var updatesOrderes = updateInfos.Updates.OrderByDescending(n => n.Version); result.LatestVersion = updatesOrderes.First().Version; - result.CurrentVersion = modpackInfo.Version; + if (exists) + result.CurrentVersion = modpackInfo.Version; result.IsInstalled = true; var checkingVersionIndex = 0; var checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex); + var actionsZeroIndex = result.Actions.Count; // Ensure we insert update actions behind install actions while (checkingVersion is not null && checkingVersion.Version > result.CurrentVersion) { @@ -97,7 +101,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, ModpackInfo modpackInf actionsToAdd.Add(action); } - result.Actions.InsertRange(0, actionsToAdd); + result.Actions.InsertRange(actionsZeroIndex, actionsToAdd); checkingVersionIndex += 1; checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex); diff --git a/ModpackUpdater.Model/ModpackInfo.cs b/ModpackUpdater.Model/ModpackInfo.cs index 832f2a7..4dd660d 100644 --- a/ModpackUpdater.Model/ModpackInfo.cs +++ b/ModpackUpdater.Model/ModpackInfo.cs @@ -16,7 +16,7 @@ public class ModpackInfo [JsonIgnore] public string LocaLPath { get; private set; } [JsonIgnore] - public bool Exists => Directory.Exists(LocaLPath); + public bool Exists => File.Exists(GetFilePath(LocaLPath)); public void Save() { diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 6a3e2f8..9cbc9c3 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -22,6 +22,8 @@ public partial class Form1 if (!string.IsNullOrWhiteSpace(updateOptions.ProfileFolder)) LoadMinecraftProfile(updateOptions.ProfileFolder); + else if (!string.IsNullOrWhiteSpace(AppConfig.Instance.LastMinecraftProfilePath)) + LoadMinecraftProfile(AppConfig.Instance.LastMinecraftProfilePath); } public Form1() @@ -38,44 +40,49 @@ public partial class Form1 RadButton_PasteModpackConfig.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.paste, SvgImageSize.Small); } - private bool IsMinecaftProfileLoaded() + private void LoadMinecraftProfile(string folderPath) { - return !string.IsNullOrEmpty(GetMinecraftProfilePath()); - } + RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; + AppConfig.Instance.LastMinecraftProfilePath = folderPath; - private string GetMinecraftProfilePath() - { - return RadTextBoxControl_MinecraftProfileFolder.Text.Trim(); - } + if (string.IsNullOrWhiteSpace(folderPath)) + return; - private bool IsUpdateConfigLoaded() - { - return !string.IsNullOrEmpty(GetUpdateconfigPath()); - } - - private string GetUpdateconfigPath() - { - return RadTextBoxControl_ModpackConfig.Text.Trim(); - } - - private bool CheckStatus() - { - bool CheckStatusRet; - - if (!IsMinecaftProfileLoaded()) + try { - SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); - CheckStatusRet = false; + modpackInfo = ModpackInfo.TryLoad(folderPath); + RadTextBoxControl_ModpackConfig.Text = modpackInfo.ExtrasKey; + radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; } - else if (!IsUpdateConfigLoaded()) + catch { - SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); - CheckStatusRet = false; } - else - CheckStatusRet = true; - return CheckStatusRet; + CheckStatusAndUpdate(); + } + + private void LoadUpdateConfigFile(string filePath) + { + RadTextBoxControl_ModpackConfig.Text = filePath; + + if (string.IsNullOrWhiteSpace(filePath)) + return; + + try + { + updateConfig = ModpackConfig.LoadFromUrl(filePath); + } + catch (Exception) + { + } + + CheckStatusAndUpdate(); + } + + private void LoadInstallKey(string installKey) + { + radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey = installKey; + CheckStatusAndUpdate(); } private void SetStatus(string statusText, RadSvgImage image) @@ -90,58 +97,47 @@ public partial class Form1 RadLabel_Status.SvgImage = null; } - private void LoadMinecraftProfile(string folderPath) + private void CheckStatusAndUpdate() { - RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; - - if (IsMinecaftProfileLoaded()) - { - try - { - modpackInfo = ModpackInfo.TryLoad(folderPath); - radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; - } - catch - { - RadTextBoxControl_MinecraftProfileFolder.Text = string.Empty; - } - - if (string.IsNullOrWhiteSpace(RadTextBoxControl_ModpackConfig.Text) && !string.IsNullOrWhiteSpace(modpackInfo?.ConfigUrl)) - LoadUpdateConfigFile(modpackInfo.ConfigUrl); - else if (IsUpdateConfigLoaded()) - RadButton_CheckForUpdates.PerformClick(); - } - else - ClearStatus(); + if (CheckStatus()) + RadButton_CheckForUpdates.PerformClick(); } - private void LoadUpdateConfigFile(string filePath) + private bool CheckStatus() { - static ModpackConfig loadConfig(string filePath) + if (modpackInfo == null || string.IsNullOrWhiteSpace(RadTextBoxControl_MinecraftProfileFolder.Text) /*|| modpackInfo.Valid*/) { - try - { - return ModpackConfig.LoadFromUrl(filePath); - } - catch (Exception) - { - } - return null; + SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); + RadButton_PasteModpackConfig.Enabled = false; + radButton_PasteInstallKey.Enabled = false; + RadButton_CheckForUpdates.Enabled = false; + RadButton_Install.Enabled = false; + return false; + } + else if (updateConfig == null || string.IsNullOrWhiteSpace(RadTextBoxControl_ModpackConfig.Text)) + { + SetStatus(LangRes.StatusText_ConfigIncompleteOrNotLoaded, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); + RadButton_PasteModpackConfig.Enabled = true; + radButton_PasteInstallKey.Enabled = false; + RadButton_CheckForUpdates.Enabled = false; + RadButton_Install.Enabled = false; + return false; + } + else if (updateConfig.Maintenance && !updateOptions.IgnoreMaintenance) + { + SetStatus(LangRes.StatusText_Maintenance, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.services, SvgImageSize.Small)); + RadButton_PasteModpackConfig.Enabled = true; + radButton_PasteInstallKey.Enabled = true; + RadButton_CheckForUpdates.Enabled = false; + RadButton_Install.Enabled = false; + return false; } - RadTextBoxControl_ModpackConfig.Text = filePath; - - if (!string.IsNullOrWhiteSpace(filePath) && loadConfig(filePath) is ModpackConfig modpackConfig) - { - if (updateConfig.Maintenance && !updateOptions.IgnoreMaintenance) - SetStatus(LangRes.StatusText_Maintenance, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.services, SvgImageSize.Small)); - else - RadButton_CheckForUpdates.PerformClick(); - } - else - { - ClearStatus(); - } + RadButton_PasteModpackConfig.Enabled = true; + radButton_PasteInstallKey.Enabled = true; + RadButton_CheckForUpdates.Enabled = true; + RadButton_Install.Enabled = false; + return true; } private async Task ExecuteUpdate(bool doInstall) @@ -150,63 +146,93 @@ public partial class Form1 updater.InstallProgessUpdated += Update_InstallProgessUpdated; updater.CheckingProgressUpdated += Updated_CheckingProgresssUpdated; + void error() + { + SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); + currentUpdating = false; + } + void installing() + { + SetStatus(LangRes.StatusText_Installing, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); + currentUpdating = true; + } + void updatesAvailable() + { + SetStatus(LangRes.StatusText_UpdateAvailable, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); + } + void everythingOk() + { + SetStatus(LangRes.StatusTest_EverythingOk, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.done, SvgImageSize.Small)); + currentUpdating = false; + } + // Check only if not pressed "install", not really needed otherwise. if (lastUpdateCheckResult is null || !doInstall) { SetStatus(LangRes.StatusText_CheckingForUpdates, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small)); // Check for extras once again - modpackInfo.ExtrasKey = radTextBoxControl_InstallKey.Text.Trim(); updateOptions.IncludeExtras = AppFeatures.AllowExtras.IsEnabled(new AllowExtrasFeatureContext(modpackInfo, updateConfig)); try { lastUpdateCheckResult = await updater.Check(updateOptions); } - catch + catch(Exception) { - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); + error(); + if (Debugger.IsAttached) + throw; } finally { } } + // Error while update check if (lastUpdateCheckResult is null || lastUpdateCheckResult.HasError) - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); - else if (lastUpdateCheckResult.HasUpdates) { - if (doInstall) - { - SetStatus(LangRes.StatusText_Installing, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); - currentUpdating = true; - - try - { - if (await updater.Install(lastUpdateCheckResult) == true) - { - lastUpdateCheckResult = null; // Reset last update check, a new one would be needed now. - SetStatus(LangRes.StatusTest_EverythingOk, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.done, SvgImageSize.Small)); - } - else - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); - } - catch (Exception) - { - SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.close, SvgImageSize.Small)); - if (Debugger.IsAttached) - throw; - } - finally - { - currentUpdating = false; - } - } - else - SetStatus(LangRes.StatusText_UpdateAvailable, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small)); + error(); + return; + } + + // No updates available + if (!lastUpdateCheckResult.HasUpdates) + { + everythingOk(); + return; + } + + // Updates available (but don't install) + if (!doInstall) + { + updatesAvailable(); + return; + } + + // Install updates + installing(); + currentUpdating = true; + try + { + // Install + if (await updater.Install(lastUpdateCheckResult) == false) + { + error(); + return; + } + + // Success + lastUpdateCheckResult = null; // Reset last update check, a new one would be needed now. + everythingOk(); + } + catch (Exception) + { + // Error + error(); + if (Debugger.IsAttached) + throw; } - else - SetStatus(LangRes.StatusTest_EverythingOk, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.done, SvgImageSize.Small)); } private void Update_InstallProgessUpdated(UpdateCheckResult result, int processedSyncs) @@ -238,7 +264,7 @@ public partial class Form1 { if (modpackInfo == null) return; - radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey = Clipboard.GetText(); + LoadInstallKey(Clipboard.GetText()); } private void RadButton_RefreshConfig_Click(object sender, EventArgs e) @@ -249,8 +275,7 @@ public partial class Form1 private async void ButtonX_CheckForUpdates_Click(object sender, EventArgs e) { ClearStatus(); - if (CheckStatus()) - await ExecuteUpdate(false); + await ExecuteUpdate(false); } private async void ButtonX_StartUpdate_Click(object sender, EventArgs e) @@ -258,8 +283,7 @@ public partial class Form1 if (!currentUpdating) { ClearStatus(); - if (CheckStatus()) - await ExecuteUpdate(true); + await ExecuteUpdate(true); } } diff --git a/ModpackUpdater/Program.cs b/ModpackUpdater/Program.cs index f4694de..0ab084d 100644 --- a/ModpackUpdater/Program.cs +++ b/ModpackUpdater/Program.cs @@ -37,7 +37,7 @@ public static class Program if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp")) ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple"; - Application.Run(new Form1(updateOptions)); + Application.Run(new Form1(updateOptions)); } private static string GetSettingsPath(int? settingsVersion = 2) From 44450546d037bef2aef54bf5c56c2be93705e7d4 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 13:39:52 +0200 Subject: [PATCH 37/50] show version without git tag --- ModpackUpdater/Form1.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 9cbc9c3..9db8e18 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -3,6 +3,7 @@ using ModpackUpdater.Model; using ModpackUpdater.My.Resources; using Pilz.UI.Telerik; using System.Diagnostics; +using System.Reflection; using Telerik.WinControls; using Telerik.WinControls.UI; @@ -30,7 +31,7 @@ public partial class Form1 { InitializeComponent(); - Text = $"{Text} (v{Application.ProductVersion})"; + Text = $"{Text} (v{Assembly.GetExecutingAssembly().GetName().Version})"; RadButton_Install.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.software_installer, SvgImageSize.Small); RadButton_CheckForUpdates.SvgImage = AppSymbolFactory.Instance.GetSvgImage(AppSymbols.update_done, SvgImageSize.Small); From 7804a60377cf0eef3479a6aed4b188f7ed52b98b Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 13:40:12 +0200 Subject: [PATCH 38/50] v1.5.0 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index fcdd258..675ba79 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.4.1.0 + 1.5.0.0 From b5878572aaf005b6e5dd787fe25754b957aa10af Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 17:52:09 +0200 Subject: [PATCH 39/50] fix loading configu url from modpackinfo --- ModpackUpdater/Form1.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index 9db8e18..d55124e 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -52,7 +52,7 @@ public partial class Form1 try { modpackInfo = ModpackInfo.TryLoad(folderPath); - RadTextBoxControl_ModpackConfig.Text = modpackInfo.ExtrasKey; + RadTextBoxControl_ModpackConfig.Text = modpackInfo.ConfigUrl; radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; } catch From ebb15bf25c154ecf6fc3a32057135615cd088f15 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 17:52:14 +0200 Subject: [PATCH 40/50] v1.5.0.1 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 675ba79..ca45870 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.5.0.0 + 1.5.0.1 From 1e00870f29add51614296a109a165d7ac11d8fda Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:08:07 +0200 Subject: [PATCH 41/50] fix install button never accessable --- ModpackUpdater/Form1.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index d55124e..a7a41f9 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -137,7 +137,7 @@ public partial class Form1 RadButton_PasteModpackConfig.Enabled = true; radButton_PasteInstallKey.Enabled = true; RadButton_CheckForUpdates.Enabled = true; - RadButton_Install.Enabled = false; + RadButton_Install.Enabled = true; return true; } From bf38ed6df6fbb75c57e5f7dcbb50694856fcbe79 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:08:39 +0200 Subject: [PATCH 42/50] v1.5.0.2 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index ca45870..e238ff5 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.5.0.1 + 1.5.0.2 From 1fba037e3feff126fc21b7b8f9f2449fc142cf36 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:26:58 +0200 Subject: [PATCH 43/50] fix loading everything on startup --- ModpackUpdater/Form1.cs | 44 +++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index a7a41f9..c9a0ec2 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -45,38 +45,12 @@ public partial class Form1 { RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; AppConfig.Instance.LastMinecraftProfilePath = folderPath; - - if (string.IsNullOrWhiteSpace(folderPath)) - return; - - try - { - modpackInfo = ModpackInfo.TryLoad(folderPath); - RadTextBoxControl_ModpackConfig.Text = modpackInfo.ConfigUrl; - radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; - } - catch - { - } - CheckStatusAndUpdate(); } private void LoadUpdateConfigFile(string filePath) { RadTextBoxControl_ModpackConfig.Text = filePath; - - if (string.IsNullOrWhiteSpace(filePath)) - return; - - try - { - updateConfig = ModpackConfig.LoadFromUrl(filePath); - } - catch (Exception) - { - } - CheckStatusAndUpdate(); } @@ -106,6 +80,24 @@ public partial class Form1 private bool CheckStatus() { + try + { + modpackInfo = ModpackInfo.TryLoad(RadTextBoxControl_MinecraftProfileFolder.Text.Trim()); + RadTextBoxControl_ModpackConfig.Text = modpackInfo.ConfigUrl; + radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; + } + catch + { + } + + try + { + updateConfig = ModpackConfig.LoadFromUrl(RadTextBoxControl_ModpackConfig.Text); + } + catch (Exception) + { + } + if (modpackInfo == null || string.IsNullOrWhiteSpace(RadTextBoxControl_MinecraftProfileFolder.Text) /*|| modpackInfo.Valid*/) { SetStatus(LangRes.StatusText_MinecraftProfileWarning, AppSymbolFactory.Instance.GetSvgImage(AppSymbols.general_warning_sign, SvgImageSize.Small)); From b7a201e62182fc31835942ed6fcf36f4d52af6ab Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:27:08 +0200 Subject: [PATCH 44/50] v1.5.0.3 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index e238ff5..cafd8a3 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.5.0.2 + 1.5.0.3 From a4a0549920235d6c3d423cf17a2831e6f77e594b Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:45:56 +0200 Subject: [PATCH 45/50] fix pasting url & ley --- ModpackUpdater/Form1.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index c9a0ec2..e7c20c4 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -248,15 +248,11 @@ public partial class Form1 private void RadButton_PasteModpackConfig_Click(object sender, EventArgs e) { - var text = Clipboard.GetText(); - if (text.StartsWith("http")) - LoadUpdateConfigFile(text); + LoadUpdateConfigFile(Clipboard.GetText()); } private void RadButton_PasteInstallKey_Click(object sender, EventArgs e) { - if (modpackInfo == null) - return; LoadInstallKey(Clipboard.GetText()); } From 9fb56678f39e97bc88a56400ea7bdac0f059f0b0 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:46:07 +0200 Subject: [PATCH 46/50] v1.5.0.4 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index cafd8a3..1033e60 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.5.0.3 + 1.5.0.4 From 725711877c18d228af341737af2c80807bb47737 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:49:06 +0200 Subject: [PATCH 47/50] fix version --- ModpackUpdater/AppUpdater.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/AppUpdater.cs b/ModpackUpdater/AppUpdater.cs index 3488926..fe2e0be 100644 --- a/ModpackUpdater/AppUpdater.cs +++ b/ModpackUpdater/AppUpdater.cs @@ -27,7 +27,7 @@ public class AppUpdater string result = await httpClient.GetStringAsync(UPDATE_URL); info = JsonConvert.DeserializeObject(result); - if (info is not null && info.Version < appVersion) + if (info is not null && info.Version > appVersion) hasUpdate = true; } catch From 80d41c869c4a34e21bdf76227acb68a58cb3a3c0 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:49:23 +0200 Subject: [PATCH 48/50] v1.5.0.5 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 1033e60..4bc5122 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.5.0.4 + 1.5.0.5 From ade4f8f24513360777f5ce36db71b46e67ce4122 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:58:07 +0200 Subject: [PATCH 49/50] fix loading url & key again --- ModpackUpdater/Form1.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ModpackUpdater/Form1.cs b/ModpackUpdater/Form1.cs index e7c20c4..60c1460 100644 --- a/ModpackUpdater/Form1.cs +++ b/ModpackUpdater/Form1.cs @@ -45,7 +45,7 @@ public partial class Form1 { RadTextBoxControl_MinecraftProfileFolder.Text = folderPath; AppConfig.Instance.LastMinecraftProfilePath = folderPath; - CheckStatusAndUpdate(); + CheckStatusAndUpdate(loadedProfile: true); } private void LoadUpdateConfigFile(string filePath) @@ -72,19 +72,22 @@ public partial class Form1 RadLabel_Status.SvgImage = null; } - private void CheckStatusAndUpdate() + private void CheckStatusAndUpdate(bool loadedProfile = false) { - if (CheckStatus()) + if (CheckStatus(loadedProfile)) RadButton_CheckForUpdates.PerformClick(); } - private bool CheckStatus() + private bool CheckStatus(bool loadedProfile) { try { modpackInfo = ModpackInfo.TryLoad(RadTextBoxControl_MinecraftProfileFolder.Text.Trim()); - RadTextBoxControl_ModpackConfig.Text = modpackInfo.ConfigUrl; - radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; + if (loadedProfile) + { + RadTextBoxControl_ModpackConfig.Text = modpackInfo.ConfigUrl; + radTextBoxControl_InstallKey.Text = modpackInfo.ExtrasKey; + } } catch { From b6e0f6f77ad6fe9910ece27c6cee45da52cb92c5 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Sat, 22 Jun 2024 18:58:17 +0200 Subject: [PATCH 50/50] v1.5.0.6 --- ModpackUpdater/ModpackUpdater.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModpackUpdater/ModpackUpdater.csproj b/ModpackUpdater/ModpackUpdater.csproj index 4bc5122..61214ba 100644 --- a/ModpackUpdater/ModpackUpdater.csproj +++ b/ModpackUpdater/ModpackUpdater.csproj @@ -8,7 +8,7 @@ Minecraft Modpack Updater true true - 1.5.0.5 + 1.5.0.6