From 6389ccededd5fe59c16d99531c89456a2db97634 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Fri, 31 Jan 2020 14:04:58 -0500 Subject: [PATCH 1/8] WIP code for Updater.exe --- Ryujinx.Updater/Program.cs | 107 +++++++++++++++++++++++++ Ryujinx.Updater/Ryujinx.Updater.csproj | 12 +++ Ryujinx.Updater/Ryujinx.ico | Bin 0 -> 108122 bytes Ryujinx.sln | 13 +++ Ryujinx/Ryujinx.csproj | 1 + Ryujinx/Updater/Parser/UpdateParser.cs | 18 ++++- Ryujinx/Updater/Update.cs | 2 +- 7 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 Ryujinx.Updater/Program.cs create mode 100644 Ryujinx.Updater/Ryujinx.Updater.csproj create mode 100644 Ryujinx.Updater/Ryujinx.ico diff --git a/Ryujinx.Updater/Program.cs b/Ryujinx.Updater/Program.cs new file mode 100644 index 0000000000..b44b850fed --- /dev/null +++ b/Ryujinx.Updater/Program.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Ryujinx.Updater +{ + public class Program + { + public static string RyuDir = Environment.CurrentDirectory; + + public static string updateSaveLocation; + public static string metaFilePath; + + public static string versionNumber; + public static string downloadUrl; + + private static void CloneDirectory(string root, string dest) + { + foreach (var directory in Directory.GetDirectories(root)) + { + string dirName = Path.GetFileName(directory); + + try + { + if (!Directory.Exists(Path.Combine(dest, dirName))) + { + Directory.CreateDirectory(Path.Combine(dest, dirName)); + } + } + catch + { + + } + + CloneDirectory(directory, Path.Combine(dest, dirName)); + } + + foreach (var file in Directory.GetFiles(root)) + { + try + { + File.Move(file, Path.Combine(dest, Path.GetFileName(file)), true); + } + catch + { + + } + } + } + + [STAThread] + public static void Main() + { + // Create Temp Directory + + if (!Directory.Exists(Path.Combine(RyuDir, "Temp"))) + { + Directory.CreateDirectory(Path.Combine(RyuDir, "Temp")); + } + + updateSaveLocation = Path.Combine(RyuDir, "Temp", "RyujinxPackage.zip"); + metaFilePath = Path.Combine(RyuDir, "Meta.json"); + + string[] metaFileData = File.ReadAllLines(metaFilePath); + + versionNumber = metaFileData[0]; + downloadUrl = metaFileData[1]; + + using (WebClient client = new WebClient()) + { + client.DownloadFile(downloadUrl, updateSaveLocation); + } + + foreach (string file in Directory.GetFiles(RyuDir, "*", SearchOption.AllDirectories)) + { + if (Path.GetFileName(file) != "Config.json" && Path.GetFileName(file) != "Meta.json" && Path.GetFileName(file) != "RyujinxPackage.zip") + { + try + { + File.Delete(file); + } + catch + { + + } + } + } + + ZipFile.ExtractToDirectory(updateSaveLocation, RyuDir, true); + + CloneDirectory(Path.Combine(RyuDir, "publish"), RyuDir); + Directory.Delete(Path.Combine(RyuDir, "publish"), true); + Directory.Delete(Path.Combine(RyuDir, "Temp"), true); + + Process.Start(Path.Combine(RyuDir, "Ryujinx.exe")); + + Application.Exit(); + } + + } +} \ No newline at end of file diff --git a/Ryujinx.Updater/Ryujinx.Updater.csproj b/Ryujinx.Updater/Ryujinx.Updater.csproj new file mode 100644 index 0000000000..6db5bdf5ed --- /dev/null +++ b/Ryujinx.Updater/Ryujinx.Updater.csproj @@ -0,0 +1,12 @@ + + + + WinExe + netcoreapp3.0 + true + Ryujinx.Updater.Program + Updater + Ryujinx.ico + + + \ No newline at end of file diff --git a/Ryujinx.Updater/Ryujinx.ico b/Ryujinx.Updater/Ryujinx.ico new file mode 100644 index 0000000000000000000000000000000000000000..edf1b93f71fc22179767d13e0ad307a217d440b9 GIT binary patch literal 108122 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 literal 0 HcmV?d00001 diff --git a/Ryujinx.sln b/Ryujinx.sln index fda3a4e190..3dab1e5c4c 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.29613.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "Ryujinx\Ryujinx.csproj", "{074045D4-3ED2-4711-9169-E385F2BFB5A0}" + ProjectSection(ProjectDependencies) = postProject + {529E361C-FEF5-4C07-A2F4-3351C45CADDD} = {529E361C-FEF5-4C07-A2F4-3351C45CADDD} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Tests", "Ryujinx.Tests\Ryujinx.Tests.csproj", "{EBB55AEA-C7D7-4DEB-BF96-FA1789E225E9}" EndProject @@ -38,6 +41,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Shader", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec", "Ryujinx.Graphics.Nvdec\Ryujinx.Graphics.Nvdec.csproj", "{85A0FA56-DC01-4A42-8808-70DAC76BD66D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Updater", "Ryujinx.Updater\Ryujinx.Updater.csproj", "{529E361C-FEF5-4C07-A2F4-3351C45CADDD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -174,6 +179,14 @@ Global {85A0FA56-DC01-4A42-8808-70DAC76BD66D}.Profile Release|Any CPU.Build.0 = Release|Any CPU {85A0FA56-DC01-4A42-8808-70DAC76BD66D}.Release|Any CPU.ActiveCfg = Release|Any CPU {85A0FA56-DC01-4A42-8808-70DAC76BD66D}.Release|Any CPU.Build.0 = Release|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Profile Debug|Any CPU.ActiveCfg = Debug|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Profile Debug|Any CPU.Build.0 = Debug|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Profile Release|Any CPU.ActiveCfg = Release|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Profile Release|Any CPU.Build.0 = Release|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {529E361C-FEF5-4C07-A2F4-3351C45CADDD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Ryujinx/Ryujinx.csproj b/Ryujinx/Ryujinx.csproj index aa38faa1c0..f5336253a2 100644 --- a/Ryujinx/Ryujinx.csproj +++ b/Ryujinx/Ryujinx.csproj @@ -87,6 +87,7 @@ + diff --git a/Ryujinx/Updater/Parser/UpdateParser.cs b/Ryujinx/Updater/Parser/UpdateParser.cs index b920494ecf..cc535e6b58 100644 --- a/Ryujinx/Updater/Parser/UpdateParser.cs +++ b/Ryujinx/Updater/Parser/UpdateParser.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json.Linq; using Ryujinx.Common.Logging; using Ryujinx.Ui; using System; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; @@ -24,7 +25,7 @@ namespace Ryujinx.Updater.Parser public static string _buildArt; - public static string RyuDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Ryujinx"); + public static string RyuDir = Environment.CurrentDirectory; public static WebClient Package = new WebClient(); public static int PackageProgress; public static double Percentage; @@ -77,8 +78,19 @@ namespace Ryujinx.Updater.Parser { if (dialog.Run() == (int)ResponseType.Yes) { - dialog.Dispose(); - GrabPackage(); + try + { + // Start Updater.exe + + string updaterPath = Path.Combine(RyuDir, "Updater.exe"); + + Process.Start(new ProcessStartInfo(updaterPath) { UseShellExecute = true }); + Application.Quit(); + } + catch (Exception ex) + { + GtkDialog.CreateErrorDialog(ex.Message); + } } } diff --git a/Ryujinx/Updater/Update.cs b/Ryujinx/Updater/Update.cs index 517761f506..f97d71ed5a 100644 --- a/Ryujinx/Updater/Update.cs +++ b/Ryujinx/Updater/Update.cs @@ -34,7 +34,7 @@ namespace Ryujinx.Updater try { - Process.Start(new ProcessStartInfo(Path.Combine(_parentdir, "Ryujinx.exe"), "/C") { UseShellExecute = true }); + Process.Start(new ProcessStartInfo(Path.Combine(RyuDir, "Ryujinx.exe")) { UseShellExecute = true }); Application.Quit(); } catch (Exception ex) From a25ef65b5481af214625ebc4da6b58c37fe25554 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Fri, 31 Jan 2020 14:21:16 -0500 Subject: [PATCH 2/8] WIP 2 on the Updater. Updater.exe won't boot now for some reason... --- Ryujinx.Updater/Program.cs | 2 ++ Ryujinx.Updater/Ryujinx.Updater.csproj | 4 ++-- Ryujinx/Ui/MainWindow.cs | 2 -- Ryujinx/Updater/Parser/UpdateParser.cs | 11 +++++++++-- Ryujinx/Updater/Update.cs | 4 ++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Ryujinx.Updater/Program.cs b/Ryujinx.Updater/Program.cs index b44b850fed..7b837c4c39 100644 --- a/Ryujinx.Updater/Program.cs +++ b/Ryujinx.Updater/Program.cs @@ -72,6 +72,8 @@ namespace Ryujinx.Updater versionNumber = metaFileData[0]; downloadUrl = metaFileData[1]; + MessageBox.Show(downloadUrl); + using (WebClient client = new WebClient()) { client.DownloadFile(downloadUrl, updateSaveLocation); diff --git a/Ryujinx.Updater/Ryujinx.Updater.csproj b/Ryujinx.Updater/Ryujinx.Updater.csproj index 6db5bdf5ed..932016c6a1 100644 --- a/Ryujinx.Updater/Ryujinx.Updater.csproj +++ b/Ryujinx.Updater/Ryujinx.Updater.csproj @@ -1,10 +1,10 @@  - WinExe + Exe netcoreapp3.0 true - Ryujinx.Updater.Program + Updater Ryujinx.ico diff --git a/Ryujinx/Ui/MainWindow.cs b/Ryujinx/Ui/MainWindow.cs index 1b7421c6e3..426c00e288 100644 --- a/Ryujinx/Ui/MainWindow.cs +++ b/Ryujinx/Ui/MainWindow.cs @@ -16,8 +16,6 @@ using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; -using Utf8Json; -using Utf8Json.Resolvers; using GUI = Gtk.Builder.ObjectAttribute; diff --git a/Ryujinx/Updater/Parser/UpdateParser.cs b/Ryujinx/Updater/Parser/UpdateParser.cs index cc535e6b58..c86c649e6a 100644 --- a/Ryujinx/Updater/Parser/UpdateParser.cs +++ b/Ryujinx/Updater/Parser/UpdateParser.cs @@ -80,12 +80,19 @@ namespace Ryujinx.Updater.Parser { try { + // Create Meta.json + + List metaFileContents = new List(); + metaFileContents.Add(_buildVer); + metaFileContents.Add(_buildArt); + File.WriteAllLines(Path.Combine(RyuDir, "Meta.json"), metaFileContents); + // Start Updater.exe string updaterPath = Path.Combine(RyuDir, "Updater.exe"); - Process.Start(new ProcessStartInfo(updaterPath) { UseShellExecute = true }); - Application.Quit(); + Process.Start(updaterPath); + } catch (Exception ex) { diff --git a/Ryujinx/Updater/Update.cs b/Ryujinx/Updater/Update.cs index f97d71ed5a..bdccc7831e 100644 --- a/Ryujinx/Updater/Update.cs +++ b/Ryujinx/Updater/Update.cs @@ -11,8 +11,8 @@ namespace Ryujinx.Updater { public class Update { - private static string _parentdir = Path.Combine(@"..\.."); - public static string RyuDir = Environment.CurrentDirectory; + private static string _parentdir = Path.Combine(@"..\.."); + public static string RyuDir = Environment.CurrentDirectory; public static void PerformUpdate() { From e9996c4540f57b852629738c9bca9013555c244c Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 1 Feb 2020 15:50:18 -0500 Subject: [PATCH 3/8] WIP 2 --- Ryujinx.Updater/Program.cs | 64 +++++++++++--------------- Ryujinx.Updater/Ryujinx.Updater.csproj | 24 ++++++---- Ryujinx/Program.cs | 4 +- Ryujinx/Ryujinx.csproj | 2 +- Ryujinx/Updater/Parser/UpdateParser.cs | 9 +--- Ryujinx/Updater/Update.cs | 56 ---------------------- 6 files changed, 44 insertions(+), 115 deletions(-) delete mode 100644 Ryujinx/Updater/Update.cs diff --git a/Ryujinx.Updater/Program.cs b/Ryujinx.Updater/Program.cs index 7b837c4c39..165ef87ce6 100644 --- a/Ryujinx.Updater/Program.cs +++ b/Ryujinx.Updater/Program.cs @@ -1,26 +1,19 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; -using System.Linq; using System.Net; -using System.Threading.Tasks; -using System.Windows.Forms; namespace Ryujinx.Updater { public class Program { - public static string RyuDir = Environment.CurrentDirectory; + public static string RyuDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ryujinx"); + public static string launchDir = Environment.CurrentDirectory; public static string updateSaveLocation; - public static string metaFilePath; - public static string versionNumber; - public static string downloadUrl; - - private static void CloneDirectory(string root, string dest) + private static void MoveAllFilesOver(string root, string dest) { foreach (var directory in Directory.GetDirectories(root)) { @@ -38,7 +31,7 @@ namespace Ryujinx.Updater } - CloneDirectory(directory, Path.Combine(dest, dirName)); + MoveAllFilesOver(directory, Path.Combine(dest, dirName)); } foreach (var file in Directory.GetFiles(root)) @@ -55,54 +48,49 @@ namespace Ryujinx.Updater } [STAThread] - public static void Main() + public static void Main(string[] args) { - // Create Temp Directory + if (args.Length < 2) + { + return; + } + + File.WriteAllText(Path.Combine(launchDir, "Version.json"), args[1]); + + // Create temp directory if (!Directory.Exists(Path.Combine(RyuDir, "Temp"))) { Directory.CreateDirectory(Path.Combine(RyuDir, "Temp")); } + // Download latest update + + string downloadUrl = args[0]; + updateSaveLocation = Path.Combine(RyuDir, "Temp", "RyujinxPackage.zip"); - metaFilePath = Path.Combine(RyuDir, "Meta.json"); - - string[] metaFileData = File.ReadAllLines(metaFilePath); - - versionNumber = metaFileData[0]; - downloadUrl = metaFileData[1]; - - MessageBox.Show(downloadUrl); using (WebClient client = new WebClient()) { client.DownloadFile(downloadUrl, updateSaveLocation); } - foreach (string file in Directory.GetFiles(RyuDir, "*", SearchOption.AllDirectories)) - { - if (Path.GetFileName(file) != "Config.json" && Path.GetFileName(file) != "Meta.json" && Path.GetFileName(file) != "RyujinxPackage.zip") - { - try - { - File.Delete(file); - } - catch - { - - } - } - } + // Extract Update .zip ZipFile.ExtractToDirectory(updateSaveLocation, RyuDir, true); - CloneDirectory(Path.Combine(RyuDir, "publish"), RyuDir); + // Copy new files over to Ryujinx folder + + MoveAllFilesOver(Path.Combine(RyuDir, "publish"), launchDir); + + // Remove temp folders + Directory.Delete(Path.Combine(RyuDir, "publish"), true); Directory.Delete(Path.Combine(RyuDir, "Temp"), true); - Process.Start(Path.Combine(RyuDir, "Ryujinx.exe")); + // Start new Ryujinx version and close Updater - Application.Exit(); + Process.Start(Path.Combine(launchDir, "Ryujinx.exe")); } } diff --git a/Ryujinx.Updater/Ryujinx.Updater.csproj b/Ryujinx.Updater/Ryujinx.Updater.csproj index 932016c6a1..ca0512931e 100644 --- a/Ryujinx.Updater/Ryujinx.Updater.csproj +++ b/Ryujinx.Updater/Ryujinx.Updater.csproj @@ -1,12 +1,16 @@ - - - - Exe - netcoreapp3.0 - true - - Updater - Ryujinx.ico - + + + + netcoreapp3.0 + win-x64;osx-x64;linux-x64; + Debug;Release;Profile Debug;Profile Release + Ryujinx.ico + Exe + Updater + + + + + \ No newline at end of file diff --git a/Ryujinx/Program.cs b/Ryujinx/Program.cs index d7b20d2a60..1defba290e 100644 --- a/Ryujinx/Program.cs +++ b/Ryujinx/Program.cs @@ -3,6 +3,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Configuration; using Ryujinx.Profiler; using Ryujinx.Ui; +using Ryujinx.Updater.Parser; using System; using System.IO; @@ -63,8 +64,7 @@ namespace Ryujinx { switch (arg.Substring(0, 2).ToUpper()) { - case "/U": Updater.Update.PerformUpdate(); break; - case "/C": Updater.Update.Cleanup(); break; + case "/U": UpdateParser.BeginParse(); break; default: mainWindow.LoadApplication(args[0]); break; } } diff --git a/Ryujinx/Ryujinx.csproj b/Ryujinx/Ryujinx.csproj index f5336253a2..7d6b52efaa 100644 --- a/Ryujinx/Ryujinx.csproj +++ b/Ryujinx/Ryujinx.csproj @@ -74,7 +74,7 @@ - + diff --git a/Ryujinx/Updater/Parser/UpdateParser.cs b/Ryujinx/Updater/Parser/UpdateParser.cs index c86c649e6a..2e6cb45b2c 100644 --- a/Ryujinx/Updater/Parser/UpdateParser.cs +++ b/Ryujinx/Updater/Parser/UpdateParser.cs @@ -80,18 +80,11 @@ namespace Ryujinx.Updater.Parser { try { - // Create Meta.json - - List metaFileContents = new List(); - metaFileContents.Add(_buildVer); - metaFileContents.Add(_buildArt); - File.WriteAllLines(Path.Combine(RyuDir, "Meta.json"), metaFileContents); - // Start Updater.exe string updaterPath = Path.Combine(RyuDir, "Updater.exe"); - Process.Start(updaterPath); + Process.Start(updaterPath, _buildArt + " " + _buildVer); } catch (Exception ex) diff --git a/Ryujinx/Updater/Update.cs b/Ryujinx/Updater/Update.cs deleted file mode 100644 index bdccc7831e..0000000000 --- a/Ryujinx/Updater/Update.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Gtk; -using Ryujinx.Common.Logging; -using Ryujinx.Ui; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Text; - -namespace Ryujinx.Updater -{ - public class Update - { - private static string _parentdir = Path.Combine(@"..\.."); - public static string RyuDir = Environment.CurrentDirectory; - - public static void PerformUpdate() - { - try - { - //Get list of files from the current directory, and copy them to the parent directory. - foreach (string _PathDir in Directory.GetDirectories(RyuDir, "*", SearchOption.AllDirectories)) - { - Directory.CreateDirectory(_PathDir.Replace(RyuDir, _parentdir)); - } - - foreach (string _PathNew in Directory.GetFiles(RyuDir, "*.*", SearchOption.AllDirectories)) - { - File.Copy(_PathNew, _PathNew.Replace(RyuDir, _parentdir), true); - } - - Logger.PrintInfo(LogClass.Application, "Package installation was completed.\n"); - GtkDialog.CreateInfoDialog("Update", "Ryujinx - Update", "Almost finished", "The package was installed.\nPlease click ok, and the update will complete."); - - try - { - Process.Start(new ProcessStartInfo(Path.Combine(RyuDir, "Ryujinx.exe")) { UseShellExecute = true }); - Application.Quit(); - } - catch (Exception ex) - { - GtkDialog.CreateErrorDialog(ex.Message); - } - } - catch (Exception ex) - { - GtkDialog.CreateErrorDialog(ex.Message); - } - } - - public static void Cleanup() - { - Directory.Delete(Path.Combine(RyuDir, "temp"), true); - } - } -} From 9844fb34388cf35bf1ba6dd6c22d247456104f96 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 2 Feb 2020 14:41:52 -0500 Subject: [PATCH 4/8] WIP 3 - Updater works as expected! - New updater program icon - Safer code - Optimized code (not really) - Version shown properly in the about window --- Ryujinx.Updater/Program.cs | 43 ++++-- Ryujinx.Updater/Ryujinx.Updater.csproj | 13 +- Ryujinx.Updater/Ryujinx.ico | Bin 108122 -> 0 bytes Ryujinx.Updater/Updater.ico | Bin 0 -> 105659 bytes Ryujinx/Program.cs | 1 - Ryujinx/Ui/AboutWindow.cs | 45 ++++-- Ryujinx/Ui/GtkDialog.cs | 1 - Ryujinx/Ui/MainWindow.cs | 3 - Ryujinx/Ui/assets/Update.png | Bin 61440 -> 10439 bytes Ryujinx/Updater/Parser/UpdateParser.cs | 182 ------------------------- Ryujinx/Updater/UpdateParser.cs | 130 ++++++++++++++++++ 11 files changed, 199 insertions(+), 219 deletions(-) delete mode 100644 Ryujinx.Updater/Ryujinx.ico create mode 100644 Ryujinx.Updater/Updater.ico delete mode 100644 Ryujinx/Updater/Parser/UpdateParser.cs create mode 100644 Ryujinx/Updater/UpdateParser.cs diff --git a/Ryujinx.Updater/Program.cs b/Ryujinx.Updater/Program.cs index 165ef87ce6..67f6aa98ff 100644 --- a/Ryujinx.Updater/Program.cs +++ b/Ryujinx.Updater/Program.cs @@ -6,10 +6,10 @@ using System.Net; namespace Ryujinx.Updater { - public class Program + class Program { - public static string RyuDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ryujinx"); - public static string launchDir = Environment.CurrentDirectory; + public static string localAppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ryujinx"); + public static string ryuDir = Environment.CurrentDirectory; public static string updateSaveLocation; @@ -47,28 +47,37 @@ namespace Ryujinx.Updater } } - [STAThread] - public static void Main(string[] args) + static void Main(string[] args) { if (args.Length < 2) { return; } - File.WriteAllText(Path.Combine(launchDir, "Version.json"), args[1]); + if (!File.Exists(Path.Combine(localAppPath, "Version.json"))) + { + File.Create(Path.Combine(localAppPath, "Version.json")).Close(); + File.WriteAllText(Path.Combine(localAppPath, "Version.json"), "Unknown Version"); + } + + Console.WriteLine($"Updating Ryujinx... | {File.ReadAllText(Path.Combine(localAppPath, "Version.json"))} -> {args[1]}"); + + File.WriteAllText(Path.Combine(localAppPath, "Version.json"), args[1]); // Create temp directory - if (!Directory.Exists(Path.Combine(RyuDir, "Temp"))) + if (!Directory.Exists(Path.Combine(localAppPath, "Temp"))) { - Directory.CreateDirectory(Path.Combine(RyuDir, "Temp")); + Directory.CreateDirectory(Path.Combine(localAppPath, "Temp")); } // Download latest update string downloadUrl = args[0]; - updateSaveLocation = Path.Combine(RyuDir, "Temp", "RyujinxPackage.zip"); + updateSaveLocation = Path.Combine(localAppPath, "Temp", "RyujinxPackage.zip"); + + Console.WriteLine($"Downloading latest Ryujinx package..."); using (WebClient client = new WebClient()) { @@ -77,20 +86,26 @@ namespace Ryujinx.Updater // Extract Update .zip - ZipFile.ExtractToDirectory(updateSaveLocation, RyuDir, true); + Console.WriteLine($"Extracting Ryujinx..."); + + ZipFile.ExtractToDirectory(updateSaveLocation, localAppPath, true); // Copy new files over to Ryujinx folder - MoveAllFilesOver(Path.Combine(RyuDir, "publish"), launchDir); + Console.WriteLine($"Replacing old version..."); + + MoveAllFilesOver(Path.Combine(localAppPath, "publish"), ryuDir); // Remove temp folders - Directory.Delete(Path.Combine(RyuDir, "publish"), true); - Directory.Delete(Path.Combine(RyuDir, "Temp"), true); + Directory.Delete(Path.Combine(localAppPath, "publish"), true); + Directory.Delete(Path.Combine(localAppPath, "Temp"), true); // Start new Ryujinx version and close Updater - Process.Start(Path.Combine(launchDir, "Ryujinx.exe")); + ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(ryuDir, "Ryujinx.exe")); + startInfo.UseShellExecute = true; + Process.Start(startInfo); } } diff --git a/Ryujinx.Updater/Ryujinx.Updater.csproj b/Ryujinx.Updater/Ryujinx.Updater.csproj index ca0512931e..a2eb568e1a 100644 --- a/Ryujinx.Updater/Ryujinx.Updater.csproj +++ b/Ryujinx.Updater/Ryujinx.Updater.csproj @@ -4,13 +4,20 @@ netcoreapp3.0 win-x64;osx-x64;linux-x64; Debug;Release;Profile Debug;Profile Release - Ryujinx.ico + Updater.ico Exe Updater - + + - + + + + + + true + \ No newline at end of file diff --git a/Ryujinx.Updater/Ryujinx.ico b/Ryujinx.Updater/Ryujinx.ico deleted file mode 100644 index edf1b93f71fc22179767d13e0ad307a217d440b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108122 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 diff --git a/Ryujinx.Updater/Updater.ico b/Ryujinx.Updater/Updater.ico new file mode 100644 index 0000000000000000000000000000000000000000..e75f145be8ef2bbe283540e107ddda7a800f724d GIT binary patch literal 105659 zcmZQzU}Rup00Bk@1qNSn28J{S28MI(U|8MG$RHp9;b*WgFa*zFWatd=bLZuf;$mQ6;Pv!y2?EK2FbBx$ zn4%SF3=HBTo-U3d6}R5rEx#cbI`jC)_ZDBI1a=4*ZRqGoV!R&fA~8)#HAGWc>F7oU zu9yua8#i<}wW@K6U0BfPu!P6eD?=%lsq1tXt0OHbn`{>P@pm1o>9sV5x5sQAV)opm+<|_H4&-YK{iE@Ud@XZJNneA+++uswe zV6ZqB&nKOqot=2!#Z_jijROauw za=Axs@0h-LL`*RZ*pM(=KB4l#stp?9ALn-OSjcoiI5F@YS4{WKBab&q8HDya9bUk6 zfjKcyj%5zNj@csTb=)ya+!p@3Y}&w={qEy@2ARCfPR#>xp)yzZ6^mMzuw4jD4AkSA z)4caA{|5GgJ?~?V%853-vts(u&|NyKU*eLp7Q@|AA%n9Qqn5Y0&ivsQ;pTsx!AeKx z)Kf#(2flpMs>N=s>RLRz_POrj#Y`6p69d;V-eFqvCSj+$VXxEvuXDHewAnG0#E80o zXS~gPSypGeOhIbIl-0k^MY}n(E?{3}u}k&_?~IoTJH@41r-78u=W_55DJ)UlFn{sW zdwel>?sQGz3ub&VQL9gld4BnpJ81{LA6j(f|3bdY_HqAZm}~A|jFLZ4qU7cNQqO_k zbaI0p`?jJjPY#C4)SfNBXH=%eU@I#2^wI&}o?ML+O|w|v#2vlJy6^L}je(3WHa@HV zyFF>$o!e&2mo-Wzzu%MkZzaQ*n20H_6WUsIo+s=)ZqVyg{_9-yvwl6MZ!wp*Za01= zduto#47Y`y`#w+mxtPg-Aynor$C8Hb_g~#-xGm(|_jy|QawY?TP?@>xGA}cBZeQrO z&@X^dVuDtmACq74mOINFmbon~yKH~%gA7y5n~b&Jnbm*!MLhE@XJpgRId!yAo>|%| z>eB_SKEIE1x1aH3O;~VfQ4FK8&y!xhX|q}1T#RX-AQs3dv0;Noe1E1$)X9TI#tojK zGIt+X=l@g}ZD{1~{&c_bb)%}R&Uc9og`)2JKhE7Qv5Ui^AXMhB%njKUGCJmrmo-Fw zo{Q!YWmwp?_;e$)jIOz$Dc9CEt_FsHqZcI)h|B1H4|^bF%Jp+OlY)M!Nx`(mTg@2j z7Pu+y|MKW`_pEe=cg-&a3lhyAq};FMpZSjIgv>1W=KDR8|6U$?7%H<;pke`&Lh;oz z|MrW1ertC-%V+V0o%=q^Nr^Uu3yM8eIxy?Nt+VS*8&VsVrvKh5^7psLR*}44%m+-k za)Xav{JL+loRDb4bdGK#mVcr*WNvVLKC{=fp|$3?nLvNCRBPQ^>j?`bY8W%z(sDa* zewocs^{6+#p7CDn(ZHA16BH#<7&*F&QWN+S^6&VZow{+SaIxBl74IE>bZ>9@pj{j#V(8!ZpsJpnB@mVGF<{I`(;d}S) z5EXm+>44*b#si=BJ)X$=$?n1W0|)mpzg&H9E@O-9PL>auXP(91Dz`BbayR+RlX|2o zl;O~#JAxLX5qHaVjDk!zgp0Zd*RWqQ->bop7`U$Q<`3&%eXeUN`7UdG5x(E}#dG<3 z#uit}1Uq>-cAbaTavQS*6WASC6I!gI84fL~(Vf6}`)8l)oE2cbZ0t#>EUK^$;s7?ysIs$PLwOuUYY4DBKGvq zf$t5rwa1mt+4SuEu>5Skr#hEI#1wBv%MDxKM;w{Cyish_k z`~6R{M*_AKwS<1=-M2F1GymC}2hwZU4OQ0e=Dl&|!ECNQ$IEq!4P}2Y7l?mwf57?R z>49ybGPcjHUn*vXGG@H{{9nLWe;@C^j!fIVa>i=E8`H|_ z-nY8$h40H16?=NT;k;GUJ0+8c+e2&WSbi96SlC=z$Mt5_`Cr9c-9^?9 zX7^2--6r|w=JvFeexHlP7tFj_FTSDa>C$x!Wvd^($ds?#78x<+Kii##*~|amW6cRU zdeOe-xvu{6*HQ<>H}3ywoS>fj&$88ZCtKRFdEICKE2OPxH>>Biv}fk%F7iDywPLos zy&CgxzMTux<7OqUx?J#C^!3XF%R*)DzO&AsX)T}5;GS6i`9H^x7PJ3z4lRn2*&$*+ zyI$?tjBx7w!kOXXCh=Q#F??=G5&yRG(F>pZm8Z3f zYuO4|zM1`JKA?B&&*u`ZcV_>eZ~3|VU?eCprY6XHx6kjKsrbD-{AY=0#FX|#xoNKs zl^fojdx=r+Ji|9uvF#;q7O%F@l6iJXGBI$Uyv4mQvczhyLkP7HI#u7Cd+ z_8dI)aCu^z=Zi)6b7c6x?vO1$TE7ca73{QPzQJHUyIyU>ezX5`W-XKxf1LLDK6}pk zv-fS+aUHlft*<&t)O~-^6z6mkXWMlw(~39Tu{Y?oR$7r zy0udz%ts<}l`*eqnBZK=alg{pS@cj_V}&=l;tp z4rEY^w0O37$8WJ{brbQZ{k%C(Gfq0Mvem)|q8 z+QxlAP1){V$r<5nHhrB_^#^&rMw~iWRDaNB?{mZZm8UZzwHXov^*GnqJvw}E1*g4! zm5g!L>22x_Z&z9T+WfvH^-In?#x-YONcZM#kjP&iQusw2nb?1wbG@^n@_)sZc-K(I8T_F#cLl_r9-FbA*y|9>9i zDBtv`#{tVvCiVQYHn`3bY4^!G!HoOBC1tyNcg2$5PSxtG6Bc{A+tBsF+Rs0ezcX0B zFnjIcbATsVa;a&9eXmu(YjUS*|}@wwM>_dj-3Z#&1}_V*qChb3pl7p%f7lnV$+DTt2Yq zz|PWHGHe@|FNd%Q-=(f-{uJU ze}Xx5`N>}gcAoir_m#neIaa=6UuDzXb#oui@V~_o!kWS)GF#zv{bTF)zKHB2$6tpru6Xn! z^MO#btLb4!`;nLK)Io24C4%OcTtxk2{$$IrqB z*ICNG&-GyM*~M@tSvx?qfpNvwlz!_gwKlpd~f_K_(J7P{S%*7?)#kA zZRH!so|F0Tg8fFx?OYD^GW|c9`niv@McUmgKcxGa)6Jg!!8?W1-m@K7GkkHFtH#dQ zZXNaR_ksG~=XUzOGKplfxNvCU+I_#9xg4Hf&D_LY(6#vKI>v9joA!L0TYmZt|BW4@ zRa4&{2xYKZ<2Sjtp}64l`wI36ERp~Ayx((sN#%F@BZn5sAG~vRqZjLf#ji{vrGE%M zSS0-Z{DCsZY0t*Q7k$@tigC-<-D(LK&=9_)VT_=xiJJI$@`KV{Vhq|JCpJ z++OB4d3*Bn&GrW(^@;)*U(B%bopz|_bJSr_uV8Mo&i}O#H4H!0%F?p#F#oyYDyPLD z8?^kS(*f24*0DP5OB|;~zjb-N!JkPw(&}5}I=wBc7)o5`sxhQ9OqS8DbeZt<`OkB^ zdtaG!HYV%J{*!!gdtFf=WkyzYuDt z#ULB7{G@x~^_pVAvb^llxVdWG$#L@0!IS1Q`<2X`%;j+UYUU>1f?bQB<}rTb+Eg>` z{hr&;RGmZ3x9vE?pR@hnIX~6~M_-v#su$RO^D~csrI&DA;q?5EbIWg=g#Ynpzn5J& zbLN5RvCp49vY)2YVC8%5z@2xSKhD{C^RN7~xc~Mw&+nR@ojd)cLssQV<7S=x*GucP z7<5CHpUgJwwbQnac&B+Lp#L{mRm=R(jc;}Izm}g7o;5d^F=OU4r_22Yi?`)m4(P93 zaXCfwjL%VC8J+JZ6;8{4oVa`);}#F&E01&Dn9ewp_g~@k`VVuzkFdc;|Bc=>Kit+8>BH-Z%_Q( z%++9CI%`eW&g=FE4;J+sK3FJMI%`d*<M(v@E^eIHCB#*L{z(=J3nBweFaH$&}&vtZ3ih#_twUpK^Shz31;? zix9f3w%6pDWXJmBCjNT`&EH;5E|uM|w%f8kc_Gt-fY0x~Fem8W-`Eknoq6`w!WFBm z81MdKy7kAo*!AolS6@gqxR%aZ!y40O z_J6`0<~J8w&+=310l_SM*u9|n!y`R^=$aY(N zWY|zW;pycXcB3#WW{HhyRd044__Z%tP<v`nLY}WV3%u_c2R~ z*0O9+IPpny#`5D{_BNfFkK>m6&zAqfml`@(EuNY0lWe=r2KR=`2K?S%jkeu3i)G&M zS|CAG;iGIv&&lQk;SHB>|5BY7cu}$;wRDyaTTJuacCS-ELT5CtOlK5ljr_OfeM3wD zW5EKy$xj=YB952q7`0m)%&zmA@Ra`--!W5B2KQGck-R%ZKTmY{Qz^4U@H6Y$>~YH`e*RWp`(_-kmn)ylYjE_TjuhV5i ze};FHBYori&wYE%d8Tdu>Yt_gx6?js?d575t<5O7Gt*1Wzy@?{&&% znr?c2mw2V5D1(2Kj=iA8)r&>1nV*~84-u)H$khyKi`aXW)sC%GE|79{M0!! z+Tm2???)xlOAHoo& zcH-0PhW-S*)wj(AgIPdhRX-LoU2rHvgS&$>YQl}V)R4p#GCCx7PItdVuI-|so9C)&VQct_)lKw95{z570kRhI~E zaF#LWTFVj>x%?y-NF;>8>R9383sD&}Jl3ydD4FosZ6R+%v5C);`5_Eet1?A??OOb_ zjA`F9>vTz5(T2R={tuMgvq7cx#C^ikE?$al=qtXX5yD)}7WvN^)Tm#<@TK9g+d|0$ zOB7D$f0(rUmIY>*KIpRY{W9k;Xe4i@!s&XR8WHner`JrCbJe(ipNkgj;d0<-jjS_!koE8X zv;&O$il?zIX1WmUI8DBPw%bBu*|o}ID;U1qK6oQnQONx#7sx0vLE-fK114Oy_Q&M^N^Y2Vtods{ z*MS2jy-vw9HA*BmR8Dxx|GO{N&7U=);n)R@61Fs#AD8zfi&>Wl794nG^3$sL{iD^5 zi<@<>Pj0I6OJ_K2w!PEoJhS|@XYy=w8F^wZYn1425d5GrfhDr8_x+9|yrK-13j;OS z`M5Xz5#RS%u>7C=glh*UZmzxe2sA+N>FVdQ&MBcu12jMn5?}-kp(}t`3?SBZUIqpb zh6;>$DkT2DMM(Vr9U<}mg+_c}jIaO*iT|$_694~oNc{i*A@TpOhQ$AuA7Mc-V!ay@ z|6e>L{{LNQ+=JpDgrA1Q|2G)1figlo9uohbCnWy=X|%Wp#Xkst42l2mGD3o4#CbC$ z{y%F-{QvDZ;vN+LApA2V{(tO<3!Gu@;gII^u+Ofi_G`2IZNM`2TasDDwwXykm3An~?bb zlS1PED-M&WqKP*`;{P`e!?;II51>Bm!jSm?$}|bUA#7+!{QuNp9{0%U;Co2?|N4;l z{~SX&%Bbq}kof--M^OC3(!$M<`2R*!4agyC7^u${68|66cY}q^NTESv)H$Q;kQo?4 z;{S7o#Q#4!0?PqVTAu;R14A_XQq9>R@&83a;{SunMNpWGG`x1SO#m(jltSYFgZj@S zE&f6NT|Zh5fYX2pbQ}*9CZu4{7@S5({C|32!;tv@cA&jvA@ToPLgN4L4T=8`YTJ|I zUTkV-fyP3pR;Uh9gFx%^$(Z*A^|3t%%FEC;Ojt<#|E(eM|3P!m*y5KMv7&+U!(g&E zB>sO28SO#P*#Cg<>j{bfuNxBoA5^Ck6W{1+eu2)e7))_7P;Mb}T=4l|8E*}V|L+kJ z{~xpl5j~Cx@$ZA?!Uihb2aCO+x{%CupEp9{{|gTWe}K-P35ox|iHx$WYcRNfpxppk zw+}tXhftnDmp?LC`c$BHeMtQOX(XlrP(3iZew6{-C*Tc<|9_Um@B^iXH6ii;nFcxy zgX{;5^M%C!pG=}3)`9enVsILe42k~_suw}=N(!DZSi%pK7D*iI2K6I!28;U#+8xlo z{aX_A5Gbt-nm$!X{C|Gv+98m;h{1~oI@|}7{UP!HZO9mF`5O}dKWwo0BP9O6EeT@; zpmlA0gT?KG!5ty-|3gCJ|AXR`nEV4%0~(*R8w~CTxgjL}KWIG&%x#3|B#@p_j0k~{ z`2YE2)B~VBVVVe2296aH{~t8h0UEO;6!#$codf66!E19!{Qq7u(!hg|`2UiF!B-*i z|CbW!eo!62J{a6QnA`wuPp>303_j79C`oX;!(a;g!Qz&X`2Xx7@&6B! z5RR}kP&UwhfTmy2UILh#@X=KR?cTv^e@Og)LFhTp_`(lat`8LUgTX%`@&Ab}zZMM! z_YPJ!gv9@s3yJ>^I_DWVp3&K$KEt3H3jl>B3GLXEAobM7kB=}jKR&{&K_ng&W2v~p z0CdK8Nc?}$InU_v4&sB>TZZG(J5b^w@&Db3th-*)!i|rQFbh0B!u+2|%tH$|P}9ti z`2VgU@&7?{C!jco;rAi&{|9CJ3A)!A=1zR{cWQ&8ee-9690eD zj-f;MJL8LYWI0xl|EP(FWBh}{CnWxVbx8dGOCj<9WkCGFib4HQBFleJI^d_aKZbGq zgZ340Q9Hb-Z60Wy4+-%vKyCYnYy49?oM>gPpgm}8s?71KXv2j z@eyXO$47?FHE@F<{`raA`vuw~HmL7We|&^l=J65cOOKB*S5r4t(ay9%5dW+s#J@Q0 zLV_}rA0J`Xd3=QV5!5gL9v@+jqs&D5=pN|!2l?{x5$5mEa0BIWd{`Bvez4)kN0=QR zA7Orv=7(R8k1)FqHn*a?XOP7IOSG`Vl?L3<-9OO$$48jMA0J`=ng!wN4w?BP+gjtT>ZW~JW zJwC#`h(H*^(!t8X;IGF=n3*0QVeTW+%^ZP4DKInZg_lzc_)!!`TOw^W~IU4 z{>Mj{H6I^gen+Ick<-ASYR3+euuLK$92X7-H-p^p_z1Hd3F8;AGyv)|gn;yqVn_%) zKEljLLLC4aU$cei9C-5a5#}%=`hl>xhtZ%hFPnjP{orxI<0H(ANhkyEJU+rq_4A0x z4Grj604#2arQd?iJtWu8;ieBdh7QWx#D?Fx!PK69e1v%d3F#N+$NQkR7VPQiIJ$bOqw}R5*<0H&#$VdZcL48Vc!)!R|dwhgh`|%NG(A)_zaSu~74Rns| zUPtA7MU1MjF`h_y{xA&sQ7_VM3}K9v@-uA|w1ZJwC!LM5Fr|rlDl!<0H&GkB=~e>P1-oCYFBq_z1JdVDRhXBg~4Ak1#(cBMmeT z2KNuN8y+8FwjiS(fTfeQkB>0x4gx;0*1LfwyVlSvJe0+p?78&^mJ&ZwPEqfmyVQzVRggF*E zW@iZMd(#P%)1Cp98zzG#E(XdSpmzP^Bh2fmkOt7x#8BYB7%X!g0~P-ud!ckusjUFFi29=A0DSqhTmWjlM(QsD>Z4=a!G51c7c%qdZslz>9N%i03 zBh1Q=k1#JJqmNCiIHHxgqvL{j5(jj=b<*P_%x{Ka8*vV3ECi4DN2Q=4@c0Nb+v6k5 z0gsO`FME818PtEKReq$Gxu7vj7O3||DH1{elxLvx$;r?;#f^`TFrR;Xgc-DU2(*^~ zG{!~`Ozhfb^fYzq@eyWj61+UBbdZI><0H&0kB=~KCZkRQrBSg#=ABXJkPrgU@d|Rr ztX@4n!mL7qRijD=VF-}0uMN4}|MK_=5 zbP$HX<0H&2kB>0_B%{tBUH35v1D0-&*)$48j!9v@*Qc6=YShlxa6MwJit5O{oqIgyBUhoHIt z(e*onJu=C3A85Zho;|)NK=(nAY4oVJArb_y@p&0!hyZ zJ|w*(_>lYnQVYWW|NjREJ%|m$|Ns97rza2_gh5^aVGtXHL2M8Pu|XKb24N5zgh6Z& z2C+dH#0Fsy8-zh@5C*Y97{mr)5F3O+Y!C*qK^VjaVGtXHL2M8Pu|XKb24N5zgh6Z& z2C+dH#0Fsy8-zh@5C*Y97{mr)5F3O+Y!C*qK^VjaVGtXHL2M8Pu|XKb24N5zgh6Z& z2C+dH#0Fsy8-zh@5C*Y9`2YVuAntz<8-)M=|AEH;0M05Pxd-6*eE^Ri2>$>){viAY zL|z1`{|8QwU^5?pG6^(2f&`#^kSK`zAIyiQPmsU|aHfHzPXr&59wB^?(-2wZ2RM^J zG6+Z>l1U&L1jPRX&IE`84w6+61t7#}{~#IU|Ns9`7M%Z|0i0_Q4r%}!h;UE?v@igN z(EtDcDJ@+7LCph&Bgg~)(fLpd5P1=z0M3V&PVgA{4{;$l#=r)G2uO(oVnHyZ0D!PT zB*MQS-hZSB0`noE24;c@NT`CDU;+`|VD5iH6$-j@5Wx%4Poi^>(jQnqI{!Z+y@KWc zL((&Z4I&}w9mIlQNPd8@K_n!<{Qv)7gMop;fq{Vm6vm7U3XrI9U|_h;3&9Y9fh9xY z|8s`K|KAo8|KD+7T|$4`L*oB4hs6Ki5EB3Ye@OiQpCR%8BkAvofw3_p{y#%V{QqfC zzk~b_!v8|z|CfT~2F6wNvo$3Ce-)bFLH-BfKOyn|_2}mk`r8x||35Ay{y!+LLH{c=eBe*yZZM*7$YZQmTl;rAyY@&9G%;}ZJY0&U-{ z$KiKSxxXA*4}$7KVsUv${QvBb`2YSP@&8o@Yg+;2u8{cuQ}Os6|!;BPmNc?|^kof-Y-r(DjPuQ9vu&g`OuK~|4DfI{>dmFB7+kW|DPX6UYkjVaWv5q692y* zM>_otN+Xn78WR7%0E_vcGIGH0Z3g)bR40YR|DS`!ji59ODkBs@>d3{=@(|k?%b*!o z3yJ^F0v-1T`575EfWn7dzr*x}#Q(?E=ZuEQ6QUm3?ea8)nw1|3~A0H2s6;Rgug8(fki9 zAPCT-MFduxfVKk+yX zF7@~bv-jg8%$FV?VHSrAQi(wY|5sqyTRw|Q&SQ9dggFIi-{Kk2eXG6;SF3=zdMmIUFEAqvJty2IJ!+%rmk0A9SBEKNZ3NbRIss z-$8uPe)d6eMg?dO6&C-4+z7hYf#S7VkB=~8D+fU4gYwy6xkDOsHXz7N=ooaLC`Dla zJ+};W-#EJ2AU>#!FrqY_QL6v(5oT39_dBhm^uG7UN0?b3A7S2sBb|Zr8g$`0r9L5F z|KlUfnK;}BiYHJR32G}ykZZ%^Bh0*yk1(IZVaIjQUH0UfO$~j}I(sq>_kqFyg#SK1 z!h8XG=gTy-c?0x$1Z?~@c+5Wnx@(LYej(QkXnhE}+X&>>fxw{f8PNGVXgWxJe1w_Y zyHqF*w+ZCNA2szs_nCw4Lk88=l=_Jj{gu@82c>2`KEkZ~_z3fa$48hSnsheq`ALK63T_Mo(=&~OlVJ?T>J5fafy#h}dg3{Wsy?6BS5oYbg~5Wgor=TlNf$LPi%nEAD|~TJb=o>&Ln7n>I0uc0Xm=pbO6Es|DaPRl`agB)e^B%OK+XRFwGSLF zKluMY0Q-{vKRCSpu>S{#-yi1xe?Y$e$N2vb$k+cE{{Msc)*j+pP~?Mr30eUT@*U_D z4G;}F>jy-Gf(b-}j@tmK`~M%J4=KPw=KlZxA9B{se~7*R|3lpI|Nnom`;h1#P-Fgp z0vU8pgaHEsLjnT>1N@u_704M8ptB-C&Z9LBiT^Jd690dHNc?|oTH8f!^Py|bVe42y z>#XglZ3nH)3yJ^F783t|JK9=-FCp>&rD$a*waf+W?+S_kzYxvspnZVF)UtzC=783C zhs6JHMRPl7tr}=ACq?rLv~n}DxgqiYv#{(x1MO!U^yln`#QzTpiT@8;Zw?A?7zXXr z8_;?fIec-kL*oBihs6K?ik5DkLibn6g7%Z+!7?H7|3yIg2ABD?6c362uMrae{}r0s zLE#U|v&3M~en-$bIWI%v|8EY7|DO;N|DTJNZibl+E#vQEaXZNUl;9U3@&D6k9Va03 zv7EONc{heSmFSb{?~=X|0je&XDuBJiU0o|iy0vQ90u)4 zp@rLFW`fddNc{ifX!e8Bv^z`s|7co&K=-WNMDxSPkof;3 zjafn49(`E$0|pQZ14`vX;{U6K#Qz7CBd~A-(V(*wYsR)zk2hbU8_t5-cPl_4js)e58fxcG{)DPew#mtcS|2b&x?VD)vp(A@V{Fz77KLzP+H2sX+^aHI+fcfH9c-u3Nk1+3t+6(dnXiiZM zWEQdb@eyY3$48jABbfo3lLOr+N~{qSslze{o0&+VH-=xLfEM#|q!Wz0} z7-lDo2JMOR1;r7vdVK81N0{A_=9FRP9H;gDU!c8PkB=}PMvDiS{qG+iVLtfy2=fML zKMmAZ!-ui0gWCvNCy&qXl*&Cm!p!&h2s3D%Ara^1MarUPubw5ZysQ!F>ggNc; z5oXZcPtkn-EGC=#6327g2`Nv0?OR?Nxy8x7L2HbH39Ps!E zv-IO5%%J>2J$C)@yG|=4{=a@m{Qo^6@&CopZATIjeDXx$Dd%t3f7XnvV&14+;bnjZ>@{|`E+8)PpGpMa)6 zP#Q$Xp!xkqP#Pt{8k|Z);{Q7#g*nWAVrkGi1d7UA=$IGi>|q2(92+|%{=X-Z{TS;7 z9v@+Lfwrqa?L%j5W?&P;m;R8|hs6JPMzY@pSq{V|*M5**V(_T_!!P_n{Yhft9;Akd z_(vWe_XO#|he7T4$48h!V+c0*)WPIJ;{Tf>)e{)`8@f*&l=ncm1f~xg4V_E41I@2* zsWDyznhSb-g!v)VOwb-zylbM+&e^#C_y{xEXKKLw2;F}T@;?aofZPO=!$vUMRB-7BrN75Vn3o`_2hC4WbUy_243{TJW`f2L zLF1XA{w}P3K&HkK?|6KK88n6h3!~Na8VdsX@$nI6&>3VfyAOfN1!VWp zlKuDya~)E+gUSm*TH1$fHgpaLR{nwV3Q2Rx$Yznt2FP{;oNLp}TdANI}v|HvOc{LlXI;s5oA5C8voKWGQue~^8D>cRI8gD&&~ zja9(MDOgAwr+}VcxSE`^;i2ndL3<=xNsSB8T{+M_3ZT9~JoK(o(0!#o#H90QJvc7<4ZeXm1$ab^xgD8xsE?)CU9Y3xK!jq4x;(Lic{)y&nU*7ISY%{Qrxf z{yi)Vpk{;CCO5*wpy#(>oT~%f?_dE_2ctvc|1S!O|Gxmne|&^_Aqd0xglOn~t%Wdk zAiW?A;}fE>=m(9JFGAP%_z1HFwy|93y=-v*LhAz18Km&~4OHGfKEizQ@e$^|gyzwq z=Q)DLz%JN&4$S%(~plZdp`!#|KYIp- zKlKa@KiC-h0loUFoq?Nw4-IWmCC@@tiB0#`eZQ6CctT&$bj@)21o#t}= zMc3V}N{l94>r;nVnugEpo>F7;(hyhijH$qzw11IGq3X8_u|;%ki_3G7$O`l##sptk;Cxm?Z+;MuM{Z`xEyEsm*NsVFB%+hA+XJ%(8XSOf) zRFPy@vSTf82(z`?|60ogo(=oFl}|D#9L>yr5SeiJ=)dn%8$KS;(wmsVFhOLx-GRvm zR(<{R|20EBtJRK>NsJCbGHrr>pUt-v-)CFFbSl>9B!hzH?K<8&lMegs)em^M$&-!2 z^X3(<9gII}h5x-Vc)&D0z=*-))U>A!?G4G(9+l7Gmw6rJ1yZ!Z$UsnHLi_zv*$vyh zwImr-M7MwC*#0wj`ttkNy9_iks;7q;F?eYC-Bz{!|Mkf3_v6mA?)oyNm3sp~Yu zq0IkNxxf4lKjP>Ja#f(^tb&90i&+0vUt>G=Xo12>28ESJ|H|!{_#w8o_=eOD{*1Sm zyxAB$&#sr*G1K75@||A~LNsoE&0xbMbF=Ao0ZYNcwG((4Ce1po)x!Ski*8e{rMShp zX&!70o~>II4LU#A)@%Ys{++=mj4itptYa0U( z+?2fYZ7oN-j*N(kB!kM+gvtb&f{eE88_Ykt*G}PKm?V{6`atu+bHOV`5)ZX`K!$m5 zV0%bY{5Js=xjeN;8DKD28c0tk0Gl#wRJC>?jNg%84vLA>$ zaOT9TC@~4%oRn@==7uFD`b^D@w@$oz1pWtJ`|h%fajpIiQBZEJIr3Uk8})m@xB z6b|j$#v*qB5^Q_xm_ytmuD?5Qwx#em$lf3sW*f1@*mh{x$9-;KZkVpT=B>^HmuMYH z29>3=9e3D%Sj>^VTS@|I>3jh;)>`3*>1SmR_-%_YV({?#uC_tnKz-9LF+Q$aH^e~k z^>Q9dAHyr9)!D3v7A&}$yD^1f!jyM%56*DBe&r@1vSkm%t+9?3m*R4^De!P*B||*4 zoQdBp;`;f<=z@R=AU#=(1sn#Nhi>t)>1{m<4wst;93I3AUi+r~Kn3E!-(3dE4?c5b z@8-I3A7b}Cb~c91N`G{A$-YR182g`rkL8(r*!4{Z4j)j1xY?Y|Lh;b9Fot6fA*n9T zoI%_*B7D0Fi-m@V5rfC7)Gtswbn6_0-$saQHCr4VFDtLfRWX2uOC0+*=4Wm{B1@$=Y=#7aFH0ZG zE2Y(|brSESWh*c1x(yJw=yMn|?d#aE?Q%mfG(zs5oY@d5c+E^m zA_)>s_3AOg2KJkFooWa?pa*e_`K*F+hn!nX{EW6akZ7zrG^gQ4iP{;C7g-Qp&jr-j zjxE#X;{qk9SE23|X$OvQWWRQ-$a9Fk4N63RZ^RtB%pBjpVOuPRIGYtXe7y|k8Ym}t zwQS{Obh`l#y;$B0@;}TD-D(qVWAy|jtB+a+95cidbHf?fp;w z_Fxak>nvvpku5VJp&83^M<6kFE{8GGwJk@D7(9Y@2{#xDUfb#>#AJ0lNs>Y3bkT5&*r#cPJxhCa(bTMoMKNPE~}={C1v;{m<{$G1hYF=U<$ zV>Dwji+PityI|_+#XXVC68vviYTg!|U{GjP{u$@cf3)n&+!!g>G~q)F7T7je>b3JQ zXqn1RlC69HB;9*Yp3Bn3;sw@;QjeIXJF_tyU8B37;hj>s~^c+M%eJHfC( z=sNQa^_vghbLhODZ<|+N?I<3gu&~@?F zfxrU`9n7aYpPK#j=lcZ<`awEEbj%pfF}B@`UYQW4&cpSpv$<(X;=RkV?YRxV8?R4Z zTvz@tC^46(M{oVQkLx5Q8LlW*sk$raGc*^}?YlCkjOm@m`gI?RL)aKhXWJbJKItz% z-8sv!xnXrIn#&1>k-;XCRuJ_b^f8^7vS;k;d4rxYVj_nG$kBdB9pHKSqYL;^h zn&{nL!%jO&?p@01C;sKuP8xqjWvyGti9I(TO*d|-RHZQnJ$_K+`8%=}ZrujjlB zI>E4DSw!~-nNJrT%BMS@n$maR#-~@aw#INtGE6yr@$k(9vk%_ z?zVdh@=EJ1fq5d|6fWF+I$=?XTkiRF-*@qxlG@LtF^BJD-~F2pg7&Oi_x5J#lG6&z z4PsG}65KhjgFG(olD9aUI)TxFyOdpy`C7T=k_=mBnW)>FUo%a2ihOFy@N=u>hc(vq znpyeGzZvfD7BOPrSRnpEN`-2#ThdF?3-0?!#l9ki!Ab=@*Nuvo8|hk?n0bH|C)35&i*KMDRsF37&xbM#;3I`1i*(M-`U5!cxdG(0iYl4S6@lhvZ# z5MHJ!mCN@*?!&nx`~ONjfh&tUjn=X!%H-wjWBSE3|7MaT!xhV$Kg-KCr@i1!U@{P_ zVErL5DTURECok(%aT_Agd> zbvCGKJ1KUWL4hOu_xB>ne~(=gL_QQ0wXDB%Nvgu&l0%JG(Cicj0d;|OOnRmA%;gN* z8S{6^sIKPOA^Ac!F?Txi^;=1j3@jT=4HmV${@?eZraADye?hg43 z^oM)te=j&Zva$VVwL$*eoC%B$osSz2s)oEzd0=#?e0OoqezDE61?C@Z-xhIQ;6Gn< zl3~G-YX?pUt^CUUAZCG(`&_NNyADVs>^$*m*1R`=vU4`_Ff?8Id9R)^!10IO_w3v2 zs@AadsP8*Dy|~fwKsKn3(Ft+Y#tf z*>_3I9iBfnhj#sAxRX(>%Iq*JUhw#i`|b_41=IEyl`9rxw3OcUin;#PgRQ~l70Vns zN7?U!`wo4$ruOtz#35mYF6ZJ z1kXCoHM1_}{x`EcRe65;%AzZM1=~;jns_yoU53pjw_BC@z@#l~=gxfiChzv+UHqx9 zwzcXTYFoC>^{aR=RfYM0kgVT~-}7C=nHJYpuHyXXu_M96EL`><*MCb;LN;;ZPgu>9_dWE0^FEcSi+v|w_nm#> z)hw?a+{e=6JlGoCtaX}i|6#kiFWFHynfK7%e{+>qXR{@qy5A1c{UqqTqU4=-k3Uw| zKTWGl(AkidQhHYT%=h}6peT;{;@8);>516`&G@cUj@b|D5r)s`TrE1VpeOh9&jZi*@l0*zKKZOvk9Q@*zXVXi z2!6v}a^k|beH?#IPG3+|pi_|7Qu=r5hbw-bYz=CbHqN(qH55F&&lKO3wS@6Nso=G* z{D(fQ{t0rb$=Z&}Q{VweG&#U)i@B_I+9j|BXna?tNCRqCFLCN0*doE0$CzUCi z!1GXQ`ivURFGsTzRG1G0NzGcAE6cp+k+*;E1|b8vAD$_tXW7`8-h*0r8%%aFL|1=V ze`1TWjZoF!6R)BiDhe(ZgUr-f8*3bLT)6JT%8Bn!TQ|xot$C~RAQ2QLpB8R+|KD}y z>VbWN*Ge@D_JY#xQZa^ktZKg|1vA&N&XGurEoXRsBkm-_1o5X=O;7LJ|N3+p z8;@__q-0~pAFKiC-KxwE``%2O_;!wCMcVF=`LUeEA5JT+er1D*tj`Tf7| zzT>N>*JjNR3K!Hi?aFGXJ5U00f|n^n&!?r!s@CxJFk88YUH_8u-2Nyi*7j(vU-y!4 z&D=)czZ?~prq2q};qPI+*0W~a&X)G#y?G!@HRb=_?-RFwc|1yZ9_L0^P`P*bL!bCb zh6IKWU-k#xWqBi)7@N*qelzYQLx9Ka)CB2xrh6Y#mmU4nmt(tc*T!|MdY~TTf`n76 zv!f>WzW*=(U3Hm=KjVG3u*=Q|G`EErF^JsSc9IpO`XJefZ;>@yno@zHN0;eXNb*IHEv`)@OxW;5rYH+4@1^0%L9!q z#~IQcbq!hyrg=|dTo5Vx+mzvRLsop;se?=pLLTsR)fZeTY~gI1#KUlQ`JP>Astdd) z=0DRupc5aL)g;)W{i^%x%gX)gJcg4}7&6KtE&l%Brmw5py1Q|o$o=3id5m@0)hf&l zj0YGN9GdAdLo^^*<@RTdf}Y%oJPd3M%ne-cO%JVUm{zyyp7#O9mhS&5k_=Hk;mi$Q z9==6t3zo`h+Dg9QuSwTdVRrC-9r5J0xqQX->C-;FkY2!F;BWkY?`4kWI=ii`K{cn0 zcbq*c$6&XhV*P`#va^hQOv@OSn;yRZ-F5^2yt6@yywY<{@4wqyAns+jyXDlXGkel` z7=AuyU&ghR&qDTxgaqdl(HHL{8D!edZwe@U$s`l_j@AD5$2xoMj zyqT%BKVQ&2fM-?L2a|*SpCz=;6-25s zJ6zOUzfP0+miW)Ks@+p&U6yW%WL*DL(MQJbqkX$WQ0F|x4F89EHJ^AIHf3=oh8<{8 z`}fnlu~zerDeEL22Jf}WY}+mxGh}gI=KTKV{?y0wf2;f~j^Et^irEK}45^o69tb@6 zBonv#Z)1Oq703Y}cp5gX<+BjBXf3d>uYJb&TUahu_asBWms{xx(&@i81quF8HfS-p zsDC!_!2KAtlMD~OJ^Rk#qs8`}x%$K7_utR6yX~|A_2c)Jq&&YmMV^B@@y)a<-vug=Bu1%@R*dsFhK=0YC;XhNrneP)HYGU6V&llImtjd zgVA9UXbj175)~NC4Jx2+^duE3FxVJ8afN@T4)r zB(KAz2VNd1-YR<7yv!0b8ug?9-+AUf-+$TW3wCWw`r)^(2Q*mu{@nk92mIZC&ucT( zuU;#$Z@=~urNC*8xiJY06Q)d^`(N&W@7F)~PcwbL7RF<#p@UO4LQ>9{pex?yI}PnQdEP8>2(e#`k}AGbT6o_5M-b&-4!D#A8>3 zxnIs`%r#-~(0VoZKi2_^gs(FHUpOAvajWa$+!)tNwgU_bn$gz(w;gakpyvBWbZ_JG zZ0)x753^1gGuQ{TUuW>px-_?5(tztmrDpxrv;#|Sbv>NDYt<*71NCQ?Y+7}WL1Cpt zEF;g!%kQIvE0%3b`f*NgwGA^v%9}6y86C9dF8&|faQV}pY-{HJt6@CykGM`VBrr?} zsj>dg+%S>#*Vo*}-Pzi0^Iv(bK5)&5;Ys*4IkqpF1=$nxADi4?uC-|Hf4>8{tbD&y z4@})EdiXlaISuw%`ST{^$R5+i1XP4Fe)j{2oW;-s(&$#L^J#Ebkxd$8xevALT zJ*5@Tyzig%VqOF8jL;)jZJbiC-iwT?+s`!N(H5VVlb2?mv|ONt)YC9D>^*C%&C<cgFpi zmvXb2?{Ln^n|+1lG-I^LPcy&8n_hV{H!OK}P5wvl#QbE*M3Il7b?-FXZ5yw-?(5A@ zFHEde_PV)Ew?O}<I)Bx(_l%aTa5h-(kXlTd>cG@r1$L94Ye&( zl8(=>( z!55}pXpLrN2alQ0;aD?NvlxynM{M_|on-z8KFYPj%cm5TVG{ce{3yvKshjz(< zsx`6l3b$>=O(3)0u!RV6cTdC7E@!JdvqWzC2FMe{v z#-)O1!<7l2jkc_1WALop$Y0>wQtHdZ$0l|o$uyx_LHm45gaga)W z$GZ>QJCGB-=0xAW|C~O?3?5NZuZ88_-qzc+%Z~jQQ~a$Y(?enh8hCQ^MZ`BtF)W#8 zl=H#A;o||XiJ@lNKMm^dt7#uv{QqZ*dyzDQifQKa`*IS@YlI_HKQ}Tr*561my;OGK zpX9B3>J2Lmb@nhiWc{04ul+#o!E(W{awnmjCCA=1uRDKZUq*;exBkk?znnL;5AD)p z%G$#Jz$_zA<#AJukA(I9jc3??UjyAlVDi#r~blJ zK|k?tT^n|7=H%C#R8;A|MU7|wt2qbP{x_d^=3jhFWNhqQeZSP7%}XV=zw+8tIcu}x zbw>4Hi-LuFSlZG{Zuc+R^h$po@q$n+Z|R$=D2QKKW~4}sZ|;2F(3!Lm|AmTs%zNw-3J^Jw&{lTT~ocoy1B+} z`~Tnv`iABw7!-8(_Hu^*+1|Tmoj%9+U-g;YQx}IexKI9nW|d$_SZzMTgpm1HCoP^M zs?ZrIem!Z(}-tJL%~P-iJ*W z*BZqg4-E-BYr^2+b$OP-{rb}!+188|N5r(<*K&ORRGq%3@8tp0r5837#cvLp9KulT z7IEG60PnVN%Pe<^FUAHG|#dg5EQ&tYF#kzZD?PZ!W_d_l8(CX8K+P8 zdd$NRl-I|2u7ATi^@jKxaZfXN4_*B?+b!t4=f?P-`!&`xPLRsi-}F=FbK4#+9;RnE zlb$9hKe*XZ_K!a((sbPvsSJh*QqPySytjyU4GRa2lV20lX1~pRp5d<2%5=5Dz7J*$ z9^RnN)&;vwyOs&F{q@;+6qJfx5{`Cc?P@r+s^4qv#5iUJ-J4zqDjuj$ylN_bgTLag z*y@Q^g74}iWg=tq1?PoD6!9$y%99sctTf!FTEn`{uVw38fzQnK z(~hiXSn}(>bh+TZ*F9$~56s;b(Obe5Ap7#%e?6_$US=HCYz|)Kyc_&mN@MwBvZ}9g ztQKl>dMle*d!K3f^k0E}OXRJ%E$j~Ml4JARv^UFP^^?+1Wk;;*8;n=3nH6=a_Zv^c z7w2{carcPp#RnV@Fh#FXz0vnUWY1dV^`GNpD&I;nWD4$WoZYzT#H(NCiEh7hqSsWd zVfZ6CBZSHN|M!N)xjWMtmb98N%PH8LGf|6YsBP5G-T3MzJCCvrOV(4N73F*eEbQ@; z3`<s9o6G^2(0)$MU!43?3@he+ygMXB|ngGZ3k` zCzdVvwlSGAeE<5mq^;qC&o|rfFa!y2VU%O3a*4Rz*`nxn>Cl2|rNn!Gy;LLqS04!6 z$HT)Q)WZE&tMRVVnzu=ZSYx$vPc!UhYG?ki~PahsI(>q>&hdbuEkpzPZhyQ`y zR)==Qd1uW|@Af{V)v|tlmAd`wT`KmUObS{~CooK4C}Vi1u#Yjq)WQBwpK;jQNy>k8 z#csaLf3?X(qT@T;zH&_-hD&TMs~_EVg>_uhqa-h=R?f}aapU~1mfzp5T1;-VJ7BKY z%IFZqD#5=-;${0?$!!+Gw-{tO!ylK&yqSOdamKfrA4)fW`j=|*Fa%X6@N6hs@-=tj zACIN)tQXjS(4W4j&}UAU?Sp&Z@#MhS+&oNi1)8AnIX>%Kx#W@+R|VI7`#;+|kzoQu zUGrl5r9lN;1>3>S?_;TZZsc*%T71W`)C?(orjVRp4CcFdg04Jc{?B~pNst7CO2gWQ z-!-w`fxqW{Sn;|&mW#Q8<$|n)_e;BvK3c4o8yi~;_Zu;IlrSD+T)j&qXv;FD+Qx9O zstr01Lms$+Mx@IdZ8<0FPgTFiy5NnJS%u_-vIKQ;=dNqq4*uo;*cdVcl^g%YvS~*3 z3(sr#(F$^>nB3p_ZW0Vintt^x-;~b$2xqL|ZP>KqvpiGGLnn{GUu_0wUMo&N#Gs(N z>+^j{3D=6cT}yWSnOo5RKV|x&4}Z8EB5(c7ciQo2|JrUv*L0N&r|0fZXIOHy{NHNf zcVFMXN%9Ds$;QJhR|txpN7n!QS~TnL#_(urofq=^S^p-;#C|_hz{dA~qM7*_qIXCH znY?Q7Zj8P2vzpCe)%lwT-sv@q^loo>+@K!Ib)Lb)yGZuKw$lo!_jDe}9J*-(^3qDi zsiBuS_!(xtO7fU#Ds_Wp2g{7-MG_24jZ_F3w*HnzfYrR?$Yh7awV2L3_%O$zG?5hvPh1#%&$(a z6eLnSmoq~{-fomT@UP|l z@2Q1-Okvk_WkgIkBhEgZ@afg!l;icn9~w_5GEC??d&tqzpHViJFLPxL_Z{{-ZW1?N z=Wb_XSh-@akA>;a@C92>D?UxJ`ygS!RUt9s?Ia0?B|1N)KX`*C6`oFz`Vv&Mq+b2Q zOpsZd-k2ru9+C+1wEtrJLB~MR@>2a>kgE)LvP1}5+*=yZxtevJf7uV=Npt_pOm}5t zIQm8Mt=4~*H@=S%lVk|Vl5b&W?q{~%CDV1G7VxTGs1A~M_P5X<(txf@lO8>YN7dvJ&2br!b`OHNL=swBgb5^?71?h)6y4p`J^ zEmC1_2w6XQlJc_~Yg{W7g4m;VPBJL`y>ZCV@w{8a?XZ^PJFBMmgN#Ws+hCr!!3&f{ zZzXxMF=*ZmZ*g>-?-p@;;(`BAk(5IV7Dx(S`xgCZ&)2|7j1H%|r#CQn6bD?G&zWus z>O?QC;IYs;wChx(Rzfz|rlr!ZbDEp11oHUb~C}(rit{V`0Iu9HcytXwk zC_EZ8AgA*82GawDgrJtKZ(SEp4U}xoJgH1S}X>Mv`UJe?0RM5N& za@TvMHMuN_{~AHPRS|v0-@^A7EJ)?J&irKyWC}fkomH2+hs_Mi4LndOc~Hg~o&H zpz%cyukWEnM`Ru^Sa6^DFjO~lg8m~Jkr2i=nUIP0|0+ILx^n{pEDPi}ECmg-Pr78w zB_o>{E8Doy!5r-IrMpEf><{e7dl7o^x(YUwXK{V1TI{It{qT0=jgaw;9SuZ z@Un%M$CKnlN)!s9Gw8Z9B45^XWLq~I@I`_~YP!}p>^qPyc&$uy!+eOHwG3a>_c=PA zW+-Q{hD_bxJ>=-Pb>h{ld=)G=4nQoCQ?*G^H`5kMWBGFgB9bI4vW3rpEh8V|nT>p0 zzcdTXFPwtN`mul(G%!4>QX-K)Y<0-9fN2-@ZK;JV!9j3@^V#i-QfIj;%^6m6eM!9 zv;MU`Y#PHV!*OQgTu@{^2CrpE%h~<9;d0}{llI=A?n~e`HrBI@d`xb)tWGj0WWL$6*2Aou;;a%I5+ z)&nOG%&h3&pTaQViqfp=fD7MStOeH$VRxV03Nal1})i=+iy@NTL8bHA(;r16nS-yc4%DxMpxGhST+1JRY;No@HWV ztS@^B7Rr9JV1a()y#pE3eT*19x}2Sxo9?lfE&1ur1qw&44Zqk}_d4u2{y%m)XoXPM zjNF^vqqjF)3krI|Bm)gQu&X J%Q~loCIHY$>vaGC literal 61440 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
-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 diff --git a/Ryujinx/Updater/Parser/UpdateParser.cs b/Ryujinx/Updater/Parser/UpdateParser.cs deleted file mode 100644 index 2e6cb45b2c..0000000000 --- a/Ryujinx/Updater/Parser/UpdateParser.cs +++ /dev/null @@ -1,182 +0,0 @@ -using Gtk; -using Newtonsoft.Json.Linq; -using Ryujinx.Common.Logging; -using Ryujinx.Ui; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.IO.Compression; -using System.Net; -using System.Runtime.InteropServices; -using System.Threading.Tasks; - -namespace Ryujinx.Updater.Parser -{ - public class UpdateParser - { - private static string _jobId; - private static string _buildVer; - private static string _buildUrl = "https://ci.appveyor.com/api/projects/gdkchan/ryujinx/branch/master"; - private static string _buildCommit; - private static string _branch; - private static string _platformExt; - - public static string _buildArt; - - public static string RyuDir = Environment.CurrentDirectory; - public static WebClient Package = new WebClient(); - public static int PackageProgress; - public static double Percentage; - - public static void BeginParse() - { - try - { - // Detect current platform - - if (RuntimeInformation.ProcessArchitecture == Architecture.X64) - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - _platformExt = "osx_x64.zip"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - _platformExt = "win_x64.zip"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - _platformExt = "linux_x64.tar.gz"; - } - } - - // Begin the Appveyor parsing - - WebClient jsonClient = new WebClient(); - string fetchedJSON = jsonClient.DownloadString(_buildUrl); - JObject jsonRoot = JObject.Parse(fetchedJSON); - - var __Build = jsonRoot["build"]; - - string __Version = (string)__Build["version"]; - string __JobsId = (string)__Build["jobs"][0]["jobId"]; - string __branch = (string)__Build["branch"]; - string __buildCommit = (string)__Build["commitId"]; - - _jobId = __JobsId; - _buildVer = __Version; - _buildArt = "https://ci.appveyor.com/api/buildjobs/" + _jobId + "/artifacts/ryujinx-" + _buildVer + "-" + _platformExt; - _buildCommit = __buildCommit.Substring(0, 7); - _branch = __branch; - - Logger.PrintInfo(LogClass.Application, "Fetched JSON and Parsed:" + Environment.NewLine + "MetaData: JobID(" + __JobsId + ") BuildVer(" + __Version + ")" + Environment.NewLine + "BuildURL(" + _buildArt + ")"); - Logger.PrintInfo(LogClass.Application, "Commit-id: (" + _buildCommit + ")" + " Branch: (" + _branch + ")"); - - using (MessageDialog dialog = GtkDialog.CreateAcceptDialog("Update", "Ryujinx - Update", "Would you like to update?", "Version " + _buildVer + " is available.")) - { - if (dialog.Run() == (int)ResponseType.Yes) - { - try - { - // Start Updater.exe - - string updaterPath = Path.Combine(RyuDir, "Updater.exe"); - - Process.Start(updaterPath, _buildArt + " " + _buildVer); - - } - catch (Exception ex) - { - GtkDialog.CreateErrorDialog(ex.Message); - } - } - } - - } - catch (Exception ex) - { - Logger.PrintError(LogClass.Application, ex.Message); - GtkDialog.CreateErrorDialog("Update canceled by user or failed to grab or parse the information.\nPlease try at a later time, or report the error to our GitHub."); - } - } - - private static async void GrabPackage() - { - // Check if paths exist - - if (!Directory.Exists(Path.Combine(RyuDir, "Data", "Update")) || !Directory.Exists(Path.Combine(RyuDir, "Data")) || !Directory.Exists(Path.Combine(Environment.CurrentDirectory, "temp"))) - { - Directory.CreateDirectory(Path.Combine(RyuDir, "Data", "Update")); - Directory.CreateDirectory(Path.Combine(RyuDir, "Data")); - Directory.CreateDirectory(Path.Combine(Environment.CurrentDirectory, "temp")); - } - - try - { - // Attempt to grab the latest package - - Package.DownloadProgressChanged += new DownloadProgressChangedEventHandler(PackageDownloadProgress); - Package.DownloadFileCompleted += new AsyncCompletedEventHandler(PackageDownloadedAsync); - using (MessageDialog dialog = GtkDialog.CreateProgressDialog("Update", "Ryujinx - Update", "Downloading update " + _buildVer, "Please wait while we download the latest package and extract it.")) - { - dialog.Run(); - } - } - catch (Exception ex) - { - Logger.PrintError(LogClass.Application, ex.InnerException.ToString()); - GtkDialog.CreateErrorDialog(ex.Message); - } - } - - private static async void PackageDownloadedAsync(object sender, AsyncCompletedEventArgs e) - { - if (e.Cancelled == true) - { - Logger.PrintError(LogClass.Application, "Package download failed or cancelled"); - } - else - { - Logger.PrintWarning(LogClass.Application, "Package is now installing"); - await ExtractPackageAsync(); - } - } - - private static void PackageDownloadProgress(object sender, DownloadProgressChangedEventArgs e) - { - Percentage = e.ProgressPercentage; - PackageProgress = e.ProgressPercentage; - } - - public static async Task ExtractPackageAsync() - { - try - { - // Begin the extaction process - - await Task.Run(() => ZipFile.ExtractToDirectory(Path.Combine(RyuDir, "Data", "Update", "RyujinxPackage.zip"), Path.Combine(Environment.CurrentDirectory, "temp"))); - - try - { - Process.Start(new ProcessStartInfo(Path.Combine(Environment.CurrentDirectory, "temp", "publish", "Ryujinx.exe"), "/U") { UseShellExecute = true }); - Application.Quit(); - } - catch (Exception ex) - { - GtkDialog.CreateErrorDialog("Package installation has failed\nCheck the log for more information."); - Logger.PrintError(LogClass.Application, "Package installation has failed\n" + ex.InnerException.ToString()); - - return; - } - } - catch (Exception ex) - { - Logger.PrintError(LogClass.Application, "Package installation has failed\n" + ex.InnerException.ToString()); - GtkDialog.CreateErrorDialog("Package installation has failed\nCheck the log for more information."); - } - } - - } -} \ No newline at end of file diff --git a/Ryujinx/Updater/UpdateParser.cs b/Ryujinx/Updater/UpdateParser.cs new file mode 100644 index 0000000000..de529fd0fa --- /dev/null +++ b/Ryujinx/Updater/UpdateParser.cs @@ -0,0 +1,130 @@ +using Gtk; +using Newtonsoft.Json.Linq; +using Ryujinx.Common.Logging; +using Ryujinx.Ui; +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Runtime.InteropServices; + +namespace Ryujinx +{ + public class UpdateParser + { + private static string _jobId; + private static string _buildVer; + private static string _buildUrl = "https://ci.appveyor.com/api/projects/gdkchan/ryujinx/branch/master"; + private static string _buildCommit; + private static string _branch; + private static string _platformExt; + + public static string _buildArt; + + public static string RyuDir = Environment.CurrentDirectory; + public static string localAppPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ryujinx"); + public static WebClient Package = new WebClient(); + public static int PackageProgress; + public static double Percentage; + + public static void BeginParse() + { + try + { + // Detect current platform + + if (RuntimeInformation.ProcessArchitecture == Architecture.X64) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + _platformExt = "osx_x64.zip"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + _platformExt = "win_x64.zip"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + _platformExt = "linux_x64.tar.gz"; + } + } + + // Begin the Appveyor parsing + + WebClient jsonClient = new WebClient(); + string fetchedJSON = jsonClient.DownloadString(_buildUrl); + JObject jsonRoot = JObject.Parse(fetchedJSON); + + var __Build = jsonRoot["build"]; + + string __Version = (string)__Build["version"]; + string __JobsId = (string)__Build["jobs"][0]["jobId"]; + string __branch = (string)__Build["branch"]; + string __buildCommit = (string)__Build["commitId"]; + + _jobId = __JobsId; + _buildVer = __Version; + _buildArt = "https://ci.appveyor.com/api/buildjobs/" + _jobId + "/artifacts/ryujinx-" + _buildVer + "-" + _platformExt; + _buildCommit = __buildCommit.Substring(0, 7); + _branch = __branch; + + if (!Directory.Exists(localAppPath)) + { + Directory.CreateDirectory(localAppPath); + } + + if (File.Exists(Path.Combine(localAppPath, "Version.json"))) + { + try + { + Version newVersion = Version.Parse(_buildVer); + + string currentVersionJson = File.ReadAllLines(Path.Combine(localAppPath, "Version.json"))[0]; + Version currentVersion = Version.Parse(currentVersionJson); + + if (newVersion.CompareTo(currentVersion) == 0) + { + GtkDialog.CreateErrorDialog("You are already using the most updated version!"); + + return; + } + } + catch + { + + } + } + + using (MessageDialog dialog = GtkDialog.CreateAcceptDialog("Update", "Ryujinx - Update", "Would you like to update?", "Version " + _buildVer + " is available.")) + { + if (dialog.Run() == (int)ResponseType.Yes) + { + try + { + // Start Updater.exe + + string updaterPath = Path.Combine(RyuDir, "Updater.exe"); + + ProcessStartInfo startInfo = new ProcessStartInfo(updaterPath); + startInfo.Arguments = _buildArt + " " + _buildVer; + startInfo.UseShellExecute = true; + Process.Start(startInfo); + + Application.Quit(); + } + catch (Exception ex) + { + GtkDialog.CreateErrorDialog(ex.Message); + } + } + } + } + catch (Exception ex) + { + Logger.PrintError(LogClass.Application, ex.Message); + GtkDialog.CreateErrorDialog("Update canceled by user or failed to grab or parse the information.\nPlease try at a later time, or report the error to our GitHub."); + } + } + + } +} \ No newline at end of file From ea19a0e29c7614955f8899749c36d67db46afb36 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 2 Feb 2020 14:53:45 -0500 Subject: [PATCH 5/8] Fixed Info dialogs --- Ryujinx/Ui/GtkDialog.cs | 5 +++-- Ryujinx/Updater/UpdateParser.cs | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Ryujinx/Ui/GtkDialog.cs b/Ryujinx/Ui/GtkDialog.cs index f833174250..0218f3b994 100644 --- a/Ryujinx/Ui/GtkDialog.cs +++ b/Ryujinx/Ui/GtkDialog.cs @@ -36,7 +36,7 @@ namespace Ryujinx.Ui return messageDialog; } - internal static MessageDialog CreateInfoDialog(string iconType, string titleMessage, string textMessage, string secText) + internal static void CreateInfoDialog(string iconType, string titleMessage, string textMessage, string secText) { MessageDialog messageDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, null) { @@ -47,7 +47,8 @@ namespace Ryujinx.Ui WindowPosition = WindowPosition.Center }; messageDialog.SetSizeRequest(100, 20); - return messageDialog; + messageDialog.Run(); + messageDialog.Dispose(); } internal static MessageDialog CreateProgressDialog(string iconType, string titleMessage, string textMessage, string secText) diff --git a/Ryujinx/Updater/UpdateParser.cs b/Ryujinx/Updater/UpdateParser.cs index de529fd0fa..9d8dda3d5b 100644 --- a/Ryujinx/Updater/UpdateParser.cs +++ b/Ryujinx/Updater/UpdateParser.cs @@ -73,6 +73,8 @@ namespace Ryujinx Directory.CreateDirectory(localAppPath); } + // Get Version.json to compare versions + if (File.Exists(Path.Combine(localAppPath, "Version.json"))) { try @@ -84,7 +86,7 @@ namespace Ryujinx if (newVersion.CompareTo(currentVersion) == 0) { - GtkDialog.CreateErrorDialog("You are already using the most updated version!"); + GtkDialog.CreateInfoDialog("Update", "Ryujinx - Updater", "You are already using the most updated version of Ryujinx!", ""); return; } @@ -95,6 +97,8 @@ namespace Ryujinx } } + // Show a message asking the user if they want to update + using (MessageDialog dialog = GtkDialog.CreateAcceptDialog("Update", "Ryujinx - Update", "Would you like to update?", "Version " + _buildVer + " is available.")) { if (dialog.Run() == (int)ResponseType.Yes) @@ -122,7 +126,7 @@ namespace Ryujinx catch (Exception ex) { Logger.PrintError(LogClass.Application, ex.Message); - GtkDialog.CreateErrorDialog("Update canceled by user or failed to grab or parse the information.\nPlease try at a later time, or report the error to our GitHub."); + GtkDialog.CreateErrorDialog("Update failed to grab or parse the information.\nPlease try at a later time, or report the error to our GitHub."); } } From 664c25b54d822804c4a90dd5d6696721c15eecfd Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 2 Feb 2020 15:23:50 -0500 Subject: [PATCH 6/8] Now showing download percentage! --- Ryujinx.Updater/Program.cs | 20 +++++++++++++++----- Ryujinx/Ui/AboutWindow.cs | 2 -- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Ryujinx.Updater/Program.cs b/Ryujinx.Updater/Program.cs index 67f6aa98ff..a2d500dddc 100644 --- a/Ryujinx.Updater/Program.cs +++ b/Ryujinx.Updater/Program.cs @@ -13,6 +13,8 @@ namespace Ryujinx.Updater public static string updateSaveLocation; + public static int lastPercentage; + private static void MoveAllFilesOver(string root, string dest) { foreach (var directory in Directory.GetDirectories(root)) @@ -79,14 +81,23 @@ namespace Ryujinx.Updater Console.WriteLine($"Downloading latest Ryujinx package..."); - using (WebClient client = new WebClient()) + WebClient client = new WebClient(); + + client.DownloadProgressChanged += (s, e) => { - client.DownloadFile(downloadUrl, updateSaveLocation); - } + if (e.ProgressPercentage != lastPercentage) + { + Console.WriteLine("Package downloading... " + e.ProgressPercentage + "%"); + } + + lastPercentage = e.ProgressPercentage; + }; + + client.DownloadFileTaskAsync(new Uri(downloadUrl), updateSaveLocation).Wait(); // Extract Update .zip - Console.WriteLine($"Extracting Ryujinx..."); + Console.WriteLine($"Extracting Ryujinx package..."); ZipFile.ExtractToDirectory(updateSaveLocation, localAppPath, true); @@ -107,6 +118,5 @@ namespace Ryujinx.Updater startInfo.UseShellExecute = true; Process.Start(startInfo); } - } } \ No newline at end of file diff --git a/Ryujinx/Ui/AboutWindow.cs b/Ryujinx/Ui/AboutWindow.cs index f8f53d4a9a..57939c718a 100644 --- a/Ryujinx/Ui/AboutWindow.cs +++ b/Ryujinx/Ui/AboutWindow.cs @@ -4,8 +4,6 @@ using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.InteropServices; -using Utf8Json; -using Utf8Json.Resolvers; using GUI = Gtk.Builder.ObjectAttribute; From 7b9b8e38dcab735c6d5900c7afb3c703359e46e5 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 2 Feb 2020 15:32:01 -0500 Subject: [PATCH 7/8] Better Variable Names & Some Optimising --- Ryujinx/Updater/UpdateParser.cs | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/Ryujinx/Updater/UpdateParser.cs b/Ryujinx/Updater/UpdateParser.cs index 9d8dda3d5b..1bef55bd4f 100644 --- a/Ryujinx/Updater/UpdateParser.cs +++ b/Ryujinx/Updater/UpdateParser.cs @@ -14,15 +14,13 @@ namespace Ryujinx { private static string _jobId; private static string _buildVer; - private static string _buildUrl = "https://ci.appveyor.com/api/projects/gdkchan/ryujinx/branch/master"; - private static string _buildCommit; - private static string _branch; private static string _platformExt; - public static string _buildArt; + private static string _masterUrl = "https://ci.appveyor.com/api/projects/gdkchan/ryujinx/branch/master"; + private static string _buildUrl; public static string RyuDir = Environment.CurrentDirectory; - public static string localAppPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ryujinx"); + public static string localAppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ryujinx"); public static WebClient Package = new WebClient(); public static int PackageProgress; public static double Percentage; @@ -52,21 +50,14 @@ namespace Ryujinx // Begin the Appveyor parsing WebClient jsonClient = new WebClient(); - string fetchedJSON = jsonClient.DownloadString(_buildUrl); + string fetchedJSON = jsonClient.DownloadString(_masterUrl); JObject jsonRoot = JObject.Parse(fetchedJSON); - var __Build = jsonRoot["build"]; + JToken _buildToken = jsonRoot["build"]; - string __Version = (string)__Build["version"]; - string __JobsId = (string)__Build["jobs"][0]["jobId"]; - string __branch = (string)__Build["branch"]; - string __buildCommit = (string)__Build["commitId"]; - - _jobId = __JobsId; - _buildVer = __Version; - _buildArt = "https://ci.appveyor.com/api/buildjobs/" + _jobId + "/artifacts/ryujinx-" + _buildVer + "-" + _platformExt; - _buildCommit = __buildCommit.Substring(0, 7); - _branch = __branch; + _jobId = (string)_buildToken["jobs"][0]["jobId"]; + _buildVer = (string)_buildToken["version"]; + _buildUrl = "https://ci.appveyor.com/api/buildjobs/" + _jobId + "/artifacts/ryujinx-" + _buildVer + "-" + _platformExt; if (!Directory.Exists(localAppPath)) { @@ -110,7 +101,7 @@ namespace Ryujinx string updaterPath = Path.Combine(RyuDir, "Updater.exe"); ProcessStartInfo startInfo = new ProcessStartInfo(updaterPath); - startInfo.Arguments = _buildArt + " " + _buildVer; + startInfo.Arguments = _buildUrl + " " + _buildVer; startInfo.UseShellExecute = true; Process.Start(startInfo); From 17b790e42496ae472c14f44e859edd5888da6ec5 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 2 Feb 2020 15:38:52 -0500 Subject: [PATCH 8/8] Fixed build error --- Ryujinx/Ui/GtkDialog.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Ryujinx/Ui/GtkDialog.cs b/Ryujinx/Ui/GtkDialog.cs index 0218f3b994..0c4e994a85 100644 --- a/Ryujinx/Ui/GtkDialog.cs +++ b/Ryujinx/Ui/GtkDialog.cs @@ -50,22 +50,5 @@ namespace Ryujinx.Ui messageDialog.Run(); messageDialog.Dispose(); } - - internal static MessageDialog CreateProgressDialog(string iconType, string titleMessage, string textMessage, string secText) - { - MessageDialog messageDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.None, null) - { - Title = titleMessage, - Icon = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), $"Ryujinx.Ui.assets.{iconType}.png"), - Text = textMessage, - SecondaryText = secText, - WindowPosition = WindowPosition.Center - }; - Uri URL = new Uri(UpdateParser._buildArt); - UpdateParser.Package.DownloadFileAsync(URL, Path.Combine(UpdateParser.RyuDir, "Data", "Update", "RyujinxPackage.zip")); - messageDialog.SetSizeRequest(100, 20); - - return messageDialog; - } } }