diff --git a/.gitignore b/.gitignore
index 3e759b75..63ed14cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -236,7 +236,7 @@ Generated_Code/
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
-Backup*/
+#Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
diff --git a/FModel.sln b/FModel.sln
index 945e05f0..fb6bcab7 100644
--- a/FModel.sln
+++ b/FModel.sln
@@ -1,37 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
-VisualStudioVersion = 16.0.28803.202
+VisualStudioVersion = 16.0.28803.452
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FModel", "FModel\FModel.csproj", "{8FABCD3A-9D55-4B54-B237-B259D815DEB8}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FModel", "FModel\FModel.csproj", "{8AAB27BD-18D7-4164-8BBC-AB534D55D30F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x64.ActiveCfg = Debug|x64
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x64.Build.0 = Debug|x64
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x86.ActiveCfg = Debug|x86
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x86.Build.0 = Debug|x86
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|Any CPU.Build.0 = Release|Any CPU
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x64.ActiveCfg = Release|x64
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x64.Build.0 = Release|x64
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x86.ActiveCfg = Release|x86
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x86.Build.0 = Release|x86
+ {8AAB27BD-18D7-4164-8BBC-AB534D55D30F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8AAB27BD-18D7-4164-8BBC-AB534D55D30F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8AAB27BD-18D7-4164-8BBC-AB534D55D30F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8AAB27BD-18D7-4164-8BBC-AB534D55D30F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {3D4827DE-E5BC-4FA0-9D6B-6804C8F3BA96}
+ SolutionGuid = {42CA5618-EB78-4DDF-95A4-BD589CC52791}
EndGlobalSection
EndGlobal
diff --git a/FModel/App.config b/FModel/App.config
index c32c8ca7..89e07837 100644
--- a/FModel/App.config
+++ b/FModel/App.config
@@ -6,77 +6,77 @@
-
+
-
+
-
+
-
- False
-
-
+
-
- 0
-
-
- 1
-
-
- False
-
-
-
-
-
- 1
-
-
- 0
-
-
- False
-
-
- False
-
-
-
-
-
- True
-
-
- English
-
-
-
-
-
-
-
-
- False
-
-
-
-
-
- 1
-
-
- 50,50,50
-
-
+
Default
-
+
+ English
+
+
+ False
+
+
+ False
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 3
+
+
+ 3
+
+
+ {BundleName} - {Date}
+
+
+ False
+
+
+
+
+
+ 0
+
+
+ False
+
+
+ True
+
+
+ False
+
+
+ True
+
+
+ 21:32:43
+
+
+ 29:161:242
+
+
True
@@ -84,8 +84,8 @@
-
-
+
+
diff --git a/FModel/App.xaml b/FModel/App.xaml
new file mode 100644
index 00000000..f780ac10
--- /dev/null
+++ b/FModel/App.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/App.xaml.cs b/FModel/App.xaml.cs
new file mode 100644
index 00000000..f7652b44
--- /dev/null
+++ b/FModel/App.xaml.cs
@@ -0,0 +1,18 @@
+using FModel.Methods.MessageBox;
+using System.Windows;
+
+namespace FModel
+{
+ ///
+ /// Logique d'interaction pour App.xaml
+ ///
+ public partial class App : Application
+ {
+ void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
+ {
+ string errorMessage = string.Format("An unhandled exception occurred: {0}", e.Exception.Message);
+ DarkMessageBox.Show(errorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ e.Handled = true;
+ }
+ }
+}
diff --git a/FModel/Commands/FModel_Commands.cs b/FModel/Commands/FModel_Commands.cs
new file mode 100644
index 00000000..17503699
--- /dev/null
+++ b/FModel/Commands/FModel_Commands.cs
@@ -0,0 +1,12 @@
+using System.Windows.Input;
+
+namespace FModel.Commands
+{
+ static class FModel_Commands
+ {
+ public static readonly RoutedUICommand OpenSettings = new RoutedUICommand("Open Settings Window", "OpenSettings", typeof(MainWindow));
+ public static readonly RoutedUICommand OpenSearch = new RoutedUICommand("Open Search Window", "OpenSearch", typeof(MainWindow));
+ public static readonly RoutedUICommand OpenOutput = new RoutedUICommand("Open Output Folder", "OpenOutput", typeof(MainWindow));
+ public static readonly RoutedUICommand MergeImages = new RoutedUICommand("Merge Images", "MergeImages", typeof(MainWindow));
+ }
+}
diff --git a/FModel/Custom/JsonExtensions.cs b/FModel/Custom/JsonExtensions.cs
deleted file mode 100644
index e8c1f48e..00000000
--- a/FModel/Custom/JsonExtensions.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections.Generic;
-
-namespace FModel
-{
- public static class JsonExtensions
- {
- public static List FindTokens(this JToken containerToken, string name)
- {
- List matches = new List();
- FindTokens(containerToken, name, matches);
- return matches;
- }
-
- private static void FindTokens(JToken containerToken, string name, List matches)
- {
- if (containerToken.Type == JTokenType.Object)
- {
- foreach (JProperty child in containerToken.Children())
- {
- if (string.Equals(child.Name, name, StringComparison.CurrentCultureIgnoreCase))
- {
- matches.Add(child.Value);
- }
- FindTokens(child.Value, name, matches);
- }
- }
- else if (containerToken.Type == JTokenType.Array)
- {
- foreach (JToken child in containerToken.Children())
- {
- FindTokens(child, name, matches);
- }
- }
- }
- }
-}
diff --git a/FModel/Custom/TypeAssistant.cs b/FModel/Custom/TypeAssistant.cs
deleted file mode 100644
index c8519775..00000000
--- a/FModel/Custom/TypeAssistant.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Threading;
-
-namespace FModel
-{
- public class TypeAssistant
- {
- public event EventHandler Idled = delegate { };
- public int WaitingMilliSeconds { get; set; }
- Timer _waitingTimer;
-
- public TypeAssistant(int waitingMilliSeconds = 600)
- {
- WaitingMilliSeconds = waitingMilliSeconds;
- _waitingTimer = new Timer(p =>
- {
- Idled(this, EventArgs.Empty);
- });
- }
- public void TextChanged()
- {
- _waitingTimer.Change(WaitingMilliSeconds, Timeout.Infinite);
- }
- }
-}
diff --git a/FModel/DLLs/ScintillaNET FindReplaceDialog.dll b/FModel/DLLs/ScintillaNET FindReplaceDialog.dll
deleted file mode 100644
index 45659b0f..00000000
Binary files a/FModel/DLLs/ScintillaNET FindReplaceDialog.dll and /dev/null differ
diff --git a/FModel/DLLs/csharp-wick.dll b/FModel/DLLs/csharp-wick.dll
deleted file mode 100644
index 48dc32a1..00000000
Binary files a/FModel/DLLs/csharp-wick.dll and /dev/null differ
diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj
index f922844f..5c0df7d5 100644
--- a/FModel/FModel.csproj
+++ b/FModel/FModel.csproj
@@ -4,16 +4,34 @@
Debug
AnyCPU
- {8FABCD3A-9D55-4B54-B237-B259D815DEB8}
+ {8AAB27BD-18D7-4164-8BBC-AB534D55D30F}
WinExe
FModel
FModel
- v4.7.1
+ v4.7.2
512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
true
true
+
+ false
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ true
x64
@@ -24,259 +42,460 @@
DEBUG;TRACE
prompt
4
+ true
- AnyCPU
+ x64
pdbonly
true
bin\Release\
TRACE
prompt
4
+ true
+ false
- FModel.ico
+ Logo.ico
FModel.Program
-
- true
- bin\x64\Debug\
- DEBUG;TRACE
- full
- x64
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\x64\Release\
- TRACE
- true
- pdbonly
- x64
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- true
- bin\x86\Debug\
- DEBUG;TRACE
- full
- x86
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\x86\Release\
- TRACE
- true
- pdbonly
- x86
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- ..\packages\Autoupdater.NET.Official.1.5.4\lib\net40\AutoUpdater.NET.dll
+
+ ..\packages\Autoupdater.NET.Official.1.5.7\lib\net40\AutoUpdater.NET.dll
-
- False
- DLLs\csharp-wick.dll
+
+ ..\packages\HtmlAgilityPack.1.11.16\lib\Net45\HtmlAgilityPack.dll
-
- ..\packages\Cyotek.Windows.Forms.ColorPicker.1.7.2\lib\net35\Cyotek.Windows.Forms.ColorPicker.dll
-
-
- ..\packages\HtmlAgilityPack.1.11.12\lib\Net45\HtmlAgilityPack.dll
+
+ ..\packages\AvalonEdit.6.0.0\lib\net45\ICSharpCode.AvalonEdit.dll
..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll
+
+ ..\packages\Ookii.Dialogs.Wpf.1.1.0\lib\net45\Ookii.Dialogs.Wpf.dll
+
..\packages\RestSharp.106.6.10\lib\net452\RestSharp.dll
-
- False
- DLLs\ScintillaNET FindReplaceDialog.dll
-
-
- ..\packages\jacobslusser.ScintillaNET.3.6.3\lib\net40\ScintillaNET.dll
+
+ ..\packages\SkiaSharp.1.68.0\lib\net45\SkiaSharp.dll
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+ ..\packages\WriteableBitmapEx.1.6.3\lib\net40\WriteableBitmapEx.Wpf.dll
+
-
- Form
-
-
- MergeImages.cs
-
-
-
-
-
- Form
-
-
- AESManager.cs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Form
-
-
- About.cs
-
-
- Form
-
-
- SearchFiles.cs
-
-
- Form
-
-
- Settings.cs
-
-
- Form
-
-
- UpdateModeSettings.cs
-
-
- Form
-
-
- MainWindow.cs
-
-
-
-
-
-
-
-
- About.cs
-
-
- AESManager.cs
-
-
- MergeImages.cs
-
-
- SearchFiles.cs
-
-
- Settings.cs
-
-
- UpdateModeSettings.cs
-
-
- MainWindow.cs
-
-
- ResXFileCodeGenerator
+
+ MSBuild:Compile
Designer
- Resources.Designer.cs
-
-
-
- SettingsSingleFileGenerator
- Settings.Designer.cs
-
+
+
+
+ AESManager.xaml
+
+
+
+
+
+
+ ColorPickerControl.xaml
+
+
+
+ ColorPickerSwatch.xaml
+
+
+ ColorPickerWindow.xaml
+
+
+ ColorPickRow.xaml
+
+
+ SliderRow.xaml
+
+
+ FModel_About.xaml
+
+
+ FModel_CustomMB.xaml
+
+
+ FModel_ImagesMerger.xaml
+
+
+ FModel_SearchFiles.xaml
+
+
+ FModel_Settings.xaml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FindReplaceWindow.xaml
+
+
+ FindWindow.xaml
+
+
+ GiveByteWindow.xaml
+
+
+ HexBox.xaml
+
+
+
+ HexEditor.xaml
+
+
+ HexViewer.xaml
+
+
+ ReplaceByteWindow.xaml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FindReplaceDialog.xaml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
True
True
Resources.resx
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ FModel_Main.xaml
+ Code
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+ Code
+
True
Settings.settings
True
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
-
- Always
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ False
+ Microsoft .NET Framework 4.7.2 %28x86 et x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -285,8 +504,11 @@
-
-
-
-
+
+
+
+ Ce projet fait référence à des packages NuGet qui sont manquants sur cet ordinateur. Utilisez l'option de restauration des packages NuGet pour les télécharger. Pour plus d'informations, consultez http://go.microsoft.com/fwlink/?LinkID=322105. Le fichier manquant est : {0}.
+
+
+
\ No newline at end of file
diff --git a/FModel/FModel.ico b/FModel/FModel.ico
deleted file mode 100644
index e2328d8a..00000000
Binary files a/FModel/FModel.ico and /dev/null differ
diff --git a/FModel/FModel_Main.xaml b/FModel/FModel_Main.xaml
new file mode 100644
index 00000000..c326a826
--- /dev/null
+++ b/FModel/FModel_Main.xaml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/FModel_Main.xaml.cs b/FModel/FModel_Main.xaml.cs
new file mode 100644
index 00000000..ee861298
--- /dev/null
+++ b/FModel/FModel_Main.xaml.cs
@@ -0,0 +1,360 @@
+using AutoUpdaterDotNET;
+using FModel.Forms;
+using FModel.Forms.HexViewer;
+using FModel.Methods;
+using FModel.Methods.AESManager;
+using FModel.Methods.Assets;
+using FModel.Methods.BackupsManager;
+using FModel.Methods.PAKs;
+using FModel.Methods.TreeViewModel;
+using FModel.Methods.Utilities;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel
+{
+ ///
+ /// Logique d'interaction pour MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public SortedTreeViewWindowViewModel ViewModel { get { return DataContext as SortedTreeViewWindowViewModel; } set { DataContext = value; } }
+
+ public MainWindow()
+ {
+ InitializeComponent();
+ this.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ FWindow.FMain = this;
+ }
+
+ private async void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ FModelVersionLabel.Text += Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5);
+
+ AutoUpdater.CheckForUpdateEvent += UIHelper.AutoUpdaterOnCheckForUpdateEvent;
+ AutoUpdater.Start("https://dl.dropbox.com/s/3kv2pukqu6tj1r0/FModel.xml?dl=0");
+
+ // Copy user settings from previous application version if necessary
+ /*if (FProp.Default.FUpdateSettings)
+ {
+ FProp.Default.Upgrade();
+ FProp.Default.FUpdateSettings = false;
+ FProp.Default.Save();
+ }*/
+
+ await Task.Run(() =>
+ {
+ FoldersUtility.LoadFolders();
+ FoldersUtility.CheckWatermark();
+ RegisterFromPath.FilterPAKs();
+ DynamicKeysChecker.SetDynamicKeys();
+ RegisterDownloadedBackups.LoadBackupFiles();
+ }).ContinueWith(TheTask =>
+ {
+ TasksUtility.TaskCompleted(TheTask.Exception);
+ });
+
+ AvalonEdit.SetAEConfig();
+ }
+
+ #region BUTTON EVENTS
+ private void Button_AESManager_Click(object sender, RoutedEventArgs e)
+ {
+ if (!FormsUtility.IsWindowOpen("AES Manager"))
+ {
+ new AESManager().Show();
+ }
+ else { FormsUtility.GetOpenedWindow("AES Manager").Focus(); }
+ }
+ private void Button_OpenImage_Click(object sender, RoutedEventArgs e)
+ {
+ if (ImageBox_Main.Source != null)
+ {
+ if (!FormsUtility.IsWindowOpen(FWindow.FCurrentAsset))
+ {
+ Window win = new Window();
+ win.Title = FWindow.FCurrentAsset;
+ win.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ win.WindowStartupLocation = WindowStartupLocation.CenterScreen;
+ win.Width = ImageBox_Main.Source.Width;
+ win.Height = ImageBox_Main.Source.Height;
+ if (ImageBox_Main.Source.Height > 1000)
+ {
+ win.WindowState = WindowState.Maximized;
+ }
+
+ DockPanel dockPanel = new DockPanel
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+
+ Image img = new Image();
+ img.UseLayoutRounding = true;
+ img.Source = ImageBox_Main.Source;
+ dockPanel.Children.Add(img);
+
+ win.Content = dockPanel;
+ win.Show();
+ }
+ else { FormsUtility.GetOpenedWindow(FWindow.FCurrentAsset).Focus(); }
+ }
+ }
+ private void Button_Stop_Click(object sender, RoutedEventArgs e)
+ {
+ if (TasksUtility.CancellableTaskTokenSource != null)
+ {
+ TasksUtility.CancellableTaskTokenSource.Cancel();
+ if (TasksUtility.CancellableTaskTokenSource.IsCancellationRequested)
+ {
+ new UpdateMyProcessEvents("Canceled!", "Yikes").Update();
+ }
+ else { new UpdateMyProcessEvents("This is odd!\tCanceled but not requested. You should never see this tbh", "Yikes").Update(); }
+ }
+ }
+ private async void Button_Extract_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ //FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString(); <-- already in the 'Load' loop
+ await AssetsLoader.LoadSelectedAsset();
+ }
+ }
+ #endregion
+
+ #region MENU ITEM EVENTS
+ public async void MI_Pak_Click(object sender, RoutedEventArgs e)
+ {
+ FWindow.FCurrentPAK = (sender as MenuItem).Header.ToString();
+ await PAKsLoader.LoadOnePAK();
+ }
+ private async void MI_LoadAllPAKs_Click(object sender, RoutedEventArgs e)
+ {
+ FWindow.FCurrentPAK = string.Empty;
+
+ //LOAD ALL
+ if (!MI_DifferenceMode.IsChecked && !MI_UpdateMode.IsChecked)
+ {
+ await PAKsLoader.LoadAllPAKs();
+ }
+
+ //LOAD DIFF
+ if (MI_DifferenceMode.IsChecked && !MI_UpdateMode.IsChecked)
+ {
+ await PAKsLoader.LoadDifference();
+ }
+
+ //LOAD AND EXTRACT DIFF
+ if (MI_DifferenceMode.IsChecked && MI_UpdateMode.IsChecked)
+ {
+ //not done yet
+ }
+ }
+ private async void MI_BackupPAKs_Click(object sender, RoutedEventArgs e)
+ {
+ await BackupPAKs.CreateBackupFile();
+ }
+ private void MI_Settings_Click(object sender, RoutedEventArgs e)
+ {
+ if (!FormsUtility.IsWindowOpen("Settings"))
+ {
+ new FModel_Settings().Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Settings").Focus(); }
+ }
+ private void MI_Search_Click(object sender, RoutedEventArgs e)
+ {
+ if (!FormsUtility.IsWindowOpen("Search"))
+ {
+ new FModel_SearchFiles().Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Search").Focus(); }
+ }
+ private void MI_HexViewer_Click(object sender, RoutedEventArgs e)
+ {
+ if (!FormsUtility.IsWindowOpen("Hex Viewer"))
+ {
+ new HexViewer().Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Hex Viewer").Focus(); }
+ }
+ private void MI_ExportRaw_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ AssetsUtility.ExportAssetData();
+ }
+ }
+ private void MI_SaveJson_Click(object sender, RoutedEventArgs e)
+ {
+ AssetsUtility.SaveAssetProperties();
+ }
+ private void MI_OpenOutputFolder_Click(object sender, RoutedEventArgs e)
+ {
+ FoldersUtility.OpenOutputFolder();
+ }
+ private void MI_Save_Image_Click(object sender, RoutedEventArgs e)
+ {
+ if (ImageBox_Main.Source != null)
+ {
+ ImagesUtility.SaveImageDialog();
+ }
+ }
+ private void MI_MergeImages_Click(object sender, RoutedEventArgs e)
+ {
+ if (!FormsUtility.IsWindowOpen("Images Merger"))
+ {
+ new FModel_ImagesMerger().Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Images Merger").Focus(); }
+ }
+ private void MI_About_Click(object sender, RoutedEventArgs e)
+ {
+ if (!FormsUtility.IsWindowOpen("About"))
+ {
+ new FModel_About().Show();
+ }
+ else { FormsUtility.GetOpenedWindow("About").Focus(); }
+ }
+ private void MI_Change_Header(object sender, RoutedEventArgs e)
+ {
+ //DIFFERENCE MODE
+ if (MI_DifferenceMode.IsChecked)
+ {
+ MI_LoadOnePAK.IsEnabled = false;
+ MI_LoadAllPAKs.Header = "Load Difference";
+ MI_UpdateMode.IsEnabled = true;
+ }
+ if (!MI_DifferenceMode.IsChecked)
+ {
+ MI_LoadOnePAK.IsEnabled = true;
+ MI_UpdateMode.IsEnabled = false;
+ MI_UpdateMode.IsChecked = false;
+ }
+
+ //UPDATE MODE
+ if (MI_UpdateMode.IsChecked)
+ {
+ MI_LoadAllPAKs.Header = "Load And Extract Difference";
+ MI_UpdateMode.IsEnabled = true;
+ }
+ if (!MI_UpdateMode.IsChecked)
+ {
+ MI_LoadAllPAKs.Header = "Load Difference";
+ }
+
+ //BOTH
+ if (!MI_DifferenceMode.IsChecked && !MI_UpdateMode.IsChecked)
+ {
+ MI_LoadAllPAKs.Header = "Load All PAKs";
+ }
+ }
+ #endregion
+
+ #region TREEVIEW EVENTS
+ private async void NodeSelected(object sender, RoutedEventArgs e)
+ {
+ TreeViewItem currContainer = e.OriginalSource as TreeViewItem;
+ if (currContainer != null)
+ {
+ FWindow.TVItem = currContainer;
+ await ListBoxUtility.PopulateListBox(currContainer);
+ }
+
+ }
+ private async void RC_ExtractFolders_Click(object sender, RoutedEventArgs e)
+ {
+ if (TreeView_Main.SelectedItem != null)
+ {
+ string path = TreeViewUtility.GetFullPath(FWindow.TVItem);
+ await AssetsLoader.ExtractFoldersAndSub(path);
+ }
+ }
+ #endregion
+
+ #region LISTBOX EVENTS
+ private void ListBox_Main_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.AddedItems.Count > 0) { ((ListBox)sender).ScrollIntoView(e.AddedItems[0]); }
+ if (!AssetsLoader.isRunning) { Button_Extract.IsEnabled = ListBox_Main.SelectedIndex >= 0; }
+ }
+ private async void ListBox_Main_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
+ {
+ if (!AssetsLoader.isRunning && ListBox_Main.SelectedIndex >= 0)
+ {
+ //FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString(); <-- already in the 'Load' loop
+ await AssetsLoader.LoadSelectedAsset();
+ }
+ }
+ private async void FilterTextBox_Main_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ await ListBoxUtility.FilterListBox();
+ }
+ private async void RC_Extract_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ //FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString(); <-- already in the 'Load' loop
+ await AssetsLoader.LoadSelectedAsset();
+ }
+ }
+ private void RC_ExportData_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ AssetsUtility.ExportAssetData();
+ }
+ }
+ private void RC_SaveData_Click(object sender, RoutedEventArgs e)
+ {
+ AssetsUtility.SaveAssetProperties();
+ }
+ private void RC_Copy_FPath_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ Clipboard.SetText(AssetsUtility.GetAssetPathToCopy());
+ }
+ }
+ private void RC_Copy_FName_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ Clipboard.SetText(AssetsUtility.GetAssetPathToCopy(true));
+ }
+ }
+ private void RC_Copy_FPath_NoExt_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ Clipboard.SetText(AssetsUtility.GetAssetPathToCopy(false, false));
+ }
+ }
+ private void RC_Copy_FName_NoExt_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ Clipboard.SetText(AssetsUtility.GetAssetPathToCopy(true, false));
+ }
+ }
+ private void RC_Properties_Click(object sender, RoutedEventArgs e)
+ {
+ if (ListBox_Main.SelectedIndex >= 0)
+ {
+ FWindow.FCurrentAsset = ListBox_Main.SelectedItem.ToString();
+ AssetInformations.OpenAssetInfos();
+ }
+ }
+ #endregion
+ }
+}
diff --git a/FModel/Forms/AESManager.Designer.cs b/FModel/Forms/AESManager.Designer.cs
deleted file mode 100644
index bf94107c..00000000
--- a/FModel/Forms/AESManager.Designer.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-namespace FModel.Forms
-{
- partial class AESManager
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AESManager));
- this.groupBox3 = new System.Windows.Forms.GroupBox();
- this.textBox2 = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.OKButton = new System.Windows.Forms.Button();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.panel1 = new System.Windows.Forms.Panel();
- this.linkLabel1 = new System.Windows.Forms.LinkLabel();
- this.groupBox3.SuspendLayout();
- this.groupBox1.SuspendLayout();
- this.SuspendLayout();
- //
- // groupBox3
- //
- this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.groupBox3.Controls.Add(this.textBox2);
- this.groupBox3.Controls.Add(this.label3);
- this.groupBox3.Location = new System.Drawing.Point(12, 12);
- this.groupBox3.Name = "groupBox3";
- this.groupBox3.Size = new System.Drawing.Size(565, 49);
- this.groupBox3.TabIndex = 14;
- this.groupBox3.TabStop = false;
- this.groupBox3.Text = "Static Key:";
- //
- // textBox2
- //
- this.textBox2.Location = new System.Drawing.Point(74, 19);
- this.textBox2.Name = "textBox2";
- this.textBox2.Size = new System.Drawing.Size(485, 20);
- this.textBox2.TabIndex = 2;
- this.textBox2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
- //
- // label3
- //
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(6, 22);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(62, 13);
- this.label3.TabIndex = 3;
- this.label3.Text = "Main PAKs:";
- //
- // OKButton
- //
- this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.OKButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.OKButton.Location = new System.Drawing.Point(480, 292);
- this.OKButton.Name = "OKButton";
- this.OKButton.Size = new System.Drawing.Size(97, 21);
- this.OKButton.TabIndex = 16;
- this.OKButton.Text = "OK";
- this.OKButton.UseVisualStyleBackColor = true;
- this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
- //
- // groupBox1
- //
- this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.groupBox1.Controls.Add(this.panel1);
- this.groupBox1.Location = new System.Drawing.Point(12, 67);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(565, 219);
- this.groupBox1.TabIndex = 17;
- this.groupBox1.TabStop = false;
- this.groupBox1.Text = "Dynamic Keys:";
- //
- // panel1
- //
- this.panel1.AutoScroll = true;
- this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.panel1.Location = new System.Drawing.Point(3, 16);
- this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(559, 200);
- this.panel1.TabIndex = 0;
- //
- // linkLabel1
- //
- this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.linkLabel1.AutoSize = true;
- this.linkLabel1.Location = new System.Drawing.Point(12, 296);
- this.linkLabel1.Name = "linkLabel1";
- this.linkLabel1.Size = new System.Drawing.Size(124, 13);
- this.linkLabel1.TabIndex = 18;
- this.linkLabel1.TabStop = true;
- this.linkLabel1.Text = "Latest Fortnite AES Keys";
- this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel1_LinkClicked);
- //
- // AESManager
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(589, 325);
- this.Controls.Add(this.linkLabel1);
- this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.OKButton);
- this.Controls.Add(this.groupBox3);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.MinimumSize = new System.Drawing.Size(605, 364);
- this.Name = "AESManager";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "AES Manager";
- this.groupBox3.ResumeLayout(false);
- this.groupBox3.PerformLayout();
- this.groupBox1.ResumeLayout(false);
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox groupBox3;
- private System.Windows.Forms.TextBox textBox2;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.Button OKButton;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.LinkLabel linkLabel1;
- }
-}
\ No newline at end of file
diff --git a/FModel/Forms/AESManager.cs b/FModel/Forms/AESManager.cs
deleted file mode 100644
index c02d3523..00000000
--- a/FModel/Forms/AESManager.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace FModel.Forms
-{
- public partial class AESManager : Form
- {
- public static bool isClosed { get; set; }
-
- public AESManager()
- {
- InitializeComponent();
- isClosed = false;
-
- textBox2.Text = @"0x" + Properties.Settings.Default.AESKey;
-
- for (int i = 0; i < ThePak.dynamicPaksList.Count; i++)
- {
- string dCurrentUsedPak = ThePak.dynamicPaksList[i].thePak; //SET CURRENT DYNAMIC PAK
- int pFrom = dCurrentUsedPak.IndexOf("pakchunk") + "pakchunk".Length;
- int pTo = dCurrentUsedPak.LastIndexOf("WindowsClient.pak");
-
- TextBox txtBox = new TextBox();
- txtBox.Location = new Point(164, 3 + (26 * i));
- txtBox.Size = new Size(372, 20);
- txtBox.Name = "txtBox_" + dCurrentUsedPak.Substring(pFrom, pTo - pFrom - 1);
- txtBox.Parent = panel1;
-
- Label lbl = new Label();
- lbl.AutoSize = true;
- lbl.Location = new Point(3, 6 + (26 * i));
- lbl.Size = new Size(155, 13);
- lbl.Text = dCurrentUsedPak.Substring(0, dCurrentUsedPak.LastIndexOf("."));
- lbl.Parent = panel1;
-
- if (DynamicKeysManager.AESEntries != null)
- {
- foreach (AESEntry s in DynamicKeysManager.AESEntries)
- {
- if (s.thePak == dCurrentUsedPak) { txtBox.Text = @"0x" + s.theKey; }
- }
- }
- }
- }
-
- private void OKButton_Click(object sender, EventArgs e)
- {
- if (!string.IsNullOrWhiteSpace(textBox2.Text) && textBox2.Text.StartsWith("0x"))
- {
- if (textBox2.Text.Contains(" ")) { textBox2.Text = textBox2.Text.Replace(" ", string.Empty); }
- Properties.Settings.Default.AESKey = textBox2.Text.Substring(2).ToUpper();
- }
- else { Properties.Settings.Default.AESKey = ""; }
-
- DynamicKeysManager.AESEntries = new List();
- for (int i = 0; i < ThePak.dynamicPaksList.Count; i++)
- {
- string dCurrentUsedPak = ThePak.dynamicPaksList[i].thePak; //SET CURRENT DYNAMIC PAK
- int pFrom = dCurrentUsedPak.IndexOf("pakchunk") + "pakchunk".Length;
- int pTo = dCurrentUsedPak.LastIndexOf("WindowsClient.pak");
-
- Control[] controls = this.Controls.Find("txtBox_" + dCurrentUsedPak.Substring(pFrom, pTo - pFrom - 1), true);
- if (controls.Length > 0)
- {
- TextBox txtBox = controls[0] as TextBox;
- if (txtBox != null)
- {
- if (!string.IsNullOrWhiteSpace(txtBox.Text))
- {
- DynamicKeysManager.serialize(txtBox.Text.Substring(2).ToUpper(), dCurrentUsedPak);
- }
- }
- }
- }
-
- Properties.Settings.Default.Save();
- isClosed = true;
- Close();
- }
-
- private void LinkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- System.Diagnostics.Process.Start("http://benbotfn.tk:8080/api/aes");
- }
- }
-}
diff --git a/FModel/Forms/AESManager.resx b/FModel/Forms/AESManager.resx
deleted file mode 100644
index a12630e6..00000000
--- a/FModel/Forms/AESManager.resx
+++ /dev/null
@@ -1,1353 +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
-
-
-
-
- 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
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Forms/AESManager.xaml b/FModel/Forms/AESManager.xaml
new file mode 100644
index 00000000..88b24b99
--- /dev/null
+++ b/FModel/Forms/AESManager.xaml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/AESManager.xaml.cs b/FModel/Forms/AESManager.xaml.cs
new file mode 100644
index 00000000..9e650c87
--- /dev/null
+++ b/FModel/Forms/AESManager.xaml.cs
@@ -0,0 +1,132 @@
+using FModel.Methods;
+using FModel.Methods.AESManager;
+using FModel.Methods.Utilities;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Navigation;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Forms
+{
+ ///
+ /// Logique d'interaction pour AESManager.xaml
+ ///
+ public partial class AESManager : Window
+ {
+ private static readonly string AESManager_PATH = FProp.Default.FOutput_Path + "\\FAESManager.xml";
+
+ public AESManager()
+ {
+ InitializeComponent();
+ this.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ }
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ AddLblTxtForDynamicPAKs();
+ GetUserSettings();
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ SetUserSettings();
+ PAKsUtility.DisableNonKeyedPAKs();
+ Close();
+ }
+
+ private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
+ {
+ System.Diagnostics.Process.Start(e.Uri.AbsoluteUri);
+ }
+
+ private void AddLblTxtForDynamicPAKs()
+ {
+ if (PAKEntries.PAKEntriesList != null && PAKEntries.PAKEntriesList.Any())
+ {
+ if (AESEntries.AESEntriesList == null) { KeysManager.Deserialize(); }
+ int yPos = 4;
+
+ foreach (PAKInfosEntry Pak in PAKEntries.PAKEntriesList.Where(x => x.bTheDynamicPAK == true))
+ {
+ Label PakLabel = new Label();
+ PakLabel.Content = Path.GetFileNameWithoutExtension(Pak.ThePAKPath);
+ PakLabel.HorizontalAlignment = HorizontalAlignment.Left;
+ PakLabel.Margin = new Thickness(2, yPos - 2, 0, 0);
+ PakLabel.VerticalAlignment = VerticalAlignment.Top;
+ PakLabel.Foreground = new SolidColorBrush(Color.FromRgb(239, 239, 239));
+
+ TextBox PakTextBox = new TextBox();
+ PakTextBox.Height = 19;
+ PakTextBox.TextWrapping = TextWrapping.NoWrap;
+ PakTextBox.AcceptsReturn = false;
+ PakTextBox.Margin = new Thickness(160, yPos, 5, 0);
+ PakTextBox.VerticalAlignment = VerticalAlignment.Top;
+ PakTextBox.Foreground = new SolidColorBrush(Color.FromRgb(239, 239, 239));
+ PakTextBox.Name = $"TxtBox_{Regex.Match(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), @"\d+").Value}";
+
+ if (AESEntries.AESEntriesList != null && AESEntries.AESEntriesList.Any())
+ {
+ string PAKKeyFromXML = AESEntries.AESEntriesList.Where(x => string.Equals(x.ThePAKName, Path.GetFileNameWithoutExtension(Pak.ThePAKPath))).Select(x => x.ThePAKKey).FirstOrDefault();
+ PakTextBox.Text = $"0x{PAKKeyFromXML}";
+ }
+
+ yPos += 28;
+ Grid_DynamicKeys.Children.Add(PakLabel);
+ Grid_DynamicKeys.Children.Add(PakTextBox);
+ }
+ }
+ }
+
+ private void GetUserSettings()
+ {
+ MAesTextBox.Text = $"0x{FProp.Default.FPak_MainAES}";
+ }
+
+ private void SetUserSettings()
+ {
+ //MAIN AES
+ if (!string.IsNullOrEmpty(MAesTextBox.Text))
+ {
+ if (MAesTextBox.Text.StartsWith("0x"))
+ {
+ FProp.Default.FPak_MainAES = Regex.Replace(MAesTextBox.Text.Substring(2).ToUpper(), @"\s+", string.Empty);
+ }
+ else { FProp.Default.FPak_MainAES = Regex.Replace(MAesTextBox.Text.ToUpper(), @"\s+", string.Empty); }
+ }
+ else { FProp.Default.FPak_MainAES = string.Empty; }
+
+ //DYNAMIC AESs
+ AESEntries.AESEntriesList = new List();
+ if (PAKEntries.PAKEntriesList != null && PAKEntries.PAKEntriesList.Any())
+ {
+ foreach (PAKInfosEntry Pak in PAKEntries.PAKEntriesList.Where(x => x.bTheDynamicPAK == true))
+ {
+ TextBox PakTextBox = UIHelper.FindChild(this, $"TxtBox_{Regex.Match(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), @"\d+").Value}");
+ if (!string.IsNullOrEmpty(PakTextBox.Text))
+ {
+ if (PakTextBox.Text.StartsWith("0x"))
+ {
+ KeysManager.Serialize(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), Regex.Replace(PakTextBox.Text.Substring(2).ToUpper(), @"\s+", string.Empty));
+ }
+ else { KeysManager.Serialize(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), Regex.Replace(PakTextBox.Text.ToUpper(), @"\s+", string.Empty)); }
+ }
+ else { KeysManager.Serialize(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), string.Empty); }
+ }
+
+ Directory.CreateDirectory(Path.GetDirectoryName(AESManager_PATH));
+ using (var fileStream = new FileStream(AESManager_PATH, FileMode.Create))
+ {
+ KeysManager.serializer.Serialize(fileStream, AESEntries.AESEntriesList);
+ }
+ }
+
+ //SAVE
+ FProp.Default.Save();
+ }
+ }
+}
diff --git a/FModel/Forms/About.Designer.cs b/FModel/Forms/About.Designer.cs
deleted file mode 100644
index ef4dba9a..00000000
--- a/FModel/Forms/About.Designer.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-namespace FModel.Forms
-{
- partial class About
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About));
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.linkLabel1 = new System.Windows.Forms.LinkLabel();
- this.linkLabel2 = new System.Windows.Forms.LinkLabel();
- this.label1 = new System.Windows.Forms.Label();
- this.label2 = new System.Windows.Forms.Label();
- this.label3 = new System.Windows.Forms.Label();
- this.label4 = new System.Windows.Forms.Label();
- this.linkLabel3 = new System.Windows.Forms.LinkLabel();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.SuspendLayout();
- //
- // pictureBox1
- //
- this.pictureBox1.Image = global::FModel.Properties.Resources.FModel_Logo;
- this.pictureBox1.Location = new System.Drawing.Point(12, 12);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(90, 90);
- this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.pictureBox1.TabIndex = 0;
- this.pictureBox1.TabStop = false;
- //
- // linkLabel1
- //
- this.linkLabel1.AutoSize = true;
- this.linkLabel1.Location = new System.Drawing.Point(138, 98);
- this.linkLabel1.Name = "linkLabel1";
- this.linkLabel1.Size = new System.Drawing.Size(69, 13);
- this.linkLabel1.TabIndex = 1;
- this.linkLabel1.TabStop = true;
- this.linkLabel1.Text = "GitHub Repo";
- this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
- //
- // linkLabel2
- //
- this.linkLabel2.AutoSize = true;
- this.linkLabel2.Location = new System.Drawing.Point(381, 98);
- this.linkLabel2.Name = "linkLabel2";
- this.linkLabel2.Size = new System.Drawing.Size(43, 13);
- this.linkLabel2.TabIndex = 2;
- this.linkLabel2.TabStop = true;
- this.linkLabel2.Text = "Discord";
- this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked);
- //
- // label1
- //
- this.label1.Location = new System.Drawing.Point(108, 47);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(360, 40);
- this.label1.TabIndex = 3;
- this.label1.Text = "FModel is a Fortnite .PAK file explorer built in C#\r\nIf you find this project use" +
- "ful, feel free to give it a star on GitHub\r\n⊂(◕‿◕)つ";
- this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // label2
- //
- this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.label2.Location = new System.Drawing.Point(108, 8);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(360, 39);
- this.label2.TabIndex = 4;
- this.label2.Text = "FModel";
- this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // label3
- //
- this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.label3.AutoSize = true;
- this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.label3.Location = new System.Drawing.Point(12, 123);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(42, 13);
- this.label3.TabIndex = 6;
- this.label3.Text = "Credits:";
- this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- //
- // label4
- //
- this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.label4.AutoSize = true;
- this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.label4.Location = new System.Drawing.Point(53, 124);
- this.label4.Name = "label4";
- this.label4.Size = new System.Drawing.Size(241, 13);
- this.label4.TabIndex = 11;
- this.label4.Text = "• Waddlesworth • Maiky M • AyeTSG • FireMonkey";
- this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // linkLabel3
- //
- this.linkLabel3.AutoSize = true;
- this.linkLabel3.Location = new System.Drawing.Point(260, 98);
- this.linkLabel3.Name = "linkLabel3";
- this.linkLabel3.Size = new System.Drawing.Size(67, 13);
- this.linkLabel3.TabIndex = 12;
- this.linkLabel3.TabStop = true;
- this.linkLabel3.Text = "How To Use";
- this.linkLabel3.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel3_LinkClicked);
- //
- // About
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(467, 145);
- this.Controls.Add(this.linkLabel3);
- this.Controls.Add(this.label4);
- this.Controls.Add(this.linkLabel2);
- this.Controls.Add(this.linkLabel1);
- this.Controls.Add(this.label1);
- this.Controls.Add(this.label3);
- this.Controls.Add(this.label2);
- this.Controls.Add(this.pictureBox1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "About";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "About FModel";
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.PictureBox pictureBox1;
- private System.Windows.Forms.LinkLabel linkLabel1;
- private System.Windows.Forms.LinkLabel linkLabel2;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.LinkLabel linkLabel3;
- }
-}
diff --git a/FModel/Forms/About.cs b/FModel/Forms/About.cs
deleted file mode 100644
index 31392df4..00000000
--- a/FModel/Forms/About.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System.IO;
-using System.Windows.Forms;
-
-namespace FModel.Forms
-{
- public partial class About : Form
- {
- public About()
- {
- InitializeComponent();
-
- label2.Text += @" " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5);
- }
-
- private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/iAmAsval/FModel");
- }
-
- private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- System.Diagnostics.Process.Start("https://discordapp.com/invite/JmWvXKb");
- }
-
- private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
- {
- System.Diagnostics.Process.Start("https://github.com/iAmAsval/FModel/blob/master/README.md#how-to-use");
- }
- }
-}
diff --git a/FModel/Forms/About.resx b/FModel/Forms/About.resx
deleted file mode 100644
index a12630e6..00000000
--- a/FModel/Forms/About.resx
+++ /dev/null
@@ -1,1353 +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
-
-
-
-
- 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
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Forms/ColorPicker/Code/ColorPalette.cs b/FModel/Forms/ColorPicker/Code/ColorPalette.cs
new file mode 100644
index 00000000..15df0921
--- /dev/null
+++ b/FModel/Forms/ColorPicker/Code/ColorPalette.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Media;
+using System.Xml.Serialization;
+
+namespace ColorPickerWPF.Code
+{
+ [Serializable]
+ public class ColorPalette
+ {
+ public List BuiltInColors { get; set; }
+
+ public List CustomColors { get; set; }
+
+ [XmlIgnore]
+ protected const int NumColorsFirstSwatch = 39;
+ [XmlIgnore]
+ protected const int NumColorsCustomSwatch = 44;
+ [XmlIgnore]
+ protected const int NumColorsSecondSwatch = 112;
+
+ public ColorPalette()
+ {
+ BuiltInColors = new List();
+ CustomColors = new List();
+ }
+
+ public void InitializeDefaults()
+ {
+ BuiltInColors.Clear();
+ BuiltInColors.AddRange(
+ GetColorSwatchItems(
+ new List()
+ {
+ Colors.Black,
+ Colors.Red,
+ Colors.DarkOrange,
+ Colors.Yellow,
+ Colors.LawnGreen,
+ Colors.Blue,
+ Colors.Purple,
+ Colors.DeepPink,
+ Colors.Aqua,
+ Colors.SaddleBrown,
+ Colors.Wheat,
+ Colors.BurlyWood,
+ Colors.Teal,
+
+ Colors.White,
+ Colors.OrangeRed,
+ Colors.Orange,
+ Colors.Gold,
+ Colors.LimeGreen,
+ Colors.DodgerBlue,
+ Colors.Orchid,
+ Colors.HotPink,
+ Colors.Turquoise,
+ Colors.SandyBrown,
+ Colors.SeaGreen,
+ Colors.SlateBlue,
+ Colors.RoyalBlue,
+
+ Colors.Tan,
+ Colors.Peru,
+ Colors.DarkBlue,
+ Colors.DarkGreen,
+ Colors.DarkSlateBlue,
+ Colors.Navy,
+ Colors.MistyRose,
+ Colors.LemonChiffon,
+ Colors.ForestGreen,
+ Colors.Firebrick,
+ Colors.DarkViolet,
+ Colors.Aquamarine,
+ Colors.CornflowerBlue,
+ Colors.Bisque,
+ Colors.WhiteSmoke,
+ Colors.AliceBlue,
+
+
+ Color.FromArgb(255, 5, 5, 5),
+ Color.FromArgb(255, 15, 15, 15),Color.FromArgb(255, 35, 35, 35),
+ Color.FromArgb(255, 55, 55, 55),
+ Color.FromArgb(255, 75, 75, 75),
+ Color.FromArgb(255, 95, 95, 95),
+ Color.FromArgb(255, 115, 115, 115),
+ Color.FromArgb(255, 135, 135, 135),
+ Color.FromArgb(255, 155, 155, 155),
+ Color.FromArgb(255, 175, 175, 175),
+ Color.FromArgb(255, 195, 195, 195),
+ Color.FromArgb(255, 215, 215, 215),
+ Color.FromArgb(255, 235, 235, 235),
+ }));
+
+ CustomColors.Clear();
+ CustomColors.AddRange(Enumerable.Repeat(Colors.White, NumColorsCustomSwatch)
+ .Select(x => new ColorSwatchItem() { Color = x, HexString = x.ToHexString() })
+ .ToList());
+ }
+
+
+ protected List GetColorSwatchItems(List colors)
+ {
+ return colors.Select(x => new ColorSwatchItem() { Color = x, HexString = x.ToHexString() }).ToList();
+ }
+ }
+}
diff --git a/FModel/Forms/ColorPicker/Code/ColorPickerDialogOptions.cs b/FModel/Forms/ColorPicker/Code/ColorPickerDialogOptions.cs
new file mode 100644
index 00000000..3447727d
--- /dev/null
+++ b/FModel/Forms/ColorPicker/Code/ColorPickerDialogOptions.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ColorPickerWPF.Code
+{
+ [Flags]
+ public enum ColorPickerDialogOptions
+ {
+ None,
+ SimpleView,
+ LoadCustomPalette
+ }
+}
diff --git a/FModel/Forms/ColorPicker/Code/ColorSwatchItem.cs b/FModel/Forms/ColorPicker/Code/ColorSwatchItem.cs
new file mode 100644
index 00000000..0ff39a3f
--- /dev/null
+++ b/FModel/Forms/ColorPicker/Code/ColorSwatchItem.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+
+namespace ColorPickerWPF.Code
+{
+ public class ColorSwatchItem
+ {
+ public Color Color { get; set; }
+ public string HexString { get; set; }
+ }
+}
diff --git a/FModel/Forms/ColorPicker/Code/Util.cs b/FModel/Forms/ColorPicker/Code/Util.cs
new file mode 100644
index 00000000..8cad74cf
--- /dev/null
+++ b/FModel/Forms/ColorPicker/Code/Util.cs
@@ -0,0 +1,256 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Windows.Media.Imaging;
+using System.Xml;
+using System.Xml.Serialization;
+using Color = System.Windows.Media.Color;
+
+namespace ColorPickerWPF.Code
+{
+ internal static class Util
+ {
+ [DllImport("shlwapi.dll")]
+ public static extern int ColorHLSToRGB(int H, int L, int S);
+
+ public static Color ColorFromHSL(int H, int S, int L)
+ {
+ int colorInt = ColorHLSToRGB(H, L, S);
+ byte[] bytes = BitConverter.GetBytes(colorInt);
+ return Color.FromArgb(255, bytes[0], bytes[1], bytes[2]);
+ }
+
+
+ public static string ToHexString(this Color c)
+ {
+ return "#" + c.A.ToString("X2") + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
+ }
+
+ public static Color ColorFromHexString(string hex)
+ {
+ return Color.FromRgb(
+ Convert.ToByte(hex.Substring(1, 2), 16),
+ Convert.ToByte(hex.Substring(3, 2), 16),
+ Convert.ToByte(hex.Substring(5, 2), 16));
+ }
+
+ public static bool IsDialogFlagSet(this ColorPickerDialogOptions flags, ColorPickerDialogOptions flag)
+ {
+ if ((flags & flag) == flag)
+ {
+ return true;
+ }
+ return false;
+ }
+
+
+ public static BitmapImage GetBitmapImage(BitmapSource bitmapSource)
+ {
+ JpegBitmapEncoder encoder = new JpegBitmapEncoder();
+ MemoryStream memoryStream = new MemoryStream();
+ BitmapImage bImg = new BitmapImage();
+
+ encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
+ encoder.Save(memoryStream);
+
+ memoryStream.Position = 0;
+ bImg.BeginInit();
+ bImg.StreamSource = memoryStream;
+ bImg.EndInit();
+
+ memoryStream.Close();
+
+ return bImg;
+ }
+
+ public static float GetHue(this System.Windows.Media.Color c)
+ {
+ var color = System.Drawing.Color.FromArgb(c.A, c.R, c.G, c.B);
+ return color.GetHue();
+ }
+
+ public static float GetBrightness(this System.Windows.Media.Color c)
+ {
+ var color = System.Drawing.Color.FromArgb(c.A, c.R, c.G, c.B);
+ return color.GetBrightness();
+ }
+
+ public static float GetSaturation(this System.Windows.Media.Color c)
+ {
+ var color = System.Drawing.Color.FromArgb(c.A, c.R, c.G, c.B);
+ return color.GetSaturation();
+ }
+
+ public static Color FromAhsb(int alpha, float hue, float saturation, float brightness)
+ {
+
+ if (0 > alpha || 255 < alpha)
+ {
+ throw new ArgumentOutOfRangeException("alpha", alpha,
+ "Value must be within a range of 0 - 255.");
+ }
+ if (0f > hue || 360f < hue)
+ {
+ throw new ArgumentOutOfRangeException("hue", hue,
+ "Value must be within a range of 0 - 360.");
+ }
+ if (0f > saturation || 1f < saturation)
+ {
+ throw new ArgumentOutOfRangeException("saturation", saturation,
+ "Value must be within a range of 0 - 1.");
+ }
+ if (0f > brightness || 1f < brightness)
+ {
+ throw new ArgumentOutOfRangeException("brightness", brightness,
+ "Value must be within a range of 0 - 1.");
+ }
+
+ if (0 == saturation)
+ {
+ return Color.FromArgb((byte)alpha, Convert.ToByte(brightness * 255),
+ Convert.ToByte(brightness * 255), Convert.ToByte(brightness * 255));
+ }
+
+ float fMax, fMid, fMin;
+ int iSextant;
+ byte iMax, iMid, iMin;
+
+ if (0.5 < brightness)
+ {
+ fMax = brightness - (brightness * saturation) + saturation;
+ fMin = brightness + (brightness * saturation) - saturation;
+ }
+ else
+ {
+ fMax = brightness + (brightness * saturation);
+ fMin = brightness - (brightness * saturation);
+ }
+
+ iSextant = (int)Math.Floor(hue / 60f);
+ if (300f <= hue)
+ {
+ hue -= 360f;
+ }
+ hue /= 60f;
+ hue -= 2f * (float)Math.Floor(((iSextant + 1f) % 6f) / 2f);
+ if (0 == iSextant % 2)
+ {
+ fMid = hue * (fMax - fMin) + fMin;
+ }
+ else
+ {
+ fMid = fMin - hue * (fMax - fMin);
+ }
+
+ iMax = Convert.ToByte(fMax * 255);
+ iMid = Convert.ToByte(fMid * 255);
+ iMin = Convert.ToByte(fMin * 255);
+
+ switch (iSextant)
+ {
+ case 1:
+ return Color.FromArgb((byte)alpha, iMid, iMax, iMin);
+ case 2:
+ return Color.FromArgb((byte)alpha, iMin, iMax, iMid);
+ case 3:
+ return Color.FromArgb((byte)alpha, iMin, iMid, iMax);
+ case 4:
+ return Color.FromArgb((byte)alpha, iMid, iMin, iMax);
+ case 5:
+ return Color.FromArgb((byte)alpha, iMax, iMin, iMid);
+ default:
+ return Color.FromArgb((byte)alpha, iMax, iMid, iMin);
+ }
+ }
+
+ // https://stackoverflow.com/questions/5091455/web-color-list-in-c-sharp-application
+ public static List GetWebColors()
+ {
+ Type colors = typeof(System.Drawing.Color);
+ PropertyInfo[] colorInfo = colors.GetProperties(BindingFlags.Public |
+ BindingFlags.Static);
+ List list = new List();
+ foreach (PropertyInfo info in colorInfo)
+ {
+ var c = System.Drawing.Color.FromName(info.Name);
+ list.Add(Color.FromArgb(c.A, c.R, c.G, c.B));
+ }
+
+
+ return list;
+ }
+
+
+ public static void SaveToXml(this T obj, string filename)
+ {
+ var xml = obj.GetXmlText();
+
+ File.WriteAllText(filename, xml);
+ }
+
+ public static string GetXmlText(this T obj)
+ {
+ var xmlSerializer = new XmlSerializer(typeof(T));
+
+ var sww = new StringWriter();
+
+ var settings = new XmlWriterSettings()
+ {
+ Indent = true,
+ IndentChars = " ",
+ NewLineOnAttributes = false,
+ //OmitXmlDeclaration = true
+ };
+ var writer = XmlWriter.Create(sww, settings);
+
+ xmlSerializer.Serialize(writer, obj);
+ var xml = sww.ToString();
+
+ writer.Close();
+ writer.Dispose();
+
+
+ return xml;
+ }
+
+ public static T LoadFromXml(this T obj, string filename)
+ {
+ T result = default(T);
+ if (File.Exists(filename))
+ {
+ var sr = new StreamReader(filename);
+ var xr = new XmlTextReader(sr);
+
+ var xmlSerializer = new XmlSerializer(typeof(T));
+
+ result = (T)xmlSerializer.Deserialize(xr);
+
+ xr.Close();
+ sr.Close();
+ xr.Dispose();
+ sr.Dispose();
+ }
+ return result;
+ }
+
+ public static T LoadFromXmlText(this T obj, string xml)
+ {
+ T result = default(T);
+ if (!String.IsNullOrEmpty(xml))
+ {
+ var xr = XmlReader.Create(new StringReader(xml));
+
+ var xmlSerializer = new XmlSerializer(typeof(T));
+
+ result = (T)xmlSerializer.Deserialize(xr);
+
+ xr.Close();
+ xr.Dispose();
+ }
+ return result;
+ }
+
+ }
+}
diff --git a/FModel/Forms/ColorPicker/ColorPickRow.xaml b/FModel/Forms/ColorPicker/ColorPickRow.xaml
new file mode 100644
index 00000000..c7a8f3b4
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickRow.xaml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/ColorPicker/ColorPickRow.xaml.cs b/FModel/Forms/ColorPicker/ColorPickRow.xaml.cs
new file mode 100644
index 00000000..34857c0a
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickRow.xaml.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Windows;
+using System.Windows.Media;
+using ColorPickerWPF.Code;
+using UserControl = System.Windows.Controls.UserControl;
+
+namespace ColorPickerWPF
+{
+ ///
+ /// Interaction logic for ColorPickRow.xaml
+ ///
+ public partial class ColorPickRow : UserControl
+ {
+ public event EventHandler OnPick;
+
+ public Color Color { get; set; }
+
+ public ColorPickerDialogOptions Options { get; set; }
+
+ public ColorPickRow()
+ {
+ InitializeComponent();
+ }
+
+ private void PickColorButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ Color color;
+ if (ColorPickerWindow.ShowDialog(out color, Options))
+ {
+ SetColor(color);
+ OnPick?.Invoke(this, EventArgs.Empty);
+ }
+ }
+
+ public void SetColor(Color color)
+ {
+ Color = color;
+ HexLabel.Text = color.ToHexString();
+ ColorDisplayGrid.Background = new SolidColorBrush(color);
+ }
+ }
+}
diff --git a/FModel/Forms/ColorPicker/ColorPickerControl.xaml b/FModel/Forms/ColorPicker/ColorPickerControl.xaml
new file mode 100644
index 00000000..3561dd6d
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerControl.xaml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/ColorPicker/ColorPickerControl.xaml.cs b/FModel/Forms/ColorPicker/ColorPickerControl.xaml.cs
new file mode 100644
index 00000000..c5068b7d
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerControl.xaml.cs
@@ -0,0 +1,419 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using ColorPickerWPF.Code;
+using UserControl = System.Windows.Controls.UserControl;
+
+namespace ColorPickerWPF
+{
+ ///
+ /// Interaction logic for ColorPickerControl.xaml
+ ///
+ public partial class ColorPickerControl : UserControl
+ {
+ public Color Color = Colors.White;
+
+ public delegate void ColorPickerChangeHandler(Color color);
+
+ public event ColorPickerChangeHandler OnPickColor;
+
+ internal List ColorSwatch1 = new List();
+ internal List ColorSwatch2 = new List();
+
+ public bool IsSettingValues = false;
+
+ protected const int NumColorsFirstSwatch = 39;
+ protected const int NumColorsSecondSwatch = 112;
+
+ internal static ColorPalette ColorPalette;
+
+
+ public ColorPickerControl()
+ {
+ InitializeComponent();
+
+ ColorPickerSwatch.ColorPickerControl = this;
+
+ // Load from file if possible
+ if (ColorPickerSettings.UsingCustomPalette && File.Exists(ColorPickerSettings.CustomPaletteFilename))
+ {
+ try
+ {
+ ColorPalette = ColorPalette.LoadFromXml(ColorPickerSettings.CustomPaletteFilename);
+ }
+ catch (Exception)
+ {
+ //ok
+ }
+ }
+
+ if (ColorPalette == null)
+ {
+ ColorPalette = new ColorPalette();
+ ColorPalette.InitializeDefaults();
+ }
+
+
+ ColorSwatch1.AddRange(ColorPalette.BuiltInColors.Take(NumColorsFirstSwatch).ToArray());
+
+ ColorSwatch2.AddRange(ColorPalette.BuiltInColors.Skip(NumColorsFirstSwatch).Take(NumColorsSecondSwatch).ToArray());
+
+ Swatch1.SwatchListBox.ItemsSource = ColorSwatch1;
+ Swatch2.SwatchListBox.ItemsSource = ColorSwatch2;
+
+ if (ColorPickerSettings.UsingCustomPalette)
+ {
+ CustomColorSwatch.SwatchListBox.ItemsSource = ColorPalette.CustomColors;
+ }
+ else
+ {
+ customColorsLabel.Visibility = Visibility.Collapsed;
+ CustomColorSwatch.Visibility = Visibility.Collapsed;
+ }
+
+
+ RSlider.Slider.Maximum = 255;
+ GSlider.Slider.Maximum = 255;
+ BSlider.Slider.Maximum = 255;
+ ASlider.Slider.Maximum = 255;
+ HSlider.Slider.Maximum = 360;
+ SSlider.Slider.Maximum = 1;
+ LSlider.Slider.Maximum = 1;
+
+
+ RSlider.Label.Content = "R";
+ RSlider.Slider.TickFrequency = 1;
+ RSlider.Slider.IsSnapToTickEnabled = true;
+ GSlider.Label.Content = "G";
+ GSlider.Slider.TickFrequency = 1;
+ GSlider.Slider.IsSnapToTickEnabled = true;
+ BSlider.Label.Content = "B";
+ BSlider.Slider.TickFrequency = 1;
+ BSlider.Slider.IsSnapToTickEnabled = true;
+
+ ASlider.Label.Content = "A";
+ ASlider.Slider.TickFrequency = 1;
+ ASlider.Slider.IsSnapToTickEnabled = true;
+
+ HSlider.Label.Content = "H";
+ HSlider.Slider.TickFrequency = 1;
+ HSlider.Slider.IsSnapToTickEnabled = true;
+ SSlider.Label.Content = "S";
+ //SSlider.Slider.TickFrequency = 1;
+ //SSlider.Slider.IsSnapToTickEnabled = true;
+ LSlider.Label.Content = "V";
+ //LSlider.Slider.TickFrequency = 1;
+ //LSlider.Slider.IsSnapToTickEnabled = true;
+
+
+ SetColor(Color);
+
+ }
+
+
+ public void SetColor(Color color)
+ {
+ Color = color;
+
+ CustomColorSwatch.CurrentColor = color;
+
+ IsSettingValues = true;
+
+ RSlider.Slider.Value = Color.R;
+ GSlider.Slider.Value = Color.G;
+ BSlider.Slider.Value = Color.B;
+ ASlider.Slider.Value = Color.A;
+
+ SSlider.Slider.Value = Color.GetSaturation();
+ LSlider.Slider.Value = Color.GetBrightness();
+ HSlider.Slider.Value = Color.GetHue();
+
+ ColorDisplayBorder.Background = new SolidColorBrush(Color);
+
+ IsSettingValues = false;
+ OnPickColor?.Invoke(color);
+ }
+
+ internal void CustomColorsChanged()
+ {
+ if (ColorPickerSettings.UsingCustomPalette)
+ {
+ SaveCustomPalette(ColorPickerSettings.CustomPaletteFilename);
+ }
+ }
+
+
+ protected void SampleImageClick(BitmapSource img, Point pos)
+ {
+ // https://social.msdn.microsoft.com/Forums/vstudio/en-US/82a5731e-e201-4aaf-8d4b-062b138338fe/getting-pixel-information-from-a-bitmapimage?forum=wpf
+
+ int stride = (int)img.Width * 4;
+ int size = (int)img.Height * stride;
+ byte[] pixels = new byte[(int)size];
+
+ img.CopyPixels(pixels, stride, 0);
+
+
+ // Get pixel
+ var x = (int)pos.X;
+ var y = (int)pos.Y;
+
+ int index = y * stride + 4 * x;
+
+ byte red = pixels[index];
+ byte green = pixels[index + 1];
+ byte blue = pixels[index + 2];
+ byte alpha = pixels[index + 3];
+
+ var color = Color.FromArgb(alpha, blue, green, red);
+ SetColor(color);
+ }
+
+
+ private void SampleImage_OnMouseDown(object sender, MouseButtonEventArgs e)
+ {
+ Mouse.Capture(this);
+
+ this.MouseMove += ColorPickerControl_MouseMove;
+ this.MouseUp += ColorPickerControl_MouseUp;
+ }
+ private void SampleImage2_OnMouseDown(object sender, MouseButtonEventArgs e)
+ {
+ Mouse.Capture(null);
+
+ this.MouseMove += ColorPickerControl2_MouseMove;
+ this.MouseUp += ColorPickerControl2_MouseUp;
+ }
+
+ private void ColorPickerControl_MouseMove(object sender, MouseEventArgs e)
+ {
+ var pos = e.GetPosition(SampleImage);
+ var img = SampleImage.Source as BitmapSource;
+
+ if (pos.X > 0 && pos.Y > 0 && pos.X < img.PixelWidth && pos.Y < img.PixelHeight)
+ SampleImageClick(img, pos);
+ }
+ private void ColorPickerControl2_MouseMove(object sender, MouseEventArgs e)
+ {
+ var pos = e.GetPosition(SampleImage2);
+ var img = SampleImage2.Source as BitmapSource;
+
+ if (pos.X > 0 && pos.Y > 0 && pos.X < img.PixelWidth && pos.Y < img.PixelHeight)
+ SampleImageClick(img, pos);
+ }
+
+ private void ColorPickerControl_MouseUp(object sender, MouseButtonEventArgs e)
+ {
+ Mouse.Capture(null);
+ this.MouseMove -= ColorPickerControl_MouseMove;
+ this.MouseUp -= ColorPickerControl_MouseUp;
+ }
+ private void ColorPickerControl2_MouseUp(object sender, MouseButtonEventArgs e)
+ {
+ Mouse.Capture(null);
+ this.MouseMove -= ColorPickerControl2_MouseMove;
+ this.MouseUp -= ColorPickerControl2_MouseUp;
+ }
+
+ private void Swatch_OnOnPickColor(Color color)
+ {
+ SetColor(color);
+ }
+
+ private void HSlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var s = Color.GetSaturation();
+ var l = Color.GetBrightness();
+ var h = (float)value;
+ var a = (int)ASlider.Slider.Value;
+ Color = Util.FromAhsb(a, h, s, l);
+
+ SetColor(Color);
+ }
+ }
+
+
+
+
+ private void RSlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var val = (byte)value;
+ Color.R = val;
+ SetColor(Color);
+ }
+ }
+
+ private void GSlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var val = (byte)value;
+ Color.G = val;
+ SetColor(Color);
+ }
+ }
+
+ private void BSlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var val = (byte)value;
+ Color.B = val;
+ SetColor(Color);
+ }
+ }
+
+ private void ASlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var val = (byte)value;
+ Color.A = val;
+ SetColor(Color);
+ }
+ }
+
+ private void SSlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var s = (float)value;
+ var l = Color.GetBrightness();
+ var h = Color.GetHue();
+ var a = (int)ASlider.Slider.Value;
+ Color = Util.FromAhsb(a, h, s, l);
+
+ SetColor(Color);
+ }
+
+ }
+
+ private void PickerHueSlider_OnValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ {
+ UpdateImageForHSV();
+ }
+
+
+ private void UpdateImageForHSV()
+ {
+
+ //var hueChange = (int)((PickerHueSlider.Value / 360.0) * 240);
+ var sliderHue = (float)PickerHueSlider.Value;
+
+
+ //var colorPickerImage = System.IO.Path.Combine(Environment.CurrentDirectory, @"/Resources/colorpicker1.png");
+ var img =
+ new BitmapImage(new Uri("pack://application:,,,/Resources/colorpicker2.png",
+ UriKind.Absolute));
+
+ var writableImage = BitmapFactory.ConvertToPbgra32Format(img);
+
+ if (sliderHue <= 0f || sliderHue >= 360f)
+ {
+ // No hue change just return
+ SampleImage2.Source = img;
+ return;
+ }
+
+ using (var context = writableImage.GetBitmapContext())
+ {
+ long numPixels = img.PixelWidth * img.PixelHeight;
+
+ for (int x = 0; x < img.PixelWidth; x++)
+ {
+ for (int y = 0; y < img.PixelHeight; y++)
+ {
+ var pixel = writableImage.GetPixel(x, y);
+
+ var newHue = (float)(sliderHue + pixel.GetHue());
+ if (newHue >= 360)
+ newHue -= 360;
+
+ var color = Util.FromAhsb((int)255,
+ newHue, pixel.GetSaturation(), pixel.GetBrightness());
+
+ writableImage.SetPixel(x, y, color);
+ }
+ }
+ }
+
+
+
+ SampleImage2.Source = writableImage;
+ }
+
+ private void LSlider_OnOnValueChanged(double value)
+ {
+ if (!IsSettingValues)
+ {
+ var s = Color.GetSaturation();
+ var l = (float)value;
+ var h = Color.GetHue();
+ var a = (int)ASlider.Slider.Value;
+ Color = Util.FromAhsb(a, h, s, l);
+
+ SetColor(Color);
+ }
+ }
+
+
+ public void SaveCustomPalette(string filename)
+ {
+ var colors = CustomColorSwatch.GetColors();
+ ColorPalette.CustomColors = colors;
+
+ try
+ {
+ ColorPalette.SaveToXml(filename);
+ }
+ catch (Exception)
+ {
+ //ok
+ }
+ }
+
+ public void LoadCustomPalette(string filename)
+ {
+ if (File.Exists(filename))
+ {
+ try
+ {
+ ColorPalette = ColorPalette.LoadFromXml(filename);
+
+ CustomColorSwatch.SwatchListBox.ItemsSource = ColorPalette.CustomColors.ToList();
+
+ // Do regular one too
+
+ ColorSwatch1.Clear();
+ ColorSwatch2.Clear();
+ ColorSwatch1.AddRange(ColorPalette.BuiltInColors.Take(NumColorsFirstSwatch).ToArray());
+ ColorSwatch2.AddRange(ColorPalette.BuiltInColors.Skip(NumColorsFirstSwatch).Take(NumColorsSecondSwatch).ToArray());
+ Swatch1.SwatchListBox.ItemsSource = ColorSwatch1;
+ Swatch2.SwatchListBox.ItemsSource = ColorSwatch2;
+
+ }
+ catch (Exception)
+ {
+ //ok
+ }
+
+ }
+ }
+
+
+ public void LoadDefaultCustomPalette()
+ {
+ LoadCustomPalette(Path.Combine(ColorPickerSettings.CustomColorsDirectory, ColorPickerSettings.CustomColorsFilename));
+ }
+
+ }
+}
diff --git a/FModel/Forms/ColorPicker/ColorPickerSettings.cs b/FModel/Forms/ColorPicker/ColorPickerSettings.cs
new file mode 100644
index 00000000..9776d520
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerSettings.cs
@@ -0,0 +1,15 @@
+using System;
+using System.IO;
+
+namespace ColorPickerWPF
+{
+ public static class ColorPickerSettings
+ {
+ internal static bool UsingCustomPalette;
+ public static string CustomColorsFilename = "CustomColorPalette.xml";
+ public static string CustomColorsDirectory = Environment.CurrentDirectory;
+
+ public static string CustomPaletteFilename { get { return Path.Combine(CustomColorsDirectory, CustomColorsFilename); } }
+
+ }
+}
diff --git a/FModel/Forms/ColorPicker/ColorPickerSwatch.xaml b/FModel/Forms/ColorPicker/ColorPickerSwatch.xaml
new file mode 100644
index 00000000..d9b2b15c
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerSwatch.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/ColorPicker/ColorPickerSwatch.xaml.cs b/FModel/Forms/ColorPicker/ColorPickerSwatch.xaml.cs
new file mode 100644
index 00000000..c990dc80
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerSwatch.xaml.cs
@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using ColorPickerWPF.Code;
+using UserControl = System.Windows.Controls.UserControl;
+
+namespace ColorPickerWPF
+{
+ ///
+ /// Interaction logic for ColorPickerSwatch.xaml
+ ///
+ public partial class ColorPickerSwatch : UserControl
+ {
+ public delegate void ColorSwatchPickHandler(Color color);
+
+ public static ColorPickerControl ColorPickerControl { get; set; }
+
+ public event ColorSwatchPickHandler OnPickColor;
+
+ public bool Editable { get; set; }
+ public Color CurrentColor = Colors.White;
+
+ public ColorPickerSwatch()
+ {
+ InitializeComponent();
+ }
+
+
+ private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
+ {
+ var border = (sender as Border);
+ if (border == null)
+ return;
+
+ if (Editable && Keyboard.IsKeyDown(Key.LeftCtrl))
+ {
+ border.Background = new SolidColorBrush(CurrentColor);
+
+ var data = border.DataContext as ColorSwatchItem;
+ if (data != null)
+ {
+ data.Color = CurrentColor;
+ data.HexString = CurrentColor.ToHexString();
+ }
+
+ if (ColorPickerControl != null)
+ {
+ ColorPickerControl.CustomColorsChanged();
+ }
+ }
+ else
+ {
+ var color = border.Background as SolidColorBrush;
+ OnPickColor?.Invoke(color.Color);
+ }
+
+
+ }
+
+
+ internal List GetColors()
+ {
+ var results = new List();
+
+ var shit = SwatchListBox.Items;
+
+ var colors = SwatchListBox.ItemsSource as List;
+ if (colors != null)
+ {
+ return colors;
+ }
+
+ return results;
+ }
+ }
+}
diff --git a/FModel/Forms/ColorPicker/ColorPickerWindow.xaml b/FModel/Forms/ColorPicker/ColorPickerWindow.xaml
new file mode 100644
index 00000000..11f11e2b
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerWindow.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/ColorPicker/ColorPickerWindow.xaml.cs b/FModel/Forms/ColorPicker/ColorPickerWindow.xaml.cs
new file mode 100644
index 00000000..9abf7e19
--- /dev/null
+++ b/FModel/Forms/ColorPicker/ColorPickerWindow.xaml.cs
@@ -0,0 +1,100 @@
+using System.Windows;
+using System.Windows.Media;
+using ColorPickerWPF.Code;
+
+namespace ColorPickerWPF
+{
+ ///
+ /// Interaction logic for ColorPickerWindow.xaml
+ ///
+ public partial class ColorPickerWindow : Window
+ {
+ protected readonly int WidthMax = 574;
+ protected readonly int WidthMin = 342;
+ protected bool SimpleMode { get; set; }
+
+ public ColorPickerWindow()
+ {
+ InitializeComponent();
+ }
+
+ public static bool ShowDialog(out Color color, ColorPickerDialogOptions flags = ColorPickerDialogOptions.None, ColorPickerControl.ColorPickerChangeHandler customPreviewEventHandler = null)
+ {
+ if ((flags & ColorPickerDialogOptions.LoadCustomPalette) == ColorPickerDialogOptions.LoadCustomPalette)
+ {
+ ColorPickerSettings.UsingCustomPalette = true;
+ }
+
+ var instance = new ColorPickerWindow();
+ color = instance.ColorPicker.Color;
+
+ if ((flags & ColorPickerDialogOptions.SimpleView) == ColorPickerDialogOptions.SimpleView)
+ {
+ instance.ToggleSimpleAdvancedView();
+ }
+
+ if (ColorPickerSettings.UsingCustomPalette)
+ {
+ instance.ColorPicker.LoadDefaultCustomPalette();
+ }
+
+ if (customPreviewEventHandler != null)
+ {
+ instance.ColorPicker.OnPickColor += customPreviewEventHandler;
+ }
+
+ var result = instance.ShowDialog();
+ if (result.HasValue && result.Value)
+ {
+ color = instance.ColorPicker.Color;
+ return true;
+ }
+
+ return false;
+ }
+
+ private void OKButton_Click(object sender, RoutedEventArgs e)
+ {
+ DialogResult = true;
+ Hide();
+ }
+
+ private void CloseButton_Click(object sender, RoutedEventArgs e)
+ {
+ DialogResult = false;
+ Hide();
+ }
+
+ private void MinMaxViewButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (SimpleMode)
+ {
+ SimpleMode = false;
+ MinMaxViewButton.Content = "<< Simple";
+ Width = WidthMax;
+ }
+ else
+ {
+ SimpleMode = true;
+ MinMaxViewButton.Content = "Advanced >>";
+ Width = WidthMin;
+ }
+ }
+
+ public void ToggleSimpleAdvancedView()
+ {
+ if (SimpleMode)
+ {
+ SimpleMode = false;
+ MinMaxViewButton.Content = "<< Simple";
+ Width = WidthMax;
+ }
+ else
+ {
+ SimpleMode = true;
+ MinMaxViewButton.Content = "Advanced >>";
+ Width = WidthMin;
+ }
+ }
+ }
+}
diff --git a/FModel/Forms/ColorPicker/SliderRow.xaml b/FModel/Forms/ColorPicker/SliderRow.xaml
new file mode 100644
index 00000000..8ec0478a
--- /dev/null
+++ b/FModel/Forms/ColorPicker/SliderRow.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/ColorPicker/SliderRow.xaml.cs b/FModel/Forms/ColorPicker/SliderRow.xaml.cs
new file mode 100644
index 00000000..15252646
--- /dev/null
+++ b/FModel/Forms/ColorPicker/SliderRow.xaml.cs
@@ -0,0 +1,59 @@
+using System.Windows;
+using System.Windows.Controls;
+
+namespace ColorPickerWPF
+{
+ ///
+ /// Interaction logic for SliderRow.xaml
+ ///
+ public partial class SliderRow : UserControl
+ {
+ public delegate void SliderRowValueChangedHandler(double value);
+
+ public event SliderRowValueChangedHandler OnValueChanged;
+
+ public string FormatString { get; set; }
+
+ protected bool UpdatingValues = false;
+
+ public SliderRow()
+ {
+ FormatString = "F2";
+
+ InitializeComponent();
+ }
+
+ private void Slider_OnValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ {
+ // Set textbox
+ var value = Slider.Value;
+
+ if (!UpdatingValues)
+ {
+ UpdatingValues = true;
+ TextBox.Text = value.ToString(FormatString);
+ OnValueChanged?.Invoke(value);
+ UpdatingValues = false;
+ }
+ }
+
+ private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!UpdatingValues)
+ {
+ var text = TextBox.Text;
+ bool ok = false;
+ double parsedValue = 0;
+
+ ok = double.TryParse(text, out parsedValue);
+ if (ok)
+ {
+ UpdatingValues = true;
+ Slider.Value = parsedValue;
+ OnValueChanged?.Invoke(parsedValue);
+ UpdatingValues = false;
+ }
+ }
+ }
+ }
+}
diff --git a/FModel/Forms/FModel_About.xaml b/FModel/Forms/FModel_About.xaml
new file mode 100644
index 00000000..c370fedb
--- /dev/null
+++ b/FModel/Forms/FModel_About.xaml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/FModel_About.xaml.cs b/FModel/Forms/FModel_About.xaml.cs
new file mode 100644
index 00000000..1dbefdb4
--- /dev/null
+++ b/FModel/Forms/FModel_About.xaml.cs
@@ -0,0 +1,25 @@
+using System.Windows;
+using System.Windows.Media;
+using System.Windows.Navigation;
+
+namespace FModel.Forms
+{
+ ///
+ /// Logique d'interaction pour FModel_About.xaml
+ ///
+ public partial class FModel_About : Window
+ {
+ public FModel_About()
+ {
+ InitializeComponent();
+ this.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+
+ AboutTitle_Lbl.Content += " " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5);
+ }
+
+ private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
+ {
+ System.Diagnostics.Process.Start(e.Uri.AbsoluteUri);
+ }
+ }
+}
diff --git a/FModel/Forms/FModel_CustomMB.xaml b/FModel/Forms/FModel_CustomMB.xaml
new file mode 100644
index 00000000..fa0e4f5e
--- /dev/null
+++ b/FModel/Forms/FModel_CustomMB.xaml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/FModel_CustomMB.xaml.cs b/FModel/Forms/FModel_CustomMB.xaml.cs
new file mode 100644
index 00000000..ca68b44d
--- /dev/null
+++ b/FModel/Forms/FModel_CustomMB.xaml.cs
@@ -0,0 +1,234 @@
+using FModel.Methods.Utilities;
+using System.Drawing;
+using System.Windows;
+using System.Windows.Media;
+
+namespace FModel.Forms
+{
+ ///
+ /// Logique d'interaction pour FModel_CustomMB.xaml
+ ///
+ internal partial class FModel_CustomMB : Window
+ {
+ internal string Caption
+ {
+ get
+ {
+ return Title;
+ }
+ set
+ {
+ Title = value;
+ }
+ }
+
+ internal string Message
+ {
+ get
+ {
+ return TextBlock_Message.Text;
+ }
+ set
+ {
+ TextBlock_Message.Text = value;
+ }
+ }
+
+ internal string OkButtonText
+ {
+ get
+ {
+ return Label_Ok.Content.ToString();
+ }
+ set
+ {
+ Label_Ok.Content = value.TryAddKeyboardAccellerator();
+ }
+ }
+
+ internal string CancelButtonText
+ {
+ get
+ {
+ return Label_Cancel.Content.ToString();
+ }
+ set
+ {
+ Label_Cancel.Content = value.TryAddKeyboardAccellerator();
+ }
+ }
+
+ internal string YesButtonText
+ {
+ get
+ {
+ return Label_Yes.Content.ToString();
+ }
+ set
+ {
+ Label_Yes.Content = value.TryAddKeyboardAccellerator();
+ }
+ }
+
+ internal string NoButtonText
+ {
+ get
+ {
+ return Label_No.Content.ToString();
+ }
+ set
+ {
+ Label_No.Content = value.TryAddKeyboardAccellerator();
+ }
+ }
+
+ public MessageBoxResult Result { get; set; }
+
+ internal FModel_CustomMB(string message)
+ {
+ InitializeComponent();
+ this.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+
+ Message = message;
+ Image_MessageBox.Visibility = System.Windows.Visibility.Collapsed;
+ DisplayButtons(MessageBoxButton.OK);
+ }
+
+ internal FModel_CustomMB(string message, string caption)
+ {
+ InitializeComponent();
+
+ Message = message;
+ Caption = caption;
+ Image_MessageBox.Visibility = System.Windows.Visibility.Collapsed;
+ DisplayButtons(MessageBoxButton.OK);
+ }
+
+ internal FModel_CustomMB(string message, string caption, MessageBoxButton button)
+ {
+ InitializeComponent();
+
+ Message = message;
+ Caption = caption;
+ Image_MessageBox.Visibility = System.Windows.Visibility.Collapsed;
+
+ DisplayButtons(button);
+ }
+
+ internal FModel_CustomMB(string message, string caption, MessageBoxImage image)
+ {
+ InitializeComponent();
+
+ Message = message;
+ Caption = caption;
+ DisplayImage(image);
+ DisplayButtons(MessageBoxButton.OK);
+ }
+
+ internal FModel_CustomMB(string message, string caption, MessageBoxButton button, MessageBoxImage image)
+ {
+ InitializeComponent();
+
+ Message = message;
+ Caption = caption;
+ Image_MessageBox.Visibility = System.Windows.Visibility.Collapsed;
+
+ DisplayButtons(button);
+ DisplayImage(image);
+ }
+
+ private void DisplayButtons(MessageBoxButton button)
+ {
+ switch (button)
+ {
+ case MessageBoxButton.OKCancel:
+ // Hide all but OK, Cancel
+ Button_OK.Visibility = System.Windows.Visibility.Visible;
+ Button_OK.Focus();
+ Button_Cancel.Visibility = System.Windows.Visibility.Visible;
+
+ Button_Yes.Visibility = System.Windows.Visibility.Collapsed;
+ Button_No.Visibility = System.Windows.Visibility.Collapsed;
+ break;
+ case MessageBoxButton.YesNo:
+ // Hide all but Yes, No
+ Button_Yes.Visibility = System.Windows.Visibility.Visible;
+ Button_Yes.Focus();
+ Button_No.Visibility = System.Windows.Visibility.Visible;
+
+ Button_OK.Visibility = System.Windows.Visibility.Collapsed;
+ Button_Cancel.Visibility = System.Windows.Visibility.Collapsed;
+ break;
+ case MessageBoxButton.YesNoCancel:
+ // Hide only OK
+ Button_Yes.Visibility = System.Windows.Visibility.Visible;
+ Button_Yes.Focus();
+ Button_No.Visibility = System.Windows.Visibility.Visible;
+ Button_Cancel.Visibility = System.Windows.Visibility.Visible;
+
+ Button_OK.Visibility = System.Windows.Visibility.Collapsed;
+ break;
+ default:
+ // Hide all but OK
+ Button_OK.Visibility = System.Windows.Visibility.Visible;
+ Button_OK.Focus();
+
+ Button_Yes.Visibility = System.Windows.Visibility.Collapsed;
+ Button_No.Visibility = System.Windows.Visibility.Collapsed;
+ Button_Cancel.Visibility = System.Windows.Visibility.Collapsed;
+ break;
+ }
+ }
+
+ private void DisplayImage(MessageBoxImage image)
+ {
+ Icon icon;
+
+ switch (image)
+ {
+ case MessageBoxImage.Exclamation: // Enumeration value 48 - also covers "Warning"
+ icon = SystemIcons.Exclamation;
+ break;
+ case MessageBoxImage.Error: // Enumeration value 16, also covers "Hand" and "Stop"
+ icon = SystemIcons.Hand;
+ break;
+ case MessageBoxImage.Information: // Enumeration value 64 - also covers "Asterisk"
+ icon = SystemIcons.Information;
+ break;
+ case MessageBoxImage.Question:
+ icon = SystemIcons.Question;
+ break;
+ default:
+ icon = SystemIcons.Information;
+ break;
+ }
+
+ Image_MessageBox.Source = icon.ToImageSource();
+ Image_MessageBox.Visibility = System.Windows.Visibility.Visible;
+ }
+
+ private void Button_OK_Click(object sender, RoutedEventArgs e)
+ {
+ Result = MessageBoxResult.OK;
+ Close();
+ }
+
+ private void Button_Cancel_Click(object sender, RoutedEventArgs e)
+ {
+ Result = MessageBoxResult.Cancel;
+ Close();
+ }
+
+ private void Button_Yes_Click(object sender, RoutedEventArgs e)
+ {
+ Result = MessageBoxResult.Yes;
+ Close();
+ }
+
+ private void Button_No_Click(object sender, RoutedEventArgs e)
+ {
+ Result = MessageBoxResult.No;
+ Close();
+ }
+ }
+}
diff --git a/FModel/Forms/FModel_ImagesMerger.xaml b/FModel/Forms/FModel_ImagesMerger.xaml
new file mode 100644
index 00000000..e4bcd6db
--- /dev/null
+++ b/FModel/Forms/FModel_ImagesMerger.xaml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/FModel_ImagesMerger.xaml.cs b/FModel/Forms/FModel_ImagesMerger.xaml.cs
new file mode 100644
index 00000000..22091367
--- /dev/null
+++ b/FModel/Forms/FModel_ImagesMerger.xaml.cs
@@ -0,0 +1,255 @@
+using FModel.Methods.Utilities;
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Forms
+{
+ ///
+ /// Logique d'interaction pour FModel_ImagesMerger.xaml
+ ///
+ public partial class FModel_ImagesMerger : Window
+ {
+ private static List _imagePath { get; set; }
+
+ public FModel_ImagesMerger()
+ {
+ InitializeComponent();
+ }
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ ImagesListBox.Items.Clear();
+ }
+
+ private async void UpdatePreview(object sender, RoutedEventArgs e)
+ {
+ if (MergerPreview_Image.Source != null)
+ {
+ await UpdateMergerPreview();
+ }
+ }
+
+ private async Task UpdateMergerPreview()
+ {
+ AddImages_Button.IsEnabled = false;
+ RemoveImage_Button.IsEnabled = false;
+ ClearImages_Button.IsEnabled = false;
+ ImagesPerRow_Slider.IsEnabled = false;
+ OpenImage_Button.IsEnabled = false;
+ SaveImage_Button.IsEnabled = false;
+
+ if ((_imagePath != null && _imagePath.Count > 0) || ImagesListBox.Items.Count > 0)
+ {
+ _imagePath = new List();
+ for (int i = 0; i < ImagesListBox.Items.Count; ++i)
+ {
+ _imagePath.Add(((ListBoxItem)ImagesListBox.Items[i]).ContentStringFormat);
+ }
+ }
+ int imageCount = _imagePath.Count;
+ int numperrow = Convert.ToInt32(ImagesPerRow_Slider.Value);
+
+ await Task.Run(() =>
+ {
+ DrawingVisual drawingVisual = new DrawingVisual();
+ using (DrawingContext drawingContext = drawingVisual.RenderOpen())
+ {
+ //INITIALIZATION
+ drawingContext.DrawRectangle(Brushes.Transparent, null, new Rect(new Point(0, 0), new Size(515, 515)));
+
+ var w = 520 * numperrow;
+ if (imageCount * 520 < 520 * numperrow)
+ {
+ w = imageCount * 520;
+ }
+
+ int h = int.Parse(Math.Ceiling(double.Parse(imageCount.ToString()) / numperrow).ToString(CultureInfo.InvariantCulture)) * 520;
+
+ int num = 1;
+ int curW = 0;
+ int curH = 0;
+ int maxHeight = 0;
+
+ for (int i = 0; i < imageCount; i++)
+ {
+ int percentage = (i + 1) * 100 / imageCount;
+
+ BitmapImage source = new BitmapImage(new Uri(_imagePath[i]));
+ source.DecodePixelWidth = 515;
+
+ double width = source.Width;
+ double height = source.Height;
+ if (height > maxHeight) { maxHeight = Convert.ToInt32(height); }
+
+ drawingContext.DrawImage(source, new Rect(new Point(curW, curH), new Size(width, height)));
+ if (num % numperrow == 0)
+ {
+ curW = 0;
+ curH += maxHeight + 5;
+ num += 1;
+
+ maxHeight = 0; //reset max height for each new row
+ }
+ else
+ {
+ curW += Convert.ToInt32(width) + 5;
+ num += 1;
+ }
+ }
+ }
+
+ if (drawingVisual != null)
+ {
+ RenderTargetBitmap RTB = new RenderTargetBitmap((int)Math.Floor(drawingVisual.DescendantBounds.Width), (int)Math.Floor(drawingVisual.DescendantBounds.Height), 96, 96, PixelFormats.Pbgra32);
+ RTB.Render(drawingVisual);
+ RTB.Freeze(); //We freeze to apply the RTB to our imagesource from the UI Thread
+
+ this.Dispatcher.InvokeAsync(() =>
+ {
+ MergerPreview_Image.Source = BitmapFrame.Create(RTB); //thread safe and fast af
+ });
+ }
+
+ }).ContinueWith(TheTask =>
+ {
+ TasksUtility.TaskCompleted(TheTask.Exception);
+ });
+
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ AddImages_Button.IsEnabled = true;
+ RemoveImage_Button.IsEnabled = true;
+ ClearImages_Button.IsEnabled = true;
+ ImagesPerRow_Slider.IsEnabled = true;
+ OpenImage_Button.IsEnabled = true;
+ SaveImage_Button.IsEnabled = true;
+ }
+
+ private async void AddImages_Button_Click(object sender, RoutedEventArgs e)
+ {
+ OpenFileDialog openFiledialog = new OpenFileDialog();
+ openFiledialog.Title = "Choose your images";
+ openFiledialog.InitialDirectory = FProp.Default.FOutput_Path + "\\Icons\\";
+ openFiledialog.Multiselect = true;
+ openFiledialog.Filter = "PNG Files (*.png)|*.png|All Files (*.*)|*.*";
+ if (openFiledialog.ShowDialog() == true)
+ {
+ AddFiles(openFiledialog.FileNames);
+ await UpdateMergerPreview();
+ }
+ }
+
+ private void AddFiles(string[] files)
+ {
+ if (files.Count() > 0)
+ {
+ foreach (string file in files)
+ {
+ ListBoxItem itm = new ListBoxItem();
+ itm.ContentStringFormat = file;
+ itm.Content = Path.GetFileNameWithoutExtension(file);
+
+ ImagesListBox.Items.Add(itm);
+ }
+ }
+ }
+
+ private async void RemoveImage_Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (ImagesListBox.Items.Count > 0 && ImagesListBox.SelectedItems.Count > 0)
+ {
+ for (int i = ImagesListBox.SelectedItems.Count - 1; i >= 0; --i)
+ {
+ ImagesListBox.Items.Remove(ImagesListBox.SelectedItems[i]);
+ }
+
+ await UpdateMergerPreview();
+ }
+ }
+
+ private void ClearImages_Button_Click(object sender, RoutedEventArgs e)
+ {
+ ImagesListBox.Items.Clear();
+ MergerPreview_Image.Source = null;
+ }
+
+ private void OpenImage_Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (MergerPreview_Image.Source != null)
+ {
+ if (!FormsUtility.IsWindowOpen("Merged Image"))
+ {
+ Window win = new Window();
+ win.Title = "Merged Image";
+ win.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ win.WindowStartupLocation = WindowStartupLocation.CenterScreen;
+ win.Width = MergerPreview_Image.Source.Width;
+ win.Height = MergerPreview_Image.Source.Height;
+ if (MergerPreview_Image.Source.Height > 1000)
+ {
+ win.WindowState = WindowState.Maximized;
+ }
+
+ DockPanel dockPanel = new DockPanel
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+
+ Image img = new Image();
+ img.UseLayoutRounding = true;
+ img.Source = MergerPreview_Image.Source;
+ dockPanel.Children.Add(img);
+
+ win.Content = dockPanel;
+ win.Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Merged Image").Focus(); }
+ }
+ }
+
+ private void SaveImage_Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (MergerPreview_Image.Source != null)
+ {
+ SaveFileDialog saveFileDialog = new SaveFileDialog();
+ saveFileDialog.Title = "Save Image";
+ saveFileDialog.FileName = "Merger";
+ saveFileDialog.InitialDirectory = FProp.Default.FOutput_Path;
+ saveFileDialog.Filter = "PNG Files (*.png)|*.png";
+ if (saveFileDialog.ShowDialog() == true)
+ {
+ string path = saveFileDialog.FileName;
+ using (var fileStream = new FileStream(path, FileMode.Create))
+ {
+ PngBitmapEncoder encoder = new PngBitmapEncoder();
+ encoder.Frames.Add(BitmapFrame.Create((BitmapSource)MergerPreview_Image.Source));
+ encoder.Save(fileStream);
+
+ if (File.Exists(path))
+ {
+ new UpdateMyConsole(System.IO.Path.GetFileNameWithoutExtension(path), CColors.Blue).Append();
+ new UpdateMyConsole(" successfully saved", CColors.White, true).Append();
+ }
+ else //just in case
+ {
+ new UpdateMyConsole("Bruh moment\nCouldn't save ", CColors.White).Append();
+ new UpdateMyConsole(System.IO.Path.GetFileNameWithoutExtension(path), CColors.Blue, true).Append();
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FModel/Forms/FModel_SearchFiles.xaml b/FModel/Forms/FModel_SearchFiles.xaml
new file mode 100644
index 00000000..4794843c
--- /dev/null
+++ b/FModel/Forms/FModel_SearchFiles.xaml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/FModel_SearchFiles.xaml.cs b/FModel/Forms/FModel_SearchFiles.xaml.cs
new file mode 100644
index 00000000..44ccfc81
--- /dev/null
+++ b/FModel/Forms/FModel_SearchFiles.xaml.cs
@@ -0,0 +1,269 @@
+using FModel.Methods;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Threading.Tasks;
+using System.Windows;
+using PakReader;
+using FModel.Methods.Utilities;
+using System.IO;
+using FModel.Methods.Assets;
+using FProp = FModel.Properties.Settings;
+using System;
+
+namespace FModel.Forms
+{
+ ///
+ /// Logique d'interaction pour FModel_SearchFiles.xaml
+ ///
+ public partial class FModel_SearchFiles : Window
+ {
+ private static List FileNames { get; set; }
+
+ public class FileInfo
+ {
+ public string Name { get; set; }
+ public string Extension { get; set; }
+ public string PAK { get; set; }
+ }
+
+ public class GridViewItem : INotifyPropertyChanged
+ {
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected void OnPropertyChanged(string name)
+ {
+ var handler = PropertyChanged;
+ if (handler != null)
+ {
+ handler(this, new PropertyChangedEventArgs(name));
+ }
+ }
+ }
+
+ public FModel_SearchFiles()
+ {
+ InitializeComponent();
+ }
+
+ private async void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ if (PAKEntries.PAKToDisplay != null)
+ {
+ FilterTextBox_Search.IsReadOnly = true;
+ FileNames = new List();
+ await PopulateDataGrid();
+ DataGrid_Search.ItemsSource = FileNames;
+ FilterTextBox_Search.IsReadOnly = false;
+ }
+ }
+
+ private static async Task PopulateDataGrid()
+ {
+ Dictionary IfExistChecker = new Dictionary();
+ await Task.Run(() =>
+ {
+ if (!string.IsNullOrEmpty(FWindow.FCurrentPAK))
+ {
+ FillList(PAKEntries.PAKToDisplay[FWindow.FCurrentPAK], IfExistChecker);
+ }
+ else
+ {
+ foreach (FPakEntry[] PAKsFileInfos in PAKEntries.PAKToDisplay.Values)
+ {
+ FillList(PAKsFileInfos, IfExistChecker);
+ }
+ }
+ }).ContinueWith(TheTask =>
+ {
+ TasksUtility.TaskCompleted(TheTask.Exception);
+ });
+ }
+
+ private static void FillList(FPakEntry[] EntryArray, Dictionary ExistChecker)
+ {
+ foreach (FPakEntry entry in EntryArray)
+ {
+ string filename = entry.Name;
+ string ext = Path.GetExtension(entry.Name);
+ string pak = Path.GetFileName(AssetEntries.AssetEntriesDict[entry.Name].Name);
+
+ if (filename.EndsWith(".uasset") || filename.EndsWith(".uexp") || filename.EndsWith(".ubulk"))
+ {
+ filename = filename.Substring(0, filename.LastIndexOf('.'));
+ if (AssetEntries.ArraySearcher.ContainsKey(filename + ".uexp"))
+ {
+ ext += " .uexp";
+ }
+ if (AssetEntries.ArraySearcher.ContainsKey(filename + ".ubulk"))
+ {
+ ext += " .ubulk";
+ }
+ filename += ".uasset";
+ }
+
+ if (!ExistChecker.ContainsKey(filename))
+ {
+ ExistChecker.Add(filename, pak);
+
+ FileNames.Add(new FileInfo
+ {
+ Name = filename,
+ Extension = ext,
+ PAK = pak
+ });
+ }
+ }
+ }
+
+ private async void FilterTextBox_Search_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
+ {
+ if (PAKEntries.PAKToDisplay != null && FileNames != null)
+ {
+ List filtered = new List();
+ string[] filters = FilterTextBox_Search.Text.Trim().Split(' ');
+
+ await Task.Run(() =>
+ {
+ foreach (FileInfo fi in FileNames)
+ {
+ bool checkSearch = false;
+ if (filters.Length > 1)
+ {
+ foreach (string filter in filters)
+ {
+ checkSearch = ListBoxUtility.CaseInsensitiveContains(fi.Name, filter);
+ if (!checkSearch) { break; }
+ }
+ }
+ else { checkSearch = ListBoxUtility.CaseInsensitiveContains(fi.Name, filters[0]); }
+
+ if (checkSearch)
+ {
+ filtered.Add(fi);
+ }
+ }
+ });
+
+ DataGrid_Search.ItemsSource = filtered;
+ }
+ }
+
+ #region RIGHT CLICK
+ private void RC_Copy_FPath_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+
+ Clipboard.SetText(selectedName.Substring(1));
+ }
+ }
+ private void RC_Copy_FName_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+
+ Clipboard.SetText(Path.GetFileName(selectedName));
+ }
+ }
+ private void RC_Copy_FPath_NoExt_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+
+ Clipboard.SetText(FoldersUtility.GetFullPathWithoutExtension(selectedName).Substring(1));
+ }
+ }
+ private void RC_Copy_FName_NoExt_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+
+ Clipboard.SetText(Path.GetFileNameWithoutExtension(selectedName));
+ }
+ }
+ private void RC_Properties_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+ if (selectedName.EndsWith(".uasset"))
+ {
+ selectedName = selectedName.Substring(0, selectedName.LastIndexOf('.'));
+ }
+
+ FWindow.FCurrentAsset = selectedName;
+ AssetInformations.OpenAssetInfos(true);
+ }
+ }
+ private void GoTo_Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+ if (selectedName.EndsWith(".uasset"))
+ {
+ selectedName = selectedName.Substring(0, selectedName.LastIndexOf('.'));
+ }
+
+ FWindow.FCurrentAsset = selectedName;
+ TreeViewUtility.JumpToFolder(selectedName.Substring(1, selectedName.LastIndexOf("/") - 1));
+ FWindow.FMain.ListBox_Main.SelectedValue = selectedName.Substring(selectedName.LastIndexOf("/") + 1);
+ Close();
+ }
+ }
+ private void RC_ExportData_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataGrid_Search.SelectedIndex >= 0)
+ {
+ FileInfo item = (FileInfo)DataGrid_Search.SelectedItem;
+ string selectedName = item.Name;
+ if (selectedName.EndsWith(".uasset"))
+ {
+ selectedName = selectedName.Substring(0, selectedName.LastIndexOf('.'));
+ }
+
+ PakReader.PakReader reader = AssetsUtility.GetPakReader(selectedName);
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries(selectedName);
+ foreach (FPakEntry entry in entriesList)
+ {
+ string path = FProp.Default.FOutput_Path + "\\Exports\\" + entry.Name;
+ string pWExt = FoldersUtility.GetFullPathWithoutExtension(entry.Name);
+ string subfolders = pWExt.Substring(0, pWExt.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase));
+
+ Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Exports\\" + subfolders);
+ Stream stream = reader.GetPackageStream(entry);
+ using (var fStream = File.OpenWrite(path))
+ using (stream)
+ {
+ stream.CopyTo(fStream);
+ }
+
+ if (File.Exists(path))
+ {
+ new UpdateMyConsole(Path.GetFileName(path), CColors.Blue).Append();
+ new UpdateMyConsole(" successfully exported", CColors.White, true).Append();
+ }
+ else //just in case
+ {
+ new UpdateMyConsole("Bruh moment\nCouldn't export ", CColors.White).Append();
+ new UpdateMyConsole(Path.GetFileName(path), CColors.Blue, true).Append();
+ }
+ }
+ }
+ }
+ }
+ #endregion
+ }
+}
diff --git a/FModel/Forms/FModel_Settings.xaml b/FModel/Forms/FModel_Settings.xaml
new file mode 100644
index 00000000..d6dfcae9
--- /dev/null
+++ b/FModel/Forms/FModel_Settings.xaml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/FModel_Settings.xaml.cs b/FModel/Forms/FModel_Settings.xaml.cs
new file mode 100644
index 00000000..9c26cf44
--- /dev/null
+++ b/FModel/Forms/FModel_Settings.xaml.cs
@@ -0,0 +1,576 @@
+using FModel.Methods.MessageBox;
+using System.Windows;
+using System;
+using FProp = FModel.Properties.Settings;
+using System.Windows.Controls;
+using System.ComponentModel;
+using System.Reflection;
+using System.Linq;
+using System.Windows.Media;
+using FModel.Methods.Assets;
+using FModel.Methods;
+using System.Windows.Media.Imaging;
+using FModel.Methods.Utilities;
+using System.IO;
+using System.Threading.Tasks;
+using Ookii.Dialogs.Wpf;
+using System.Globalization;
+using FModel.Methods.Assets.IconCreator;
+using ColorPickerWPF;
+
+namespace FModel.Forms
+{
+ ///
+ /// Logique d'interaction pour FModel_Settings.xaml
+ ///
+ public partial class FModel_Settings : Window
+ {
+ public FModel_Settings()
+ {
+ InitializeComponent();
+ this.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ }
+
+ #region ENUMS
+ enum LIndexes
+ {
+ [Description("English")]
+ English = 0,
+ [Description("French")]
+ French = 1,
+ [Description("German")]
+ German = 2,
+ [Description("Italian")]
+ Italian = 3,
+ [Description("Spanish")]
+ Spanish = 4,
+ [Description("Spanish (LA)")]
+ Spanish_LA = 5,
+ [Description("Arabic")]
+ Arabic = 6,
+ [Description("Japanese")]
+ Japanese = 7,
+ [Description("Korean")]
+ Korean = 8,
+ [Description("Polish")]
+ Polish = 9,
+ [Description("Portuguese (Brazil)")]
+ Portuguese_Brazil = 10,
+ [Description("Russian")]
+ Russian = 11,
+ [Description("Turkish")]
+ Turkish = 12,
+ [Description("Chinese (S)")]
+ Chinese_S = 13,
+ [Description("Traditional Chinese")]
+ Traditional_Chinese = 14
+ }
+
+ enum RIndexes
+ {
+ [Description("Default")]
+ Default = 0,
+ [Description("Flat")]
+ Flat = 1,
+ [Description("Minimalist")]
+ Minimalist = 2
+ }
+
+ public static T GetEnumValueFromDescription(string description)
+ {
+ var type = typeof(T);
+ if (!type.IsEnum) { throw new ArgumentException(); }
+ FieldInfo[] fields = type.GetFields();
+ var field = fields
+ .SelectMany(f => f.GetCustomAttributes(
+ typeof(DescriptionAttribute), false), (
+ f, a) => new { Field = f, Att = a })
+ .Where(a => ((DescriptionAttribute)a.Att)
+ .Description == description).SingleOrDefault();
+ return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
+ }
+ #endregion
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ FoldersUtility.CheckWatermark();
+ GetUserSettings();
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ SetUserSettings();
+ Close();
+ }
+
+ private async void GetUserSettings()
+ {
+ InputTextBox.Text = FProp.Default.FPak_Path;
+ bDiffFileSize.IsChecked = FProp.Default.FDiffFileSize;
+ OutputTextBox.Text = FProp.Default.FOutput_Path;
+
+ ComboBox_Language.SelectedIndex = (int)GetEnumValueFromDescription(FProp.Default.FLanguage);
+ ComboBox_Design.SelectedIndex = (int)GetEnumValueFromDescription(FProp.Default.FRarity_Design);
+
+ bFeaturedIcon.IsChecked = FProp.Default.FIsFeatured;
+ bWatermarkIcon.IsChecked = FProp.Default.FUseWatermark;
+ Watermark_Label.Content += Path.GetFileName(FProp.Default.FWatermarkFilePath);
+
+ Opacity_Slider.Value = FProp.Default.FWatermarkOpacity;
+ Scale_Slider.Value = FProp.Default.FWatermarkScale;
+ xPos_Slider.Value = FProp.Default.FWatermarkXPos;
+ yPos_Slider.Value = FProp.Default.FWatermarkYPos;
+
+ WatermarkChallenge_TextBox.Text = FProp.Default.FChallengeWatermark;
+ bCustomChallenge.IsChecked = FProp.Default.FUseChallengeWatermark;
+ Banner_Label.Content += Path.GetFileName(FProp.Default.FBannerFilePath);
+ OpacityBanner_Slider.Value = FProp.Default.FBannerOpacity;
+
+ await UpdateImageWithWatermark();
+ UpdateChallengeCustomTheme();
+ }
+
+ private void SetUserSettings()
+ {
+ if (!string.Equals(FProp.Default.FPak_Path, InputTextBox.Text))
+ {
+ FProp.Default.FPak_Path = InputTextBox.Text;
+ DarkMessageBox.Show("Please, restart FModel to apply your new input path", "FModel Input Path Changed", MessageBoxButton.OK, MessageBoxImage.Information);
+ }
+ FProp.Default.FDiffFileSize = (bool)bDiffFileSize.IsChecked;
+
+ if (!string.Equals(FProp.Default.FOutput_Path, OutputTextBox.Text))
+ {
+ FProp.Default.FOutput_Path = OutputTextBox.Text;
+ DarkMessageBox.Show("Please, restart FModel to apply your new output path", "FModel Output Path Changed", MessageBoxButton.OK, MessageBoxImage.Information);
+ }
+
+ if (AssetEntries.AssetEntriesDict != null && !string.Equals(FProp.Default.FLanguage, ((ComboBoxItem)ComboBox_Language.SelectedItem).Content.ToString()))
+ {
+ AssetTranslations.SetAssetTranslation(((ComboBoxItem)ComboBox_Language.SelectedItem).Content.ToString());
+ }
+ FProp.Default.FLanguage = ((ComboBoxItem)ComboBox_Language.SelectedItem).Content.ToString();
+
+ FProp.Default.FRarity_Design = ((ComboBoxItem)ComboBox_Design.SelectedItem).Content.ToString();
+ FProp.Default.FIsFeatured = (bool)bFeaturedIcon.IsChecked;
+ FProp.Default.FUseWatermark = (bool)bWatermarkIcon.IsChecked;
+
+ FProp.Default.FWatermarkOpacity = Convert.ToInt32(Opacity_Slider.Value);
+ FProp.Default.FWatermarkScale = Scale_Slider.Value;
+ FProp.Default.FWatermarkXPos = xPos_Slider.Value;
+ FProp.Default.FWatermarkYPos = yPos_Slider.Value;
+
+ FProp.Default.FChallengeWatermark = WatermarkChallenge_TextBox.Text;
+ FProp.Default.FUseChallengeWatermark = (bool)bCustomChallenge.IsChecked;
+ FProp.Default.FBannerOpacity = Convert.ToInt32(OpacityBanner_Slider.Value);
+
+ FProp.Default.Save();
+ }
+
+ private async void UpdateImageBox(object sender, RoutedEventArgs e)
+ {
+ await UpdateImageWithWatermark();
+ }
+ private async void EnableDisableWatermark(object sender, RoutedEventArgs e)
+ {
+ OpenFile_Button.IsEnabled = (bool)bWatermarkIcon.IsChecked;
+ xPos_Slider.IsEnabled = (bool)bWatermarkIcon.IsChecked;
+ yPos_Slider.IsEnabled = (bool)bWatermarkIcon.IsChecked;
+ Opacity_Slider.IsEnabled = (bool)bWatermarkIcon.IsChecked;
+ Scale_Slider.IsEnabled = (bool)bWatermarkIcon.IsChecked;
+
+ await UpdateImageWithWatermark();
+ }
+ private void EnableDisableCustomTheme(object sender, RoutedEventArgs e)
+ {
+ AddBanner_Button.IsEnabled = (bool)bCustomChallenge.IsChecked;
+ DeleteBanner_Button.IsEnabled = (bool)bCustomChallenge.IsChecked;
+ PrimaryColor_Button.IsEnabled = (bool)bCustomChallenge.IsChecked;
+ SecondaryColor_Button.IsEnabled = (bool)bCustomChallenge.IsChecked;
+ OpacityBanner_Slider.IsEnabled = (bool)bCustomChallenge.IsChecked;
+
+ UpdateChallengeCustomTheme();
+ }
+ private async void UpdateImageWithWatermark(object sender, RoutedEventArgs e)
+ {
+ await UpdateImageWithWatermark();
+ }
+ private async Task UpdateImageWithWatermark()
+ {
+ bool watermarkEnabled = (bool)bWatermarkIcon.IsChecked;
+ string rarityDesign = ((ComboBoxItem)ComboBox_Design.SelectedItem).Content.ToString();
+ bool isFeatured = (bool)bFeaturedIcon.IsChecked;
+ int opacity = Convert.ToInt32(Opacity_Slider.Value);
+ double scale = Scale_Slider.Value;
+ double xPos = xPos_Slider.Value;
+ double yPos = yPos_Slider.Value;
+
+ await Task.Run(() =>
+ {
+ DrawingVisual drawingVisual = new DrawingVisual();
+ using (DrawingContext drawingContext = drawingVisual.RenderOpen())
+ {
+ //INITIALIZATION
+ drawingContext.DrawRectangle(Brushes.Transparent, null, new Rect(new Point(0, 0), new Size(515, 515)));
+
+ BitmapImage source = null;
+ switch (rarityDesign)
+ {
+ case "Default":
+ source = new BitmapImage(new Uri(isFeatured ? "pack://application:,,,/Resources/Template_D_F.png" : "pack://application:,,,/Resources/Template_D_N.png"));
+ break;
+ case "Flat":
+ source = new BitmapImage(new Uri(isFeatured ? "pack://application:,,,/Resources/Template_F_F.png" : "pack://application:,,,/Resources/Template_F_N.png"));
+ break;
+ case "Minimalist":
+ source = new BitmapImage(new Uri(isFeatured ? "pack://application:,,,/Resources/Template_M_F.png" : "pack://application:,,,/Resources/Template_M_N.png"));
+ break;
+ }
+ drawingContext.DrawImage(source, new Rect(new Point(0, 0), new Size(515, 515)));
+
+ if (!string.IsNullOrEmpty(FProp.Default.FWatermarkFilePath) && watermarkEnabled)
+ {
+ using (StreamReader image = new StreamReader(FProp.Default.FWatermarkFilePath))
+ {
+ if (image != null)
+ {
+ BitmapImage bmp = new BitmapImage();
+ bmp.BeginInit();
+ bmp.CacheOption = BitmapCacheOption.OnLoad;
+ bmp.StreamSource = image.BaseStream;
+ bmp.EndInit();
+
+ drawingContext.DrawImage(ImagesUtility.CreateTransparency(bmp, opacity), new Rect(xPos, yPos, scale, scale));
+ }
+ }
+ }
+ }
+
+ if (drawingVisual != null)
+ {
+ RenderTargetBitmap RTB = new RenderTargetBitmap(515, 515, 96, 96, PixelFormats.Pbgra32);
+ RTB.Render(drawingVisual);
+ RTB.Freeze(); //We freeze to apply the RTB to our imagesource from the UI Thread
+
+ FWindow.FMain.Dispatcher.InvokeAsync(() =>
+ {
+ ImageBox_RarityPreview.Source = BitmapFrame.Create(RTB); //thread safe and fast af
+ });
+ }
+
+ }).ContinueWith(TheTask =>
+ {
+ TasksUtility.TaskCompleted(TheTask.Exception);
+ });
+ }
+ private void UpdateChallengeCustomTheme(object sender, RoutedEventArgs e)
+ {
+ UpdateChallengeCustomTheme();
+ }
+ private void UpdateChallengeCustomTheme()
+ {
+ bool watermarkEnabled = (bool)bCustomChallenge.IsChecked;
+ string watermark = WatermarkChallenge_TextBox.Text;
+ string path = FProp.Default.FBannerFilePath;
+ int opacity = Convert.ToInt32(OpacityBanner_Slider.Value);
+ string[] primaryParts = FProp.Default.FPrimaryColor.Split(':');
+ string[] secondaryParts = FProp.Default.FSecondaryColor.Split(':');
+ SolidColorBrush PrimaryColor = new SolidColorBrush(Color.FromRgb(Convert.ToByte(primaryParts[0]), Convert.ToByte(primaryParts[1]), Convert.ToByte(primaryParts[2])));
+ SolidColorBrush SecondaryColor = new SolidColorBrush(Color.FromRgb(Convert.ToByte(secondaryParts[0]), Convert.ToByte(secondaryParts[1]), Convert.ToByte(secondaryParts[2])));
+
+ if (watermarkEnabled)
+ {
+ DrawingVisual drawingVisual = new DrawingVisual();
+ double PPD = VisualTreeHelper.GetDpi(drawingVisual).PixelsPerDip;
+ using (DrawingContext drawingContext = drawingVisual.RenderOpen())
+ {
+ //INITIALIZATION
+ drawingContext.DrawRectangle(Brushes.Transparent, null, new Rect(new Point(0, 0), new Size(1024, 410)));
+
+ Point dStart = new Point(0, 256);
+ LineSegment[] dSegments = new[]
+ {
+ new LineSegment(new Point(1024, 256), true),
+ new LineSegment(new Point(1024, 241), true),
+ new LineSegment(new Point(537, 236), true),
+ new LineSegment(new Point(547, 249), true),
+ new LineSegment(new Point(0, 241), true)
+ };
+ PathFigure dFigure = new PathFigure(dStart, dSegments, true);
+ PathGeometry dGeo = new PathGeometry(new[] { dFigure });
+
+ Typeface typeface = new Typeface(TextsUtility.Burbank, FontStyles.Normal, FontWeights.Black, FontStretches.Normal);
+ FormattedText formattedText =
+ new FormattedText(
+ "{BUNDLE DISPLAY NAME HERE}",
+ CultureInfo.CurrentUICulture,
+ FlowDirection.LeftToRight,
+ typeface,
+ 55,
+ Brushes.White,
+ PPD
+ );
+ formattedText.TextAlignment = TextAlignment.Left;
+ formattedText.MaxTextWidth = 768;
+ formattedText.MaxLineCount = 1;
+ Point textLocation = new Point(50, 165 - formattedText.Height);
+
+ drawingContext.DrawRectangle(PrimaryColor, null, new Rect(0, 0, 1024, 256));
+ if (!string.IsNullOrEmpty(path))
+ {
+ BitmapImage bmp = new BitmapImage(new Uri(path));
+ drawingContext.DrawImage(ImagesUtility.CreateTransparency(bmp, opacity), new Rect(0, 0, 1024, 256));
+ }
+ drawingContext.DrawGeometry(SecondaryColor, null, dGeo);
+ drawingContext.DrawText(formattedText, textLocation);
+
+ formattedText =
+ new FormattedText(
+ "{LAST FOLDER HERE}",
+ CultureInfo.CurrentUICulture,
+ FlowDirection.LeftToRight,
+ typeface,
+ 30,
+ SecondaryColor,
+ IconCreator.PPD
+ );
+ formattedText.TextAlignment = TextAlignment.Left;
+ formattedText.MaxTextWidth = 768;
+ formattedText.MaxLineCount = 1;
+ textLocation = new Point(50, 100 - formattedText.Height);
+ Geometry geometry = formattedText.BuildGeometry(textLocation);
+ Pen pen = new Pen(ChallengesUtility.DarkBrush(SecondaryColor, 0.3f), 1);
+ pen.LineJoin = PenLineJoin.Round;
+ drawingContext.DrawGeometry(SecondaryColor, pen, geometry);
+
+ typeface = new Typeface(TextsUtility.FBurbank, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
+ formattedText =
+ new FormattedText(
+ watermark,
+ CultureInfo.CurrentUICulture,
+ FlowDirection.LeftToRight,
+ typeface,
+ 20,
+ new SolidColorBrush(Color.FromArgb(150, 255, 255, 255)),
+ IconCreator.PPD
+ );
+ formattedText.TextAlignment = TextAlignment.Right;
+ formattedText.MaxTextWidth = 1014;
+ formattedText.MaxLineCount = 1;
+ textLocation = new Point(0, 205);
+ drawingContext.DrawText(formattedText, textLocation);
+
+ LinearGradientBrush linGrBrush = new LinearGradientBrush();
+ linGrBrush.StartPoint = new Point(0, 0);
+ linGrBrush.EndPoint = new Point(0, 1);
+ linGrBrush.GradientStops.Add(new GradientStop(Color.FromArgb(75, SecondaryColor.Color.R, SecondaryColor.Color.G, SecondaryColor.Color.B), 0));
+ linGrBrush.GradientStops.Add(new GradientStop(Color.FromArgb(25, PrimaryColor.Color.R, PrimaryColor.Color.G, PrimaryColor.Color.B), 0.15));
+ linGrBrush.GradientStops.Add(new GradientStop(Color.FromArgb(0, 0, 0, 0), 1));
+
+ drawingContext.DrawRectangle(ChallengesUtility.DarkBrush(PrimaryColor, 0.3f), null, new Rect(0, 256, 1024, 144));
+ drawingContext.DrawRectangle(linGrBrush, null, new Rect(0, 256, 1024, 144));
+
+ typeface = new Typeface(TextsUtility.Burbank, FontStyles.Normal, FontWeights.Black, FontStretches.Normal);
+ int y = 300;
+
+ drawingContext.DrawRectangle(ChallengesUtility.DarkBrush(PrimaryColor, 0.3f), null, new Rect(0, y, 1024, 90));
+ drawingContext.DrawRectangle(PrimaryColor, null, new Rect(25, y, 1024 - 50, 70));
+
+ dStart = new Point(32, y + 5);
+ dSegments = new[]
+ {
+ new LineSegment(new Point(29, y + 67), true),
+ new LineSegment(new Point(1024 - 160, y + 62), true),
+ new LineSegment(new Point(1024 - 150, y + 4), true)
+ };
+ dFigure = new PathFigure(dStart, dSegments, true);
+ dGeo = new PathGeometry(new[] { dFigure });
+ drawingContext.DrawGeometry(ChallengesUtility.LightBrush(PrimaryColor, 0.04f), null, dGeo);
+
+ drawingContext.DrawRectangle(SecondaryColor, null, new Rect(60, y + 47, 500, 7));
+
+ dStart = new Point(39, y + 35);
+ dSegments = new[]
+ {
+ new LineSegment(new Point(45, y + 32), true),
+ new LineSegment(new Point(48, y + 37), true),
+ new LineSegment(new Point(42, y + 40), true)
+ };
+ dFigure = new PathFigure(dStart, dSegments, true);
+ dGeo = new PathGeometry(new[] { dFigure });
+ drawingContext.DrawGeometry(SecondaryColor, null, dGeo);
+ }
+
+ if (drawingVisual != null)
+ {
+ RenderTargetBitmap RTB = new RenderTargetBitmap(1024, 410, 96, 96, PixelFormats.Pbgra32);
+ RTB.Render(drawingVisual);
+ RTB.Freeze(); //We freeze to apply the RTB to our imagesource from the UI Thread
+
+ FWindow.FMain.Dispatcher.InvokeAsync(() =>
+ {
+ ImageBox_ChallengePreview.Source = BitmapFrame.Create(RTB); //thread safe and fast af
+ });
+ }
+ }
+ else
+ {
+ BitmapImage source = new BitmapImage(new Uri("pack://application:,,,/Resources/Template_Challenge.png"));
+ ImageBox_ChallengePreview.Source = source;
+ }
+ }
+
+ private void OpenIconCreator_Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (ImageBox_RarityPreview.Source != null)
+ {
+ if (!FormsUtility.IsWindowOpen("Icon Template"))
+ {
+ Window win = new Window();
+ win.Title = "Icon Template";
+ win.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ win.WindowStartupLocation = WindowStartupLocation.CenterScreen;
+ win.Width = ImageBox_RarityPreview.Source.Width;
+ win.Height = ImageBox_RarityPreview.Source.Height;
+
+ DockPanel dockPanel = new DockPanel
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+
+ Image img = new Image();
+ img.UseLayoutRounding = true;
+ img.Source = ImageBox_RarityPreview.Source;
+ dockPanel.Children.Add(img);
+
+ win.Content = dockPanel;
+ win.Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Icon Template").Focus(); }
+ }
+ }
+
+ private async void OpenFile_Button_Click(object sender, RoutedEventArgs e)
+ {
+ Microsoft.Win32.OpenFileDialog openFiledialog = new Microsoft.Win32.OpenFileDialog();
+ openFiledialog.Title = "Choose your watermark";
+ openFiledialog.Multiselect = false;
+ openFiledialog.Filter = "PNG Files (*.png)|*.png|All Files (*.*)|*.*";
+ if (openFiledialog.ShowDialog() == true)
+ {
+ Watermark_Label.Content = "File Name: " + Path.GetFileName(openFiledialog.FileName);
+ FProp.Default.FWatermarkFilePath = openFiledialog.FileName;
+ FProp.Default.Save();
+
+ await UpdateImageWithWatermark();
+ }
+ }
+
+ private void BrowseInput_Button_Click(object sender, RoutedEventArgs e)
+ {
+ VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog();
+ dialog.Description = "Please select a folder.";
+ dialog.UseDescriptionForTitle = true; // This applies to the Vista style dialog only, not the old dialog.
+
+ if ((bool)dialog.ShowDialog(this))
+ {
+ InputTextBox.Text = dialog.SelectedPath;
+ }
+ }
+
+ private void BrowseOutput_Button_Click(object sender, RoutedEventArgs e)
+ {
+ VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog();
+ dialog.Description = "Please select a folder.";
+ dialog.UseDescriptionForTitle = true; // This applies to the Vista style dialog only, not the old dialog.
+
+ if ((bool)dialog.ShowDialog(this))
+ {
+ OutputTextBox.Text = dialog.SelectedPath;
+ }
+ }
+
+ private void OpenChallengeTheme_Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (ImageBox_ChallengePreview.Source != null)
+ {
+ if (!FormsUtility.IsWindowOpen("Challenge Theme Template"))
+ {
+ Window win = new Window();
+ win.Title = "Challenge Theme Template";
+ win.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
+ win.WindowStartupLocation = WindowStartupLocation.CenterScreen;
+ win.Width = ImageBox_ChallengePreview.Source.Width;
+ win.Height = ImageBox_ChallengePreview.Source.Height;
+
+ DockPanel dockPanel = new DockPanel
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+
+ Image img = new Image();
+ img.UseLayoutRounding = true;
+ img.Source = ImageBox_ChallengePreview.Source;
+ dockPanel.Children.Add(img);
+
+ win.Content = dockPanel;
+ win.Show();
+ }
+ else { FormsUtility.GetOpenedWindow("Challenge Theme Template").Focus(); }
+ }
+ }
+
+ private void PrimaryColor_Button_Click(object sender, RoutedEventArgs e)
+ {
+ Color color;
+ bool ok = ColorPickerWindow.ShowDialog(out color);
+ if (ok)
+ {
+ FProp.Default.FPrimaryColor = color.R + ":" + color.G + ":" + color.B;
+ FProp.Default.Save();
+
+ UpdateChallengeCustomTheme();
+ }
+ }
+
+ private void SecondaryColor_Button_Click(object sender, RoutedEventArgs e)
+ {
+ Color color;
+ bool ok = ColorPickerWindow.ShowDialog(out color);
+ if (ok)
+ {
+ FProp.Default.FSecondaryColor = color.R + ":" + color.G + ":" + color.B;
+ FProp.Default.Save();
+
+ UpdateChallengeCustomTheme();
+ }
+ }
+
+ private void AddBanner_Button_Click(object sender, RoutedEventArgs e)
+ {
+ Microsoft.Win32.OpenFileDialog openFiledialog = new Microsoft.Win32.OpenFileDialog();
+ openFiledialog.Title = "Choose your banner";
+ openFiledialog.Multiselect = false;
+ openFiledialog.Filter = "PNG Files (*.png)|*.png|All Files (*.*)|*.*";
+ if (openFiledialog.ShowDialog() == true)
+ {
+ Banner_Label.Content = "File Name: " + Path.GetFileName(openFiledialog.FileName);
+ FProp.Default.FBannerFilePath = openFiledialog.FileName;
+ FProp.Default.Save();
+
+ UpdateChallengeCustomTheme();
+ }
+ }
+
+ private void DeleteBanner_Button_Click(object sender, RoutedEventArgs e)
+ {
+ Banner_Label.Content = "File Name: ";
+ FProp.Default.FBannerFilePath = string.Empty;
+ FProp.Default.Save();
+
+ UpdateChallengeCustomTheme();
+ }
+ }
+}
diff --git a/FModel/Forms/HexViewer/BaseByte.cs b/FModel/Forms/HexViewer/BaseByte.cs
new file mode 100644
index 00000000..d9265865
--- /dev/null
+++ b/FModel/Forms/HexViewer/BaseByte.cs
@@ -0,0 +1,559 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Base author : Derek Tremblay (derektremblay666@gmail.com)
+// Contributor : emes30
+// Notice : The idea to make a base class with common bytecontrol code is taken
+// from emes30 fork (https://github.com/emes30/WpfHexEditorControl)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using WpfHexaEditor.Core;
+using WpfHexaEditor.Core.Interfaces;
+
+namespace WpfHexaEditor
+{
+ ///
+ /// Base class for bytecontrol
+ ///
+ abstract class BaseByte : FrameworkElement, IByteControl
+ {
+ #region Global class variables
+ protected readonly HexEditor _parent;
+ private bool _isSelected;
+ private ByteAction _action = ByteAction.Nothing;
+ private byte? _byte;
+ private bool _isHighLight;
+ #endregion global class variables
+
+ #region Events
+
+ public event EventHandler ByteModified;
+ public event EventHandler MouseSelection;
+ public event EventHandler Click;
+ public event EventHandler RightClick;
+ public event EventHandler DoubleClick;
+ public event EventHandler MoveNext;
+ public event EventHandler MovePrevious;
+ public event EventHandler MoveRight;
+ public event EventHandler MoveLeft;
+ public event EventHandler MoveUp;
+ public event EventHandler MoveDown;
+ public event EventHandler MovePageDown;
+ public event EventHandler MovePageUp;
+ public event EventHandler ByteDeleted;
+ public event EventHandler EscapeKey;
+ public event EventHandler CtrlzKey;
+ public event EventHandler CtrlvKey;
+ public event EventHandler CtrlcKey;
+ public event EventHandler CtrlaKey;
+ public event EventHandler CtrlyKey;
+
+ #endregion Events
+
+ #region Constructor
+
+ protected BaseByte(HexEditor parent)
+ {
+ //Parent hexeditor
+ _parent = parent ?? throw new ArgumentNullException(nameof(parent));
+
+ #region Binding tooltip
+
+ LoadDictionary("/FModel;component/Forms/HexViewer/ToolTipDictionary.xaml");
+ var txtBinding = new Binding
+ {
+ Source = FindResource("ByteToolTip"),
+ UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
+ Mode = BindingMode.OneWay
+ };
+
+ // Load ressources dictionnary
+ void LoadDictionary(string url)
+ {
+ var ttRes = new ResourceDictionary { Source = new Uri(url, UriKind.Relative) };
+ Resources.MergedDictionaries.Add(ttRes);
+ }
+
+ SetBinding(ToolTipProperty, txtBinding);
+
+ #endregion
+
+ //Default properties
+ DataContext = this;
+ Focusable = true;
+ }
+
+ #endregion
+
+ #region Properties
+
+ ///
+ /// Position in file
+ ///
+ public long BytePositionInStream { get; set; } = -1L;
+
+ ///
+ /// Used for selection coloring
+ ///
+ public bool FirstSelected { protected get; set; }
+
+ ///
+ /// Used to prevent ByteModified event occurc when we dont want!
+ ///
+ public bool InternalChange { get; set; }
+
+ ///
+ /// Get or set if control as in read only mode
+ ///
+ public bool ReadOnlyMode { protected get; set; }
+
+ ///
+ /// Get or set the description to shown in tooltip
+ ///
+ public string Description { get; set; }
+
+ ///
+ /// Return true if mouse is over... (Used with traverse methods via IByteControl)
+ ///
+ public bool IsMouseOverMe { get; internal set; }
+
+ ///
+ /// Get or Set if control as selected
+ ///
+ public bool IsSelected
+ {
+ get => _isSelected;
+ set
+ {
+ if (value == _isSelected) return;
+
+ _isSelected = value;
+ UpdateVisual();
+ }
+ }
+
+ ///
+ /// Get of Set if control as marked as highlighted
+ ///
+ public bool IsHighLight
+ {
+ get => _isHighLight;
+ set
+ {
+ if (value == _isHighLight) return;
+
+ _isHighLight = value;
+ UpdateVisual();
+ }
+ }
+
+ ///
+ /// Byte used for this instance
+ ///
+ public byte? Byte
+ {
+ get => _byte;
+ set
+ {
+ _byte = value;
+
+ if (Action != ByteAction.Nothing && InternalChange == false)
+ ByteModified?.Invoke(this, new EventArgs());
+
+ UpdateTextRenderFromByte();
+ }
+ }
+
+ ///
+ /// Action with this byte
+ ///
+ public ByteAction Action
+ {
+ get => _action;
+ set
+ {
+ _action = value != ByteAction.All ? value : ByteAction.Nothing;
+
+ UpdateVisual();
+ }
+ }
+
+ protected FormattedText TextFormatted { get; private set; }
+
+ #endregion
+
+ #region Private base properties
+
+ ///
+ /// Definie the foreground
+ ///
+ private static readonly DependencyProperty ForegroundProperty =
+ TextElement.ForegroundProperty.AddOwner(
+ typeof(BaseByte));
+
+ protected Brush Foreground
+ {
+ get => (Brush)GetValue(ForegroundProperty);
+ set => SetValue(ForegroundProperty, value);
+ }
+
+ public static readonly DependencyProperty BackgroundProperty =
+ TextElement.BackgroundProperty.AddOwner(typeof(BaseByte),
+ new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
+
+ ///
+ /// Defines the background
+ ///
+ protected Brush Background
+ {
+ get => (Brush)GetValue(BackgroundProperty);
+ set => SetValue(BackgroundProperty, value);
+ }
+
+ private static readonly DependencyProperty TextProperty =
+ DependencyProperty.Register(nameof(Text), typeof(string), typeof(BaseByte),
+ new FrameworkPropertyMetadata(string.Empty,
+ FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
+
+ ///
+ /// Text to be displayed representation of Byte
+ ///
+ protected string Text
+ {
+ get => (string)GetValue(TextProperty);
+ set => SetValue(TextProperty, value);
+ }
+
+ private static readonly DependencyProperty FontWeightProperty = TextElement.FontWeightProperty.AddOwner(typeof(BaseByte));
+
+ ///
+ /// The FontWeight property specifies the weight of the font.
+ ///
+ protected FontWeight FontWeight
+ {
+ get => (FontWeight)GetValue(FontWeightProperty);
+ set => SetValue(FontWeightProperty, value);
+ }
+
+ #endregion Base properties
+
+ #region Methods
+
+ ///
+ /// Update Background,foreground and font property
+ ///
+ public virtual void UpdateVisual()
+ {
+ if (IsSelected)
+ {
+ FontWeight = _parent.FontWeight;
+ Foreground = _parent.ForegroundContrast;
+
+ Background = FirstSelected
+ ? _parent.SelectionFirstColor
+ : _parent.SelectionSecondColor;
+ }
+ else if (IsHighLight)
+ {
+ FontWeight = _parent.FontWeight;
+ Foreground = _parent.Foreground;
+ Background = _parent.HighLightColor;
+ }
+ else if (Action != ByteAction.Nothing)
+ {
+ FontWeight = FontWeights.Bold;
+ Foreground = _parent.Foreground;
+
+ switch (Action)
+ {
+ case ByteAction.Modified:
+ Background = _parent.ByteModifiedColor;
+ break;
+ case ByteAction.Deleted:
+ Background = _parent.ByteDeletedColor;
+ break;
+ }
+ }
+ else
+ {
+ var cbb = _parent.GetCustomBackgroundBlock(BytePositionInStream);
+
+ Description = cbb != null ? cbb.Description : "";
+
+ Background = cbb != null ? cbb.Color : Brushes.Transparent;
+ Foreground = _parent.GetColumnNumber(BytePositionInStream) % 2 == 0
+ ? _parent.Foreground
+ : _parent.ForegroundSecondColor;
+
+ FontWeight = _parent.FontWeight;
+ }
+
+ UpdateAutoHighLiteSelectionByteVisual();
+
+ InvalidateVisual();
+ }
+
+ ///
+ /// Auto highlite SelectionByte
+ ///
+ protected void UpdateAutoHighLiteSelectionByteVisual()
+ {
+ if (_parent.AllowAutoHighLightSelectionByte && _parent.SelectionByte != null &&
+ Byte == _parent.SelectionByte && !IsSelected)
+ Background = _parent.AutoHighLiteSelectionByteBrush;
+ }
+
+ ///
+ /// Update the render of text derived bytecontrol from byte property
+ ///
+ public abstract void UpdateTextRenderFromByte();
+
+ ///
+ /// Clear control
+ ///
+ public virtual void Clear()
+ {
+ InternalChange = true;
+ BytePositionInStream = -1;
+ Byte = null;
+ Action = ByteAction.Nothing;
+ IsSelected = false;
+ InternalChange = false;
+ Description = string.Empty;
+ }
+
+ #endregion
+
+ #region Events delegate
+
+ ///
+ /// Render the control
+ ///
+ protected override void OnRender(DrawingContext dc)
+ {
+ //Draw background
+ if (Background != null)
+ dc.DrawRectangle(Background, null, new Rect(0, 0, RenderSize.Width, RenderSize.Height));
+
+ //Draw text
+ var typeface = new Typeface(_parent.FontFamily, _parent.FontStyle, FontWeight, _parent.FontStretch);
+
+ var formattedText = new FormattedText(Text, CultureInfo.InvariantCulture, FlowDirection.LeftToRight,
+ typeface, _parent.FontSize, Foreground, VisualTreeHelper.GetDpi(this).PixelsPerDip);
+
+ dc.DrawText(formattedText, new Point(2, 2));
+
+//#if DEBUG && NET47
+// //FOR HELP TO DEBUG HIDEBYTEDELETED ONLY...
+// if (_parent.HideByteDeleted && BytePositionInStream < 10000 && Core.Bytes.ByteConverters.IsHexValue(Text).success)
+// {
+// var formattedText2 = new FormattedText(BytePositionInStream.ToString(), CultureInfo.InvariantCulture, FlowDirection.LeftToRight,
+// typeface, 8, Brushes.Green, VisualTreeHelper.GetDpi(this).PixelsPerDip);
+
+// dc.DrawText(formattedText2, new Point(0, 10));
+// }
+//#endif
+
+ //Update properties
+ TextFormatted = formattedText;
+ }
+
+ protected override void OnMouseEnter(MouseEventArgs e)
+ {
+ if (Byte != null && !IsSelected && !IsHighLight &&
+ Action != ByteAction.Modified &&
+ Action != ByteAction.Deleted &&
+ Action != ByteAction.Added)
+ Background = _parent.MouseOverColor;
+
+ UpdateAutoHighLiteSelectionByteVisual();
+
+ if (e.LeftButton == MouseButtonState.Pressed)
+ MouseSelection?.Invoke(this, e);
+
+ IsMouseOverMe = true;
+
+ base.OnMouseEnter(e);
+ }
+
+ protected override void OnMouseLeave(MouseEventArgs e)
+ {
+ var cbb = _parent.GetCustomBackgroundBlock(BytePositionInStream);
+
+ if (Byte != null && !IsSelected && !IsHighLight &&
+ Action != ByteAction.Modified &&
+ Action != ByteAction.Deleted &&
+ Action != ByteAction.Added)
+ Background = Brushes.Transparent;
+
+ if (cbb != null && !IsSelected && !IsHighLight &&
+ Action != ByteAction.Modified &&
+ Action != ByteAction.Deleted &&
+ Action != ByteAction.Added)
+ Background = cbb.Color;
+
+ IsMouseOverMe = false;
+
+ UpdateAutoHighLiteSelectionByteVisual();
+
+ base.OnMouseLeave(e);
+ }
+
+ protected override void OnMouseDown(MouseButtonEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Pressed)
+ {
+ if (!IsFocused)
+ Focus();
+
+ switch (e.ClickCount)
+ {
+ case 1:
+ Click?.Invoke(this, e);
+ break;
+ case 2:
+ DoubleClick?.Invoke(this, e);
+ break;
+ }
+
+ }
+
+ if (e.RightButton == MouseButtonState.Pressed)
+ RightClick?.Invoke(this, e);
+
+ base.OnMouseDown(e);
+ }
+
+ protected override void OnToolTipOpening(ToolTipEventArgs e)
+ {
+ if (Byte == null || !_parent.ShowByteToolTip)
+ e.Handled = true;
+
+ base.OnToolTipOpening(e);
+ }
+
+ protected override void OnLostFocus(RoutedEventArgs e)
+ {
+ _parent.HideCaret();
+ base.OnLostFocus(e);
+ }
+
+ protected void OnMoveNext(EventArgs e) => MoveNext?.Invoke(this, e);
+
+ protected bool KeyValidation(KeyEventArgs e)
+ {
+ #region Key validation and launch event if needed
+
+ if (KeyValidator.IsUpKey(e.Key))
+ {
+ e.Handled = true;
+ MoveUp?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ if (KeyValidator.IsDownKey(e.Key))
+ {
+ e.Handled = true;
+ MoveDown?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ if (KeyValidator.IsLeftKey(e.Key))
+ {
+ e.Handled = true;
+ MoveLeft?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ if (KeyValidator.IsRightKey(e.Key))
+ {
+ e.Handled = true;
+ MoveRight?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ if (KeyValidator.IsPageDownKey(e.Key))
+ {
+ e.Handled = true;
+ MovePageDown?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ if (KeyValidator.IsPageUpKey(e.Key))
+ {
+ e.Handled = true;
+ MovePageUp?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ if (KeyValidator.IsDeleteKey(e.Key))
+ {
+ if (!ReadOnlyMode)
+ {
+ e.Handled = true;
+ ByteDeleted?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ }
+ else if (KeyValidator.IsBackspaceKey(e.Key))
+ {
+ e.Handled = true;
+ ByteDeleted?.Invoke(this, new EventArgs());
+
+ MovePrevious?.Invoke(this, new EventArgs());
+
+ return true;
+ }
+ else if (KeyValidator.IsEscapeKey(e.Key))
+ {
+ e.Handled = true;
+ EscapeKey?.Invoke(this, new EventArgs());
+ return true;
+ }
+ else if (KeyValidator.IsCtrlZKey(e.Key))
+ {
+ e.Handled = true;
+ CtrlzKey?.Invoke(this, new EventArgs());
+ return true;
+ }
+ else if (KeyValidator.IsCtrlYKey(e.Key))
+ {
+ e.Handled = true;
+ CtrlyKey?.Invoke(this, new EventArgs());
+ return true;
+ }
+ else if (KeyValidator.IsCtrlVKey(e.Key))
+ {
+ e.Handled = true;
+ CtrlvKey?.Invoke(this, new EventArgs());
+ return true;
+ }
+ else if (KeyValidator.IsCtrlCKey(e.Key))
+ {
+ e.Handled = true;
+ CtrlcKey?.Invoke(this, new EventArgs());
+ return true;
+ }
+ else if (KeyValidator.IsCtrlAKey(e.Key))
+ {
+ e.Handled = true;
+ CtrlaKey?.Invoke(this, new EventArgs());
+ return true;
+ }
+
+ return false;
+ #endregion
+ }
+ }
+ #endregion
+
+}
+
diff --git a/FModel/Forms/HexViewer/BrushesDictionary.xaml b/FModel/Forms/HexViewer/BrushesDictionary.xaml
new file mode 100644
index 00000000..6c111963
--- /dev/null
+++ b/FModel/Forms/HexViewer/BrushesDictionary.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/BookMark.cs b/FModel/Forms/HexViewer/Core/BookMark.cs
new file mode 100644
index 00000000..eac14e69
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/BookMark.cs
@@ -0,0 +1,40 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor.Core
+{
+ ///
+ /// BookMark class
+ ///
+ public sealed class BookMark
+ {
+ public ScrollMarker Marker { get; set; } = ScrollMarker.Nothing;
+ public long BytePositionInStream { get; set; }
+ public string Description { get; set; } = string.Empty;
+
+ public BookMark() { }
+
+ public BookMark(string description, long position)
+ {
+ BytePositionInStream = position;
+ Description = description;
+ }
+
+ public BookMark(string description, long position, ScrollMarker marker)
+ {
+ BytePositionInStream = position;
+ Description = description;
+ Marker = marker;
+ }
+
+ ///
+ /// String representation
+ ///
+ ///
+ public override string ToString() => $"({ByteConverters.LongToHex(BytePositionInStream)}h){Description}";
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Bytes/ByteConverters.cs b/FModel/Forms/HexViewer/Core/Bytes/ByteConverters.cs
new file mode 100644
index 00000000..34ae676d
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Bytes/ByteConverters.cs
@@ -0,0 +1,255 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+
+namespace WpfHexaEditor.Core.Bytes
+{
+ ///
+ /// ByteCharConverter for convert data
+ ///
+ public static class ByteConverters
+ {
+ ///
+ /// Convert long to hex value
+ ///
+ public static string LongToHex(long val, OffSetPanelFixedWidth offsetwight = OffSetPanelFixedWidth.Dynamic) =>
+ val.ToString(offsetwight == OffSetPanelFixedWidth.Dynamic
+ ? ConstantReadOnly.HexStringFormat
+ : ConstantReadOnly.HexLineInfoStringFormat
+ , CultureInfo.InvariantCulture);
+
+ public static string LongToString(long val, int saveBits = -1)
+ {
+ if (saveBits == -1) return val.ToString();
+
+ //Char[] with fixed size is always
+ var chs = new char[saveBits];
+ for (int i = 1; i <= saveBits; i++)
+ {
+ chs[saveBits - i] = (char)(val % 10 + 48);
+ val /= 10;
+ }
+ return new string(chs);
+ }
+
+ ///
+ /// Convert Byte to Char (can be used as visible text)
+ ///
+ ///
+ /// Code from : https://github.com/pleonex/tinke/blob/master/Be.Windows.Forms.HexBox/ByteCharConverters.cs
+ ///
+ public static char ByteToChar(byte val) => val > 0x1F && !(val > 0x7E && val < 0xA0) ? (char)val : '.';
+
+ ///
+ /// Convert Char to Byte
+ ///
+ public static byte CharToByte(char val) => (byte)val;
+
+ ///
+ /// Converts a byte array to a hex string. For example: {10,11} = "0A 0B"
+ ///
+ public static string ByteToHex(byte[] data)
+ {
+ if (data == null) return string.Empty;
+
+ var sb = new StringBuilder();
+
+ foreach (var b in data)
+ {
+ var hex = ByteToHex(b);
+ sb.Append(hex);
+ sb.Append(" ");
+ }
+
+ if (sb.Length > 0)
+ sb.Remove(sb.Length - 1, 1);
+
+ return sb.ToString();
+ }
+
+ ///
+ /// Convert a byte to char[2].
+ ///
+ public static char[] ByteToHexCharArray(byte val)
+ {
+ var hexbyteArray = new char[2];
+ ByteToHexCharArray(val, hexbyteArray);
+ return hexbyteArray;
+ }
+
+ ///
+ /// Fill the with hex char;
+ ///
+ /// The length of this value should be 2.
+ public static void ByteToHexCharArray(byte val, char[] charArr)
+ {
+ if (charArr == null)
+ throw new ArgumentNullException(nameof(charArr));
+
+ if (charArr.Length != 2)
+ throw new ArgumentException($"The length of {charArr} should be 2.");
+
+ charArr[0] = ByteToHexChar(val >> 4);
+ charArr[1] = ByteToHexChar(val - ((val >> 4) << 4));
+ }
+
+ ///
+ /// Convert a byte to Hex char,i.e,10 = 'A'
+ ///
+ public static char ByteToHexChar(int val)
+ {
+ if (val < 10)
+ {
+ return (char)(48 + val);
+ }
+ else
+ {
+ switch (val)
+ {
+ case 10:
+ return 'A';
+ case 11:
+ return 'B';
+ case 12:
+ return 'C';
+ case 13:
+ return 'D';
+ case 14:
+ return 'E';
+ case 15:
+ return 'F';
+ default:
+ return 's';
+ }
+ }
+ }
+
+ ///
+ /// Converts the byte to a hex string. For example: "10" = "0A";
+ ///
+ public static string ByteToHex(byte val) => new string(ByteToHexCharArray(val));
+
+ ///
+ /// Convert byte to ASCII string
+ ///
+ public static string BytesToString(byte[] buffer, ByteToString converter = ByteToString.ByteToCharProcess)
+ {
+ if (buffer == null) return string.Empty;
+
+ switch (converter)
+ {
+ case ByteToString.AsciiEncoding:
+ return Encoding.ASCII.GetString(buffer, 0, buffer.Length);
+
+ case ByteToString.ByteToCharProcess:
+ var builder = new StringBuilder();
+
+ foreach (var @byte in buffer)
+ builder.Append(ByteToChar(@byte));
+
+ return builder.ToString();
+ }
+
+ return string.Empty;
+ }
+
+ ///
+ /// Converts the hex string to an byte array. The hex string must be separated by a space char ' '. If there is any invalid hex information in the string the result will be null.
+ ///
+ public static byte[] HexToByte(string hex)
+ {
+ if (string.IsNullOrEmpty(hex)) return null;
+
+ hex = hex.Trim();
+ var hexArray = hex.Split(' ');
+ var byteArray = new byte[hexArray.Length];
+
+ for (var i = 0; i < hexArray.Length; i++)
+ {
+ var hexValue = hexArray[i];
+ var (isByte, val) = HexToUniqueByte(hexValue);
+
+ if (!isByte) return null;
+
+ byteArray[i] = val;
+ }
+
+ return byteArray;
+ }
+
+ ///
+ /// Return Tuple (bool, byte) that bool represent if is a byte
+ ///
+ public static (bool success, byte val) HexToUniqueByte(string hex) =>
+ (byte.TryParse(hex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var val), val);
+
+ ///
+ /// Convert a hex string to long.
+ ///
+ ///
+ /// Return (true, [position])
+ /// Return (false, -1) on error
+ ///
+ public static (bool success, long position) HexLiteralToLong(string hex)
+ {
+ if (string.IsNullOrEmpty(hex)) return (false, -1);
+
+ var i = hex.Length > 1 && hex[0] == '0' && (hex[1] == 'x' || hex[1] == 'X')
+ ? 2
+ : 0;
+
+ long value = 0;
+
+ while (i < hex.Length)
+ {
+ #region convert
+
+ int x = hex[i++];
+
+ if
+ (x >= '0' && x <= '9') x -= '0';
+ else if
+ (x >= 'A' && x <= 'F') x -= 'A' + 10;
+ else if
+ (x >= 'a' && x <= 'f') x -= 'a' + 10;
+ else
+ return (false, -1);
+
+ value = 16 * value + x;
+
+ #endregion
+ }
+
+ return (true, value);
+ }
+
+ ///
+ /// Check if is an hexa string
+ ///
+ public static (bool success, long value) IsHexValue(string hexastring) => HexLiteralToLong(hexastring);
+
+ ///
+ /// Check if is an hexa byte string
+ ///
+ public static (bool success, byte[] value) IsHexaByteStringValue(string hexastring) =>
+ HexToByte(hexastring) == null
+ ? (false, null)
+ : (true, byteArray: HexToByte(hexastring));
+
+ ///
+ /// Convert string to byte array
+ ///
+ public static byte[] StringToByte(string str) => str.Select(CharToByte).ToArray();
+
+ ///
+ /// Convert String to hex string For example: "barn" = "62 61 72 6e"
+ ///
+ public static string StringToHex(string str) => ByteToHex(StringToByte(str));
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Bytes/ByteModified.cs b/FModel/Forms/HexViewer/Core/Bytes/ByteModified.cs
new file mode 100644
index 00000000..984510d3
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Bytes/ByteModified.cs
@@ -0,0 +1,100 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using WpfHexaEditor.Core.Interfaces;
+
+namespace WpfHexaEditor.Core.Bytes
+{
+ public class ByteModified : IByteModified
+ {
+ #region Constructor
+
+ ///
+ /// Default contructor
+ ///
+ public ByteModified() { }
+
+ ///
+ /// complete contructor
+ ///
+ public ByteModified(byte? val, ByteAction action, long bytePositionInStream, long undoLength)
+ {
+ Byte = val;
+ Action = action;
+ BytePositionInStream = bytePositionInStream;
+ Length = undoLength;
+ }
+
+ #endregion constructor
+
+ #region properties
+
+ ///
+ /// Byte mofidied
+ ///
+ public byte? Byte { get; set; }
+
+ ///
+ /// Action have made in this byte
+ ///
+ public ByteAction Action { get; set; } = ByteAction.Nothing;
+
+ ///
+ /// Get of Set te position in file
+ ///
+ public long BytePositionInStream { get; set; } = -1;
+
+ ///
+ /// Number of byte to undo when this byte is reach
+ ///
+ public long Length { get; set; } = 1;
+
+ #endregion properties
+
+ #region Methods
+
+ ///
+ /// Check if the object is valid and data can be used for action
+ ///
+ public bool IsValid => BytePositionInStream > -1 && Action != ByteAction.Nothing && Byte != null;
+
+ ///
+ /// String representation of byte
+ ///
+ public override string ToString() =>
+ $"ByteModified - Action:{Action} Position:{BytePositionInStream} Byte:{Byte}";
+
+ ///
+ /// Clear object
+ ///
+ public void Clear()
+ {
+ Byte = null;
+ Action = ByteAction.Nothing;
+ BytePositionInStream = -1;
+ Length = 1;
+ }
+
+ ///
+ /// Copy Current instance to another
+ ///
+ ///
+ public ByteModified GetCopy() => new ByteModified
+ {
+ Action = Action,
+ Byte = Byte,
+ Length = Length,
+ BytePositionInStream = BytePositionInStream
+ };
+
+ ///
+ /// Get if bytemodified is valid
+ ///
+ public static bool CheckIsValid(ByteModified byteModified) => byteModified != null && byteModified.IsValid;
+
+ #endregion Methods
+
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Bytes/ByteProvider.cs b/FModel/Forms/HexViewer/Core/Bytes/ByteProvider.cs
new file mode 100644
index 00000000..0efa17ca
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Bytes/ByteProvider.cs
@@ -0,0 +1,1725 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Xml.Linq;
+using WpfHexaEditor.Core.CharacterTable;
+using WpfHexaEditor.Core.MethodExtention;
+using Application = System.Windows.Application;
+using Clipboard = System.Windows.Clipboard;
+using DataObject = System.Windows.DataObject;
+using MessageBox = System.Windows.MessageBox;
+using TextDataFormat = System.Windows.TextDataFormat;
+
+namespace WpfHexaEditor.Core.Bytes
+{
+ ///
+ /// Used for interaction with file or stream
+ ///
+ public sealed class ByteProvider : IDisposable
+ {
+ #region Globals variable
+
+ private readonly IDictionary _byteModifiedDictionary = new Dictionary();
+ private string _fileName = string.Empty;
+ private Stream _stream;
+ private bool _readOnlyMode;
+ private double _longProcessProgress;
+ private string _newfilename = string.Empty;
+
+ #endregion Globals variable
+
+ #region Events
+
+ public event EventHandler DataCopiedToClipboard;
+ public event EventHandler ReadOnlyChanged;
+ public event EventHandler Closed;
+ public event EventHandler StreamOpened;
+ public event EventHandler PositionChanged;
+ public event EventHandler Undone;
+ public event EventHandler Redone;
+ public event EventHandler DataCopiedToStream;
+ public event EventHandler ChangesSubmited;
+ public event EventHandler LongProcessChanged;
+ public event EventHandler LongProcessStarted;
+ public event EventHandler LongProcessCompleted;
+ public event EventHandler LongProcessCanceled;
+ public event EventHandler DataPasted;
+ public event EventHandler FillWithByteCompleted;
+ public event EventHandler ReplaceByteCompleted;
+ public event EventHandler BytesAppendCompleted;
+
+ #endregion Events
+
+ #region Constructors
+
+ ///
+ /// Default constructor
+ ///
+ public ByteProvider()
+ {
+ }
+
+ ///
+ /// Construct new ByteProvider with filename and try to open file
+ ///
+ public ByteProvider(string fileName) => FileName = fileName;
+
+ ///
+ /// Constuct new ByteProvider with stream
+ ///
+ ///
+ public ByteProvider(Stream stream) => Stream = stream;
+
+ #endregion Constructors
+
+ #region Properties
+
+ ///
+ /// Get the type of stream are opened in byteprovider.
+ ///
+ //[Obsolete("The ByteProviderStreamType is lowly extensible in purpose of variety of stream source,and will be removed in next release.")]
+ public ByteProviderStreamType StreamType { get; internal set; } = ByteProviderStreamType.Nothing;
+
+ ///
+ /// Get the original length of file/stream . Return -1 if file is close.
+ ///
+ public long Length => IsOpen
+ ? _stream.Length //- GetByteModifieds(ByteAction.Deleted).Count() + GetByteModifieds(ByteAction.Added).Count()
+ : -1;
+
+ ///
+ /// Get the length of file/stream included byte added and deleted. Return -1 if file is close.
+ ///
+ public long LengthAjusted => IsOpen
+ ? _stream.Length - GetByteModifieds(ByteAction.Deleted).Count() + GetByteModifieds(ByteAction.Added).Count()
+ : -1;
+
+ ///
+ /// Return true if file or stream are empty or close.
+ ///
+ public bool IsEmpty => !IsOpen || Length == 0;
+
+ #region Open/close stream property/methods
+
+ ///
+ /// Set or Get the file with the control will show hex
+ ///
+ //[Obsolete("The FileName will be removed in next release.")]
+ public string FileName
+ {
+ get => _fileName;
+
+ set
+ {
+
+ _fileName = value;
+ OpenFile();
+ }
+ }
+
+ ///
+ /// Get or set a MemoryStream for use with byteProvider
+ ///
+ public Stream Stream
+ {
+ get => _stream;
+ set
+ {
+ var readonlymode = _readOnlyMode;
+ Close();
+ _readOnlyMode = readonlymode;
+
+ StreamType = ByteProviderStreamType.MemoryStream;
+
+ _stream = value;
+
+ StreamOpened?.Invoke(this, new EventArgs());
+ }
+ }
+
+ #endregion Properties
+
+ ///
+ /// Open file are set in FileName property
+ ///
+ public void OpenFile()
+ {
+ if (File.Exists(FileName))
+ {
+ Close();
+
+ var readOnlyMode = false;
+
+ try
+ {
+ _stream = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
+ }
+ catch
+ {
+ if (MessageBox.Show("The file is locked. Do you want to open it in read-only mode?", string.Empty,
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ _stream = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+
+ readOnlyMode = true;
+ }
+ }
+
+ if (readOnlyMode)
+ ReadOnlyMode = true;
+
+ StreamType = ByteProviderStreamType.File;
+
+ StreamOpened?.Invoke(this, new EventArgs());
+ }
+ else
+ {
+ throw new FileNotFoundException();
+ }
+ }
+
+ ///
+ /// Put the control on readonly mode.
+ ///
+ public bool ReadOnlyMode
+ {
+ get => _readOnlyMode;
+ set
+ {
+ _readOnlyMode = value;
+
+ //Launch event
+ ReadOnlyChanged?.Invoke(this, new EventArgs());
+ }
+ }
+
+ ///
+ /// Close stream
+ /// ReadOnlyMode is reset to false
+ ///
+ public void Close()
+ {
+ if (IsOpen)
+ {
+ _stream.Close();
+ _stream = null;
+ _newfilename = string.Empty;
+ ReadOnlyMode = false;
+ IsOnLongProcess = false;
+ LongProcessProgress = 0;
+
+ ClearUndoChange();
+ StreamType = ByteProviderStreamType.Nothing;
+
+ Closed?.Invoke(this, new EventArgs());
+ }
+ }
+
+ #endregion Open/close stream property/methods
+
+ #region Stream position
+
+ ///
+ /// Check if position as at EOF.
+ ///
+ public bool Eof => _stream.Position == _stream.Length || _stream.Position > _stream.Length;
+
+ ///
+ /// Get or Set position in file. Return -1 when file is closed
+ ///
+ public long Position
+ {
+ get => IsOpen ? (_stream.Position <= _stream.Length ? _stream.Position : _stream.Length) : -1;
+ set
+ {
+ if (!IsOpen) return;
+
+ _stream.Position = value;
+
+ PositionChanged?.Invoke(this, new EventArgs());
+ }
+ }
+
+ #endregion Stream position
+
+ #region isOpen property/methods
+
+ ///
+ /// Get if file is open
+ ///
+ public bool IsOpen => _stream != null;
+
+ ///
+ /// Get if file is open
+ ///
+ public static bool CheckIsOpen(ByteProvider provider) => provider?.IsOpen == true;
+
+ #endregion isOpen property/methods
+
+ #region Read byte
+
+ ///
+ /// Readbyte at position if file CanRead. Return -1 is file is closed of EOF.
+ ///
+ ///
+ public int ReadByte() => IsOpen && _stream?.CanRead == true ? _stream.ReadByte() : -1;
+
+ ///
+ /// Read bytes, length of reading are definid with parameter count. Start at position if file CanRead. Return null is file is closed or can be read.
+ ///
+ ///
+ public byte[] Read(int count)
+ {
+ if (!IsOpen) return null;
+ if (!_stream.CanRead) return null;
+
+ var countAdjusted = count;
+
+ if (Length - Position <= count)
+ countAdjusted = (int)(Length - Position);
+
+ var bytesReaded = new byte[countAdjusted];
+ _stream.Read(bytesReaded, 0, countAdjusted);
+
+ return bytesReaded;
+ }
+
+ ///
+ /// Read bytes
+ ///
+ public int Read(byte[] destination, int offset, int count) =>
+ IsOpen && _stream.CanRead
+ ? _stream.Read(destination, offset, count)
+ : -1;
+
+ //DEV TEST
+ //public int Read(byte[] destination, int offset, int count)
+ //{
+ // if (!IsOpen || !_stream.CanRead) return -1;
+
+ // for (int i = 0; i < count; i++)
+ // {
+ // if (!CheckIfIsByteModified(Position, ByteAction.Deleted).success)
+ // destination[i] = (byte)ReadByte();
+ // else
+ // {
+ // i--;
+ // Position++;
+ // }
+
+ // }
+
+ // return count; //_stream.Read(destination, offset, count);
+ //}
+
+ #endregion read byte
+
+ #region SubmitChanges to file/stream
+
+ ///
+ /// Submit change in a new file (Save as...)
+ /// TODO: ADD VALIDATION
+ ///
+ public bool SubmitChanges(string newFileName, bool overwrite = false)
+ {
+ _newfilename = string.Empty;
+
+ if (File.Exists(newFileName) && !overwrite)
+ return false;
+
+ //Save as
+ _newfilename = newFileName;
+ if (string.IsNullOrEmpty(_newfilename))
+ return false;
+
+ File.Create(_newfilename).Close();
+ SubmitChanges();
+ return true;
+ }
+
+ ///
+ /// Submit change to files/stream
+ ///
+ public void SubmitChanges()
+ {
+ if (!CanWrite)
+ throw new InvalidOperationException($"Cannot write to stream while {nameof(CanWrite)} is set to false.");
+
+ if (!Stream.CanWrite)
+ throw new InvalidOperationException($"Cannot write to stream while {nameof(Stream)}.{nameof(CanWrite)} is set to false.");
+
+ var cancel = false;
+
+ //Launch event at process started
+ IsOnLongProcess = true;
+ LongProcessStarted?.Invoke(this, new EventArgs());
+
+ //Set percent of progress to zero and create and iterator for help mesure progress
+ LongProcessProgress = 0;
+ int i;
+
+ //Create appropriate temp stream for new file.
+ using (var memoryStream = new MemoryStream())
+ {
+ var newStream = Length < ConstantReadOnly.Largefilelength
+ ? (Stream)memoryStream
+ : File.Open(Path.GetTempFileName(), FileMode.Open, FileAccess.ReadWrite);
+
+ //Fast change only nothing byte deleted or added
+ if (!GetByteModifieds(ByteAction.Deleted).Any() &&
+ !GetByteModifieds(ByteAction.Added).Any() &&
+ !File.Exists(_newfilename))
+ {
+ var bytemodifiedList = GetByteModifieds(ByteAction.Modified);
+ double countChange = bytemodifiedList.Count;
+ i = 0;
+
+ #region Fast save. only save byteaction=modified
+
+ foreach (var bm in bytemodifiedList)
+ if (bm.Value.IsValid)
+ {
+ //Set percent of progress
+ LongProcessProgress = i++ / countChange;
+
+ //Break process?
+ if (!IsOnLongProcess)
+ {
+ cancel = true;
+ break;
+ }
+
+ _stream.Position = bm.Key;
+ _stream.WriteByte(bm.Value.Byte.Value);
+ }
+
+ #endregion
+ }
+ else
+ {
+ //assur that we have at less 1 byte modified... if not add the first byte of file
+ if (_byteModifiedDictionary.Count == 0)
+ AddByteModified(GetByte(0).singleByte, 0);
+
+ byte[] buffer;
+ long bufferlength;
+ var sortedBm = GetByteModifieds(ByteAction.All).OrderBy(b => b.Key).ToList();
+ double countChange = sortedBm.Count;
+ i = 0;
+
+ //Set position
+ Position = 0;
+
+ //Start update and rewrite file.
+ foreach (var nextByteModified in sortedBm)
+ {
+ //Set percent of progress
+ LongProcessProgress = i++ / countChange;
+
+ //Break process?
+ if (!IsOnLongProcess) break;
+
+ //Reset buffer
+ buffer = new byte[ConstantReadOnly.Copyblocksize];
+
+ #region start read/write / use little block for optimize memory
+
+ while (Position != nextByteModified.Key)
+ {
+ bufferlength = nextByteModified.Key - Position;
+
+ //TEMPS
+ if (bufferlength < 0)
+ bufferlength = 1;
+
+ //EOF
+ if (bufferlength < ConstantReadOnly.Copyblocksize)
+ buffer = new byte[bufferlength];
+
+ _stream.Read(buffer, 0, buffer.Length);
+ newStream.Write(buffer, 0, buffer.Length);
+ }
+
+ #endregion
+
+ #region Apply ByteAction!
+
+ switch (nextByteModified.Value.Action)
+ {
+ case ByteAction.Added:
+ //TODO : IMPLEMENTING ADD BYTE
+ break;
+ case ByteAction.Deleted:
+ Position++;
+ break;
+ case ByteAction.Modified:
+ Position++;
+ newStream.WriteByte(nextByteModified.Value.Byte.Value);
+ break;
+ }
+
+ #endregion
+
+ #region Read/Write the last section of file
+
+ if (nextByteModified.Key == sortedBm.Last().Key)
+ {
+ while (!Eof)
+ {
+ bufferlength = _stream.Length - Position;
+
+ //EOF
+ if (bufferlength < ConstantReadOnly.Copyblocksize)
+ buffer = new byte[bufferlength];
+
+ _stream.Read(buffer, 0, buffer.Length);
+ newStream.Write(buffer, 0, buffer.Length);
+ }
+ }
+
+ #endregion
+ }
+
+ #region Set stream to new file (save as)
+
+ var refreshByteProvider = false;
+ if (File.Exists(_newfilename))
+ {
+ _stream?.Close();
+ _stream = File.Open(_newfilename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
+ _stream?.SetLength(newStream.Length);
+ refreshByteProvider = true;
+ }
+
+ #endregion
+
+ #region Write new data to current stream
+
+ Position = 0;
+ newStream.Position = 0;
+ buffer = new byte[ConstantReadOnly.Copyblocksize];
+
+ while (!Eof)
+ {
+ //Set percent of progress
+ LongProcessProgress = Position / (double)Length;
+
+ //Break process?
+ if (!IsOnLongProcess)
+ {
+ cancel = true;
+ break;
+ }
+
+ bufferlength = _stream.Length - Position;
+
+ //EOF
+ if (bufferlength < ConstantReadOnly.Copyblocksize)
+ buffer = new byte[bufferlength];
+
+ newStream.Read(buffer, 0, buffer.Length);
+ _stream.Write(buffer, 0, buffer.Length);
+ }
+ _stream.SetLength(newStream.Length);
+
+ #endregion
+
+ //dispose resource
+ newStream.Close();
+
+ if (refreshByteProvider)
+ FileName = _newfilename;
+ }
+ }
+
+ //Launch event at process completed
+ if (cancel)
+ LongProcessCanceled?.Invoke(this, new EventArgs());
+ else
+ LongProcessCompleted?.Invoke(this, new EventArgs());
+
+ //Launch event
+ ChangesSubmited?.Invoke(this, new EventArgs());
+ }
+
+ #endregion SubmitChanges to file/stream
+
+ #region Bytes modifications methods
+
+ ///
+ /// Check if the byte in parameter are modified and return original Bytemodified from list
+ ///
+ public (bool success, ByteModified val) CheckIfIsByteModified(long bytePositionInStream,
+ ByteAction action = ByteAction.Modified)
+ {
+ //if (action != ByteAction.Deleted)
+ //{
+ return _byteModifiedDictionary.TryGetValue(bytePositionInStream, out var byteModified)
+ && byteModified.IsValid && (byteModified.Action == action || action == ByteAction.All)
+ ? (true, byteModified)
+ : (false, null);
+ //}
+ //else //checkup is deleted
+ //{
+ // var find = false;
+ // ByteModified byteModified = null;
+ // foreach (var bm in _byteModifiedDictionary.Where(bm => bm.Value.Action == ByteAction.Deleted))
+ // if (bm.Value.BytePositionInStream >= bytePositionInStream &&
+ // bm.Value.BytePositionInStream <= bytePositionInStream)
+ // {
+ // find = true;
+ // byteModified = bm.Value;
+ // }
+
+ // return find
+ // ? (true, byteModified)
+ // : (false, null);
+ //}
+ }
+
+ ///
+ /// Add/Modifiy a ByteModifed in the list of byte have changed
+ ///
+ public void AddByteModified(byte? @byte, long BytePositionInStream, long undoLength = 1)
+ {
+ var (success, _) = CheckIfIsByteModified(BytePositionInStream);
+
+ if (success)
+ _byteModifiedDictionary.Remove(BytePositionInStream);
+
+ var byteModified = new ByteModified
+ {
+ Byte = @byte,
+ Length = undoLength,
+ BytePositionInStream = BytePositionInStream,
+ Action = ByteAction.Modified
+ };
+
+ try
+ {
+ _byteModifiedDictionary.Add(BytePositionInStream, byteModified);
+ UndoStack.Push(byteModified);
+ }
+ catch
+ {
+ // ignored
+ }
+ }
+
+ ///
+ /// Add/Modifiy a ByteModifed in the list of byte have deleted
+ ///
+ public void AddByteDeleted(long bytePositionInStream, long length)
+ {
+ var position = bytePositionInStream;
+
+ for (var i = 0; i < length; i++)
+ {
+ if (i % 100 == 0) Application.Current.DoEvents();
+
+ var (success, _) = CheckIfIsByteModified(position, ByteAction.All);
+
+ if (success)
+ _byteModifiedDictionary.Remove(position);
+
+ var byteModified = new ByteModified
+ {
+ Byte = new byte(),
+ Length = length,
+ BytePositionInStream = position,
+ Action = ByteAction.Deleted
+ };
+ _byteModifiedDictionary.Add(position, byteModified);
+
+ UndoStack.Push(byteModified);
+
+ position++;
+ }
+
+ //DEV TEST: ONLY ADD 1 BYTEMODIFIED ALSO OF 1 BY BYTE ARE DELETED...
+ ////TODO: CHECK IF BYTE ARE ALREADY DELETED AND IF YES CHECK IF LENGHT FIT THEN AJUST...
+ //// var (success, _) = CheckIfIsByteModified(position, ByteAction.All);
+
+ //var byteModified = new ByteModified
+ //{
+ // Byte = new byte(),
+ // Length = length,
+ // BytePositionInStream = bytePositionInStream, //First byte deleted
+ // Action = ByteAction.Deleted
+ //};
+ //_byteModifiedDictionary.Add(bytePositionInStream, byteModified);
+
+ //UndoStack.Push(byteModified);
+ }
+
+
+ ///
+ /// Return an IEnumerable ByteModified have action set to Modified
+ ///
+ public IDictionary GetByteModifieds(ByteAction action) =>
+ action == ByteAction.All
+ ? _byteModifiedDictionary
+ : _byteModifiedDictionary.Where(b => b.Value.Action == action).ToDictionary(k => k.Key, v => v.Value);
+
+ ///
+ /// Fill with byte at position
+ ///
+ /// The position to start fill
+ /// The length to fill
+ /// the byte to fill
+ public void FillWithByte(long startPosition, long length, byte b)
+ {
+ //Launch event at process strated
+ IsOnLongProcess = true;
+ LongProcessStarted?.Invoke(this, new EventArgs());
+
+ Position = startPosition;
+
+ if (Position > -1)
+ {
+ for (var i = 0; i < length; i++)
+ {
+ if (!Eof)
+ {
+ //Do not freeze UI...
+ if (i % 2000 == 0)
+ LongProcessProgress = (double)i / length;
+
+ //Break long process if needed
+ if (!IsOnLongProcess)
+ break;
+
+ Position = startPosition + i;
+ if (GetByte(Position).singleByte != b)
+ AddByteModified(b, Position - 1);
+ }
+ else
+ break;
+ }
+
+ FillWithByteCompleted?.Invoke(this, new EventArgs());
+ }
+
+ //Launch event at process completed
+ IsOnLongProcess = false;
+ LongProcessCompleted?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Replace byte with another in selection
+ ///
+ /// The position to start fill
+ /// The length of the selection
+ public void ReplaceByte(long startPosition, long length, byte original, byte replace)
+ {
+ //Launch event at process strated
+ IsOnLongProcess = true;
+ LongProcessStarted?.Invoke(this, new EventArgs());
+
+ Position = startPosition;
+
+ if (Position > -1)
+ {
+ for (var i = 0; i < length; i++)
+ {
+ if (!Eof)
+ {
+ //Do not freeze UI...
+ if (i % 2000 == 0)
+ LongProcessProgress = (double)i / length;
+
+ //Break long process if needed
+ if (!IsOnLongProcess)
+ break;
+
+ Position = startPosition + i;
+ if (GetByte(Position).singleByte == original)
+ AddByteModified(replace, Position - 1);
+ }
+ else
+ break;
+ }
+
+ ReplaceByteCompleted?.Invoke(this, new EventArgs());
+ }
+
+ //Launch event at process completed
+ IsOnLongProcess = false;
+ LongProcessCompleted?.Invoke(this, new EventArgs());
+ }
+
+ #endregion Bytes modifications methods
+
+ #region Copy/Paste/Cut Methods
+
+ ///
+ /// Get the length of byte are selected (base 1)
+ ///
+ public static long GetSelectionLength(long selectionStart, long selectionStop)
+ {
+ if (selectionStart == -1 || selectionStop == -1)
+ return 0;
+
+ if (selectionStart == selectionStop)
+ return 1;
+
+ return selectionStart > selectionStop
+ ? selectionStart - selectionStop + 1
+ : selectionStop - selectionStart + 1;
+ }
+
+ ///
+ /// Get the byte at selection start.
+ ///
+ /// if true take bytemodified in operation
+ public (byte? singleByte, bool succes) GetByte(long position, bool copyChange = true)
+ {
+ if (!CanCopy(position, position)) return (null, false);
+
+ //Variables
+ if (position > -1)
+ {
+ var buffer = GetCopyData(position, position, copyChange);
+
+ if (buffer.Any())
+ return (buffer[0], true);
+ }
+ else
+ return (null, false);
+
+ return (null, false);
+ }
+
+ ///
+ /// Copies the current selection in the hex box to the Clipboard.
+ ///
+ /// Set tu true if you want include change in your copy. Set to false to copy directly from source
+ public byte[] GetCopyData(long selectionStart, long selectionStop, bool copyChange)
+ {
+ //Validation
+ if (!CanCopy(selectionStart, selectionStop)) return new byte[0];
+ if (selectionStart == -1 || selectionStop == -1) return new byte[0];
+
+ //Variable
+ var bufferList = new List();
+
+ #region Set start position
+
+ _stream.Position = selectionStart != selectionStop
+ ? (selectionStart > selectionStop
+ ? selectionStop
+ : selectionStart)
+ : selectionStart;
+
+ #endregion
+
+
+ //Exclude byte deleted from copy
+ if (!copyChange)
+ {
+ var buffer = new byte[GetSelectionLength(selectionStart, selectionStop)];
+ _stream.Read(buffer, 0, Convert.ToInt32(GetSelectionLength(selectionStart, selectionStop)));
+ return buffer;
+ }
+
+ for (var i = 0; i < GetSelectionLength(selectionStart, selectionStop); i++)
+ {
+ var (success, byteModified) = CheckIfIsByteModified(_stream.Position, ByteAction.All);
+
+ if (!success)
+ {
+ bufferList.Add((byte)_stream.ReadByte());
+ continue;
+ }
+
+ switch (byteModified.Action)
+ {
+ case ByteAction.Modified:
+ if (byteModified.IsValid) bufferList.Add(byteModified.Byte.Value);
+ break;
+ //case ByteAction.Deleted: //NOTHING to do we dont want to add deleted byte
+ //case ByteAction.Added: //TODO : IMPLEMENTING ADD BYTE
+ // break;
+ }
+
+ _stream.Position++;
+ }
+
+ return bufferList.ToArray();
+ }
+
+ ///
+ /// Copy selection of byte to clipboard
+ ///
+ /// Set to true if you want onclude change in your copy. Set to false to copy directly from source
+ public void CopyToClipboard(CopyPasteMode copypastemode, long selectionStart, long selectionStop,
+ bool copyChange = true, TblStream tbl = null)
+ {
+ if (!CanCopy(selectionStart, selectionStop)) return;
+
+ //Variables
+ var buffer = GetCopyData(selectionStart, selectionStop, copyChange);
+ string sBuffer;
+
+ var da = new DataObject();
+
+ switch (copypastemode)
+ {
+ case CopyPasteMode.Byte:
+ throw new NotImplementedException();
+ case CopyPasteMode.TblString when tbl != null:
+ sBuffer = tbl.ToTblString(buffer);
+ da.SetText(sBuffer, TextDataFormat.Text);
+ break;
+ case CopyPasteMode.AsciiString:
+ sBuffer = ByteConverters.BytesToString(buffer);
+ da.SetText(sBuffer, TextDataFormat.Text);
+ break;
+ case CopyPasteMode.HexaString:
+ sBuffer = ByteConverters.ByteToHex(buffer);
+ da.SetText(sBuffer, TextDataFormat.Text);
+ break;
+ case CopyPasteMode.CSharpCode:
+ CopyToClipboard_Language(selectionStart, selectionStop, copyChange, da, CodeLanguage.CSharp);
+ break;
+ case CopyPasteMode.CCode:
+ CopyToClipboard_Language(selectionStart, selectionStop, copyChange, da, CodeLanguage.C);
+ break;
+ case CopyPasteMode.JavaCode:
+ CopyToClipboard_Language(selectionStart, selectionStop, copyChange, da, CodeLanguage.Java);
+ break;
+ case CopyPasteMode.FSharpCode:
+ CopyToClipboard_Language(selectionStart, selectionStop, copyChange, da, CodeLanguage.FSharp);
+ break;
+ case CopyPasteMode.VbNetCode:
+ CopyToClipboard_Language(selectionStart, selectionStop, copyChange, da, CodeLanguage.Vbnet);
+ break;
+ case CopyPasteMode.PascalCode:
+ CopyToClipboard_Language(selectionStart, selectionStop, copyChange, da, CodeLanguage.Pascal);
+ break;
+ }
+
+ //set memorystream (BinaryData) clipboard data
+ using (var ms = new MemoryStream(buffer, 0, buffer.Length, false, true))
+ da.SetData("BinaryData", ms);
+
+ Clipboard.SetDataObject(da, true);
+
+ DataCopiedToClipboard?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Copy selection to clipboard in code block
+ ///
+ private void CopyToClipboard_Language(long selectionStart, long selectionStop, bool copyChange, DataObject da, CodeLanguage language)
+ {
+ if (!CanCopy(selectionStart, selectionStop)) return;
+
+ //Variables
+ var buffer = GetCopyData(selectionStart, selectionStop, copyChange);
+ var i = 0;
+ var length = GetSelectionLength(selectionStart, selectionStop);
+ var delimiter = language == CodeLanguage.FSharp ? ";" : ",";
+
+ var sb = new StringBuilder();
+
+ #region define header
+
+ switch (language)
+ {
+ case CodeLanguage.C:
+ case CodeLanguage.CSharp:
+ case CodeLanguage.Java:
+ sb.Append(
+ $"/* {FileName} ({DateTime.Now.ToString(CultureInfo.CurrentCulture)}), \r\n StartPosition: 0x{ByteConverters.LongToHex(selectionStart)}, StopPosition: 0x{ByteConverters.LongToHex(selectionStop)}, Length: 0x{ByteConverters.LongToHex(length)} */");
+ break;
+ case CodeLanguage.Vbnet:
+ sb.Append(
+ $"' {FileName} ({DateTime.Now.ToString(CultureInfo.CurrentCulture)}), \r\n' StartPosition: &H{ByteConverters.LongToHex(selectionStart)}, StopPosition: &H{ByteConverters.LongToHex(selectionStop)}, Length: &H{ByteConverters.LongToHex(length)}");
+ break;
+ case CodeLanguage.Pascal:
+ sb.Append(
+ "{ " + $" {FileName} ({DateTime.Now.ToString(CultureInfo.CurrentCulture)}), \r\n StartPosition: 0x{ByteConverters.LongToHex(selectionStart)}, StopPosition: 0x{ByteConverters.LongToHex(selectionStop)}, Length: 0x{ByteConverters.LongToHex(length)}" + " }");
+ break;
+ case CodeLanguage.FSharp:
+ sb.Append(
+ $"// {FileName} ({DateTime.Now.ToString(CultureInfo.CurrentCulture)}), \r\n// StartPosition: 0x{ByteConverters.LongToHex(selectionStart)}, StopPosition: 0x{ByteConverters.LongToHex(selectionStop)}, Length: 0x{ByteConverters.LongToHex(length)}");
+ break;
+ }
+
+ #endregion
+
+ sb.AppendLine();
+ sb.AppendLine();
+
+ #region define string representation of copied data
+
+ switch (language)
+ {
+ case CodeLanguage.CSharp:
+ sb.Append($"string sData =\"{ByteConverters.BytesToString(buffer)}\";");
+ sb.AppendLine();
+ sb.Append(
+ $"string sDataHex =\"{ByteConverters.StringToHex(ByteConverters.BytesToString(buffer))}\";");
+ sb.AppendLine();
+ sb.AppendLine();
+ sb.Append("byte[] rawData = {");
+ sb.AppendLine();
+ sb.Append("\t");
+ break;
+ case CodeLanguage.Java:
+ sb.Append($"String sData =\"{ByteConverters.BytesToString(buffer)}\";");
+ sb.AppendLine();
+ sb.Append(
+ $"String sDataHex =\"{ByteConverters.StringToHex(ByteConverters.BytesToString(buffer))}\";");
+ sb.AppendLine();
+ sb.AppendLine();
+ sb.Append("byte rawData[] = {");
+ sb.AppendLine();
+ sb.Append("\t");
+ break;
+ case CodeLanguage.C:
+ sb.Append($"char sData[] =\"{ByteConverters.BytesToString(buffer)}\";");
+ sb.AppendLine();
+ sb.Append(
+ $"char sDataHex[] =\"{ByteConverters.StringToHex(ByteConverters.BytesToString(buffer))}\";");
+ sb.AppendLine();
+ sb.AppendLine();
+ sb.Append($"unsigned char rawData[{length}] {{");
+ sb.AppendLine();
+ sb.Append("\t");
+ break;
+ case CodeLanguage.FSharp:
+ sb.Append($"let sData = @\"{ByteConverters.BytesToString(buffer)}\";");
+ sb.AppendLine();
+ sb.Append(
+ $"let sDataHex = @\"{ByteConverters.StringToHex(ByteConverters.BytesToString(buffer))}\";");
+ sb.AppendLine();
+ sb.AppendLine();
+ sb.Append("let bytes = [|");
+ sb.AppendLine();
+ sb.Append(" ");
+ break;
+ case CodeLanguage.Vbnet:
+ sb.Append($"Dim sData as String =\"{ByteConverters.BytesToString(buffer)}\";");
+ sb.AppendLine();
+ sb.Append(
+ $"Dim sDataHex as String =\"{ByteConverters.StringToHex(ByteConverters.BytesToString(buffer))}\";");
+ sb.AppendLine();
+ sb.AppendLine();
+ sb.Append("Dim rawData As Byte() = { _");
+ sb.AppendLine();
+ sb.Append("\t");
+ break;
+ case CodeLanguage.Pascal:
+ sb.Append($"sData: string = @\'{ByteConverters.BytesToString(buffer)}\';");
+ sb.AppendLine();
+ sb.Append(
+ $"sDataHex: string = @\'{ByteConverters.StringToHex(ByteConverters.BytesToString(buffer))}\';");
+ sb.AppendLine();
+ sb.AppendLine();
+ sb.Append($"RawData: array[0..{buffer.Length - 1}] of Byte = (");
+ sb.AppendLine();
+ sb.Append(" ");
+ break;
+ }
+
+ #endregion
+
+ #region Build data array
+
+ foreach (var b in buffer)
+ {
+ i++;
+ if (language == CodeLanguage.Java) sb.Append("(byte)");
+
+ #region Append byte
+ string byteStr;
+ switch (language)
+ {
+ case CodeLanguage.Vbnet:
+ byteStr = $"&H{ByteConverters.ByteToHex(b)}, ";
+ break;
+ case CodeLanguage.Pascal:
+ byteStr = $"${ByteConverters.ByteToHex(b)}, ";
+ break;
+ default:
+ byteStr = $"0x{ByteConverters.ByteToHex(b)}{delimiter} ";
+ break;
+ }
+ sb.Append(byteStr);
+ #endregion
+
+ if (i == (language == CodeLanguage.Java ? 6 : 12))
+ {
+ i = 0;
+ if (language == CodeLanguage.Vbnet) sb.Append("_");
+ sb.AppendLine();
+ sb.Append(language != CodeLanguage.FSharp ? "\t" : " ");
+ }
+ }
+ if (language == CodeLanguage.Vbnet) sb.Append("_");
+ sb.AppendLine();
+ #endregion
+
+ #region End of block
+ string sByteEnd;
+ switch (language)
+ {
+ case CodeLanguage.FSharp:
+ sByteEnd = "|]";
+ break;
+ case CodeLanguage.Pascal:
+ sByteEnd = ");";
+ break;
+ default:
+ sByteEnd = "};";
+ break;
+ }
+ sb.Append(sByteEnd);
+ #endregion
+
+ da.SetText(sb.ToString(), TextDataFormat.Text);
+ }
+
+ ///
+ /// Copy selection of byte to a stream
+ ///
+ /// Output stream. Data will be copied at end of stream
+ /// Set tu true if you want onclude change in your copy. Set to false to copy directly from source
+ public void CopyToStream(Stream output, long selectionStart, long selectionStop, bool copyChange = true)
+ {
+ if (!CanCopy(selectionStart, selectionStop)) return;
+ if (output is null) return;
+
+ //Variables
+ var buffer = GetCopyData(selectionStart, selectionStop, copyChange);
+
+ if (output.CanWrite)
+ output.Write(buffer, (int)output.Length, buffer.Length);
+ else
+ throw new IOException(FModel.Properties.Resources.WritingErrorExeptionString);
+
+ DataCopiedToStream?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Get all byte from byte provider...
+ ///
+ public byte[] GetAllBytes(bool copyChange = true) => GetCopyData(0, Length - 1, copyChange);
+
+ ///
+ /// Paste the string at position with posibility to expend and append at end of file
+ ///
+ /// The string to paste
+ /// The position to start pasting. Return if position is less than zero
+ /// If true expend the file if needed, ATTENTION: bytes expended can't be canceled with undo
+ public void Paste(long startPosition, string pasteString, bool expend)
+ {
+ if (startPosition < 0) return;
+ if (pasteString is null) return;
+
+ long pastelength = pasteString.Length;
+ Position = startPosition;
+ var i = 0;
+
+ //Expend if needed
+ if (Position + pastelength > Length && expend)
+ {
+ var lengthToExpend = Position - Length + pastelength;
+ AppendByte(0, lengthToExpend);
+ Position = startPosition;
+ }
+
+ //Start to paste the string
+ if (Position > -1)
+ {
+ foreach (var chr in pasteString)
+ if (!Eof)
+ {
+ Position = startPosition + i++;
+ if (GetByte(Position).singleByte != ByteConverters.CharToByte(chr))
+ AddByteModified(ByteConverters.CharToByte(chr), Position - 1, pastelength);
+ }
+ else
+ break;
+
+ DataPasted?.Invoke(this, new EventArgs());
+ }
+ }
+
+ ///
+ /// Paste the byte array at position with posibility to expend and append at end of file
+ ///
+ /// The byte array to paste
+ /// The position to start pasting
+ /// If true expend the file if needed, ATTENTION: bytes expended can't be canceled with undo
+ public void Paste(long startPosition, byte[] pasteBytes, bool expend)
+ {
+ if (pasteBytes is null) return;
+
+ long pastelength = pasteBytes.Length;
+ Position = startPosition;
+ var i = 0;
+
+ //Expend if needed
+ if (Position + pastelength > Length && expend)
+ {
+ var lengthToExpend = Position - Length + pastelength;
+ AppendByte(0, lengthToExpend);
+ Position = startPosition;
+ }
+
+ //Start to paste the string
+ if (Position > -1)
+ {
+ foreach (var bt in pasteBytes)
+ if (!Eof)
+ {
+ Position = startPosition + i++;
+ if (GetByte(Position).singleByte != bt)
+ AddByteModified(bt, Position - 1, pastelength);
+ }
+ else
+ break;
+
+ DataPasted?.Invoke(this, new EventArgs());
+ }
+ }
+
+ ///
+ /// Paste the string at position
+ ///
+ /// The string to paste
+ public void PasteNotInsert(string pasteString) => Paste(Position, pasteString, false);
+
+ ///
+ /// Paste the string at position
+ ///
+ /// The string to paste
+ /// Start position
+ public void PasteNotInsert(long position, string pasteString) => Paste(position, pasteString, false);
+
+ ///
+ /// Paste the bytes array at position
+ ///
+ /// The bytes array to paste
+ /// Start position
+ public void PasteNotInsert(long position, byte[] pasteBytes) => Paste(position, pasteBytes, false);
+
+ ///
+ /// Paste the bytes array at actual position
+ ///
+ /// The bytes array to paste
+ public void PasteNotInsert(byte[] pasteBytes) => Paste(Position, pasteBytes, false);
+
+ #endregion Copy/Paste/Cut Methods
+
+ #region Undo / Redo
+
+ ///
+ /// Undo last byteaction
+ ///
+ /// Return a list of long contening the position are undone.
+ public void Undo()
+ {
+ if (CanUndo)
+ {
+ var last = UndoStack.Pop();
+ var bytePositionList = new List();
+ var undoLength = last.Action != ByteAction.Deleted ? last.Length : 1;
+
+ bytePositionList.Add(last.BytePositionInStream);
+ _byteModifiedDictionary.Remove(last.BytePositionInStream);
+ RedoStack.Push(last);
+
+ if (undoLength > 1)
+ for (var i = 0; i < undoLength; i++)
+ if (UndoStack.Count > 0)
+ {
+ last = UndoStack.Pop();
+ bytePositionList.Add(last.BytePositionInStream);
+ _byteModifiedDictionary.Remove(last.BytePositionInStream);
+ RedoStack.Push(last);
+ }
+
+ Undone?.Invoke(bytePositionList, new EventArgs());
+ }
+ }
+
+ ///
+ /// Redo last action made with redo...
+ ///
+ /// Return a list of long contening the position are redone.
+ public void Redo()
+ {
+ if (CanRedo)
+ {
+ var last = RedoStack.Pop();
+ var bytePositionList = new List();
+ var redoLength = last.Action != ByteAction.Deleted ? last.Length : 1;
+
+ bytePositionList.Add(last.BytePositionInStream);
+ addUndo(last);
+
+ if (redoLength > 1)
+ for (var i = 0; i < redoLength; i++)
+ if (RedoStack.Count > 0)
+ {
+ last = RedoStack.Pop();
+ bytePositionList.Add(last.BytePositionInStream);
+
+ addUndo(last);
+ }
+
+ Redone?.Invoke(bytePositionList, new EventArgs());
+ }
+
+ #region local fonction
+ void addUndo(ByteModified last)
+ {
+ //add undo...
+ switch (last.Action)
+ {
+ case ByteAction.Deleted:
+ AddByteDeleted(last.BytePositionInStream, last.Length);
+ break;
+ case ByteAction.Modified:
+ AddByteModified(last.Byte, last.BytePositionInStream, last.Length);
+ break;
+ }
+ }
+ #endregion
+ }
+
+ ///
+ /// Clear changes and undo
+ ///
+ public void ClearUndoChange()
+ {
+ _byteModifiedDictionary?.Clear();
+ UndoStack?.Clear();
+ }
+
+ ///
+ /// Clear changes and Redo
+ ///
+ public void ClearRedoChange() => RedoStack?.Clear();
+
+ ///
+ /// Gets the undo count.
+ ///
+ public int UndoCount => UndoStack.Count;
+
+ ///
+ /// Gets the redo count.
+ ///
+ public int RedoCount => RedoStack.Count;
+
+ ///
+ /// Gets the undo stack.
+ ///
+ public Stack UndoStack { get; } = new Stack();
+
+ ///
+ /// Gets the redo stack.
+ ///
+ public Stack RedoStack { get; } = new Stack();
+
+ ///
+ /// Get or set for indicate if control CanUndo
+ ///
+ public bool IsUndoEnabled { get; set; } = true;
+
+ ///
+ /// Get or set for indicate if control CanRedo
+ ///
+ public bool IsRedoEnabled { get; set; } = true;
+
+ ///
+ /// Check if the control can undone to a previous value
+ ///
+ public bool CanUndo => IsUndoEnabled && UndoStack.Count > 0;
+
+ ///
+ /// Check if the control can redone to a previous value
+ ///
+ public bool CanRedo => IsRedoEnabled && RedoStack.Count > 0;
+
+ #endregion Undo / Redo
+
+ #region Various can do property...
+
+ ///
+ /// Return true if Copy method could be invoked.
+ ///
+ public bool CanCopy(long selectionStart, long selectionStop) =>
+ GetSelectionLength(selectionStart, selectionStop) >= 1 && IsOpen;
+
+ ///
+ /// Update a value indicating whether the current stream is supporting writing.
+ ///
+ public bool CanWrite => _stream != null && !ReadOnlyMode && _stream.CanWrite;
+
+ ///
+ /// Update a value indicating whether the current stream is supporting reading.
+ ///
+ public bool CanRead => _stream != null && _stream.CanRead;
+
+ ///
+ /// Update a value indicating whether the current stream is supporting seeking.
+ ///
+ public bool CanSeek => _stream != null && _stream.CanSeek;
+
+ #endregion Can do property...
+
+ #region Find methods
+
+ ///
+ /// Find all occurance of string in stream and return an IEnumerable contening index when is find.
+ ///
+ public IEnumerable FindIndexOf(string stringToFind, long startPosition = 0) =>
+ FindIndexOf(ByteConverters.StringToByte(stringToFind), startPosition);
+
+ ///
+ /// Find all occurance of byte[] in stream and return an IEnumerable contening index when is find.
+ ///
+ public IEnumerable FindIndexOf(byte[] bytesTofind, long startPosition = 0)
+ {
+ //start position checkup
+ if (startPosition > Length) startPosition = Length;
+ else if (startPosition < 0) startPosition = 0;
+
+ //var
+ Position = startPosition;
+ var buffer = new byte[ConstantReadOnly.Findblocksize];
+ //var indexList = new List();
+ var cancel = false;
+
+ //Launch event at process strated
+ IsOnLongProcess = true;
+ LongProcessStarted?.Invoke(this, new EventArgs());
+
+ //start find
+ for (var i = startPosition; i < Length; i++)
+ {
+ //Do not freeze UI...
+ if (i % 2000 == 0)
+ LongProcessProgress = (double)Position / Length;
+
+ //Break long process if needed
+ if (!IsOnLongProcess)
+ {
+ cancel = true;
+ break;
+ }
+
+ if ((byte)ReadByte() == bytesTofind[0])
+ {
+ //position correction after read one byte
+ Position--;
+ i--;
+
+ //buffer length corection
+ if (buffer.Length > Length - Position)
+ buffer = new byte[Length - Position];
+
+ //read buffer and find
+ _stream.Read(buffer, 0, buffer.Length);
+ var findindex = buffer.FindIndexOf(bytesTofind).ToList();
+
+ //if byte if find add to Yield return finded occurence
+ if (findindex.Any())
+ foreach (var index in findindex)
+ yield return index + i + 1;
+
+ //position correction
+ i += buffer.Length;
+ }
+ }
+
+ IsOnLongProcess = false;
+
+ //Launch event at process completed
+ if (cancel)
+ LongProcessCanceled?.Invoke(this, new EventArgs());
+ else
+ LongProcessCompleted?.Invoke(this, new EventArgs());
+ }
+
+ #endregion Find methods
+
+ #region Long process progress
+
+ ///
+ /// Get if byteprovider is on a long process. Set to false to cancel all process.
+ ///
+ public bool IsOnLongProcess { get; internal set; }
+
+ ///
+ /// Get the long progress percent of job.
+ /// When set (internal) launch event LongProcessProgressChanged
+ ///
+ public double LongProcessProgress
+ {
+ get => _longProcessProgress;
+
+ internal set
+ {
+ _longProcessProgress = value;
+ LongProcessChanged?.Invoke(value, new EventArgs());
+ }
+ }
+
+ #endregion Long process progress
+
+ #region IDisposable Support
+
+ private bool _disposedValue; // Pour détecter les appels redondants
+
+ private void Dispose(bool disposing)
+ {
+ if (_disposedValue) return;
+
+ if (disposing)
+ {
+ IsOnLongProcess = false;
+ _stream = null;
+ }
+
+ _disposedValue = true;
+ }
+
+ public void Dispose() => Dispose(true);
+
+ #endregion IDisposable Support
+
+ #region Computing count byte methods...
+
+ ///
+ /// Get an array of long computing the total of each byte in the file.
+ /// The position of the array makes it possible to obtain the sum of the desired byte
+ ///
+ ///
+ /// COUNT OF 0xff
+ /// var cnt = GetByteCount()[0xff]
+ ///
+ ///
+ /// https://stackoverflow.com/questions/45656378/c-what-is-the-fastest-way-to-count-byte-in-a-file/45656760#45656760
+ /// With help of Georg and David Heffernan on stackoverflow
+ ///
+ public long[] GetByteCount()
+ {
+ if (IsOpen)
+ {
+ //Launch event at process strated
+ IsOnLongProcess = true;
+ LongProcessStarted?.Invoke(this, new EventArgs());
+
+ const int copyBufferSize = 1024 * 1024;
+ var cancel = false;
+ var buffer = new byte[copyBufferSize];
+ var storedCnt = new long[256];
+ int count;
+
+ Position = 0;
+
+ while ((count = Read(buffer, 0, copyBufferSize)) > 0)
+ {
+ for (var i = 0; i < count; i++)
+ storedCnt[buffer[i]]++;
+
+ //Do not freeze UI...
+ if (Position % 2000 == 0)
+ LongProcessProgress = (double)Position / Length;
+
+ //Break long process if needed
+ if (!IsOnLongProcess)
+ {
+ cancel = true;
+ break;
+ }
+ }
+
+ IsOnLongProcess = false;
+
+ //Launch event at process completed
+ if (cancel)
+ {
+ LongProcessCanceled?.Invoke(this, new EventArgs());
+ return null;
+ }
+
+ LongProcessCompleted?.Invoke(this, new EventArgs());
+
+ return storedCnt;
+ }
+
+ return null;
+ }
+
+ #endregion
+
+ #region Append byte at end of file
+
+ ///
+ /// Append byte at end of file
+ ///
+ public void AppendByte(byte[] bytesToAppend)
+ {
+ if (bytesToAppend == null) return;
+
+ _stream.Position = _stream.Length;
+ _stream.SetLength(Length + bytesToAppend.Length);
+
+ foreach (byte b in bytesToAppend)
+ _stream.WriteByte(b);
+
+ BytesAppendCompleted?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Append byte at end of file
+ ///
+ public void AppendByte(byte byteToAppend, long count = 1)
+ {
+ _stream.Position = _stream.Length;
+ _stream.SetLength(Length + count);
+
+ for (var i = 0; i < count; i++)
+ _stream.WriteByte(byteToAppend);
+
+ BytesAppendCompleted?.Invoke(this, new EventArgs());
+ }
+
+ #endregion Append byte at end of file
+
+ #region Serialize (save/load) current state
+
+ ///
+ /// Serialize current state of provider
+ /// TODO: include bookmark...
+ ///
+ public void SaveState(string fileName)
+ {
+ var doc = new XDocument(new XElement("WpfHexEditor",
+ new XAttribute("Version", "0.1"),
+ new XElement("ByteModifieds", new XAttribute("Count", _byteModifiedDictionary.Count))));
+
+ var bmRoot = doc.Element("WpfHexEditor").Element("ByteModifieds");
+
+ //Create bytemodified tag
+ foreach (var bm in _byteModifiedDictionary)
+ bmRoot.Add(new XElement("ByteModified",
+ new XAttribute("Action", bm.Value.Action),
+ new XAttribute("HexByte",
+ bm.Value.Byte.HasValue
+ ? new string(ByteConverters.ByteToHexCharArray((byte)bm.Value.Byte))
+ : string.Empty),
+ new XAttribute("Position", bm.Value.BytePositionInStream)));
+
+ try
+ {
+ doc.Save(fileName, SaveOptions.None);
+ }
+ catch
+ {
+ //Catch save error here
+ }
+ }
+
+ ///
+ /// Chargement de la liste des clients
+ ///
+ public void LoadState(string filename)
+ {
+ if (!File.Exists(filename)) return;
+
+ //Clear current state
+ ClearUndoChange();
+
+ var doc = XDocument.Load(filename);
+
+ var bmList = doc.Element("WpfHexEditor").Element("ByteModifieds").Elements().Select(i => i);
+
+ //Load ByteModifieds list
+ foreach (var element in bmList)
+ {
+ var bm = new ByteModified();
+
+ foreach (var at in element.Attributes())
+ switch (at.Name.ToString())
+ {
+ case "Action":
+
+ #region Set action
+
+ switch (at.Value)
+ {
+ case "Modified":
+ bm.Action = ByteAction.Modified;
+ break;
+ case "Deleted":
+ bm.Action = ByteAction.Deleted;
+ break;
+ }
+
+ #endregion
+
+ break;
+ case "HexByte":
+ bm.Byte = ByteConverters.IsHexaByteStringValue(at.Value).value[0];
+ break;
+ case "Position":
+ bm.BytePositionInStream = long.Parse(at.Value);
+ break;
+ }
+
+ #region Add bytemodified to dictionary
+ switch (bm.Action)
+ {
+ case ByteAction.Deleted:
+ AddByteDeleted(bm.BytePositionInStream, 1);
+ break;
+ case ByteAction.Modified:
+ AddByteModified(bm.Byte, bm.BytePositionInStream);
+ break;
+ }
+ #endregion
+ }
+ }
+ #endregion Serialize (save/load) current state
+
+ #region Reverse bytes selection
+
+ ///
+ /// Reverse bytes array like this {AA, FF, EE, DC} => {DC, EE, FF, AA}
+ ///
+ public void Reverse(long selectionStart, long selectionStop)
+ {
+ var data = GetCopyData(selectionStart, selectionStop, true);
+
+ #region Set start position
+
+ var startPosition = (selectionStart != selectionStop
+ ? (selectionStart > selectionStop ? selectionStop : selectionStart)
+ : selectionStart) + data.Length;
+
+ #endregion
+
+ foreach (byte b in data)
+ AddByteModified(b, --startPosition, data.Length);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Caret.cs b/FModel/Forms/HexViewer/Core/Caret.cs
new file mode 100644
index 00000000..6de1daf9
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Caret.cs
@@ -0,0 +1,277 @@
+//////////////////////////////////////////////
+// Fork 2017 : Derek Tremblay (derektremblay666@gmail.com)
+// Part of Wpf HexEditor control : https://github.com/abbaye/WPFHexEditorControl
+// Reference : https://www.codeproject.com/Tips/431000/Caret-for-WPF-User-Controls
+// Reference license : The Code Project Open License (CPOL) 1.02
+// Contributor : emes30
+//////////////////////////////////////////////
+
+using System;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using System.Windows;
+using System.Windows.Media;
+using System.Threading;
+
+namespace WpfHexaEditor.Core
+{
+ ///
+ /// This class represent a visual caret on editor
+ ///
+ public sealed class Caret : FrameworkElement, INotifyPropertyChanged
+ {
+ #region Global class variables
+ private Timer _timer;
+ private Point _position;
+ private readonly Pen _pen = new Pen(Brushes.Black, 1);
+ private readonly Brush _brush = new SolidColorBrush(Colors.Black);
+ private int _blinkPeriod = 500;
+ private double _caretHeight = 18;
+ private double _caretWidth = 9;
+ private bool _hide;
+ private CaretMode _caretMode = CaretMode.Overwrite;
+ #endregion
+
+ #region Constructor
+ public Caret()
+ {
+ if (!DesignerProperties.GetIsInDesignMode(this))
+ {
+ _pen.Freeze();
+ _brush.Opacity = .5;
+ IsHitTestVisible = false;
+ InitializeTimer();
+ Hide();
+ }
+ }
+
+ public Caret(Brush brush)
+ {
+ if (!DesignerProperties.GetIsInDesignMode(this))
+ {
+ _pen.Brush = brush;
+ _pen.Freeze();
+ _brush.Opacity = .5;
+ IsHitTestVisible = false;
+ InitializeTimer();
+ Hide();
+ }
+ }
+ #endregion
+
+ #region Properties
+
+ private static readonly DependencyProperty VisibleProperty =
+ DependencyProperty.Register(nameof(Visible), typeof(bool),
+ typeof(Caret), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+
+ ///
+ /// Get is caret is running
+ ///
+ public bool IsEnable => _timer != null;
+
+ ///
+ /// Propertie used when caret is blinking
+ ///
+ private bool Visible
+ {
+ get => (bool)GetValue(VisibleProperty);
+ set => SetValue(VisibleProperty, value);
+ }
+
+ ///
+ /// Height of the caret
+ ///
+ public double CaretHeight
+ {
+ get => _caretHeight;
+ set
+ {
+ if (_caretHeight == value) return;
+
+ _caretHeight = value;
+
+ //InitializeTimer();
+
+ OnPropertyChanged(nameof(CaretHeight));
+ }
+ }
+
+ ///
+ /// Width of the caret
+ ///
+ public double CaretWidth
+ {
+ get => _caretWidth;
+ set
+ {
+ if (_caretWidth == value) return;
+
+ _caretWidth = value;
+
+ OnPropertyChanged(nameof(CaretWidth));
+ }
+ }
+
+ ///
+ /// Get the relative position of the caret
+ ///
+ public Point Position => _position;
+
+ ///
+ /// Left position of the caret
+ ///
+ public double Left
+ {
+ get => _position.X;
+ private set
+ {
+ if (_position.X == value) return;
+
+ _position.X = Math.Floor(value);
+ if (Visible) Visible = false;
+
+ OnPropertyChanged(nameof(Position));
+ OnPropertyChanged(nameof(Left));
+ }
+ }
+
+ ///
+ /// Top position of the caret
+ ///
+ public double Top
+ {
+ get => _position.Y;
+ private set
+ {
+ if (_position.Y == value) return;
+
+ _position.Y = Math.Floor(value);
+ if (Visible) Visible = false;
+
+ OnPropertyChanged(nameof(Position));
+ OnPropertyChanged(nameof(Top));
+ }
+ }
+
+ ///
+ /// Properties return true if caret is visible
+ ///
+ public bool IsVisibleCaret => Left >= 0 && Top > 0 && _hide == false;
+
+ ///
+ /// Blick period in millisecond
+ ///
+ public int BlinkPeriod
+ {
+ get => _blinkPeriod;
+ set
+ {
+ _blinkPeriod = value;
+ InitializeTimer();
+
+ OnPropertyChanged(nameof(BlinkPeriod));
+ }
+ }
+
+ ///
+ /// Caret display mode. Line for Insert, Block for Overwrite
+ ///
+ public CaretMode CaretMode
+ {
+ get => _caretMode;
+ set
+ {
+ if (_caretMode == value) return;
+
+ _caretMode = value;
+
+ OnPropertyChanged(nameof(CaretMode));
+ }
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ /// Hide the caret
+ ///
+ public void Hide() => _hide = true;
+
+ ///
+ /// Method delegate for blink the caret
+ ///
+ private void BlinkCaret(Object state) => Dispatcher?.Invoke(() =>
+ {
+ Visible = !Visible && !_hide;
+ });
+
+ ///
+ /// Initialise the timer
+ ///
+ private void InitializeTimer() => _timer = new Timer(BlinkCaret, null, 0, BlinkPeriod);
+
+ ///
+ /// Move the caret over the position defined by point parameter
+ ///
+ public void MoveCaret(Point point) => MoveCaret(point.X, point.Y);
+
+ ///
+ /// Move the caret over the position defined by point parameter
+ ///
+ public void MoveCaret(double x, double y)
+ {
+ _hide = false;
+ Left = x;
+ Top = y;
+ }
+
+
+ ///
+ /// Start the caret
+ ///
+ public void Start()
+ {
+ InitializeTimer();
+
+ _hide = false;
+
+ OnPropertyChanged(nameof(IsEnable));
+ }
+
+ ///
+ /// Stop the carret
+ ///
+ public void Stop()
+ {
+ Hide();
+ _timer = null;
+
+ OnPropertyChanged(nameof(IsEnable));
+ }
+
+ ///
+ /// Render the caret
+ ///
+ protected override void OnRender(DrawingContext dc)
+ {
+ if (Visible)
+ switch (_caretMode)
+ {
+ case CaretMode.Insert:
+ dc.DrawLine(_pen, _position, new Point(Left, _position.Y + CaretHeight));
+ break;
+ case CaretMode.Overwrite:
+ dc.DrawRectangle(_brush, _pen, new Rect(Left, _position.Y, _caretWidth, CaretHeight));
+ break;
+ }
+ }
+ #endregion
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ private void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+}
diff --git a/FModel/Forms/HexViewer/Core/CharacterTable/DTE.cs b/FModel/Forms/HexViewer/Core/CharacterTable/DTE.cs
new file mode 100644
index 00000000..8271f5f7
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/CharacterTable/DTE.cs
@@ -0,0 +1,164 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2003-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+
+namespace WpfHexaEditor.Core.CharacterTable
+{
+ ///
+ /// Objet reprsentant un DTE.
+ ///
+ public sealed class Dte
+ {
+ /// Nom du DTE
+ private string _entry;
+
+ #region Constructeurs
+
+ ///
+ /// Constructeur principal
+ ///
+ public Dte()
+ {
+ _entry = string.Empty;
+ Type = DteType.Invalid;
+ Value = string.Empty;
+ }
+
+ ///
+ /// Contructeur permetant d'ajouter une entre et une valeur
+ ///
+ /// Nom du DTE
+ /// Valeur du DTE
+ public Dte(string entry, string value)
+ {
+ _entry = entry;
+ Value = value;
+ Type = DteType.DualTitleEncoding;
+ }
+
+ ///
+ /// Contructeur permetant d'ajouter une entre, une valeur et une description
+ ///
+ /// Nom du DTE
+ /// Valeur du DTE
+ /// Type de DTE
+ public Dte(string entry, string value, DteType type)
+ {
+ _entry = entry;
+ Value = value;
+ Type = type;
+ }
+
+ #endregion Constructeurs
+
+ #region Proprits
+
+ ///
+ /// Nom du DTE
+ ///
+ public string Entry
+ {
+ set => _entry = value != null ? value.ToUpper(): string.Empty;
+ get => _entry;
+ }
+
+ ///
+ /// Valeur du DTE
+ ///
+ public string Value { get; }
+
+ ///
+ /// Type de DTE
+ ///
+ public DteType Type { get; }
+
+ #endregion Proprits
+
+ #region Mthodes
+
+ ///
+ /// Cette fonction permet de retourner le DTE sous forme : [Entry]=[Valeur]
+ ///
+ /// Retourne le DTE sous forme : [Entry]=[Valeur]
+ public override string ToString() => Type != DteType.EndBlock && Type != DteType.EndLine
+ ? _entry + "=" + Value
+ : _entry;
+
+ #endregion Mthodes
+
+ #region Methodes Static
+
+ public static DteType TypeDte(Dte dteValue)
+ {
+ if (dteValue == null) return DteType.Invalid;
+
+ try
+ {
+ switch (dteValue._entry.Length)
+ {
+ case 2:
+ return dteValue.Value.Length == 2 ? DteType.Ascii : DteType.DualTitleEncoding;
+ case 4: // >2
+ return DteType.MultipleTitleEncoding;
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ switch (dteValue._entry)
+ {
+ case @"/":
+ return DteType.EndBlock;
+
+ case @"*":
+ return DteType.EndLine;
+ //case @"\":
+ }
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ //Du a une entre qui a 2 = de suite... EX: XX==
+ return DteType.DualTitleEncoding;
+ }
+
+ return DteType.Invalid;
+ }
+
+ public static DteType TypeDte(string dteValue)
+ {
+ if (dteValue == null) return DteType.Invalid;
+
+ try
+ {
+ if (dteValue == FModel.Properties.Resources.EndTagString)
+ return DteType.EndBlock; //
+
+ if (dteValue == FModel.Properties.Resources.LineTagString)
+ return DteType.EndLine; //
+
+ switch (dteValue.Length)
+ {
+ case 1:
+ return DteType.Ascii;
+ case 2:
+ return DteType.DualTitleEncoding;
+ }
+
+ if (dteValue.Length > 2)
+ return DteType.MultipleTitleEncoding;
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ //Du a une entre qui a 2 = de suite... EX: XX==
+ return DteType.DualTitleEncoding;
+ }
+
+ return DteType.Invalid;
+ }
+
+ #endregion Methodes Static
+
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/CharacterTable/Enum.cs b/FModel/Forms/HexViewer/Core/CharacterTable/Enum.cs
new file mode 100644
index 00000000..ed8b516e
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/CharacterTable/Enum.cs
@@ -0,0 +1,30 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2003-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+namespace WpfHexaEditor.Core.CharacterTable
+{
+ ///
+ /// Type of DTE used in TBL
+ ///
+ public enum DteType
+ {
+ Invalid = -1,
+ Ascii = 0,
+ Japonais,
+ DualTitleEncoding,
+ MultipleTitleEncoding,
+ EndLine,
+ EndBlock
+ }
+
+ public enum DefaultCharacterTableType
+ {
+ Ascii,
+ EbcdicWithSpecialChar,
+ EbcdicNoSpecialChar
+ //MACINTOSH
+ //DOS/IBM-ASCII
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/CharacterTable/TBLStream.cs b/FModel/Forms/HexViewer/Core/CharacterTable/TBLStream.cs
new file mode 100644
index 00000000..fbaba7db
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/CharacterTable/TBLStream.cs
@@ -0,0 +1,406 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2003-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor.Core.CharacterTable
+{
+ ///
+ /// Used to manage Thingy TBL file (entry=value)
+ ///
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1711:Identifiers should not have incorrect suffix", Justification = "")]
+ public sealed class TblStream : IDisposable
+ {
+ #region Global class variables
+ ///
+ /// TBL file path
+ ///
+ private string _fileName = string.Empty;
+
+ ///
+ /// Represente the whole TBL file
+ ///
+ private Dictionary _dteList = new Dictionary();
+ #endregion
+
+ #region Constructors
+ ///
+ /// Constructeur permtant de charg?le fichier DTE
+ ///
+ public TblStream(string fileName) => FileName = fileName;
+
+ ///
+ /// Constructeur permtant de chargle fichier DTE
+ ///
+ public TblStream() { }
+ #endregion
+
+ #region Indexer
+
+ ///
+ /// Indexer to work on the DTE contained in TBL in the manner of a table.
+ ///
+ public Dte this[string index]
+ {
+ get => _dteList[index];
+ set => _dteList[index] = value;
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ /// Find entry in TBL file
+ ///
+ /// Hex value to find match
+ /// Fin the Endblock and EndLine
+ public string FindMatch(string hex, bool showSpecialValue)
+ {
+ if (showSpecialValue)
+ {
+ if (_dteList.ContainsKey($"/{hex}")) return FModel.Properties.Resources.EndTagString; //"";
+ if (_dteList.ContainsKey($"*{hex}")) return FModel.Properties.Resources.LineTagString; //"";
+ }
+
+ return _dteList.ContainsKey(hex)
+ ? _dteList[hex].Value
+ : "#";
+ }
+
+ ///
+ /// Convert data to TBL string.
+ ///
+ ///
+ /// Return string converted to TBL string representation.
+ /// Return null on error
+ ///
+ public string ToTblString(byte[] data)
+ {
+ if (data == null) return null;
+
+ var sb = new StringBuilder();
+
+ for (var i = 0; i < data.Length; i++)
+ {
+ if (i < data.Length - 1)
+ {
+ var mte = FindMatch(ByteConverters.ByteToHex(data[i]) + ByteConverters.ByteToHex(data[i + 1]), true);
+
+ if (mte != "#")
+ {
+ sb.Append(mte);
+ continue;
+ }
+ }
+
+ sb.Append(FindMatch(ByteConverters.ByteToHex(data[i]), true));
+ }
+
+ return sb.ToString();
+ }
+
+ ///
+ /// Close the TBL and clear object
+ ///
+ public void Close()
+ {
+ _fileName = string.Empty;
+ _dteList.Clear();
+ }
+
+ ///
+ /// Load the TBL file
+ ///
+ private void Load(string tblString)
+ {
+ //Variables
+ char[] sepEndLine = {'\n'}; //end line char
+ char[] sepEqual = {'='}; //equal separator char
+
+ //build strings line
+ var textFromString = new StringBuilder(tblString);
+ textFromString.Insert(textFromString.Length, new[] { '\r', '\n' });
+ var lines = textFromString.ToString().Split(sepEndLine);
+
+ //Clear before loading
+ _dteList.Clear();
+
+ #region Fill dtelist dictionary
+ foreach (var line in lines)
+ {
+ var info = line.Split(sepEqual);
+
+ Dte dte;
+ try
+ {
+ switch (info[0].Length)
+ {
+ case 2:
+ dte = info[1].Length == 2
+ ? new Dte(info[0], info[1].Substring(0, info[1].Length - 1), DteType.Ascii)
+ : new Dte(info[0], info[1].Substring(0, info[1].Length - 1),
+ DteType.DualTitleEncoding);
+ break;
+ case 4: // >2
+ dte = new Dte(info[0], info[1].Substring(0, info[1].Length - 1),
+ DteType.MultipleTitleEncoding);
+ break;
+ default:
+ continue;
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ switch (info[0].Substring(0, 1))
+ {
+ case @"/":
+ dte = new Dte(info[0].Substring(0, info[0].Length - 1), string.Empty, DteType.EndBlock);
+ break;
+ case @"*":
+ dte = new Dte(info[0].Substring(0, info[0].Length - 1), string.Empty, DteType.EndLine);
+ break;
+ default:
+ continue;
+ }
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ //Occurs when two == are in the same line
+ dte = new Dte(info[0], "=", DteType.DualTitleEncoding);
+ }
+
+ _dteList.Add(dte.Entry, dte);
+
+ }
+ #endregion
+
+ #region Load bookmark
+ BookMarks.Clear();
+ foreach (var line in lines)
+ {
+ try
+ {
+ if (line.Substring(0, 1) == "(")
+ {
+ var fav = new BookMark();
+ var lineSplited = line.Split(')');
+ fav.Description = lineSplited[1].Substring(0, lineSplited[1].Length - 1);
+
+ lineSplited = line.Split('h');
+ fav.BytePositionInStream =
+ ByteConverters.HexLiteralToLong(lineSplited[0].Substring(1, lineSplited[0].Length - 1)).position;
+ fav.Marker = ScrollMarker.TblBookmark;
+ BookMarks.Add(fav);
+ }
+ }
+ catch
+ {
+ //Nothing to add if error
+ }
+ }
+ #endregion
+ }
+
+ ///
+ /// Load TBL file
+ ///
+ private void Load()
+ {
+ //ouverture du fichier
+ if (!File.Exists(_fileName))
+ {
+ var fs = File.Create(_fileName);
+ fs.Close();
+ }
+
+ StreamReader tblFile;
+ try
+ {
+ tblFile = new StreamReader(_fileName, Encoding.ASCII);
+ }
+ catch
+ {
+ return;
+ }
+
+ if (tblFile.BaseStream.CanRead)
+ Load(tblFile.ReadToEnd());
+
+ tblFile.Close();
+ }
+
+ ///
+ /// Save tbl file
+ ///
+ public void Save()
+ {
+ var myFile = new FileStream(_fileName, FileMode.Create, FileAccess.Write);
+ var tblFile = new StreamWriter(myFile, Encoding.Unicode); //ASCII
+
+ if (tblFile.BaseStream.CanWrite)
+ {
+ //Save tbl set
+ foreach (var dte in _dteList)
+ if (dte.Value.Type != DteType.EndBlock &&
+ dte.Value.Type != DteType.EndLine)
+ tblFile.WriteLine(dte.Value.Entry + "=" + dte.Value);
+ else
+ tblFile.WriteLine(dte.Value.Entry);
+
+ //Save bookmark
+ tblFile.WriteLine();
+ foreach (var mark in BookMarks)
+ tblFile.WriteLine(mark.ToString());
+
+ //Add to line at end of file. Needed for some apps that using tbl file
+ tblFile.WriteLine();
+ tblFile.WriteLine();
+ }
+
+ //close file
+ tblFile.Close();
+ }
+
+ ///
+ /// Add a DTE/MTE in TBL
+ ///
+ public void Add(Dte dte) => _dteList.Add(dte.Entry, dte);
+
+ ///
+ /// Remove TBL entry
+ ///
+ ///
+ public void Remove(Dte dte) => _dteList.Remove(dte.Entry);
+
+ #endregion
+
+ #region Property
+ ///
+ /// Get or set the File path to TBL
+ ///
+ public string FileName
+ {
+ get => _fileName;
+ internal set
+ {
+ if (File.Exists(value))
+ {
+ _fileName = value;
+ Load();
+ }
+ else
+ throw new FileNotFoundException();
+ }
+ }
+
+ ///
+ /// Get the count of DTE/MTE in the TBL
+ ///
+ public int Length => _dteList.Count;
+
+ ///
+ /// Get of set bookmarks
+ ///
+ public List BookMarks { get; set; } = new List();
+
+ public int TotalDte => _dteList.Count(l => l.Value.Type == DteType.DualTitleEncoding);
+ public int TotalMte => _dteList.Count(l => l.Value.Type == DteType.MultipleTitleEncoding);
+ public int TotalAscii => _dteList.Count(l => l.Value.Type == DteType.Ascii);
+ public int TotalInvalid => _dteList.Count(l => l.Value.Type == DteType.Invalid);
+ public int TotalJaponais => _dteList.Count(l => l.Value.Type == DteType.Japonais);
+ public int TotalEndLine => _dteList.Count(l => l.Value.Type == DteType.EndLine);
+ public int TotalEndBlock => _dteList.Count(l => l.Value.Type == DteType.EndBlock);
+
+ ///
+ /// Get the end block char
+ ///
+ public string EndBlock
+ {
+ get
+ {
+ foreach (var dte in _dteList)
+ if (dte.Value.Type == DteType.EndBlock)
+ return dte.Value.Entry;
+
+ return string.Empty;
+ }
+ }
+
+ ///
+ /// Get the end line char
+ ///
+ public string EndLine
+ {
+ get
+ {
+ foreach (var dte in _dteList)
+ if (dte.Value.Type == DteType.EndLine)
+ return dte.Value.Entry;
+
+ return string.Empty;
+ }
+ }
+
+ ///
+ /// Enable/Disable Readonly on control.
+ ///
+ public bool AllowEdit { get; set; }
+
+ #endregion
+
+ #region Build default TBL
+
+ public static TblStream CreateDefaultTbl(DefaultCharacterTableType type = DefaultCharacterTableType.Ascii)
+ {
+ var tbl = new TblStream();
+
+ switch (type)
+ {
+ case DefaultCharacterTableType.Ascii:
+ for (byte i = 0; i < 255; i++)
+ tbl.Add(new Dte(ByteConverters.ByteToHex(i).ToUpper(), $"{ByteConverters.ByteToChar(i)}"));
+ break;
+ case DefaultCharacterTableType.EbcdicWithSpecialChar:
+ tbl.Load(FModel.Properties.Resources.EBCDIC);
+ break;
+ case DefaultCharacterTableType.EbcdicNoSpecialChar:
+ tbl.Load(FModel.Properties.Resources.EBCDIC_NoSpecialChar);
+ break;
+ }
+
+ tbl.AllowEdit = true;
+ return tbl;
+ }
+
+ #endregion
+
+ #region IDisposable Support
+
+ private bool _disposedValue; // To detect redundant calls
+
+ void Dispose(bool disposing)
+ {
+ if (!_disposedValue)
+ {
+ if (disposing)
+ {
+ _dteList = null;
+ }
+
+ _disposedValue = true;
+ }
+ }
+
+ public void Dispose() => Dispose(true);
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/ConstantReadOnly.cs b/FModel/Forms/HexViewer/Core/ConstantReadOnly.cs
new file mode 100644
index 00000000..629cba22
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/ConstantReadOnly.cs
@@ -0,0 +1,23 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+namespace WpfHexaEditor.Core
+{
+ public static class ConstantReadOnly
+ {
+ public static readonly string HexLineInfoStringFormat = "x8";
+ public static readonly string HexStringFormat = "x";
+ public static readonly string DefaultHex8String = "0x00000000";
+
+ public const long Largefilelength = 52_428_800L; //50 MB
+ public const int Copyblocksize = 131_072; //128 KB
+ public const int Findblocksize = 1_048_576; //1 MB
+
+ ///
+ /// "D" may have the "widest" size
+ ///
+ public const char WidestChar = 'D';
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Converters/BoolInverterConverter.cs b/FModel/Forms/HexViewer/Core/Converters/BoolInverterConverter.cs
new file mode 100644
index 00000000..0fe72ef4
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Converters/BoolInverterConverter.cs
@@ -0,0 +1,36 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Windows.Data;
+
+namespace WpfHexaEditor.Core.Converters
+{
+ ///
+ /// Permet d'inverser des bool
+ ///
+ public sealed class BoolInverterConverter : GenericStaticInstance,IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ bool? val = null;
+
+ try
+ {
+ val = value != null && (bool) value;
+ }
+ catch
+ {
+ // ignored
+ }
+
+ return !val;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Converters/BooleanToVisibilityConverter.cs b/FModel/Forms/HexViewer/Core/Converters/BooleanToVisibilityConverter.cs
new file mode 100644
index 00000000..1d93c6b9
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Converters/BooleanToVisibilityConverter.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Data;
+
+namespace WpfHexaEditor.Core.Converters
+{
+ ///
+ /// CODE FROM NUGET PACKAGE EXPLORER : https://github.com/NuGetPackageExplorer/NuGetPackageExplorer
+ ///
+ /// This BooleanToVisibility converter allows us to override the converted value when
+ /// the bound value is false.
+ ///
+ /// The built-in converter in WPF restricts us to always use Collapsed when the bound
+ /// value is false.
+ ///
+ public sealed class BooleanToVisibilityConverter : GenericStaticInstance,IValueConverter
+ {
+ public bool Inverted { get; set; }
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var boolValue = (bool) value;
+
+ if (Inverted)
+ boolValue = !boolValue;
+
+ return (string) parameter == "hidden"
+ ? (boolValue ? Visibility.Visible : Visibility.Hidden)
+ : (boolValue ? Visibility.Visible : Visibility.Collapsed);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Converters/HexToLongStringConverter.cs b/FModel/Forms/HexViewer/Core/Converters/HexToLongStringConverter.cs
new file mode 100644
index 00000000..a96811a0
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Converters/HexToLongStringConverter.cs
@@ -0,0 +1,29 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor.Core.Converters
+{
+ ///
+ /// Used to convert hexadecimal to Long value.
+ ///
+ public sealed class HexToLongStringConverter : GenericStaticInstance ,IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var (success, val) = ByteConverters.IsHexValue(value.ToString());
+
+ return success
+ ? (object) val
+ : string.Empty;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Converters/LongToHexStringConverter.cs b/FModel/Forms/HexViewer/Core/Converters/LongToHexStringConverter.cs
new file mode 100644
index 00000000..0e469753
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Converters/LongToHexStringConverter.cs
@@ -0,0 +1,30 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Windows.Data;
+
+namespace WpfHexaEditor.Core.Converters
+{
+ ///
+ /// Used to convert long value to hexadecimal string like this 0xFFFFFFFF.
+ ///
+ public sealed class LongToHexStringConverter : GenericStaticInstance,IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
+ value != null
+ ? (long.TryParse(value.ToString(), out var longValue)
+ ? (longValue > -1
+ ? "0x" + longValue
+ .ToString(ConstantReadOnly.HexLineInfoStringFormat, CultureInfo.InvariantCulture)
+ .ToUpper()
+ : ConstantReadOnly.DefaultHex8String)
+ : ConstantReadOnly.DefaultHex8String)
+ : ConstantReadOnly.DefaultHex8String;
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Converters/PathToFilenameConverter.cs b/FModel/Forms/HexViewer/Core/Converters/PathToFilenameConverter.cs
new file mode 100644
index 00000000..389057d4
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Converters/PathToFilenameConverter.cs
@@ -0,0 +1,25 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using System.IO;
+
+namespace WpfHexaEditor.Core.Converters
+{
+ ///
+ /// Used to get the filename with extention.
+ ///
+ public sealed class PathToFilenameConverter : GenericStaticInstance ,IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
+ (value is string filename)
+ ? Path.GetFileName(filename)
+ : string.Empty;
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Enumeration.cs b/FModel/Forms/HexViewer/Core/Enumeration.cs
new file mode 100644
index 00000000..8fa3de94
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Enumeration.cs
@@ -0,0 +1,209 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+
+namespace WpfHexaEditor.Core
+{
+ ///
+ /// ByteAction used for ByteModified class
+ ///
+ public enum ByteAction
+ {
+ Nothing,
+ Added,
+ Deleted,
+ Modified,
+
+ ///
+ /// Used in ByteProvider for get list
+ ///
+ All
+ }
+
+ ///
+ /// Used for coloring mode of selection
+ ///
+ public enum FirstColor
+ {
+ HexByteData,
+ StringByteData
+ }
+
+ ///
+ /// Mode of Copy/Paste
+ ///
+ public enum CopyPasteMode
+ {
+ Byte,
+ HexaString,
+ AsciiString,
+ TblString,
+ CSharpCode,
+ VbNetCode,
+ JavaCode,
+ CCode,
+ FSharpCode,
+ PascalCode
+ }
+
+ ///
+ /// Used with Copy to code fonction for language are similar to C.
+ ///
+ internal enum CodeLanguage
+ {
+ C,
+ CSharp,
+ Java,
+ FSharp,
+ Vbnet,
+ Pascal
+ }
+
+ ///
+ /// Used for check label are selected et next label to select...
+ ///
+ public enum KeyDownLabel
+ {
+ FirstChar,
+ SecondChar,
+
+ //ThirdChar,
+ NextPosition
+ }
+
+ public enum ByteToString
+ {
+ ///
+ /// Build-in convertion mode. (recommended)
+ ///
+ ByteToCharProcess,
+
+ ///
+ /// System.Text.Encoding.ASCII string encoder
+ ///
+ AsciiEncoding
+ }
+
+ ///
+ /// Scrollbar marker
+ ///
+ public enum ScrollMarker
+ {
+ Nothing,
+ SearchHighLight,
+ Bookmark,
+ SelectionStart,
+ ByteModified,
+ ByteDeleted,
+ TblBookmark
+ }
+
+ ///
+ /// Type are opened in byteprovider
+ ///
+ ///[Obsolete("The ByteProviderStreamType is low extensible for variety of stream source,and will be removed in next release.")]
+ public enum ByteProviderStreamType
+ {
+ File,
+ MemoryStream,
+ Nothing
+ }
+
+ ///
+ /// Type of character are used
+ ///
+ public enum CharacterTableType
+ {
+ Ascii,
+ TblFile
+ }
+
+ ///
+ /// Used for control the speed of mouse wheel
+ ///
+ public enum MouseWheelSpeed
+ {
+ VerySlow = 1,
+ Slow = 3,
+ Normal = 5,
+ Fast = 7,
+ VeryFast = 9,
+ System
+ }
+
+ ///
+ /// IByteControl spacer width
+ ///
+ public enum ByteSpacerWidth
+ {
+ VerySmall = 1,
+ Small = 3,
+ Normal = 6,
+ Large = 9,
+ VeryLarge = 12
+ }
+
+ public enum ByteSpacerGroup
+ {
+ TwoByte = 2,
+ FourByte = 4,
+ SixByte = 6,
+ EightByte = 8
+ }
+
+ public enum ByteSpacerPosition
+ {
+ HexBytePanel,
+ StringBytePanel,
+ Both,
+ Nothing
+ }
+
+ public enum ByteSpacerVisual
+ {
+ Empty,
+ Line,
+ Dash
+ }
+
+ ///
+ /// Used with the view mode of HexByte, header or position.
+ ///
+ public enum DataVisualType
+ {
+ Hexadecimal, //Editable
+ Decimal //Not editable
+ //Binary //Editable
+ }
+
+ ///
+ /// Used to select the visual of the offset panel
+ ///
+ public enum OffSetPanelType
+ {
+ OffsetOnly,
+ LineOnly,
+ Both
+ }
+
+ ///
+ /// Used to fix the wigth of the offset panel
+ ///
+ public enum OffSetPanelFixedWidth
+ {
+ Dynamic,
+ Fixed
+ }
+
+ ///
+ /// Use mode of the caret
+ ///
+ public enum CaretMode
+ {
+ Insert,
+ Overwrite
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/GenericStaticInstance.cs b/FModel/Forms/HexViewer/Core/GenericStaticInstance.cs
new file mode 100644
index 00000000..8312f20f
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/GenericStaticInstance.cs
@@ -0,0 +1,17 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2018
+// Author : Janus Tida
+//////////////////////////////////////////////
+
+namespace WpfHexaEditor.Core
+{
+ ///
+ /// This class is designed to simplify getting the instance.
+ ///
+ ///
+ public abstract class GenericStaticInstance where T : class, new()
+ {
+ private static T _staticInstance;
+ public static T StaticInstance => _staticInstance ?? (_staticInstance = new T());
+ }
+}
diff --git a/FModel/Forms/HexViewer/Core/Interfaces/IByteControl.cs b/FModel/Forms/HexViewer/Core/Interfaces/IByteControl.cs
new file mode 100644
index 00000000..a50f199c
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Interfaces/IByteControl.cs
@@ -0,0 +1,52 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2017-2019
+// Author : Janus Tida
+// Contributor : Derek Tremblay
+//////////////////////////////////////////////
+
+using System;
+
+namespace WpfHexaEditor.Core.Interfaces
+{
+ ///
+ /// All byte control inherit from this interface.
+ /// This interface is used to reduce the code when manipulate byte control
+ ///
+ internal interface IByteControl
+ {
+ //Properties
+ long BytePositionInStream { get; set; }
+ ByteAction Action { get; set; }
+ byte? Byte { get; set; }
+ bool IsHighLight { get; set; }
+ bool IsSelected { get; set; }
+ bool InternalChange { get; set; }
+ bool IsMouseOverMe { get; }
+
+ //Methods
+ void UpdateVisual();
+ void Clear();
+
+ //Events
+ event EventHandler ByteModified;
+ event EventHandler MouseSelection;
+ event EventHandler Click;
+ event EventHandler DoubleClick;
+ event EventHandler RightClick;
+ event EventHandler MoveNext;
+ event EventHandler MovePrevious;
+ event EventHandler MoveRight;
+ event EventHandler MoveLeft;
+ event EventHandler MoveUp;
+ event EventHandler MoveDown;
+ event EventHandler MovePageDown;
+ event EventHandler MovePageUp;
+ event EventHandler ByteDeleted;
+ event EventHandler EscapeKey;
+ event EventHandler CtrlzKey;
+ event EventHandler CtrlvKey;
+ event EventHandler CtrlcKey;
+ event EventHandler CtrlaKey;
+ event EventHandler CtrlyKey;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Interfaces/IByteModified.cs b/FModel/Forms/HexViewer/Core/Interfaces/IByteModified.cs
new file mode 100644
index 00000000..9f6b0842
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Interfaces/IByteModified.cs
@@ -0,0 +1,26 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2017
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor.Core.Interfaces
+{
+ public interface IByteModified
+ {
+ //Properties
+ ByteAction Action { get; set; }
+
+ byte? Byte { get; set; }
+ long BytePositionInStream { get; set; }
+ bool IsValid { get; }
+ long Length { get; set; }
+
+ //Methods
+ void Clear();
+
+ ByteModified GetCopy();
+ string ToString();
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/KeyValidator.cs b/FModel/Forms/HexViewer/Core/KeyValidator.cs
new file mode 100644
index 00000000..46edff1f
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/KeyValidator.cs
@@ -0,0 +1,179 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Text;
+using System.Windows.Input;
+using WpfHexaEditor.Core.Native;
+
+namespace WpfHexaEditor.Core
+{
+ ///
+ /// Static class for valid keyboard key.
+ ///
+ public static class KeyValidator
+ {
+ ///
+ /// Check if is a numeric key as pressed
+ ///
+ public static bool IsNumericKey(Key key)
+ {
+ return key == Key.D0 || key == Key.D1 || key == Key.D2 || key == Key.D3 || key == Key.D4 || key == Key.D5 ||
+ key == Key.D6 || key == Key.D7 || key == Key.D8 || key == Key.D9 ||
+ key == Key.NumPad0 || key == Key.NumPad1 || key == Key.NumPad2 || key == Key.NumPad3 ||
+ key == Key.NumPad4 || key == Key.NumPad5 || key == Key.NumPad6 || key == Key.NumPad7 ||
+ key == Key.NumPad8 || key == Key.NumPad9;
+ }
+
+ ///
+ /// Get if key is a Hexakey (alpha)
+ ///
+ ///
+ ///
+ public static bool IsHexKey(Key key)
+ {
+ return key == Key.A || key == Key.B || key == Key.C || key == Key.D || key == Key.E || key == Key.F ||
+ IsNumericKey(key);
+ }
+
+ ///
+ /// Get the digit from key
+ ///
+ public static int GetDigitFromKey(Key key)
+ {
+ switch (key)
+ {
+ case Key.D0:
+ case Key.NumPad0: return 0;
+ case Key.D1:
+ case Key.NumPad1: return 1;
+ case Key.D2:
+ case Key.NumPad2: return 2;
+ case Key.D3:
+ case Key.NumPad3: return 3;
+ case Key.D4:
+ case Key.NumPad4: return 4;
+ case Key.D5:
+ case Key.NumPad5: return 5;
+ case Key.D6:
+ case Key.NumPad6: return 6;
+ case Key.D7:
+ case Key.NumPad7: return 7;
+ case Key.D8:
+ case Key.NumPad8: return 8;
+ case Key.D9:
+ case Key.NumPad9: return 9;
+ default: throw new ArgumentOutOfRangeException("Invalid key: " + key);
+ }
+ }
+
+ public static bool IsIgnoredKey(Key key)
+ {
+ //ADD SOMES OTHER KEY FOR VALIDATED IN IBYTECONTROL
+
+ //DELETE KEY FOR ADD OTHER FUNCTIONALITY...
+
+ return key == Key.Tab ||
+ key == Key.Enter ||
+ key == Key.Return ||
+ key == Key.LWin ||
+ key == Key.RWin ||
+ key == Key.CapsLock ||
+ key == Key.LeftAlt ||
+ key == Key.RightAlt ||
+ key == Key.System ||
+ key == Key.LeftCtrl ||
+ key == Key.F1 || key == Key.F2 || key == Key.F3 || key == Key.F4 || key == Key.F5 || key == Key.F6 ||
+ key == Key.F7 || key == Key.F8 || key == Key.F9 || key == Key.F10 || key == Key.F11 ||
+ key == Key.F12 ||
+ key == Key.Home ||
+ key == Key.Insert ||
+ key == Key.End;
+ }
+
+ public static bool IsArrowKey(Key key) =>
+ key == Key.Up || key == Key.Down || key == Key.Left || key == Key.Right;
+
+ public static bool IsBackspaceKey(Key key) => key == Key.Back;
+
+ public static bool IsSubstractKey(Key key) => key == Key.Subtract || key == Key.OemMinus;
+
+ public static bool IsDeleteKey(Key key) => key == Key.Delete;
+
+ public static bool IsCapsLock(Key key) => key == Key.CapsLock;
+
+ public static bool IsEscapeKey(Key key) => key == Key.Escape;
+
+ public static bool IsUpKey(Key key) => key == Key.Up;
+
+ public static bool IsWindowsKey(Key key) => key == Key.LWin || key == Key.RWin;
+
+ public static bool IsDownKey(Key key) => key == Key.Down;
+
+ public static bool IsRightKey(Key key) => key == Key.Right;
+
+ public static bool IsLeftKey(Key key) => key == Key.Left;
+
+ public static bool IsPageDownKey(Key key) => key == Key.PageDown;
+
+ public static bool IsPageUpKey(Key key) => key == Key.PageUp;
+
+ public static bool IsEnterKey(Key key) => key == Key.Enter;
+
+ public static bool IsTabKey(Key key) => key == Key.Tab;
+
+ public static bool IsCtrlCKey(Key key) => key == Key.C && Keyboard.Modifiers == ModifierKeys.Control;
+
+ public static bool IsCtrlZKey(Key key) => key == Key.Z && Keyboard.Modifiers == ModifierKeys.Control;
+
+ public static bool IsCtrlYKey(Key key) => key == Key.Y && Keyboard.Modifiers == ModifierKeys.Control;
+
+ public static bool IsCtrlVKey(Key key) => key == Key.V && Keyboard.Modifiers == ModifierKeys.Control;
+
+ public static bool IsCtrlAKey(Key key) => key == Key.A && Keyboard.Modifiers == ModifierKeys.Control;
+
+ #region DllImport/methods for key detection (Thank to : Inbar Barkai for help)
+
+ ///
+ /// Capture character on different locale keyboards in WPF. Convert key to appropiate char?
+ ///
+ ///
+ /// Code from
+ /// http://stackoverflow.com/questions/5825820/how-to-capture-the-character-on-different-locale-keyboards-in-wpf-c
+ ///
+ /// return a char represent the key passed in parameter
+ public static char GetCharFromKey(Key key)
+ {
+ var ch = ' ';
+
+ var virtualKey = KeyInterop.VirtualKeyFromKey(key);
+ var keyboardState = new byte[256];
+ NativeMethods.GetKeyboardState(keyboardState);
+
+ var scanCode = NativeMethods.MapVirtualKey((uint) virtualKey, NativeMethods.MapType.MapvkVkToVsc);
+ var stringBuilder = new StringBuilder(2);
+
+ var result = NativeMethods.ToUnicode((uint) virtualKey, scanCode, keyboardState, stringBuilder,
+ stringBuilder.Capacity, 0);
+ switch (result)
+ {
+ case -1:
+ case 0:
+ break;
+
+ case 1:
+ ch = stringBuilder[0];
+ break;
+
+ default:
+ ch = stringBuilder[0];
+ break;
+ }
+ return ch;
+ }
+
+ #endregion DllImport for key detection (Thank to : Inbar Barkai for help)
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/MethodExtention/ApplicationExtention.cs b/FModel/Forms/HexViewer/Core/MethodExtention/ApplicationExtention.cs
new file mode 100644
index 00000000..68d032f9
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/MethodExtention/ApplicationExtention.cs
@@ -0,0 +1,44 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System.Windows;
+using System.Windows.Threading;
+
+namespace WpfHexaEditor.Core.MethodExtention
+{
+ ///
+ /// DoEvents when control is in long task. Control do not freeze the dispatcher.
+ ///
+ public static class ApplicationExtention
+ {
+ private static readonly DispatcherOperationCallback ExitFrameCallback = ExitFrame;
+
+ public static void DoEvents(this Application app, DispatcherPriority priority = DispatcherPriority.Background)
+ {
+ var nestedFrame = new DispatcherFrame();
+ var exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(priority, ExitFrameCallback, nestedFrame);
+
+ try
+ {
+ //execute all next message
+ Dispatcher.PushFrame(nestedFrame);
+
+ //If not completed, will stop it
+ if (exitOperation.Status != DispatcherOperationStatus.Completed)
+ exitOperation.Abort();
+ }
+ catch
+ {
+ exitOperation.Abort();
+ }
+ }
+
+ private static object ExitFrame(object f)
+ {
+ (f as DispatcherFrame).Continue = false;
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/MethodExtention/ByteArrayExtention.cs b/FModel/Forms/HexViewer/Core/MethodExtention/ByteArrayExtention.cs
new file mode 100644
index 00000000..007a3fb1
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/MethodExtention/ByteArrayExtention.cs
@@ -0,0 +1,47 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System.Collections.Generic;
+using System.Linq;
+
+namespace WpfHexaEditor.Core.MethodExtention
+{
+ ///
+ /// Extention methodes for find match in byte[]
+ ///
+ public static class ByteArrayExtention
+ {
+ ///
+ /// Finds all index of byte find
+ ///
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods", Justification = "")]
+ public static IEnumerable FindIndexOf(this byte[] self, byte[] candidate)
+ {
+ if (!IsEmptyLocate(self, candidate))
+ for (var i = 0; i < self.Length; i++)
+ {
+ if (!IsMatch(self, i, candidate))
+ continue;
+
+ yield return i;
+ }
+ }
+
+ ///
+ /// Check if match is finded
+ ///
+ private static bool IsMatch(byte[] array, long position, byte[] candidate) =>
+ candidate.Length <= array.Length - position && !candidate.Where((t, i) => array[position + i] != t).Any();
+
+ ///
+ /// Check if can find
+ ///
+ private static bool IsEmptyLocate(byte[] array, byte[] candidate) => array == null
+ || candidate == null
+ || array.Length == 0
+ || candidate.Length == 0
+ || candidate.Length > array.Length;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/MethodExtention/DoubleExtension.cs b/FModel/Forms/HexViewer/Core/MethodExtention/DoubleExtension.cs
new file mode 100644
index 00000000..f1e451a5
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/MethodExtention/DoubleExtension.cs
@@ -0,0 +1,14 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+
+namespace WpfHexaEditor.Core.MethodExtention
+{
+ public static class DoubleExtension
+ {
+ public static double Round(this double s, int digit = 2) => Math.Round(s, digit);
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/MethodExtention/StringExtension.cs b/FModel/Forms/HexViewer/Core/MethodExtention/StringExtension.cs
new file mode 100644
index 00000000..7fd5d13c
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/MethodExtention/StringExtension.cs
@@ -0,0 +1,34 @@
+using System.Globalization;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace WpfHexaEditor.Core.MethodExtention
+{
+ public static class StringExtension
+ {
+ ///
+ /// The screen size of a string
+ ///
+ ///
+ /// Code from :
+ /// https://stackoverflow.com/questions/11447019/is-there-any-way-to-find-the-width-of-a-character-in-a-fixed-width-font-given-t
+ ///
+ /// Modified/adapted by Derek Tremblay
+ ///
+ public static Size GetScreenSize(this string text, FontFamily fontFamily, double fontSize, FontStyle fontStyle,
+ FontWeight fontWeight, FontStretch fontStretch, Brush foreGround)
+ {
+ fontFamily = new TextBlock().FontFamily;
+ fontSize = fontSize > 0 ? fontSize : new TextBlock().FontSize;
+
+ var typeface = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch);
+
+ var ft = new FormattedText(text ?? string.Empty, CultureInfo.InvariantCulture, FlowDirection.LeftToRight,
+ typeface, fontSize, foreGround, VisualTreeHelper.GetDpi(Application.Current.MainWindow).PixelsPerDip);
+
+
+ return new Size(ft.Width, ft.Height);
+ }
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/MethodExtention/TrackExtention.cs b/FModel/Forms/HexViewer/Core/MethodExtention/TrackExtention.cs
new file mode 100644
index 00000000..c7d1f362
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/MethodExtention/TrackExtention.cs
@@ -0,0 +1,60 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+
+namespace WpfHexaEditor.Core.MethodExtention
+{
+ public static class TrackExtention
+ {
+ ///
+ /// Get actual top position of track
+ ///
+ public static double Top(this Track track)
+ {
+ if (track.Parent is Grid parent)
+ {
+ var topRepeatButton = parent.Children[1] as RepeatButton;
+
+ return topRepeatButton.ActualHeight + parent.Margin.Top + 1;
+ }
+
+ return 0;
+ }
+
+ ///
+ /// Get actual bottom position of track
+ ///
+ public static double Bottom(this Track track)
+ {
+ if (track.Parent is Grid parent)
+ {
+ var trackControl = parent.Children[2] as Track;
+
+ return trackControl.Top() +
+ trackControl.ActualHeight +
+ parent.Margin.Top + 1;
+ }
+
+ return 0;
+ }
+
+ ///
+ /// Get actual bottom position of track
+ ///
+ public static double ButtonHeight(this Track track) => track.Top() - 1;
+
+ ///
+ /// Get actual Tick Height
+ ///
+ public static double TickHeight(this Track track) => track.ActualHeight / track.Maximum;
+
+ ///
+ /// Get actual Tick Height with another maximum value
+ ///
+ public static double TickHeight(this Track track, long maximum) => track.ActualHeight / maximum;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Native/NativeMethods.cs b/FModel/Forms/HexViewer/Core/Native/NativeMethods.cs
new file mode 100644
index 00000000..5b22d3fc
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Native/NativeMethods.cs
@@ -0,0 +1,33 @@
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace WpfHexaEditor.Core.Native
+{
+ ///
+ /// Used for key detection
+ ///
+ internal static class NativeMethods
+ {
+ internal enum MapType : uint
+ {
+ MapvkVkToVsc = 0x0,
+ MapvkVscToVk = 0x1,
+ MapvkVkToChar = 0x2,
+ MapvkVscToVkEx = 0x3,
+ }
+
+ [DllImport("user32.dll")]
+ internal static extern int ToUnicode(uint wVirtKey,
+ uint wScanCode,
+ byte[] lpKeyState,
+ [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] StringBuilder pwszBuff,
+ int cchBuff,
+ uint wFlags);
+
+ [DllImport("user32.dll")]
+ internal static extern bool GetKeyboardState(byte[] lpKeyState);
+
+ [DllImport("user32.dll")]
+ internal static extern uint MapVirtualKey(uint uCode, MapType uMapType);
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Xcbb/CustomBackgroundBlock.cs b/FModel/Forms/HexViewer/Core/Xcbb/CustomBackgroundBlock.cs
new file mode 100644
index 00000000..7cf73f72
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Xcbb/CustomBackgroundBlock.cs
@@ -0,0 +1,83 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Windows.Media;
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor.Core.Xcbb
+{
+ ///
+ /// IMPLEMENTATION NOT COMPLETED
+ /// Used to create block of custom colors background
+ ///
+ /// TODO : Add programated positon..
+ public class CustomBackgroundBlock
+ {
+ private long _length;
+
+ public CustomBackgroundBlock() { }
+
+ public CustomBackgroundBlock(long start, long length, SolidColorBrush color, string description)
+ {
+ StartOffset = start;
+ Length = length;
+ Color = color;
+ Description = description;
+ }
+
+ public CustomBackgroundBlock(long start, long length, SolidColorBrush color)
+ {
+ StartOffset = start;
+ Length = length;
+ Color = color;
+ }
+
+ public CustomBackgroundBlock(string start, long length, SolidColorBrush color)
+ {
+ var srt = ByteConverters.HexLiteralToLong(start);
+
+ StartOffset = srt.success ? srt.position : throw new Exception("Can't convert this string to long");
+ Length = length;
+ Color = color;
+ }
+
+ public CustomBackgroundBlock(string start, long length, SolidColorBrush color, string description)
+ {
+ var srt = ByteConverters.HexLiteralToLong(start);
+
+ StartOffset = srt.success ? srt.position : throw new Exception("Can't convert this string to long");
+ Length = length;
+ Color = color;
+ Description = description;
+ }
+
+ ///
+ /// Get or set the start offset
+ ///
+ public long StartOffset { get; set; }
+
+ ///
+ /// Get the stop offset
+ ///
+ public long StopOffset => StartOffset + Length - 1;
+
+ ///
+ /// Get or set the lenght of background block
+ ///
+ public long Length
+ {
+ get => _length;
+ set => _length = value > 0 ? value : 1;
+ }
+
+ ///
+ /// Description of background block
+ ///
+ public string Description { get; set; }
+
+ public SolidColorBrush Color { get; set; } = Brushes.Transparent;
+ }
+}
diff --git a/FModel/Forms/HexViewer/Core/Xcbb/ExeFile.cs b/FModel/Forms/HexViewer/Core/Xcbb/ExeFile.cs
new file mode 100644
index 00000000..9cba0d54
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Xcbb/ExeFile.cs
@@ -0,0 +1,61 @@
+using System.Collections.Generic;
+using System.Windows.Media;
+using WpfHexaEditor.Core.Bytes;
+using static FModel.Properties.Resources;
+
+namespace WpfHexaEditor.Core.Xcbb
+{
+ ///
+ /// IMPLEMENTATON NOT COMPLETED - FOR TESTING CONCEPT ONLY
+ /// Window executable file custom background block.
+ /// Will be implemented in XML file (XCBB)...
+ /// Will de deleted soon in futher commit
+ ///
+ /// TODO : Localize string
+ public class ExeFile
+ {
+ public List GetCustomBackgroundBlock() =>
+ new List
+ {
+ new CustomBackgroundBlock(0, 2, Brushes.BlueViolet, CBB_EXEFile_MagicNumberString),
+ new CustomBackgroundBlock(2, 2, Brushes.Brown, CBB_EXEFile_BytesInLastBlockString),
+ new CustomBackgroundBlock(4, 2, Brushes.SeaGreen, CBB_EXEFile_NumberOfBlockInFileBlockString),
+ new CustomBackgroundBlock(6, 2, Brushes.CadetBlue, CBB_EXEFile_NumberOfRelocationEntriesString),
+ new CustomBackgroundBlock(8, 2, Brushes.DarkGoldenrod, CBB_EXEFile_NumberOfRelocationEntriesString),
+ new CustomBackgroundBlock("0x0A", 2, Brushes.Coral, CBB_EXEFile_NumberOfHeaderParagraphAdditionalMemoryString),
+ new CustomBackgroundBlock("0x0C", 2, Brushes.HotPink, CBB_EXEFile_MaxNumberOfHeaderParagraphAdditionalMemoryString),
+ new CustomBackgroundBlock("0x0E", 2, Brushes.Cyan, CBB_EXEFile_RelativeValueOfStackSegmentString),
+ new CustomBackgroundBlock("0x10", 2, Brushes.IndianRed, CBB_EXEFile_InitialValueOfSPRegisterString),
+ new CustomBackgroundBlock("0x12", 2, Brushes.LimeGreen, CBB_EXEFile_WordChecksumString),
+ new CustomBackgroundBlock("0x14", 2, Brushes.PaleTurquoise, CBB_EXEFile_InitialValueOfIPRegisterString),
+ new CustomBackgroundBlock("0x16", 2, Brushes.DarkOrange, CBB_EXEFile_InitialValueOfCSRegisterString),
+ new CustomBackgroundBlock("0x18", 2, Brushes.Chartreuse, CBB_EXEFile_OffsetOfTheFirstRelocationItemString),
+ new CustomBackgroundBlock("0x1A", 2, Brushes.DarkSeaGreen, CBB_EXEFile_OverlayNumberString),
+ };
+
+ ///
+ /// Detect if is a PE file and create the backgroung based on file data
+ ///
+ /// TODO : complete with other various custombackground based on file
+ public List GetCustomBackgroundBlock(ByteProvider provider)
+ {
+ if (ByteProvider.CheckIsOpen(provider))
+ {
+ //Added only if is a PE file...
+ if (ByteConverters.ByteToHex(provider.GetCopyData(0, 1, true)) == "4D 5A")
+ {
+ //Load default
+ var list = GetCustomBackgroundBlock();
+
+ //Add CBB : This program cannot be run in DOS mode
+ list.Add(new CustomBackgroundBlock("0x4E", 38, Brushes.PaleVioletRed, CBB_EXEFile_NotDOSProgramString));
+
+ return list;
+ }
+ }
+
+ return new List();
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/Core/Xcbb/Exefile.xcbb b/FModel/Forms/HexViewer/Core/Xcbb/Exefile.xcbb
new file mode 100644
index 00000000..90525282
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Xcbb/Exefile.xcbb
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/HexViewer/Core/Xcbb/XcbbExpressionParser.cs b/FModel/Forms/HexViewer/Core/Xcbb/XcbbExpressionParser.cs
new file mode 100644
index 00000000..9843a937
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Xcbb/XcbbExpressionParser.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor.Core.Xcbb
+{
+ ///
+ /// Used to parse expression used in Xccb file for validate byte data.
+ ///
+ ///
+ /// Expression parser need to be linked to a ByteProvided for validating data.
+ ///
+ public class XcbbExpressionParser
+ {
+ ///
+ /// This ByteProvider is used for get data from file/stream and validate them in expression
+ ///
+ private readonly ByteProvider _provider;
+
+ ///
+ /// Unique constructor
+ ///
+ XcbbExpressionParser(ByteProvider provider) => _provider = provider;
+
+ ///
+ /// Use for valid expresion "valid if data are equal to..."
+ ///
+ /// expression like: [0x00-0x01]=$'4D 5A'
+ ///
+ /// True = expression is valid
+ /// False = expression not valid
+ /// Null = unable to valid expression
+ public bool? ValidIf(string expression)
+ {
+ if (ByteProvider.CheckIsOpen(_provider))
+ {
+
+ return false;
+ }
+
+ return null;
+ }
+
+ }
+}
diff --git a/FModel/Forms/HexViewer/Core/Xcbb/XcbbFileParser.cs b/FModel/Forms/HexViewer/Core/Xcbb/XcbbFileParser.cs
new file mode 100644
index 00000000..c8b5bc47
--- /dev/null
+++ b/FModel/Forms/HexViewer/Core/Xcbb/XcbbFileParser.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace WpfHexaEditor.Core.Xcbb
+{
+ ///
+ /// Class for read and parse xcbb file (xml custom backgroung block definition)
+ ///
+ public class XcbbFileParser
+ {
+
+
+ protected XcbbFileParser(string path)
+ {
+ LoadFile(path);
+ }
+
+ private void LoadFile(string path)
+ {
+
+ }
+ }
+}
diff --git a/FModel/Forms/HexViewer/FastTextLine.cs b/FModel/Forms/HexViewer/FastTextLine.cs
new file mode 100644
index 00000000..94482e4c
--- /dev/null
+++ b/FModel/Forms/HexViewer/FastTextLine.cs
@@ -0,0 +1,127 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2018
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Documents;
+using System.Windows.Media;
+
+namespace WpfHexaEditor
+{
+ ///
+ /// Light Label like control
+ ///
+ internal class FastTextLine: FrameworkElement
+ {
+ private readonly HexEditor _parent;
+
+ #region Constructor
+
+ public FastTextLine(HexEditor parent)
+ {
+ //Parent hexeditor
+ _parent = parent ?? throw new ArgumentNullException(nameof(parent));
+
+ //Default properties
+ DataContext = this;
+ }
+
+ #endregion Contructor
+
+ #region Base properties
+
+ ///
+ /// Definie the foreground
+ ///
+ public static readonly DependencyProperty ForegroundProperty =
+ TextElement.ForegroundProperty.AddOwner(
+ typeof(FastTextLine));
+
+ public Brush Foreground
+ {
+ get => (Brush)GetValue(ForegroundProperty);
+ set => SetValue(ForegroundProperty, value);
+ }
+
+ public static readonly DependencyProperty BackgroundProperty =
+ TextElement.BackgroundProperty.AddOwner(typeof(FastTextLine),
+ new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
+
+ ///
+ /// Defines the background
+ ///
+ public Brush Background
+ {
+ get => (Brush)GetValue(BackgroundProperty);
+ set => SetValue(BackgroundProperty, value);
+ }
+
+ public static readonly DependencyProperty TextProperty =
+ DependencyProperty.Register(nameof(Text), typeof(string), typeof(FastTextLine),
+ new FrameworkPropertyMetadata(string.Empty,
+ FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
+
+ ///
+ /// Text to be displayed representation of Byte
+ ///
+ public string Text
+ {
+ get => (string)GetValue(TextProperty);
+ set => SetValue(TextProperty, value);
+ }
+
+ public static readonly DependencyProperty FontWeightProperty = TextElement.FontWeightProperty.AddOwner(typeof(FastTextLine));
+
+ ///
+ /// The FontWeight property specifies the weight of the font.
+ ///
+ public FontWeight FontWeight
+ {
+ get => (FontWeight)GetValue(FontWeightProperty);
+ set => SetValue(FontWeightProperty, value);
+ }
+
+ #endregion Base properties
+
+ #region Properties
+
+ public bool AutoWidth { get; set; } = true;
+
+ public Point RenderPoint
+ {
+ get => (Point)GetValue(RenderPointProperty);
+ set => SetValue(RenderPointProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for RenderPoint. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty RenderPointProperty =
+ DependencyProperty.Register(nameof(RenderPoint), typeof(Point), typeof(FastTextLine),
+ new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsMeasure));
+
+ #endregion
+
+ ///
+ /// Render the control
+ ///
+ protected override void OnRender(DrawingContext dc)
+ {
+ //Draw background
+ if (Background != null)
+ dc.DrawRectangle(Background, null, new Rect(0, 0, RenderSize.Width, RenderSize.Height));
+
+ //Draw text
+ var formatedText = new FormattedText(Text, CultureInfo.InvariantCulture, FlowDirection.LeftToRight,
+ new Typeface(_parent.FontFamily, _parent.FontStyle, FontWeight, _parent.FontStretch),
+ _parent.FontSize, Foreground, VisualTreeHelper.GetDpi(this).PixelsPerDip);
+
+ dc.DrawText(formatedText, new Point(RenderPoint.X, RenderPoint.Y));
+
+ if (AutoWidth)
+ Width = formatedText.Width + RenderPoint.X;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/FindReplaceWindow.xaml b/FModel/Forms/HexViewer/FindReplaceWindow.xaml
new file mode 100644
index 00000000..32578143
--- /dev/null
+++ b/FModel/Forms/HexViewer/FindReplaceWindow.xaml
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/HexViewer/FindReplaceWindow.xaml.cs b/FModel/Forms/HexViewer/FindReplaceWindow.xaml.cs
new file mode 100644
index 00000000..e3521307
--- /dev/null
+++ b/FModel/Forms/HexViewer/FindReplaceWindow.xaml.cs
@@ -0,0 +1,84 @@
+using System.IO;
+using System.Windows;
+
+namespace WpfHexaEditor.Dialog
+{
+ ///
+ /// Logique d'interaction pour FindReplaceWindow.xaml
+ ///
+ public partial class FindReplaceWindow
+ {
+ private readonly HexEditor _parent;
+
+ public FindReplaceWindow(HexEditor parent, byte[] findData = null)
+ {
+ InitializeComponent();
+
+ //Parent hexeditor for "binding" search
+ _parent = parent;
+
+ InitializeMStream(FindHexEdit, findData);
+ InitializeMStream(ReplaceHexEdit);
+ }
+
+ #region Events
+ private void ClearButton_Click(object sender, RoutedEventArgs e) => InitializeMStream(FindHexEdit);
+ private void ClearReplaceButton_Click(object sender, RoutedEventArgs e) => InitializeMStream(ReplaceHexEdit);
+ private void CloseButton_Click(object sender, RoutedEventArgs e) => Close();
+
+ private void FindAllButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindAll(FindHexEdit.GetAllBytes(), HighlightMenuItem.IsChecked);
+
+ private void FindFirstButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindFirst(FindHexEdit.GetAllBytes(), 0, HighlightMenuItem.IsChecked);
+
+ private void FindNextButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindNext(FindHexEdit.GetAllBytes(), HighlightMenuItem.IsChecked);
+
+ private void FindLastButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindLast(FindHexEdit.GetAllBytes(), HighlightMenuItem.IsChecked);
+
+ private void ReplaceButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.ReplaceFirst(FindHexEdit.GetAllBytes(), ReplaceHexEdit.GetAllBytes(),
+ TrimMenuItem.IsChecked, HighlightMenuItem.IsChecked);
+
+ private void ReplaceNextButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.ReplaceNext(FindHexEdit.GetAllBytes(), ReplaceHexEdit.GetAllBytes(),
+ TrimMenuItem.IsChecked, HighlightMenuItem.IsChecked);
+
+ private void ReplaceAllButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.ReplaceAll(FindHexEdit.GetAllBytes(), ReplaceHexEdit.GetAllBytes(),
+ TrimMenuItem.IsChecked, HighlightMenuItem.IsChecked);
+
+ private void ReplaceHexEdit_BytesDeleted(object sender, System.EventArgs e) =>
+ InitializeMStream(ReplaceHexEdit, ReplaceHexEdit.GetAllBytes());
+
+ private void FindHexEdit_BytesDeleted(object sender, System.EventArgs e) =>
+ InitializeMStream(FindHexEdit, FindHexEdit.GetAllBytes());
+
+ private void SettingButton_Click(object sender, RoutedEventArgs e) => SettingPopup.IsOpen = true;
+
+ private void SettingMenuItem_Click(object sender, RoutedEventArgs e) => SettingPopup.IsOpen = false;
+ #endregion
+
+ #region Methods
+ ///
+ /// Initialize stream and hexeditor
+ ///
+ private void InitializeMStream(HexEditor hexeditor, byte[] findData = null)
+ {
+ hexeditor.CloseProvider();
+
+ var ms = new MemoryStream(1);
+
+ if (findData != null && findData.Length > 0)
+ foreach (byte b in findData)
+ ms.WriteByte(b);
+ else
+ ms.WriteByte(0);
+
+ hexeditor.Stream = ms;
+ }
+ #endregion
+ }
+}
diff --git a/FModel/Forms/HexViewer/FindWindow.xaml b/FModel/Forms/HexViewer/FindWindow.xaml
new file mode 100644
index 00000000..e6c67396
--- /dev/null
+++ b/FModel/Forms/HexViewer/FindWindow.xaml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/HexViewer/FindWindow.xaml.cs b/FModel/Forms/HexViewer/FindWindow.xaml.cs
new file mode 100644
index 00000000..fcdf12ac
--- /dev/null
+++ b/FModel/Forms/HexViewer/FindWindow.xaml.cs
@@ -0,0 +1,60 @@
+using System.IO;
+using System.Windows;
+
+namespace WpfHexaEditor.Dialog
+{
+ ///
+ /// Logique d'interaction pour FindWindow.xaml
+ ///
+ public partial class FindWindow
+ {
+ private MemoryStream _findMs = new MemoryStream(1);
+ private readonly HexEditor _parent;
+
+ public FindWindow(HexEditor parent, byte[] findData = null)
+ {
+ InitializeComponent();
+
+ //Parent hexeditor for "binding" search
+ _parent = parent;
+
+ InitializeMStream(findData);
+ }
+
+ private void CloseButton_Click(object sender, RoutedEventArgs e) => Close();
+ private void ClearButton_Click(object sender, RoutedEventArgs e) => InitializeMStream();
+
+ private void FindHexEdit_BytesDeleted(object sender, System.EventArgs e) =>
+ InitializeMStream(FindHexEdit.GetAllBytes());
+
+ private void FindAllButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindAll(FindHexEdit.GetAllBytes(), true);
+
+ private void FindFirstButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindFirst(FindHexEdit.GetAllBytes());
+
+ private void FindNextButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindNext(FindHexEdit.GetAllBytes());
+
+ private void FindLastButton_Click(object sender, RoutedEventArgs e) =>
+ _parent?.FindLast(FindHexEdit.GetAllBytes());
+
+ ///
+ /// Initialize stream and hexeditor
+ ///
+ private void InitializeMStream(byte[] findData = null)
+ {
+ FindHexEdit.CloseProvider();
+
+ _findMs = new MemoryStream(1);
+
+ if (findData != null && findData.Length > 0)
+ foreach (byte b in findData)
+ _findMs.WriteByte(b);
+ else
+ _findMs.WriteByte(0);
+
+ FindHexEdit.Stream = _findMs;
+ }
+ }
+}
diff --git a/FModel/Forms/HexViewer/GiveByteWindow.xaml b/FModel/Forms/HexViewer/GiveByteWindow.xaml
new file mode 100644
index 00000000..cb5d8bc1
--- /dev/null
+++ b/FModel/Forms/HexViewer/GiveByteWindow.xaml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/GiveByteWindow.xaml.cs b/FModel/Forms/HexViewer/GiveByteWindow.xaml.cs
new file mode 100644
index 00000000..3bf72778
--- /dev/null
+++ b/FModel/Forms/HexViewer/GiveByteWindow.xaml.cs
@@ -0,0 +1,14 @@
+using System.Windows;
+
+namespace WpfHexaEditor.Dialog
+{
+ ///
+ /// This Window is used to give a hex value for fill the selection with.
+ ///
+ internal partial class GiveByteWindow
+ {
+ public GiveByteWindow() => InitializeComponent();
+
+ private void OKButton_Click(object sender, RoutedEventArgs e) => DialogResult = true;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/HexBox.xaml b/FModel/Forms/HexViewer/HexBox.xaml
new file mode 100644
index 00000000..8f8120d0
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexBox.xaml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/HexBox.xaml.cs b/FModel/Forms/HexViewer/HexBox.xaml.cs
new file mode 100644
index 00000000..2a06a3d1
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexBox.xaml.cs
@@ -0,0 +1,174 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2017-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using WpfHexaEditor.Core;
+using WpfHexaEditor.Core.Bytes;
+
+namespace WpfHexaEditor
+{
+ ///
+ /// Control for enter hex value and deal with.
+ ///
+ public partial class HexBox
+ {
+ public HexBox() => InitializeComponent();
+
+ #region Events
+ ///
+ /// Occurs when value are changed.
+ ///
+ public event EventHandler ValueChanged;
+
+ #endregion
+
+ #region Properties
+
+ ///
+ /// Get hexadecimal value of LongValue
+ ///
+ public string HexValue => ByteConverters.LongToHex(LongValue);
+
+ ///
+ /// Set maximum value
+ ///
+ public long MaximumValue
+ {
+ get => (long)GetValue(MaximumValueProperty);
+ set => SetValue(MaximumValueProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for MaximumValue. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty MaximumValueProperty =
+ DependencyProperty.Register(nameof(MaximumValue), typeof(long), typeof(HexBox),
+ new FrameworkPropertyMetadata(long.MaxValue, MaximumValue_Changed));
+
+ private static void MaximumValue_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexBox ctrl)
+ if (e.NewValue != e.OldValue)
+ if (ctrl.LongValue > (long)e.NewValue)
+ ctrl.UpdateValueFrom((long)e.NewValue);
+ }
+
+ ///
+ /// Get or set the hex value show in control
+ ///
+ public long LongValue
+ {
+ get => (long)GetValue(LongValueProperty);
+ set => SetValue(LongValueProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for LongValue. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty LongValueProperty =
+ DependencyProperty.Register(nameof(LongValue), typeof(long), typeof(HexBox),
+ new FrameworkPropertyMetadata(0L,
+ LongValue_Changed,
+ LongValue_CoerceValue));
+
+ private static object LongValue_CoerceValue(DependencyObject d, object baseValue)
+ {
+ var ctrl = d as HexBox;
+
+ var newValue = (long)baseValue;
+
+ if (newValue > ctrl.MaximumValue) newValue = ctrl.MaximumValue;
+ if (newValue < 0) newValue = 0;
+
+ return newValue;
+ }
+
+ private static void LongValue_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexBox ctrl)
+ if (e.NewValue != e.OldValue)
+ {
+ var val = ByteConverters.LongToHex((long)e.NewValue);
+
+ if (val == "00000000")
+ val = "0";
+ else if (val.Length >= 3)
+ val = val.TrimStart('0');
+
+ ctrl.HexTextBox.Text = val.ToUpper();
+ ctrl.HexTextBox.CaretIndex = ctrl.HexTextBox.Text.Length;
+ ctrl.ToolTip = e.NewValue;
+
+ ctrl.ValueChanged?.Invoke(ctrl, new EventArgs());
+ }
+ }
+
+ #endregion Properties
+
+ #region Methods
+
+ ///
+ /// Substract one to the LongValue
+ ///
+ private void SubstractOne() => LongValue--;
+
+ ///
+ /// Add one to the LongValue
+ ///
+ private void AddOne() => LongValue++;
+
+ ///
+ /// Update value from decimal long
+ ///
+ private void UpdateValueFrom(long value) => LongValue = value;
+
+ ///
+ /// Update value from hex string
+ ///
+ private void UpdateValueFrom(string value)
+ {
+ var (success, val) = ByteConverters.HexLiteralToLong(value);
+
+ LongValue = success ? val : 0;
+ }
+
+ #endregion Methods
+
+ #region Controls events
+
+ private void HexTextBox_PreviewKeyDown(object sender, KeyEventArgs e) =>
+ e.Handled = !KeyValidator.IsHexKey(e.Key) &&
+ !KeyValidator.IsBackspaceKey(e.Key) &&
+ !KeyValidator.IsDeleteKey(e.Key) &&
+ !KeyValidator.IsArrowKey(e.Key) &&
+ !KeyValidator.IsTabKey(e.Key) &&
+ !KeyValidator.IsEnterKey(e.Key);
+
+ private void HexTextBox_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Up)
+ AddOne();
+
+ if (e.Key == Key.Down)
+ SubstractOne();
+
+ HexTextBox.Focus();
+ }
+
+ private void UpButton_Click(object sender, RoutedEventArgs e) => AddOne();
+
+ private void DownButton_Click(object sender, RoutedEventArgs e) => SubstractOne();
+
+ private void HexTextBox_TextChanged(object sender, TextChangedEventArgs e) =>
+ UpdateValueFrom(HexTextBox.Text);
+
+ private void CopyHexaMenuItem_Click(object sender, RoutedEventArgs e) =>
+ Clipboard.SetText($"0x{HexTextBox.Text}");
+
+ private void CopyLongMenuItem_Click(object sender, RoutedEventArgs e) =>
+ Clipboard.SetText(LongValue.ToString());
+
+ #endregion Controls events
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/HexByte.cs b/FModel/Forms/HexViewer/HexByte.cs
new file mode 100644
index 00000000..2ca853fc
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexByte.cs
@@ -0,0 +1,218 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+// Contributor: Janus Tida
+//////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Input;
+using WpfHexaEditor.Core;
+using WpfHexaEditor.Core.Bytes;
+using WpfHexaEditor.Core.MethodExtention;
+
+namespace WpfHexaEditor
+{
+ internal class HexByte : BaseByte
+ {
+ #region Global class variables
+
+ private KeyDownLabel _keyDownLabel = KeyDownLabel.FirstChar;
+
+ #endregion global class variables
+
+ #region Constructor
+
+ public HexByte(HexEditor parent) : base(parent)
+ {
+ //Update width
+ UpdateDataVisualWidth();
+ }
+
+ #endregion Contructor
+
+ #region Methods
+
+ ///
+ /// Update the render of text derived bytecontrol from byte property
+ ///
+ public override void UpdateTextRenderFromByte()
+ {
+ if (Byte != null)
+ {
+ switch (_parent.DataStringVisual)
+ {
+ case DataVisualType.Hexadecimal:
+ var chArr = ByteConverters.ByteToHexCharArray(Byte.Value);
+ Text = new string(chArr);
+ break;
+ case DataVisualType.Decimal:
+ Text = Byte.Value.ToString("d3");
+ break;
+ }
+ }
+ else
+ Text = string.Empty;
+ }
+
+ public override void Clear()
+ {
+ base.Clear();
+ _keyDownLabel = KeyDownLabel.FirstChar;
+ }
+
+ public void UpdateDataVisualWidth()
+ {
+ switch (_parent.DataStringVisual)
+ {
+ case DataVisualType.Decimal:
+ Width = 25;
+ break;
+ case DataVisualType.Hexadecimal:
+ Width = 20;
+ break;
+ }
+ }
+
+ #endregion Methods
+
+ #region Events delegate
+
+ protected override void OnMouseDown(MouseButtonEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Pressed)
+ {
+ if (IsFocused)
+ {
+ //Is focused set editing to second char.
+ _keyDownLabel = KeyDownLabel.SecondChar;
+ UpdateCaret();
+ }
+ }
+
+ base.OnMouseDown(e);
+ }
+
+ protected override void OnKeyDown(KeyEventArgs e)
+ {
+ if (Byte == null) return;
+
+ if (KeyValidation(e)) return;
+
+ //MODIFY BYTE
+ if (!ReadOnlyMode && KeyValidator.IsHexKey(e.Key))
+ switch (_parent.DataStringVisual)
+ {
+ case DataVisualType.Hexadecimal:
+
+ #region Edit hexadecimal value
+
+ string key;
+ key = KeyValidator.IsNumericKey(e.Key)
+ ? KeyValidator.GetDigitFromKey(e.Key).ToString()
+ : e.Key.ToString().ToLower();
+
+ //Update byte
+ var byteValueCharArray = ByteConverters.ByteToHexCharArray(Byte.Value);
+ switch (_keyDownLabel)
+ {
+ case KeyDownLabel.FirstChar:
+ byteValueCharArray[0] = key.ToCharArray()[0];
+ _keyDownLabel = KeyDownLabel.SecondChar;
+ Action = ByteAction.Modified;
+ Byte = ByteConverters.HexToByte(
+ byteValueCharArray[0] + byteValueCharArray[1].ToString())[0];
+ break;
+ case KeyDownLabel.SecondChar:
+ byteValueCharArray[1] = key.ToCharArray()[0];
+ _keyDownLabel = KeyDownLabel.NextPosition;
+
+ Action = ByteAction.Modified;
+ Byte = ByteConverters.HexToByte(
+ byteValueCharArray[0] + byteValueCharArray[1].ToString())[0];
+
+ //Insert byte at end of file
+ if (_parent.Length != BytePositionInStream + 1)
+ {
+ _keyDownLabel = KeyDownLabel.NextPosition;
+ OnMoveNext(new EventArgs());
+ }
+ break;
+ case KeyDownLabel.NextPosition:
+
+ //byte[] byteToAppend = { (byte)key.ToCharArray()[0] };
+ _parent.AppendByte(new byte[] { 0 });
+
+ OnMoveNext(new EventArgs());
+
+ break;
+ }
+
+ #endregion
+
+ break;
+ case DataVisualType.Decimal:
+
+ //Not editable at this moment, maybe in future
+
+ break;
+ }
+
+ UpdateCaret();
+
+ base.OnKeyDown(e);
+ }
+
+ #endregion Events delegate
+
+ #region Caret events/methods
+
+ protected override void OnGotFocus(RoutedEventArgs e)
+ {
+ _keyDownLabel = KeyDownLabel.FirstChar;
+ UpdateCaret();
+
+ base.OnGotFocus(e);
+ }
+
+ private void UpdateCaret()
+ {
+ if (ReadOnlyMode || Byte == null)
+ _parent.HideCaret();
+ else
+ {
+ //TODO: clear size and use BaseByte.TextFormatted property...
+ var size = Text[1].ToString()
+ .GetScreenSize(_parent.FontFamily, _parent.FontSize, _parent.FontStyle, FontWeight,
+ _parent.FontStretch, _parent.Foreground);
+
+ _parent.SetCaretSize(Width / 2, size.Height);
+ _parent.SetCaretMode(CaretMode.Overwrite);
+
+ switch (_keyDownLabel)
+ {
+ case KeyDownLabel.FirstChar:
+ _parent.MoveCaret(TransformToAncestor(_parent).Transform(new Point(0, 0)));
+ break;
+ case KeyDownLabel.SecondChar:
+ _parent.MoveCaret(TransformToAncestor(_parent).Transform(new Point(size.Width + 1, 0)));
+ break;
+ case KeyDownLabel.NextPosition:
+ if (_parent.Length == BytePositionInStream + 1)
+ if (_parent.AllowExtend)
+ {
+ _parent.SetCaretMode(CaretMode.Insert);
+ _parent.MoveCaret(TransformToAncestor(_parent).Transform(new Point(size.Width * 2, 0)));
+ }
+ else
+ _parent.HideCaret();
+
+ break;
+ }
+ }
+ }
+
+ #endregion
+
+ }
+}
diff --git a/FModel/Forms/HexViewer/HexEditor.xaml b/FModel/Forms/HexViewer/HexEditor.xaml
new file mode 100644
index 00000000..d3dff925
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexEditor.xaml
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/HexEditor.xaml.cs b/FModel/Forms/HexViewer/HexEditor.xaml.cs
new file mode 100644
index 00000000..ee399344
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexEditor.xaml.cs
@@ -0,0 +1,4892 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+//////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Shapes;
+using WpfHexaEditor.Core;
+using WpfHexaEditor.Core.Bytes;
+using WpfHexaEditor.Core.CharacterTable;
+using WpfHexaEditor.Core.Interfaces;
+using WpfHexaEditor.Core.MethodExtention;
+using WpfHexaEditor.Core.Xcbb;
+using WpfHexaEditor.Dialog;
+using static System.Windows.Forms.SystemInformation;
+using static WpfHexaEditor.Core.Bytes.ByteConverters;
+using static WpfHexaEditor.Core.Bytes.ByteProvider;
+using Path = System.IO.Path;
+
+namespace WpfHexaEditor
+{
+ ///
+ /// Wpf HexEditor control implementation
+ ///
+ ///
+ /// A fast, fully customisable Wpf user control for editing file or stream as hexadecimal.
+ /// Can be used in Wpf or WinForm application.
+ ///
+ public partial class HexEditor : IDisposable
+ {
+ #region Global class variables
+
+ ///
+ /// Byte provider for work with file or stream currently loaded in control.
+ ///
+ private ByteProvider _provider;
+
+ ///
+ /// The large change of scroll when clicked on scrollbar
+ ///
+ private double _scrollLargeChange = 100;
+
+ ///
+ /// List of byte are highlighted
+ ///
+ private Dictionary _markedPositionList = new Dictionary();
+
+ ///
+ /// Byte position in file when mouse right click occurs.
+ ///
+ private long _rightClickBytePosition = -1;
+
+ ///
+ /// Custom character table loaded. Used for show byte as texte.
+ ///
+ private TblStream _tblCharacterTable;
+
+ ///
+ /// Hold the count of all byte in file.
+ ///
+ private long[] _bytecount;
+
+ ///
+ /// Save the view byte buffer as a field.
+ /// To save the time when Scolling i do not building them every time when scolling.
+ ///
+ private byte[] _viewBuffer;
+
+ ///
+ /// Save the view byte buffer position as a field.
+ /// To save the time when Scolling i do not building them every time when scolling.
+ ///
+ private long[] _viewBufferBytePosition;
+
+ ///
+ /// Used for control the view on refresh
+ ///
+ private long _priLevel;
+
+ ///
+ /// Used with VerticalMoveByTime methods/events to move the scrollbar.
+ ///
+ private bool _mouseOnBottom, _mouseOnTop;
+
+ ///
+ /// Used with VerticalMoveByTime methods/events to move the scrollbar.
+ ///
+ private long _bottomEnterTimes, _topEnterTimes;
+
+ ///
+ /// Caret used in control to view position
+ ///
+ private readonly Caret _caret = new Caret();
+
+ ///
+ /// For detect redondants call when disposing control
+ ///
+ private bool _disposedValue;
+
+ ///
+ /// Highlight the header and offset on SelectionStart property
+ ///
+ private bool _highLightSelectionStart = true;
+
+ ///
+ /// Get is the first color...
+ ///
+ private FirstColor _firstColor = FirstColor.HexByteData;
+
+ #endregion Global Class variables
+
+ #region Events
+
+ ///
+ /// Occurs when selection start are changed.
+ ///
+ public event EventHandler SelectionStartChanged;
+
+ ///
+ /// Occurs when selection stop are changed.
+ ///
+ public event EventHandler SelectionStopChanged;
+
+ ///
+ /// Occurs when the length of selection are changed.
+ ///
+ public event EventHandler SelectionLengthChanged;
+
+ ///
+ /// Occurs when data are copie to clipboard.
+ ///
+ public event EventHandler DataCopied;
+
+ ///
+ /// Occurs when the type of character table are changed.
+ ///
+ public event EventHandler TypeOfCharacterTableChanged;
+
+ ///
+ /// Occurs when a long process percent changed.
+ ///
+ public event EventHandler LongProcessProgressChanged;
+
+ ///
+ /// Occurs when a long process are started.
+ ///
+ public event EventHandler LongProcessProgressStarted;
+
+ ///
+ /// Occurs when a long process are completed.
+ ///
+ public event EventHandler LongProcessProgressCompleted;
+
+ ///
+ /// Occurs when readonly property are changed.
+ ///
+ public event EventHandler ReadOnlyChanged;
+
+ ///
+ /// Occurs when data are saved to stream/file.
+ ///
+ public event EventHandler ChangesSubmited;
+
+ ///
+ /// Occurs when the replace byte by byte are completed
+ ///
+ public event EventHandler ReplaceByteCompleted;
+
+ ///
+ /// Occurs when the fill with byte method are completed
+ ///
+ public event EventHandler FillWithByteCompleted;
+
+ ///
+ /// Occurs when bytes as deleted in control
+ ///
+ public event EventHandler BytesDeleted;
+
+ ///
+ /// Occurs when byte as modified in control
+ ///
+ public event EventHandler BytesModified;
+
+ ///
+ /// Occurs when undo are completed
+ ///
+ public event EventHandler Undone;
+
+ ///
+ /// Occurs when redo are completed
+ ///
+ public event EventHandler Redone;
+
+ ///
+ /// Occurs on byte click completed
+ ///
+ public event EventHandler ByteClick;
+
+ ///
+ /// Occurs on byte double click completed
+ ///
+ public event EventHandler ByteDoubleClick;
+
+
+
+ #endregion Events
+
+ #region Constructor
+
+ public HexEditor()
+ {
+ InitializeComponent();
+
+ //Refresh view
+ UpdateScrollBar();
+ InitializeCaret();
+ RefreshView(true);
+ }
+ #endregion Contructor
+
+ #region Build-in CTRL key support
+
+ public bool AllowBuildinCtrlc
+ {
+ get => (bool)GetValue(AllowBuildinCtrlcProperty);
+ set => SetValue(AllowBuildinCtrlcProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowBuildinCTRLC. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowBuildinCtrlcProperty =
+ DependencyProperty.Register(nameof(AllowBuildinCtrlc), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_AllowBuildinCTRLPropertyChanged));
+
+ public bool AllowBuildinCtrlv
+ {
+ get => (bool)GetValue(AllowBuildinCtrlvProperty);
+ set => SetValue(AllowBuildinCtrlvProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowBuildinCTRLV. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowBuildinCtrlvProperty =
+ DependencyProperty.Register(nameof(AllowBuildinCtrlv), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_AllowBuildinCTRLPropertyChanged));
+
+ public bool AllowBuildinCtrla
+ {
+ get => (bool)GetValue(AllowBuildinCtrlaProperty);
+ set => SetValue(AllowBuildinCtrlaProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowBuildinCTRLA. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowBuildinCtrlaProperty =
+ DependencyProperty.Register(nameof(AllowBuildinCtrla), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_AllowBuildinCTRLPropertyChanged));
+
+ public bool AllowBuildinCtrlz
+ {
+ get => (bool)GetValue(AllowBuildinCtrlzProperty);
+ set => SetValue(AllowBuildinCtrlzProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowBuildinCTRLZ. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowBuildinCtrlzProperty =
+ DependencyProperty.Register(nameof(AllowBuildinCtrlz), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_AllowBuildinCTRLPropertyChanged));
+
+ public bool AllowBuildinCtrly
+ {
+ get => (bool)GetValue(AllowBuildinCtrlyProperty);
+ set => SetValue(AllowBuildinCtrlyProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowBuildinCTRLY. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowBuildinCtrlyProperty =
+ DependencyProperty.Register(nameof(AllowBuildinCtrly), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_AllowBuildinCTRLPropertyChanged));
+
+ private static void Control_AllowBuildinCTRLPropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue) ctrl.RefreshView();
+ }
+
+ private void Control_CTRLZKey(object sender, EventArgs e)
+ {
+ if (AllowBuildinCtrlz) Undo();
+ }
+
+ private void Control_CTRLYKey(object sender, EventArgs e)
+ {
+ if (AllowBuildinCtrly) Redo();
+ }
+
+ private void Control_CTRLCKey(object sender, EventArgs e)
+ {
+ if (AllowBuildinCtrlc) CopyToClipboard();
+ }
+
+ private void Control_CTRLAKey(object sender, EventArgs e)
+ {
+ if (AllowBuildinCtrla) SelectAll();
+ }
+
+ private void Control_CTRLVKey(object sender, EventArgs e)
+ {
+ if (AllowBuildinCtrlv) Paste(AllowExtend);
+ }
+
+ #endregion Build-in CTRL key support
+
+ #region Colors/fonts property and methods
+
+ public Brush SelectionFirstColor
+ {
+ get => (Brush)GetValue(SelectionFirstColorProperty);
+ set => SetValue(SelectionFirstColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for SelectionFirstColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty SelectionFirstColorProperty =
+ DependencyProperty.Register(nameof(SelectionFirstColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.CornflowerBlue, Control_ColorPropertyChanged));
+
+ public Brush SelectionSecondColor
+ {
+ get => (Brush)GetValue(SelectionSecondColorProperty);
+ set => SetValue(SelectionSecondColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for SelectionFirstColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty SelectionSecondColorProperty =
+ DependencyProperty.Register(nameof(SelectionSecondColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.LightSteelBlue, Control_ColorPropertyChanged));
+
+ public Brush ByteModifiedColor
+ {
+ get => (Brush)GetValue(ByteModifiedColorProperty);
+ set => SetValue(ByteModifiedColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteModifiedColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteModifiedColorProperty =
+ DependencyProperty.Register(nameof(ByteModifiedColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.DarkGray, Control_ColorPropertyChanged));
+
+ public Brush MouseOverColor
+ {
+ get => (Brush)GetValue(MouseOverColorProperty);
+ set => SetValue(MouseOverColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for MouseOverColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty MouseOverColorProperty =
+ DependencyProperty.Register(nameof(MouseOverColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.LightSkyBlue, Control_ColorPropertyChanged));
+
+ public Brush ByteDeletedColor
+ {
+ get => (Brush)GetValue(ByteDeletedColorProperty);
+ set => SetValue(ByteDeletedColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteDeletedColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteDeletedColorProperty =
+ DependencyProperty.Register(nameof(ByteDeletedColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Red, Control_ColorPropertyChanged));
+
+ public Brush HighLightColor
+ {
+ get => (Brush)GetValue(HighLightColorProperty);
+ set => SetValue(HighLightColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for HighLightColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty HighLightColorProperty =
+ DependencyProperty.Register(nameof(HighLightColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Gold, Control_ColorPropertyChanged));
+
+ public Brush ForegroundHighLightOffSetHeaderColor
+ {
+ get => (Brush)GetValue(ForegroundHighLightOffSetHeaderColorProperty);
+ set => SetValue(ForegroundHighLightOffSetHeaderColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ForegroundOffSetHeaderColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ForegroundHighLightOffSetHeaderColorProperty =
+ DependencyProperty.Register(nameof(ForegroundHighLightOffSetHeaderColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Black, Control_ForegroundOffSetHeaderColorPropertyChanged));
+
+ public Brush ForegroundOffSetHeaderColor
+ {
+ get => (Brush)GetValue(ForegroundOffSetHeaderColorProperty);
+ set => SetValue(ForegroundOffSetHeaderColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ForegroundOffSetHeaderColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ForegroundOffSetHeaderColorProperty =
+ DependencyProperty.Register(nameof(ForegroundOffSetHeaderColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Gray, Control_ForegroundOffSetHeaderColorPropertyChanged));
+
+ private static void Control_ForegroundOffSetHeaderColorPropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ ctrl.UpdateHeader();
+ ctrl.UpdateLinesInfo();
+ }
+
+ public new Brush Background
+ {
+ get => (Brush)GetValue(BackgroundProperty);
+ set => SetValue(BackgroundProperty, value);
+ }
+
+ public new Brush Foreground
+ {
+ get => (Brush)GetValue(ForegroundProperty);
+ set => SetValue(ForegroundProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for Foreground. This enables animation, styling, binding, etc...
+ public new static readonly DependencyProperty ForegroundProperty =
+ DependencyProperty.Register(nameof(Foreground), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Black, Control_ColorPropertyChanged));
+
+ ///
+ /// Second foreground colors used in hexbyte
+ ///
+ public Brush ForegroundSecondColor
+ {
+ get => (Brush)GetValue(ForegroundSecondColorProperty);
+ set => SetValue(ForegroundSecondColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ForegroundSecond. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ForegroundSecondColorProperty =
+ DependencyProperty.Register(nameof(ForegroundSecondColor), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Blue, Control_ColorPropertyChanged));
+
+
+ public Brush ForegroundContrast
+ {
+ get => (Brush)GetValue(ForegroundContrastProperty);
+ set => SetValue(ForegroundContrastProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ForegroundContrastColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ForegroundContrastProperty =
+ DependencyProperty.Register(nameof(ForegroundContrast), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.White, Control_ColorPropertyChanged));
+
+ // Using a DependencyProperty as the backing store for Background. This enables animation, styling, binding, etc...
+ public new static readonly DependencyProperty BackgroundProperty =
+ DependencyProperty.Register(nameof(Background), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.White, Control_BackgroundColorPropertyChanged));
+
+ private static void Control_BackgroundColorPropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ ctrl.BaseGrid.Background = (Brush)e.NewValue;
+ }
+
+ private static void Control_ColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ ctrl.UpdateVisual();
+ }
+
+ public new FontFamily FontFamily
+ {
+ get => (FontFamily)GetValue(FontFamilyProperty);
+ set => SetValue(FontFamilyProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for FontFamily. This enables animation, styling, binding, etc...
+ public new static readonly DependencyProperty FontFamilyProperty =
+ DependencyProperty.Register(nameof(FontFamily), typeof(FontFamily), typeof(HexEditor),
+ new FrameworkPropertyMetadata(new FontFamily("Courier New"),
+ FontFamily_Changed));
+
+ private static void FontFamily_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ ctrl.RefreshView(true);
+ }
+
+ ///
+ /// Call Updatevisual methods for all IByteControl
+ ///
+ public void UpdateVisual() => TraverseHexAndStringBytes(ctrl => { ctrl.UpdateVisual(); });
+
+ #endregion Colors/fonts property and methods
+
+ #region Miscellaneous property/methods
+
+ ///
+ /// The name of your application to be showing in messagebox title
+ ///
+ public string ApplicationName { get; set; } = "Wpf HexEditor";
+
+ ///
+ /// Height of data line.
+ ///
+ public double LineHeight
+ {
+ get => (double)GetValue(LineHeightProperty);
+ set => SetValue(LineHeightProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for LineHeight. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty LineHeightProperty =
+ DependencyProperty.Register(nameof(LineHeight), typeof(double), typeof(HexEditor),
+ new FrameworkPropertyMetadata(18D, LineHeight_PropertyChanged));
+
+ private static void LineHeight_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.RefreshView();
+ }
+
+ public OffSetPanelType OffSetPanelVisual
+ {
+ get { return (OffSetPanelType)GetValue(OffSetPanelVisualProperty); }
+ set { SetValue(OffSetPanelVisualProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for OffSetPanelVisual. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty OffSetPanelVisualProperty =
+ DependencyProperty.Register(nameof(OffSetPanelVisual), typeof(OffSetPanelType), typeof(HexEditor),
+ new FrameworkPropertyMetadata(OffSetPanelType.OffsetOnly, OffSetPanelVisual_PropertyChanged));
+
+ private static void OffSetPanelVisual_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.UpdateLinesInfo();
+ }
+
+ public OffSetPanelFixedWidth OffSetPanelFixedWidthVisual
+ {
+ get { return (OffSetPanelFixedWidth)GetValue(OffSetPanelFixedWidthVisualProperty); }
+ set { SetValue(OffSetPanelFixedWidthVisualProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for OffSetPanelFixedWidthVisual. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty OffSetPanelFixedWidthVisualProperty =
+ DependencyProperty.Register(nameof(OffSetPanelFixedWidthVisual), typeof(OffSetPanelFixedWidth), typeof(HexEditor),
+ new FrameworkPropertyMetadata(OffSetPanelFixedWidth.Dynamic, OffSetPanelVisual_PropertyChanged));
+
+
+ ///
+ /// Show or not the tooltip of byte in hexeditor
+ ///
+ public bool ShowByteToolTip
+ {
+ get { return (bool)GetValue(ShowByteToolTipProperty); }
+ set { SetValue(ShowByteToolTipProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for ShowByteToolTip. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ShowByteToolTipProperty =
+ DependencyProperty.Register(nameof(ShowByteToolTip), typeof(bool), typeof(HexEditor),
+ new PropertyMetadata(false));
+
+ #endregion Miscellaneous property/methods
+
+ #region Data visual type support
+
+ ///
+ /// Set or get the visual of line offset header
+ ///
+ public DataVisualType OffSetStringVisual
+ {
+ get => (DataVisualType)GetValue(OffSetStringVisualProperty);
+ set => SetValue(OffSetStringVisualProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for OffSetStringVisual. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty OffSetStringVisualProperty =
+ DependencyProperty.Register(nameof(OffSetStringVisual), typeof(DataVisualType), typeof(HexEditor),
+ new FrameworkPropertyMetadata(DataVisualType.Hexadecimal, DataVisualTypeProperty_PropertyChanged));
+
+
+ private static void DataVisualTypeProperty_PropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ ctrl.UpdateLinesInfo();
+ }
+
+ public DataVisualType DataStringVisual
+ {
+ get => (DataVisualType)GetValue(DataStringVisualProperty);
+ set => SetValue(DataStringVisualProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for HexByteStringVisual. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty DataStringVisualProperty =
+ DependencyProperty.Register(nameof(DataStringVisual), typeof(DataVisualType), typeof(HexEditor),
+ new FrameworkPropertyMetadata(DataVisualType.Hexadecimal, DataStringVisualTypeProperty_PropertyChanged));
+
+ private static void DataStringVisualTypeProperty_PropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ ctrl.UpdateHeader();
+
+ ctrl.TraverseHexBytes(hctrl =>
+ {
+ hctrl.UpdateDataVisualWidth();
+ hctrl.UpdateTextRenderFromByte();
+ });
+ }
+
+ #endregion Data visual type support
+
+ #region Characters tables property/methods
+
+ ///
+ /// Type of caracter table are used un hexacontrol.
+ /// For now, somes character table can be readonly but will change in future
+ ///
+ public CharacterTableType TypeOfCharacterTable
+ {
+ get => (CharacterTableType)GetValue(TypeOfCharacterTableProperty);
+ set => SetValue(TypeOfCharacterTableProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TypeOfCharacterTable. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TypeOfCharacterTableProperty =
+ DependencyProperty.Register(nameof(TypeOfCharacterTable), typeof(CharacterTableType), typeof(HexEditor),
+ new FrameworkPropertyMetadata(CharacterTableType.Ascii,
+ TypeOfCharacterTable_PropertyChanged));
+
+ private static void TypeOfCharacterTable_PropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ ctrl.RefreshView(true);
+ ctrl.TypeOfCharacterTableChanged?.Invoke(ctrl, new EventArgs());
+ }
+
+ ///
+ /// Show or not Multi Title Enconding (MTE) are loaded in TBL file
+ ///
+ public bool TblShowMte
+ {
+ get => (bool)GetValue(TblShowMteProperty);
+ set => SetValue(TblShowMteProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TBLShowMTE. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TblShowMteProperty =
+ DependencyProperty.Register(nameof(TblShowMte), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true,
+ TBLShowMTE_PropetyChanged));
+
+ private static void TBLShowMTE_PropetyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.RefreshView();
+ }
+
+ ///
+ /// Load TBL Character table file in control. (Used for ROM reverse engineering)
+ /// Load TBL Bookmark into control.
+ /// Change CharacterTable property for use.
+ ///
+ public void LoadTblFile(string fileName)
+ {
+ if (!File.Exists(fileName)) return;
+
+ _tblCharacterTable = new TblStream(fileName);
+
+ TblLabel.Visibility = Visibility.Visible;
+ TblLabel.ToolTip = $"TBL file : {fileName}";
+
+ UpdateTblBookMark();
+
+ BuildDataLines(MaxVisibleLine, true);
+ RefreshView(true);
+ }
+
+ ///
+ /// Load TBL Character table file in control. (Used for ROM reverse engineering)
+ /// Load TBL Bookmark into control.
+ /// Change CharacterTable property for use.
+ ///
+ public void LoadDefaultTbl(DefaultCharacterTableType type = DefaultCharacterTableType.Ascii)
+ {
+ _tblCharacterTable = TblStream.CreateDefaultTbl(type);
+ TblShowMte = false;
+
+ TblLabel.Visibility = Visibility.Visible;
+ TblLabel.ToolTip = $"{FModel.Properties.Resources.DefaultTBLString} : {type}";
+
+ RefreshView();
+ }
+
+ ///
+ /// Update TBL bookmark in control
+ ///
+ private void UpdateTblBookMark()
+ {
+ //Load from loaded TBL bookmark
+ if (_tblCharacterTable == null) return;
+
+ foreach (var mark in _tblCharacterTable.BookMarks)
+ SetScrollMarker(mark);
+ }
+
+ ///
+ /// Get or set the color of DTE in string panel.
+ ///
+ public SolidColorBrush TbldteColor
+ {
+ get => (SolidColorBrush)GetValue(TbldteColorProperty);
+ set => SetValue(TbldteColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TBLDTEColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TbldteColorProperty =
+ DependencyProperty.Register(nameof(TbldteColor), typeof(SolidColorBrush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Red,
+ TBLColor_Changed));
+
+ private static void TBLColor_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.RefreshView();
+ }
+
+ ///
+ /// Get or set the color of MTE in string panel.
+ ///
+ public SolidColorBrush TblmteColor
+ {
+ get => (SolidColorBrush)GetValue(TblmteColorProperty);
+ set => SetValue(TblmteColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TBLDTEColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TblmteColorProperty =
+ DependencyProperty.Register(nameof(TblmteColor), typeof(SolidColorBrush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.DarkSlateGray,
+ TBLColor_Changed));
+
+ ///
+ /// Get or set the color of EndBlock in string panel.
+ ///
+ public SolidColorBrush TblEndBlockColor
+ {
+ get => (SolidColorBrush)GetValue(TblEndBlockColorProperty);
+ set => SetValue(TblEndBlockColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TBLDTEColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TblEndBlockColorProperty =
+ DependencyProperty.Register(nameof(TblEndBlockColor), typeof(SolidColorBrush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Blue,
+ TBLColor_Changed));
+
+ ///
+ /// Get or set the color of EndBlock in string panel.
+ ///
+ public SolidColorBrush TblEndLineColor
+ {
+ get => (SolidColorBrush)GetValue(TblEndLineColorProperty);
+ set => SetValue(TblEndLineColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TBLDTEColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TblEndLineColorProperty =
+ DependencyProperty.Register(nameof(TblEndLineColor), typeof(SolidColorBrush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Blue,
+ TBLColor_Changed));
+
+ ///
+ /// Get or set the color of EndBlock in string panel.
+ ///
+ public SolidColorBrush TblDefaultColor
+ {
+ get => (SolidColorBrush)GetValue(TblDefaultColorProperty);
+ set => SetValue(TblDefaultColorProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for TBLDTEColor. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty TblDefaultColorProperty =
+ DependencyProperty.Register(nameof(TblDefaultColor), typeof(SolidColorBrush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.Black,
+ TBLColor_Changed));
+
+ #endregion Characters tables property/methods
+
+ #region ReadOnly property/event
+
+ ///
+ /// Put the control on readonly mode.
+ ///
+ public bool ReadOnlyMode
+ {
+ get => (bool)GetValue(ReadOnlyModeProperty);
+ set => SetValue(ReadOnlyModeProperty, value);
+ }
+
+ public static readonly DependencyProperty ReadOnlyModeProperty =
+ DependencyProperty.Register("ReadOnlyMode", typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(false,
+ ReadOnlyMode_PropertyChanged));
+
+ private static void ReadOnlyMode_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ ctrl.RefreshView(true);
+ }
+
+ private void Provider_ReadOnlyChanged(object sender, EventArgs e)
+ {
+ if (!CheckIsOpen(_provider)) return;
+
+ ReadOnlyMode = _provider.ReadOnlyMode;
+ ReadOnlyChanged?.Invoke(this, new EventArgs());
+ }
+
+ #endregion ReadOnly property/event
+
+ #region ByteModified methods/event/property
+ ///
+ /// Stream or file are modified when IsModified are set to true.
+ ///
+ public bool IsModified { get; set; } = false;
+
+ private void Control_ByteModified(object sender, EventArgs e)
+ {
+ if (sender is IByteControl ctrl)
+ {
+ _provider.AddByteModified(ctrl.Byte, ctrl.BytePositionInStream);
+ SetScrollMarker(ctrl.BytePositionInStream, ScrollMarker.ByteModified);
+ UpdateByteModified();
+
+ BytesModified?.Invoke(this, new EventArgs());
+ }
+
+ UpdateStatusBar();
+ }
+
+ private void Control_ByteDeleted(object sender, EventArgs e) => DeleteSelection();
+
+ #endregion ByteModified methods/event/methods
+
+ #region Lines methods
+ ///
+ /// Obtain the max line for vertical scrollbar
+ ///
+ private long MaxLine
+ {
+ get
+ {
+ long byteDeletedCount = 0;
+ if (CheckIsOpen(_provider) && HideByteDeleted)
+ byteDeletedCount = _provider.GetByteModifieds(ByteAction.Deleted).Count;
+
+ return AllowVisualByteAddress
+ ? CheckIsOpen(_provider) ? (VisualByteAdressLength - byteDeletedCount) / BytePerLine : 0
+ : CheckIsOpen(_provider) ? (_provider.Length - byteDeletedCount) / BytePerLine : 0;
+ }
+ }
+
+ ///
+ /// Get the number of row visible in control
+ ///
+ private int MaxVisibleLine
+ {
+ get
+ {
+ var actualheight = BaseGrid.RowDefinitions[1].ActualHeight;
+
+ if (actualheight < 0) actualheight = 0;
+
+ return (int)(actualheight / (LineHeight * ZoomScale)) + 1;
+ }
+ }
+
+ #endregion Lines methods
+
+ #region Selection Property/Methods/Event
+
+ ///
+ /// Get the selected line of focus control
+ ///
+ public long SelectionLine
+ {
+ get => (long)GetValue(SelectionLineProperty);
+ internal set => SetValue(SelectionLineProperty, value);
+ }
+
+ public static readonly DependencyProperty SelectionLineProperty =
+ DependencyProperty.Register(nameof(SelectionLine), typeof(long), typeof(HexEditor),
+ new FrameworkPropertyMetadata(0L));
+
+ private void LinesOffSetLabel_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (sender is FastTextLine line && e.LeftButton == MouseButtonState.Pressed)
+ SelectionStop = HexLiteralToLong((string)line.Tag).position + BytePerLine - 1;
+ }
+
+ private void LinesOffSetLabel_MouseDown(object sender, MouseButtonEventArgs e)
+ {
+ if (!(sender is FastTextLine line)) return;
+
+ SelectionStart = HexLiteralToLong((string)line.Tag).position;
+ SelectionStop = SelectionStart + BytePerLine - 1 - GetColumnNumber(SelectionStart);
+
+ HideCaret();
+ }
+
+ private void Control_EscapeKey(object sender, EventArgs e)
+ {
+ UnSelectAll();
+ UnHighLightAll();
+ Focus();
+ }
+
+ private void Control_KeyDown(object sender, KeyEventArgs e)
+ {
+ //TODO: need to fix... not occurs all times as needed.
+
+ switch (e.Key)
+ {
+ case Key.Delete:
+ DeleteSelection();
+ break;
+ case Key.Escape:
+ UnSelectAll();
+ UnHighLightAll();
+ Focus();
+ break;
+ }
+ }
+
+ private void Control_MovePageUp(object sender, EventArgs e)
+ {
+ //Prevent infinite loop
+ _setFocusTest = false;
+
+ //Get the new position from SelectionStart down one page
+ var newPosition = GetValidPositionFrom(SelectionStart, -(BytePerLine * MaxVisibleLine));
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ SelectionStart = newPosition < _provider.Length ? newPosition : 0;
+ else
+ {
+ FixSelectionStartStop();
+
+ if (newPosition > -1)
+ SelectionStart = SelectionStop = newPosition;
+ }
+
+ if (AllowVisualByteAddress && SelectionStart > VisualByteAdressStart)
+ SelectionStart = VisualByteAdressStart;
+
+ if (SelectionStart < FirstVisibleBytePosition)
+ VerticalScrollBar.Value--;
+
+ if (sender is HexByte || sender is StringByte)
+ {
+ VerticalScrollBar.Value -= MaxVisibleLine - 1;
+ SetFocusAtSelectionStart();
+ }
+ }
+
+ private void Control_MovePageDown(object sender, EventArgs e)
+ {
+ //Prevent infinite loop
+ _setFocusTest = false;
+
+ //Get the new position from SelectionStart down one page
+ var newPosition = GetValidPositionFrom(SelectionStart, BytePerLine * MaxVisibleLine);
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ SelectionStart = newPosition < _provider.Length ? newPosition : _provider.Length;
+ else
+ {
+ FixSelectionStartStop();
+
+ if (newPosition < _provider.Length)
+ SelectionStart = SelectionStop = newPosition;
+ }
+
+ if (AllowVisualByteAddress && SelectionStart > VisualByteAdressStop)
+ SelectionStart = VisualByteAdressStop;
+
+ if (SelectionStart > LastVisibleBytePosition)
+ VerticalScrollBar.Value++;
+
+ if (sender is HexByte || sender is StringByte)
+ {
+ VerticalScrollBar.Value += MaxVisibleLine - 1;
+ SetFocusAtSelectionStart();
+ }
+ }
+
+ private void Control_MoveDown(object sender, EventArgs e)
+ {
+ _setFocusTest = false;
+
+ var newPosition = GetValidPositionFrom(SelectionStart, BytePerLine);
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ SelectionStart = newPosition < _provider.Length ? newPosition : _provider.Length;
+ else
+ {
+ FixSelectionStartStop();
+
+ if (newPosition < _provider.Length)
+ SelectionStart = SelectionStop = newPosition;
+ }
+
+ if (AllowVisualByteAddress && SelectionStart > VisualByteAdressStop)
+ SelectionStart = VisualByteAdressStop;
+
+ if (SelectionStart > LastVisibleBytePosition)
+ VerticalScrollBar.Value++;
+
+ SetFocusAtSelectionStart();
+ }
+
+ private void Control_MoveUp(object sender, EventArgs e)
+ {
+ //Prevent infinite loop
+ _setFocusTest = false;
+
+ //Get the new position from SelectionStart
+ var newPosition = GetValidPositionFrom(SelectionStart, -BytePerLine);
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ SelectionStart = newPosition > -1 ? newPosition : 0;
+ else
+ {
+ FixSelectionStartStop();
+
+ if (newPosition > -1)
+ SelectionStart = SelectionStop = newPosition;
+ }
+
+ if (AllowVisualByteAddress && SelectionStart < VisualByteAdressStart)
+ SelectionStart = VisualByteAdressStart;
+
+ if (SelectionStart < FirstVisibleBytePosition)
+ VerticalScrollBar.Value--;
+
+ SetFocusAtSelectionStart();
+ }
+
+ private void Control_MouseSelection(object sender, EventArgs e)
+ {
+ //Prevent false mouse selection on file open
+ if (SelectionStart == -1) return;
+
+ if (!(sender is IByteControl bCtrl)) return;
+
+ var focusedControl = Keyboard.FocusedElement;
+
+ //update selection
+ SelectionStop = bCtrl.BytePositionInStream != -1 ? bCtrl.BytePositionInStream : LastVisibleBytePosition;
+
+ UpdateSelectionColor(focusedControl is HexByte ? FirstColor.HexByteData : FirstColor.StringByteData);
+ UpdateSelection();
+ }
+
+ ///
+ /// Set the start byte position of selection
+ ///
+ public long SelectionStart
+ {
+ get => (long)GetValue(SelectionStartProperty);
+ set => SetValue(SelectionStartProperty, value);
+ }
+
+ public static readonly DependencyProperty SelectionStartProperty =
+ DependencyProperty.Register("SelectionStart", typeof(long), typeof(HexEditor),
+ new FrameworkPropertyMetadata(-1L, SelectionStart_ChangedCallBack,
+ SelectionStart_CoerceValueCallBack));
+
+ private static object SelectionStart_CoerceValueCallBack(DependencyObject d, object baseValue)
+ {
+ if (!(d is HexEditor ctrl)) return -1L;
+ if (!CheckIsOpen(ctrl._provider)) return -1L;
+ if ((long)baseValue < -1) return -1L;
+
+ return baseValue;
+ }
+
+ private static void SelectionStart_ChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+ if (e.NewValue == e.OldValue) return;
+ if (!CheckIsOpen(ctrl._provider)) return;
+
+ ctrl.SelectionByte = ctrl._provider.GetByte(ctrl.SelectionStart).singleByte;
+
+ ctrl.UpdateSelection();
+ ctrl.UpdateSelectionLine();
+ ctrl.UpdateVisual();
+ ctrl.UpdateStatusBar();
+ ctrl.UpdateLinesInfo();
+ ctrl.UpdateHeader(true);
+ ctrl.SetScrollMarker(0, ScrollMarker.SelectionStart);
+
+ ctrl.SelectionStartChanged?.Invoke(ctrl, new EventArgs());
+ ctrl.SelectionLengthChanged?.Invoke(ctrl, new EventArgs());
+ }
+
+ ///
+ /// Set the start byte position of selection
+ ///
+ public long SelectionStop
+ {
+ get => (long)GetValue(SelectionStopProperty);
+ set => SetValue(SelectionStopProperty, value);
+ }
+
+ public static readonly DependencyProperty SelectionStopProperty =
+ DependencyProperty.Register("SelectionStop", typeof(long), typeof(HexEditor),
+ new FrameworkPropertyMetadata(-1L, SelectionStop_ChangedCallBack,
+ SelectionStop_CoerceValueCallBack));
+
+ private static object SelectionStop_CoerceValueCallBack(DependencyObject d, object baseValue)
+ {
+ if (!(d is HexEditor ctrl)) return baseValue;
+
+ var value = (long)baseValue;
+
+ if (value < -1 || !CheckIsOpen(ctrl._provider)) return -1L;
+
+ return value >= ctrl._provider.Length ? ctrl._provider.Length : baseValue;
+ }
+
+ private static void SelectionStop_ChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ ctrl.UpdateSelection();
+ ctrl.UpdateSelectionLine();
+
+ ctrl.SelectionStopChanged?.Invoke(ctrl, new EventArgs());
+ ctrl.SelectionLengthChanged?.Invoke(ctrl, new EventArgs());
+ }
+
+ ///
+ /// Fix the selection start and stop when needed
+ ///
+ private void FixSelectionStartStop()
+ {
+ if (SelectionStart > SelectionStop)
+ SelectionStart = SelectionStop;
+ else
+ SelectionStop = SelectionStart;
+ }
+
+ ///
+ /// Reset selection to -1
+ ///
+ public void UnSelectAll(bool cleanFocus = false)
+ {
+ SelectionStart = SelectionStop = -1;
+
+ if (cleanFocus)
+ {
+ HideCaret();
+ Focus();
+ }
+ }
+
+ ///
+ /// Select the entire file
+ /// If file are closed the selection will be set to -1
+ ///
+ public void SelectAll()
+ {
+ if (CheckIsOpen(_provider))
+ {
+ SelectionStart = 0;
+ SelectionStop = _provider.Length;
+ }
+ else
+ {
+ SelectionStart = -1;
+ SelectionStop = -1;
+ }
+
+ UpdateSelection();
+ }
+
+ ///
+ /// Get the length of byte are selected (base 1)
+ ///
+ public long SelectionLength => GetSelectionLength(SelectionStart, SelectionStop);
+
+ ///
+ /// Get byte array from current selection
+ ///
+ public byte[] SelectionByteArray
+ {
+ get
+ {
+ using (var ms = new MemoryStream())
+ {
+ CopyToStream(ms, true);
+ return ms.ToArray();
+ }
+ }
+ }
+
+ ///
+ /// Get string from current selection
+ ///
+ public string SelectionString
+ {
+ get
+ {
+ using (var ms = new MemoryStream())
+ {
+ CopyToStream(ms, true);
+ return BytesToString(ms.ToArray());
+ }
+ }
+ }
+
+ ///
+ /// Get Hexadecimal from current selection
+ ///
+ public string SelectionHex
+ {
+ get
+ {
+ using (var ms = new MemoryStream())
+ {
+ CopyToStream(ms, true);
+ return ByteToHex(ms.ToArray());
+ }
+ }
+ }
+
+ private void Control_Unloaded(object sender, RoutedEventArgs e)
+ {
+ //CloseProvider();
+ }
+
+ private void Control_MoveRight(object sender, EventArgs e)
+ {
+ //Prevent infinite loop
+ _setFocusTest = false;
+
+ //Get the new position from SelectionStart down one page
+ var newPosition = GetValidPositionFrom(SelectionStart, 1);
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ {
+ if (newPosition <= _provider.Length)
+ SelectionStop = GetValidPositionFrom(SelectionStop, 1);
+ else
+ SelectionStart = _provider.Length;
+ }
+ else
+ {
+ FixSelectionStartStop();
+
+ if (newPosition < _provider.Length)
+ SelectionStart = SelectionStop = newPosition;
+ }
+
+ if (SelectionStart >= _provider.Length)
+ SelectionStart = _provider.Length - 1;
+
+ if (AllowVisualByteAddress && SelectionStart > VisualByteAdressStop)
+ SelectionStart = VisualByteAdressStop;
+
+ if (SelectionStart > LastVisibleBytePosition)
+ VerticalScrollBar.Value++;
+
+ SetFocusAtSelectionStart();
+ }
+
+ private void Control_MoveLeft(object sender, EventArgs e)
+ {
+ //Prevent infinite loop
+ _setFocusTest = false;
+
+ //Get the new position from SelectionStart down one page
+ var newPosition = GetValidPositionFrom(SelectionStart, -1);
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ SelectionStart = newPosition > -1 ? newPosition : 0;
+ else
+ {
+ FixSelectionStartStop();
+
+ if (newPosition > -1)
+ SelectionStart = SelectionStop = newPosition;
+ }
+
+ if (SelectionStart < 0)
+ SelectionStart = 0;
+
+ if (AllowVisualByteAddress && SelectionStart < VisualByteAdressStart)
+ SelectionStart = VisualByteAdressStart;
+
+ if (SelectionStart < FirstVisibleBytePosition)
+ VerticalScrollBar.Value--;
+
+ SetFocusAtSelectionStart();
+ }
+
+ private void Control_MovePrevious(object sender, EventArgs e)
+ {
+ UpdateByteModified();
+
+ //Call move left event
+ Control_MoveLeft(sender, new EventArgs());
+ }
+
+ private void Control_MoveNext(object sender, EventArgs e)
+ {
+ UpdateByteModified();
+
+ //Call moveright event
+ Control_MoveRight(sender, new EventArgs());
+ }
+
+ #endregion Selection Property/Methods/Event
+
+ #region Copy/Paste/Cut Methods
+
+ ///
+ /// Set or get the default copy to clipboard mode
+ ///
+ public CopyPasteMode DefaultCopyToClipboardMode { get; set; } = CopyPasteMode.HexaString;
+
+ ///
+ /// Paste clipboard string without inserting byte at selection start
+ ///
+ /// Set AllowExpend to true for working
+ private void Paste(bool expendIfneeded)
+ {
+ if (!CheckIsOpen(_provider) || SelectionStart <= -1) return;
+
+ var clipBoardText = Clipboard.GetText();
+ var (success, byteArray) = IsHexaByteStringValue(clipBoardText);
+
+ #region Expend stream if needed
+
+ var pastelength = success ? byteArray.Length : clipBoardText.Length;
+ var needToBeExtent = _provider.Position + pastelength > _provider.Length;
+ var expend = false;
+ if (expendIfneeded && AllowExtend && needToBeExtent)
+ if (AppendNeedConfirmation)
+ {
+ if (MessageBox.Show(FModel.Properties.Resources.PasteExtendByteConfirmationString, ApplicationName,
+ MessageBoxButton.YesNo,
+ MessageBoxImage.Question, MessageBoxResult.Yes) == MessageBoxResult.Yes)
+ expend = true;
+ }
+ else
+ expend = true;
+
+ #endregion
+
+ if (success)
+ _provider.Paste(SelectionStart, byteArray, expend);
+ else
+ _provider.Paste(SelectionStart, clipBoardText, expend);
+
+ SetScrollMarker(SelectionStart, ScrollMarker.ByteModified, FModel.Properties.Resources.PasteFromClipboardString);
+ RefreshView();
+
+ BytesModified?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Fill the selection with a Byte at selection start
+ ///
+ public void FillWithByte(byte val) => FillWithByte(SelectionStart, SelectionLength, val);
+
+ ///
+ /// Fill with a Byte at start position
+ ///
+ public void FillWithByte(long startPosition, long length, byte val)
+ {
+ if (!CheckIsOpen(_provider) || (startPosition <= -1 || length <= 0)) return;
+
+ _provider.FillWithByte(startPosition, length, val);
+ SetScrollMarker(SelectionStart, ScrollMarker.ByteModified, FModel.Properties.Resources.FillSelectionAloneString);
+ RefreshView();
+ }
+
+ ///
+ /// Get all bytes from file or stream opened
+ ///
+ public byte[] GetAllBytes(bool copyChange)
+ {
+ if (!CheckIsOpen(_provider)) return null;
+
+ return _provider.GetAllBytes(copyChange);
+ }
+
+ ///
+ /// Get all bytes from file or stream opened and copy change
+ ///
+ public byte[] GetAllBytes() => GetAllBytes(true);
+
+ ///
+ /// Return true if Copy method could be invoked.
+ ///
+ public bool CanCopy => SelectionLength >= 1 && CheckIsOpen(_provider);
+
+ ///
+ /// Return true if delete method could be invoked.
+ ///
+ public bool CanDelete => CanCopy && !ReadOnlyMode && AllowDeleteByte;
+
+ ///
+ /// Copy to clipboard with default CopyPasteMode.ASCIIString
+ ///
+ public void CopyToClipboard() => CopyToClipboard(DefaultCopyToClipboardMode);
+
+ ///
+ /// Copy to clipboard the current selection with actual change in control
+ ///
+ public void CopyToClipboard(CopyPasteMode copypastemode) => CopyToClipboard(copypastemode, SelectionStart,
+ SelectionStop, true, _tblCharacterTable);
+
+ ///
+ /// Copy to clipboard
+ ///
+ public void CopyToClipboard(CopyPasteMode copypastemode, long selectionStart, long selectionStop,
+ bool copyChange, TblStream tbl)
+ {
+ if (!CanCopy) return;
+ if (!CheckIsOpen(_provider)) return;
+
+ _provider.CopyToClipboard(copypastemode, selectionStart, selectionStop, copyChange, tbl);
+ }
+
+ ///
+ /// Copy selection to a stream
+ ///
+ /// Output stream is not closed after copy
+ public void CopyToStream(Stream output, bool copyChange) =>
+ CopyToStream(output, SelectionStart, SelectionStop, copyChange);
+
+ ///
+ /// Copy selection to a stream
+ ///
+ /// Output stream is not closed after copy
+ public void CopyToStream(Stream output, long selectionStart, long selectionStop, bool copyChange)
+ {
+ if (!CanCopy) return;
+ if (!CheckIsOpen(_provider)) return;
+
+ _provider.CopyToStream(output, selectionStart, selectionStop, copyChange);
+ }
+
+ ///
+ /// Return a byte array with the copy of data defined by selection start/stop
+ ///
+ public byte[] GetCopyData(long selectionStart, long selectionStop, bool copyChange)
+ {
+ if (!CanCopy) return null;
+ if (!CheckIsOpen(_provider)) return null;
+
+ return _provider.GetCopyData(selectionStart, selectionStop, copyChange);
+ }
+
+ ///
+ /// Occurs when data is copied in byteprovider instance
+ ///
+ private void Provider_DataCopied(object sender, EventArgs e) => DataCopied?.Invoke(sender, e);
+
+ #endregion Copy/Paste/Cut Methods
+
+ #region Position methods
+
+ ///
+ /// Set position of cursor
+ ///
+ public void SetPosition(long position, long byteLength)
+ {
+ SelectionStart = position;
+ SelectionStop = position + byteLength - 1;
+
+ VerticalScrollBar.Value = CheckIsOpen(_provider) ? GetLineNumber(position) : 0;
+ }
+
+ ///
+ /// Get the line number of position in parameter
+ ///
+ public long GetLineNumber(long position) => (position - ByteShiftLeft) / BytePerLine;
+
+ ///
+ /// Get the column number of the position
+ ///
+ public int GetColumnNumber(long position) =>
+ AllowVisualByteAddress
+ ? (int)(position - VisualByteAdressStart - ByteShiftLeft) % BytePerLine
+ : (int)(position - ByteShiftLeft) % BytePerLine;
+
+ ///
+ /// Set position in control at position in parameter
+ ///
+ public void SetPosition(long position) => SetPosition(position, 0);
+
+ ///
+ /// Set position in control at position in parameter
+ ///
+ public void SetPosition(string hexLiteralPosition) =>
+ SetPosition(HexLiteralToLong(hexLiteralPosition).position);
+
+ ///
+ /// Set position in control at position in parameter with specified selected length
+ ///
+ public void SetPosition(string hexLiteralPosition, long byteLength) =>
+ SetPosition(HexLiteralToLong(hexLiteralPosition).position, byteLength);
+
+ ///
+ /// Give a next valid position
+ ///
+ /// Start position for compute the correction
+ /// Positive or negative position number to add/substract from position
+ private long GetValidPositionFrom(long position, long positionCorrection)
+ {
+ if (!CheckIsOpen(_provider)) return -1;
+
+ long validPosition = position;
+ long gap = positionCorrection >= 0 ? positionCorrection : -positionCorrection;
+
+ long cnt = 0;
+ for (long i = 0; i < gap; i++)
+ {
+ cnt++;
+
+ if (_provider.CheckIfIsByteModified(position + (positionCorrection > 0 ? cnt : -cnt), ByteAction.Deleted).success)
+ {
+ validPosition += positionCorrection > 0 ? 1 : -1;
+ i--;
+ }
+ else
+ validPosition += positionCorrection > 0 ? 1 : -1;
+ }
+
+ return validPosition >= 0 ? validPosition : -1;
+ }
+
+ #endregion position methods
+
+ #region Visibility property
+
+ ///
+ /// Set or Get value for change visibility of hexadecimal panel
+ ///
+ public Visibility HexDataVisibility
+ {
+ get => (Visibility)GetValue(HexDataVisibilityProperty);
+ set => SetValue(HexDataVisibilityProperty, value);
+ }
+
+ public static readonly DependencyProperty HexDataVisibilityProperty =
+ DependencyProperty.Register("HexDataVisibility", typeof(Visibility), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Visibility.Visible,
+ HexDataVisibility_PropertyChanged,
+ Visibility_CoerceValue));
+
+ private static object Visibility_CoerceValue(DependencyObject d, object baseValue) =>
+ (Visibility)baseValue == Visibility.Hidden ? Visibility.Collapsed : (Visibility)baseValue;
+
+ private static void HexDataVisibility_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ switch ((Visibility)e.NewValue)
+ {
+ case Visibility.Visible:
+ ctrl.HexDataStackPanel.Visibility = Visibility.Visible;
+
+ if (ctrl.HeaderVisibility == Visibility.Visible)
+ ctrl.HexHeaderStackPanel.Visibility = Visibility.Visible;
+ break;
+
+ case Visibility.Collapsed:
+ ctrl.HexDataStackPanel.Visibility = Visibility.Collapsed;
+ ctrl.HexHeaderStackPanel.Visibility = Visibility.Collapsed;
+ break;
+ }
+ }
+
+ ///
+ /// Set or Get value for change visibility of hexadecimal header
+ ///
+ public Visibility HeaderVisibility
+ {
+ get => (Visibility)GetValue(HeaderVisibilityProperty);
+ set => SetValue(HeaderVisibilityProperty, value);
+ }
+
+ public static readonly DependencyProperty HeaderVisibilityProperty =
+ DependencyProperty.Register("HeaderVisibility", typeof(Visibility), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Visibility.Visible,
+ HeaderVisibility_PropertyChanged,
+ Visibility_CoerceValue));
+
+ private static void HeaderVisibility_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ switch ((Visibility)e.NewValue)
+ {
+ case Visibility.Visible:
+ if (ctrl.HexDataVisibility == Visibility.Visible)
+ {
+ ctrl.HexHeaderStackPanel.Visibility = Visibility.Visible;
+ ctrl.TopRectangle.Visibility = Visibility.Visible;
+ }
+ break;
+
+ case Visibility.Collapsed:
+ ctrl.HexHeaderStackPanel.Visibility = Visibility.Collapsed;
+ ctrl.TopRectangle.Visibility = Visibility.Collapsed;
+ break;
+ }
+ }
+
+ ///
+ /// Set or Get value for change visibility of string panel
+ ///
+ public Visibility StringDataVisibility
+ {
+ get => (Visibility)GetValue(StringDataVisibilityProperty);
+ set => SetValue(StringDataVisibilityProperty, value);
+ }
+
+ public static readonly DependencyProperty StringDataVisibilityProperty =
+ DependencyProperty.Register("StringDataVisibility", typeof(Visibility), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Visibility.Visible,
+ StringDataVisibility_ValidateValue,
+ Visibility_CoerceValue));
+
+ private static void StringDataVisibility_ValidateValue(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ switch ((Visibility)e.NewValue)
+ {
+ case Visibility.Visible:
+ ctrl.StringDataStackPanel.Visibility = Visibility.Visible;
+ break;
+ case Visibility.Collapsed:
+ ctrl.StringDataStackPanel.Visibility = Visibility.Collapsed;
+ break;
+ }
+ }
+
+ ///
+ /// Set or Get value for change visibility of status bar
+ ///
+ public Visibility StatusBarVisibility
+ {
+ get => (Visibility)GetValue(StatusBarVisibilityProperty);
+ set => SetValue(StatusBarVisibilityProperty, value);
+ }
+
+ public static readonly DependencyProperty StatusBarVisibilityProperty =
+ DependencyProperty.Register("StatusBarVisibility", typeof(Visibility), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Visibility.Visible,
+ StatusBarVisibility_ValueChange,
+ Visibility_CoerceValue));
+
+ private static void StatusBarVisibility_ValueChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ switch ((Visibility)e.NewValue)
+ {
+ case Visibility.Visible:
+ ctrl.StatusBarGrid.Visibility = Visibility.Visible;
+ ctrl.BottomRectangle.Visibility = Visibility.Visible;
+ break;
+
+ case Visibility.Collapsed:
+ ctrl.StatusBarGrid.Visibility = Visibility.Collapsed;
+ ctrl.BottomRectangle.Visibility = Visibility.Collapsed;
+ break;
+ }
+
+ ctrl.RefreshView(true);
+ }
+
+ #endregion Visibility property
+
+ #region Undo / Redo
+
+ ///
+ /// Clear undo and change
+ ///
+ public void ClearAllChange()
+ {
+ if (!CheckIsOpen(_provider)) return;
+
+ _provider.ClearUndoChange();
+ _provider.ClearRedoChange();
+ }
+
+ ///
+ /// Make undo of last the last bytemodified
+ /// TODO: Fixe when HideByteDeleted
+ ///
+ public void Undo(int repeat = 1)
+ {
+ UnSelectAll();
+
+ if (!CheckIsOpen(_provider)) return;
+
+ for (var i = 0; i < repeat; i++)
+ _provider.Undo();
+
+ RefreshView();
+
+ //Update focus
+ if (UndoStack.Count == 0) return;
+
+ var position = UndoStack.ElementAt(0).BytePositionInStream;
+ if (!IsBytePositionAreVisible(position))
+ SetPosition(position);
+
+ SetFocusAt(position);
+
+ Undone?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Make Redo of the last bytemodified
+ ///
+ public void Redo(int repeat = 1)
+ {
+ UnSelectAll();
+
+ if (!CheckIsOpen(_provider)) return;
+
+ for (var i = 0; i < repeat; i++)
+ _provider.Redo();
+
+ RefreshView();
+
+ //Update focus
+ if (RedoStack.Count == 0) return;
+
+ var position = RedoStack.ElementAt(0).BytePositionInStream;
+ if (!IsBytePositionAreVisible(position))
+ SetPosition(position);
+
+ SetFocusAt(position);
+
+ Redone?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Clear the scroll marker when undone
+ ///
+ /// List of long representing position in file are undone
+ private void Provider_Undone(object sender, EventArgs e)
+ {
+ switch (sender)
+ {
+ case List bytePosition:
+ foreach (var position in bytePosition)
+ ClearScrollMarker(position);
+ break;
+ }
+
+ IsModified = _provider.UndoCount > 0;
+ }
+
+ ///
+ /// Get the undo count
+ ///
+ public long UndoCount => CheckIsOpen(_provider) ? _provider.UndoCount : 0;
+
+ ///
+ /// Get the undo count
+ ///
+ public long RedoCount => CheckIsOpen(_provider) ? _provider.RedoCount : 0;
+
+ ///
+ /// Get the undo stack
+ ///
+ public Stack UndoStack => CheckIsOpen(_provider) ? _provider.UndoStack : null;
+
+ ///
+ /// Get the Redo stack
+ ///
+ public Stack RedoStack => CheckIsOpen(_provider) ? _provider.RedoStack : null;
+
+ #endregion Undo / Redo
+
+ #region Open, Close, Save, byte provider ...
+
+ private void Provider_ChangesSubmited(object sender, EventArgs e)
+ {
+ if (!(sender is ByteProvider bp)) return;
+
+ //Refresh filename
+ var filename = bp.FileName;
+ CloseProvider();
+ FileName = filename;
+
+ ChangesSubmited?.Invoke(this, new EventArgs());
+ }
+
+ private void ProviderStream_ChangesSubmited(object sender, EventArgs e)
+ {
+ //Refresh stream
+ if (!CheckIsOpen(_provider)) return;
+
+ using (var stream = new MemoryStream())
+ {
+ _provider.Position = 0;
+ _provider.Stream.CopyTo(stream);
+
+ CloseProvider();
+ OpenStream(stream);
+ }
+
+ ChangesSubmited?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Set or Get the file with the control will show hex
+ ///
+ public string FileName
+ {
+ get => (string)GetValue(FileNameProperty);
+ set => SetValue(FileNameProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for FileName. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty FileNameProperty =
+ DependencyProperty.Register(nameof(FileName), typeof(string), typeof(HexEditor),
+ new FrameworkPropertyMetadata(string.Empty,
+ FileName_PropertyChanged));
+
+ private static void FileName_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.OpenFile((string)e.NewValue);
+ }
+
+ ///
+ /// Set the MemoryStream are used by ByteProvider
+ ///
+ public MemoryStream Stream
+ {
+ get => (MemoryStream)GetValue(StreamProperty);
+ set => SetValue(StreamProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for Stream. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty StreamProperty =
+ DependencyProperty.Register(nameof(Stream), typeof(MemoryStream), typeof(HexEditor),
+ new FrameworkPropertyMetadata(null,
+ Stream_PropertyChanged));
+
+ private static void Stream_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ ctrl.CloseProvider();
+ ctrl.OpenStream((MemoryStream)e.NewValue);
+ }
+
+ ///
+ /// Get the length of byteprovider are opened in control
+ ///
+ public long Length => CheckIsOpen(_provider) ? _provider.Length : -1;
+
+ ///
+ /// Close file and clear control
+ /// ReadOnlyMode is reset to false
+ ///
+ public void CloseProvider()
+ {
+ if (CheckIsOpen(_provider))
+ {
+ FileName = string.Empty;
+ ReadOnlyMode = false;
+ VerticalScrollBar.Value = 0;
+
+ _provider.Close();
+ }
+
+ UnHighLightAll();
+ ClearAllScrollMarker();
+ UnSelectAll();
+ RefreshView();
+ UpdateHeader(true);
+ UpdateScrollBar();
+
+ //Debug
+ Debug.Print("PROVIDER CLOSED");
+ }
+
+ ///
+ /// Save to the current stream/file
+ ///
+ public void SubmitChanges()
+ {
+ if (!CheckIsOpen(_provider) || _provider.ReadOnlyMode || !IsModified) return;
+
+ _provider.SubmitChanges();
+ }
+
+ ///
+ /// Save as to another file
+ ///
+ public void SubmitChanges(string newfilename, bool overwrite = false)
+ {
+ if (!CheckIsOpen(_provider) || _provider.ReadOnlyMode) return;
+
+ _provider.SubmitChanges(newfilename, overwrite);
+ }
+
+ ///
+ /// Open file name
+ ///
+ ///
+ private void OpenFile(string filename)
+ {
+ if (string.IsNullOrEmpty(FileName))
+ {
+ CloseProvider();
+ return;
+ }
+
+ if (File.Exists(filename))
+ {
+ CloseProvider();
+
+ _provider = new ByteProvider(filename);
+
+ if (_provider.IsEmpty)
+ {
+ CloseProvider();
+ return;
+ }
+
+ _provider.ReadOnlyChanged += Provider_ReadOnlyChanged;
+ _provider.DataCopiedToClipboard += Provider_DataCopied;
+ _provider.ChangesSubmited += Provider_ChangesSubmited;
+ _provider.Undone += Provider_Undone;
+ _provider.LongProcessChanged += Provider_LongProcessProgressChanged;
+ _provider.LongProcessStarted += Provider_LongProcessProgressStarted;
+ _provider.LongProcessCompleted += Provider_LongProcessProgressCompleted;
+ _provider.LongProcessCanceled += Provider_LongProcessProgressCompleted;
+ _provider.FillWithByteCompleted += Provider_FillWithByteCompleted;
+ _provider.ReplaceByteCompleted += Provider_ReplaceByteCompleted;
+ _provider.BytesAppendCompleted += Provider_BytesAppendCompleted;
+
+ UpdateScrollBar();
+ UpdateHeader();
+
+ //Load file with ASCII character table;
+ var previousTable = TypeOfCharacterTable;
+ TypeOfCharacterTable = CharacterTableType.Ascii;
+
+ ////TEMPS : CUSTOMBACKGROUNDBLOCK (CBB) /////////
+ ////TODO: Add autodetect file type and create external CBB...
+ //if (UseCustomBackGroudBlock)
+ // _cbbList = new ExeFile().GetCustomBackgroundBlock(_provider);
+ /////////////////////////////////////////////////
+
+ RefreshView(true);
+
+ //Replace previous character table
+ TypeOfCharacterTable = previousTable;
+
+ UnSelectAll();
+
+ UpdateTblBookMark();
+ UpdateSelectionColor(FirstColor.HexByteData);
+
+ //Update count of byte on file open
+ UpdateByteCount();
+
+ //Debug
+ Debug.Print("FILE OPENED");
+ }
+ else
+ throw new FileNotFoundException();
+ }
+
+ ///
+ /// Open file name
+ ///
+ private void OpenStream(MemoryStream stream)
+ {
+ if (!stream.CanRead) return;
+
+ CloseProvider();
+
+ _provider = new ByteProvider(stream);
+
+ if (_provider.IsEmpty)
+ {
+ CloseProvider();
+ return;
+ }
+
+ _provider.ReadOnlyChanged += Provider_ReadOnlyChanged;
+ _provider.DataCopiedToClipboard += Provider_DataCopied;
+ _provider.ChangesSubmited += ProviderStream_ChangesSubmited;
+ _provider.Undone += Provider_Undone;
+ _provider.LongProcessChanged += Provider_LongProcessProgressChanged;
+ _provider.LongProcessStarted += Provider_LongProcessProgressStarted;
+ _provider.LongProcessCompleted += Provider_LongProcessProgressCompleted;
+ _provider.LongProcessCanceled += Provider_LongProcessProgressCompleted;
+ _provider.FillWithByteCompleted += Provider_FillWithByteCompleted;
+ _provider.ReplaceByteCompleted += Provider_ReplaceByteCompleted;
+ _provider.BytesAppendCompleted += Provider_BytesAppendCompleted;
+
+ UpdateScrollBar();
+ UpdateHeader();
+
+ RefreshView(true);
+
+ UnSelectAll();
+
+ UpdateTblBookMark();
+ UpdateSelectionColor(FirstColor.HexByteData);
+
+ //Update count of byte
+ UpdateByteCount();
+
+ //Debug
+ Debug.Print("STREAM OPENED");
+ }
+
+ private void Provider_LongProcessProgressCompleted(object sender, EventArgs e)
+ {
+ LongProgressProgressBar.Visibility = Visibility.Collapsed;
+ CancelLongProcessButton.Visibility = Visibility.Collapsed;
+
+ #region Enable controls
+
+ TraverseHexBytes(ctrl => ctrl.IsEnabled = true);
+ TraverseStringBytes(ctrl => ctrl.IsEnabled = true);
+ TraverseLineInfo(ctrl => ctrl.IsEnabled = true);
+ TraverseHexHeader(ctrl => ctrl.IsEnabled = true);
+ TopRectangle.IsEnabled = BottomRectangle.IsEnabled = true;
+ VerticalScrollBar.IsEnabled = true;
+
+ #endregion
+
+ LongProcessProgressCompleted?.Invoke(this, new EventArgs());
+ }
+
+ private void Provider_LongProcessProgressStarted(object sender, EventArgs e)
+ {
+ LongProgressProgressBar.Visibility = Visibility.Visible;
+ CancelLongProcessButton.Visibility = Visibility.Visible;
+
+ #region Disable controls
+
+ TraverseHexBytes(ctrl => ctrl.IsEnabled = false);
+ TraverseStringBytes(ctrl => ctrl.IsEnabled = false);
+ TraverseLineInfo(ctrl => ctrl.IsEnabled = false);
+ TraverseHexHeader(ctrl => ctrl.IsEnabled = false);
+ TopRectangle.IsEnabled = BottomRectangle.IsEnabled = false;
+ VerticalScrollBar.IsEnabled = false;
+
+ #endregion
+
+ LongProcessProgressStarted?.Invoke(this, new EventArgs());
+ }
+
+ private void Provider_LongProcessProgressChanged(object sender, EventArgs e)
+ {
+ //Update progress bar
+ LongProgressProgressBar.Value = (double)sender;
+ Application.Current.DoEvents();
+
+ LongProcessProgressChanged?.Invoke(this, new EventArgs());
+ }
+
+ ///
+ /// Update scrollbar when append are completed
+ ///
+ private void Provider_BytesAppendCompleted(object sender, EventArgs e) =>
+ VerticalScrollBar.Maximum = MaxLine - 1;
+
+ private void Provider_ReplaceByteCompleted(object sender, EventArgs e) =>
+ ReplaceByteCompleted?.Invoke(this, new EventArgs());
+
+ private void Provider_FillWithByteCompleted(object sender, EventArgs e) =>
+ FillWithByteCompleted?.Invoke(this, new EventArgs());
+
+ private void CancelLongProcessButton_Click(object sender, RoutedEventArgs e)
+ {
+ if (!CheckIsOpen(_provider)) return;
+
+ _provider.IsOnLongProcess = false;
+ }
+
+ ///
+ /// Check if byteprovider is on long progress and update control
+ ///
+ private void CheckProviderIsOnProgress()
+ {
+ if (CheckIsOpen(_provider))
+ {
+ if (_provider.IsOnLongProcess) return;
+ CancelLongProcessButton.Visibility = Visibility.Collapsed;
+ LongProgressProgressBar.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ CancelLongProcessButton.Visibility = Visibility.Collapsed;
+ LongProgressProgressBar.Visibility = Visibility.Collapsed;
+ }
+ }
+
+ #endregion Open, Close, Save, byte provider ...
+
+ #region Easy powerful traverses methods
+
+ ///
+ /// Used to make action on all visible hexbyte
+ ///
+ private void TraverseHexBytes(Action act, ref bool exit, bool force = false)
+ {
+ var visibleLine = MaxVisibleLine;
+ var cnt = 0;
+
+ //HexByte panel
+ foreach (StackPanel hexDataStack in HexDataStackPanel.Children)
+ {
+ if (cnt++ == visibleLine && !force) break;
+
+ foreach (var ctrl in hexDataStack.Children)
+ if (ctrl is HexByte hexCtrl)
+ act(hexCtrl);
+
+ if (exit) return;
+ }
+ }
+
+ ///
+ /// Used to make action on all visible hexbyte
+ ///
+ private void TraverseHexBytes(Action act)
+ {
+ var exit = false;
+ TraverseHexBytes(act, ref exit);
+ }
+
+ ///
+ /// Used to make action on all visible stringbyte
+ ///
+ private void TraverseStringBytes(Action act, ref bool exit, bool force = false)
+ {
+ var visibleLine = MaxVisibleLine;
+ var cnt = 0;
+
+ //Stringbyte panel
+ foreach (StackPanel stringDataStack in StringDataStackPanel.Children)
+ {
+ if (cnt++ == visibleLine && !force)
+ break;
+
+ foreach (var ctrl in stringDataStack.Children)
+ if (ctrl is StringByte sbControl)
+ act(sbControl);
+
+ if (exit) return;
+ }
+ }
+
+ ///
+ /// Used to make action on all visible stringbyte
+ ///
+ private void TraverseStringBytes(Action act)
+ {
+ var exit = false;
+ TraverseStringBytes(act, ref exit);
+ }
+
+ ///
+ /// Used to make action on all visible hexbyte and stringbyte.
+ ///
+ private void TraverseHexAndStringBytes(Action act, ref bool exit, bool force = false)
+ {
+ TraverseStringBytes(act, ref exit, force);
+ TraverseHexBytes(act, ref exit, force);
+ }
+
+ ///
+ /// Used to make action on all visible hexbyte and stringbyte.
+ ///
+ private void TraverseHexAndStringBytes(Action act, bool force = false)
+ {
+ var exit = false;
+ TraverseHexAndStringBytes(act, ref exit, force);
+ }
+
+ ///
+ /// Used to make action on all visible lineinfos
+ ///
+ private void TraverseLineInfo(Action act)
+ {
+ var visibleLine = MaxVisibleLine;
+ var cnt = 0;
+
+ //lines infos panel
+ foreach (var ctrl in LinesInfoStackPanel.Children)
+ {
+ if (cnt++ == visibleLine) break;
+
+ if (ctrl is FastTextLine lineInfo)
+ act(lineInfo);
+ }
+ }
+
+ ///
+ /// Used to make action on all visible header
+ ///
+ private void TraverseHexHeader(Action act)
+ {
+ var visibleLine = MaxVisibleLine;
+ var cnt = 0;
+
+ //header panel
+ foreach (var ctrl in HexHeaderStackPanel.Children)
+ {
+ if (cnt++ == visibleLine) break;
+
+ if (ctrl is FastTextLine column)
+ act(column);
+ }
+ }
+
+ ///
+ /// Used to make action on ScrollMarker
+ ///
+ private void TraverseScrollMarker(Action act, ref bool exit)
+ {
+ for (var i = MarkerGrid.Children.Count - 1; i >= 0; i--)
+ {
+ if (MarkerGrid.Children[i] is Rectangle rect)
+ act(rect);
+
+ if (exit) return;
+ }
+ }
+
+ ///
+ /// Used to make action on ScrollMarker
+ ///
+ private void TraverseScrollMarker(Action act)
+ {
+ var exit = false;
+ TraverseScrollMarker(act, ref exit);
+ }
+
+ #endregion Traverse methods
+
+ #region BytePerLine property/methods
+
+ ///
+ /// Get or set the number of byte are show in control
+ ///
+ public int BytePerLine
+ {
+ get => (int)GetValue(BytePerLineProperty);
+ set => SetValue(BytePerLineProperty, value);
+ }
+
+ public static readonly DependencyProperty BytePerLineProperty =
+ DependencyProperty.Register("BytePerLine", typeof(int), typeof(HexEditor),
+ new FrameworkPropertyMetadata(24, BytePerLine_PropertyChanged,
+ BytePerLine_CoerceValue));
+
+ private static object BytePerLine_CoerceValue(DependencyObject d, object baseValue) =>
+ (int)baseValue < 1 ? 1 : ((int)baseValue > 64 ? 64 : baseValue);
+
+ private static void BytePerLine_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ //Get previous state
+ var firstPos = ctrl.FirstVisibleBytePosition;
+ var startPos = ctrl.SelectionStart;
+ var stopPos = ctrl.SelectionStop;
+
+ //refresh
+ ctrl.UpdateScrollBar();
+ ctrl.BuildDataLines(ctrl.MaxVisibleLine, true);
+ ctrl.RefreshView(true);
+ ctrl.UpdateHeader(true);
+
+ //Set previous state
+ ctrl.SetPosition(firstPos);
+ ctrl.SelectionStart = startPos;
+ ctrl.SelectionStop = stopPos;
+ }
+
+ #endregion
+
+ #region vertical scrollbar property/methods
+
+ ///
+ /// Vertical scrollbar large change on click
+ ///
+ public double ScrollLargeChange
+ {
+ get => _scrollLargeChange;
+ set
+ {
+ _scrollLargeChange = value;
+ UpdateScrollBar();
+ }
+ }
+
+ private void VerticalScrollBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) =>
+ RefreshView(true);
+
+ ///
+ /// Update vertical scrollbar with file info
+ ///
+ private void UpdateScrollBar()
+ {
+ VerticalScrollBar.Visibility = Visibility.Collapsed;
+
+ if (CheckIsOpen(_provider))
+ {
+ VerticalScrollBar.Visibility = Visibility.Visible;
+ VerticalScrollBar.SmallChange = 1;
+ VerticalScrollBar.LargeChange = ScrollLargeChange;
+ VerticalScrollBar.Maximum = MaxLine - MaxVisibleLine + 1;
+ }
+ }
+ #endregion
+
+ #region General update methods / Refresh view
+
+ private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
+ {
+ if (e.HeightChanged) RefreshView(true);
+ }
+
+ ///
+ /// Clear all IByteControl in hexeditor
+ ///
+ /// Set to true for clear all byte visible (set by MaxVisibleLine) or not visible in control.
+ private void ClearAllBytes(bool force = false) => TraverseHexAndStringBytes(ctrl => { ctrl.Clear(); }, force);
+
+ ///
+ /// Clear all lines offset...
+ ///
+ private void ClearLineInfo() => TraverseLineInfo(ctrl => { ctrl.Tag = ctrl.Text = string.Empty; });
+
+ ///
+ /// Refresh currentview of hexeditor
+ ///
+ public void RefreshView(bool controlResize = false, bool refreshData = true)
+ {
+#if DEBUG
+ var watch = new Stopwatch();
+ watch.Start();
+#endif
+ UpdateLinesInfo();
+
+ if (refreshData)
+ UpdateViewers(controlResize);
+
+ //Update visual of byte control
+ UpdateByteModified();
+ UpdateSelection();
+ UpdateHighLight();
+ UpdateStatusBar();
+ UpdateVisual();
+ UpdateFocus();
+
+ CheckProviderIsOnProgress();
+
+ if (controlResize)
+ {
+ UpdateScrollMarkerPosition();
+ UpdateHeader(true);
+ }
+
+#if DEBUG
+ watch.Stop();
+ Debug.Print($"REFRESH TIME: {watch.Elapsed.Milliseconds} ms");
+#endif
+ }
+
+ ///
+ /// Update the selection of byte in hexadecimal panel
+ ///
+ private void UpdateSelectionColor(FirstColor coloring)
+ {
+ switch (coloring)
+ {
+ case FirstColor.HexByteData:
+ TraverseHexBytes(ctrl => { ctrl.FirstSelected = true; });
+ TraverseStringBytes(ctrl => { ctrl.FirstSelected = false; });
+ _firstColor = FirstColor.HexByteData;
+ break;
+ case FirstColor.StringByteData:
+ TraverseHexBytes(ctrl => { ctrl.FirstSelected = false; });
+ TraverseStringBytes(ctrl => { ctrl.FirstSelected = true; });
+ _firstColor = FirstColor.StringByteData;
+ break;
+ }
+ }
+
+ ///
+ /// Build the StringByte and HexByte control used byte hexeditor
+ ///
+ /// Number of line to build
+ /// Rebuild data line
+ private void BuildDataLines(int maxline, bool rebuild = false)
+ {
+ var reAttachEvents = false;
+
+ if (rebuild)
+ {
+ reAttachEvents = true;
+
+ StringDataStackPanel.Children.Clear();
+ HexDataStackPanel.Children.Clear();
+ }
+
+ for (var lineIndex = StringDataStackPanel.Children.Count; lineIndex < maxline; lineIndex++)
+ {
+ #region Build StringByte
+
+ var dataLineStack = new StackPanel
+ {
+ Height = LineHeight,
+ Orientation = Orientation.Horizontal
+ };
+
+ for (var i = 0; i < BytePerLine; i++)
+ {
+ if (_tblCharacterTable == null && (ByteSpacerPositioning == ByteSpacerPosition.Both ||
+ ByteSpacerPositioning == ByteSpacerPosition.StringBytePanel))
+ AddByteSpacer(dataLineStack, i);
+
+ var sbCtrl = new StringByte(this);
+ sbCtrl.Clear();
+
+ dataLineStack.Children.Add(sbCtrl);
+ }
+ StringDataStackPanel.Children.Add(dataLineStack);
+
+ #endregion
+
+ #region Build HexByte
+
+ var hexaDataLineStack = new StackPanel
+ {
+ Height = LineHeight,
+ Orientation = Orientation.Horizontal
+ };
+
+ for (var i = 0; i < BytePerLine; i++)
+ {
+ if (ByteSpacerPositioning == ByteSpacerPosition.Both ||
+ ByteSpacerPositioning == ByteSpacerPosition.HexBytePanel)
+ AddByteSpacer(hexaDataLineStack, i);
+
+ var byteControl = new HexByte(this);
+ byteControl.Clear();
+
+ hexaDataLineStack.Children.Add(byteControl);
+ }
+
+ HexDataStackPanel.Children.Add(hexaDataLineStack);
+
+ #endregion
+
+ reAttachEvents = true;
+ }
+
+ #region Attach/detach events to each IByteControl
+
+ if (reAttachEvents)
+ TraverseHexAndStringBytes(ctrl =>
+ {
+ #region Detach events
+
+ ctrl.ByteModified -= Control_ByteModified;
+ ctrl.MoveNext -= Control_MoveNext;
+ ctrl.MovePrevious -= Control_MovePrevious;
+ ctrl.MouseSelection -= Control_MouseSelection;
+ ctrl.Click -= Control_Click;
+ ctrl.DoubleClick -= Control_DoubleClick;
+ ctrl.RightClick -= Control_RightClick;
+ ctrl.MoveUp -= Control_MoveUp;
+ ctrl.MoveDown -= Control_MoveDown;
+ ctrl.MoveLeft -= Control_MoveLeft;
+ ctrl.MoveRight -= Control_MoveRight;
+ ctrl.MovePageDown -= Control_MovePageDown;
+ ctrl.MovePageUp -= Control_MovePageUp;
+ ctrl.ByteDeleted -= Control_ByteDeleted;
+ ctrl.EscapeKey -= Control_EscapeKey;
+ ctrl.CtrlaKey -= Control_CTRLAKey;
+ ctrl.CtrlzKey -= Control_CTRLZKey;
+ ctrl.CtrlcKey -= Control_CTRLCKey;
+ ctrl.CtrlvKey -= Control_CTRLVKey;
+ ctrl.CtrlyKey -= Control_CTRLYKey;
+
+ #endregion
+
+ #region Attach events
+
+ ctrl.ByteModified += Control_ByteModified;
+ ctrl.MoveNext += Control_MoveNext;
+ ctrl.MovePrevious += Control_MovePrevious;
+ ctrl.MouseSelection += Control_MouseSelection;
+ ctrl.Click += Control_Click;
+ ctrl.DoubleClick += Control_DoubleClick;
+ ctrl.RightClick += Control_RightClick;
+ ctrl.MoveUp += Control_MoveUp;
+ ctrl.MoveDown += Control_MoveDown;
+ ctrl.MoveLeft += Control_MoveLeft;
+ ctrl.MoveRight += Control_MoveRight;
+ ctrl.MovePageDown += Control_MovePageDown;
+ ctrl.MovePageUp += Control_MovePageUp;
+ ctrl.ByteDeleted += Control_ByteDeleted;
+ ctrl.EscapeKey += Control_EscapeKey;
+ ctrl.CtrlaKey += Control_CTRLAKey;
+ ctrl.CtrlzKey += Control_CTRLZKey;
+ ctrl.CtrlcKey += Control_CTRLCKey;
+ ctrl.CtrlvKey += Control_CTRLVKey;
+ ctrl.CtrlyKey += Control_CTRLYKey;
+
+ #endregion
+
+ });
+
+ #endregion
+ }
+
+ ///
+ /// Update the data and string panels to current view.
+ /// Only load what is needed in the view
+ ///
+ private void UpdateViewers(bool controlResize)
+ {
+ var curLevel = ++_priLevel;
+ if (CheckIsOpen(_provider))
+ {
+ var bufferlength = MaxVisibleLine * BytePerLine + 1 + ByteShiftLeft;
+
+ #region Build the buffer lenght if needed
+
+ if (controlResize)
+ {
+ if (_viewBuffer != null)
+ {
+ if (_viewBuffer.Length < bufferlength)
+ {
+ BuildDataLines(MaxVisibleLine);
+ _viewBuffer = new byte[bufferlength];
+ _viewBufferBytePosition = new long[bufferlength];
+ }
+ }
+ else
+ {
+ _viewBuffer = new byte[bufferlength];
+ _viewBufferBytePosition = new long[bufferlength];
+ BuildDataLines(MaxVisibleLine);
+ }
+ }
+ #endregion
+
+ if (LinesInfoStackPanel.Children.Count == 0) return;
+
+ var startPosition = FirstVisibleBytePosition;
+
+ if (AllowVisualByteAddress && startPosition < VisualByteAdressStart)
+ startPosition = VisualByteAdressStart;
+
+ #region read the data from the provider and warns if necessary to load the bytes that have been deleted
+ _provider.Position = startPosition;
+ var readSize = 0;
+ if (HideByteDeleted)
+ for (int i = 0; i < _viewBuffer.Count(); i++)
+ {
+ if (!_provider.CheckIfIsByteModified(_provider.Position, ByteAction.Deleted).success)
+ {
+ if (!_provider.Eof)
+ {
+ _viewBuffer[readSize] = (byte)_provider.ReadByte();
+ _viewBufferBytePosition[readSize] = _provider.Position - 1;
+ readSize++;
+ }
+ }
+ else
+ {
+ _viewBufferBytePosition[readSize] = -1;
+ _provider.Position++;
+ i--;
+ }
+ }
+ else
+ {
+ readSize = _provider.Read(_viewBuffer, 0, bufferlength <= _viewBuffer.Count()
+ ? bufferlength
+ : _viewBuffer.Count());
+ }
+ #endregion
+
+ var index = 0;
+
+ #region HexByte panel refresh
+
+ TraverseHexBytes(ctrl =>
+ {
+ ctrl.Action = ByteAction.Nothing;
+ ctrl.ReadOnlyMode = ReadOnlyMode;
+
+ ctrl.InternalChange = true;
+
+ var nextPos = startPosition + index;
+
+ //Prevent load if byte are deleted from file
+ if (HideByteDeleted)
+ while (_provider.CheckIfIsByteModified(nextPos, ByteAction.Deleted).success)
+ nextPos++;
+
+ if (index < readSize && _priLevel == curLevel)
+ {
+ ctrl.Byte = _viewBuffer[index];
+ ctrl.BytePositionInStream = !HideByteDeleted ? nextPos : _viewBufferBytePosition[index];
+
+ if (AllowVisualByteAddress && nextPos > VisualByteAdressStop)
+ ctrl.Clear();
+ }
+ else
+ ctrl.Clear();
+
+ ctrl.InternalChange = false;
+ index++;
+ });
+
+ #endregion
+
+ index = 0;
+
+ #region StringByte panel refresh
+
+ TraverseStringBytes(ctrl =>
+ {
+ ctrl.Action = ByteAction.Nothing;
+ ctrl.ReadOnlyMode = ReadOnlyMode;
+
+ ctrl.InternalChange = true;
+ ctrl.TblCharacterTable = _tblCharacterTable;
+ ctrl.TypeOfCharacterTable = TypeOfCharacterTable;
+
+ var nextPos = startPosition + index;
+
+ //Prevent load if byte are deleted from file
+ if (HideByteDeleted)
+ while (_provider.CheckIfIsByteModified(nextPos, ByteAction.Deleted).success)
+ nextPos++;
+
+ if (index < readSize)
+ {
+ ctrl.Byte = _viewBuffer[index];
+ ctrl.BytePositionInStream = !HideByteDeleted ? nextPos : _viewBufferBytePosition[index];
+
+ ctrl.ByteNext = index < readSize - 1 ? (byte?)_viewBuffer[index + 1] : null;
+
+ if (AllowVisualByteAddress && nextPos > VisualByteAdressStop)
+ ctrl.Clear();
+ }
+ else
+ ctrl.Clear();
+
+ ctrl.InternalChange = false;
+ index++;
+ });
+
+ #endregion
+ }
+ else
+ {
+ #region Clear IByteControl
+
+ _viewBuffer = null;
+ ClearAllBytes();
+
+ #endregion
+ }
+ }
+
+ ///
+ /// Update byte are modified
+ ///
+ private void UpdateByteModified()
+ {
+ if (!CheckIsOpen(_provider)) return;
+
+ var modifiedBytesDictionary =
+ _provider.GetByteModifieds(ByteAction.All);
+
+ TraverseHexAndStringBytes(ctrl =>
+ {
+ if (!modifiedBytesDictionary.TryGetValue(ctrl.BytePositionInStream, out var byteModified)) return;
+
+ ctrl.InternalChange = true;
+ ctrl.Byte = byteModified.Byte;
+
+ if (byteModified.Action == ByteAction.Modified || byteModified.Action == ByteAction.Deleted)
+ ctrl.Action = byteModified.Action;
+
+ ctrl.InternalChange = false;
+ });
+
+ IsModified = _provider.UndoCount > 0;
+ }
+
+ ///
+ /// Update the selection of byte
+ ///
+ private void UpdateSelection()
+ {
+ var minSelect = SelectionStart <= SelectionStop ? SelectionStart : SelectionStop;
+ var maxSelect = SelectionStart <= SelectionStop ? SelectionStop : SelectionStart;
+
+ TraverseHexAndStringBytes(ctrl =>
+ {
+ ctrl.IsSelected = ctrl.BytePositionInStream >= minSelect &&
+ ctrl.BytePositionInStream <= maxSelect &&
+ ctrl.BytePositionInStream != -1
+ ? ctrl.Action != ByteAction.Deleted
+ : false;
+ });
+ }
+ ///
+ /// Update de SelectionLine property
+ ///
+ private void UpdateSelectionLine() =>
+ SelectionLine = CheckIsOpen(_provider)
+ ? GetLineNumber(SelectionStart)
+ : 0;
+
+
+ ///
+ /// Update bytes as marked on findall()
+ ///
+ private void UpdateHighLight()
+ {
+ if (_markedPositionList.Count > 0)
+ TraverseHexAndStringBytes(ctrl => ctrl.IsHighLight = _markedPositionList.ContainsKey(ctrl.BytePositionInStream));
+ else //Un highlight all
+ TraverseHexAndStringBytes(ctrl => ctrl.IsHighLight = false);
+ }
+
+ ///
+ /// Update the position info panel at left of the control
+ ///
+ private void UpdateHeader(bool clear = false)
+ {
+ //Clear before refresh
+ if (clear) HexHeaderStackPanel.Children.Clear();
+
+ if (!CheckIsOpen(_provider)) return;
+
+ for (var i = HexHeaderStackPanel.Children.Count; i < BytePerLine; i++)
+ {
+ if (ByteSpacerPositioning == ByteSpacerPosition.Both ||
+ ByteSpacerPositioning == ByteSpacerPosition.HexBytePanel)
+ AddByteSpacer(HexHeaderStackPanel, i, true);
+
+ var hlHeader = HighLightSelectionStart &&
+ GetColumnNumber(SelectionStart) == i &&
+ SelectionStart > -1;
+
+ //Create control
+ var headerLabel = new FastTextLine(this)
+ {
+ Height = LineHeight,
+ AutoWidth = false,
+ FontWeight = hlHeader && !HideByteDeleted ? FontWeights.Bold : FontWeights.Normal,
+ Foreground = hlHeader && !HideByteDeleted ? ForegroundHighLightOffSetHeaderColor : ForegroundOffSetHeaderColor,
+ RenderPoint = new Point(2, 2),
+ };
+
+ #region Set text visual of header
+
+ switch (DataStringVisual)
+ {
+ case DataVisualType.Hexadecimal:
+ headerLabel.Text = ByteToHex((byte)i);
+ headerLabel.Width = 20;
+ break;
+ case DataVisualType.Decimal:
+ headerLabel.Text = i.ToString("d3");
+ headerLabel.Width = 25;
+ break;
+ }
+
+ #endregion
+
+ //Add to stackpanel
+ HexHeaderStackPanel.Children.Add(headerLabel);
+ }
+ }
+
+ ///
+ /// Update the position info panel at left of the control
+ ///
+ private void UpdateLinesInfo()
+ {
+ var maxVisibleLine = MaxVisibleLine;
+
+ #region If the lines are less than "visible lines" create them
+
+ var linesCount = LinesInfoStackPanel.Children.Count;
+
+ if (linesCount < maxVisibleLine)
+ {
+ for (var i = 0; i < maxVisibleLine - linesCount; i++)
+ {
+ var lineInfoLabel = new FastTextLine(this)
+ {
+ Height = LineHeight,
+ Foreground = ForegroundOffSetHeaderColor,
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Center,
+ RenderPoint = new Point(2, 2)
+ };
+
+ //Events
+ lineInfoLabel.MouseDown += LinesOffSetLabel_MouseDown;
+ lineInfoLabel.MouseMove += LinesOffSetLabel_MouseMove;
+
+ LinesInfoStackPanel.Children.Add(lineInfoLabel);
+ }
+ }
+
+ #endregion
+
+ ClearLineInfo();
+
+ if (!CheckIsOpen(_provider)) return;
+
+ long firstByteInLine = FirstVisibleBytePosition;
+ long actualPosition = 0;
+
+ for (var i = 0; i < maxVisibleLine; i++)
+ {
+ var lineOffsetLabel = (FastTextLine)LinesInfoStackPanel.Children[i];
+
+ if (i > 0) firstByteInLine += BytePerLine;
+
+ #region Set text visual
+ if (!HideByteDeleted &&
+ HighLightSelectionStart &&
+ SelectionStart > -1 &&
+ SelectionStart >= firstByteInLine &&
+ SelectionStart <= firstByteInLine + BytePerLine - 1)
+ {
+ lineOffsetLabel.FontWeight = FontWeights.Bold;
+ lineOffsetLabel.Foreground = ForegroundHighLightOffSetHeaderColor;
+ lineOffsetLabel.ToolTip = $"{FModel.Properties.Resources.FirstByteString} : {SelectionStart}";
+ lineOffsetLabel.Tag = $"0x{LongToHex(SelectionStart).ToUpper()}";
+ actualPosition = SelectionStart;
+ }
+ else
+ {
+ lineOffsetLabel.FontWeight = FontWeights.Normal;
+ lineOffsetLabel.Foreground = ForegroundOffSetHeaderColor;
+ lineOffsetLabel.ToolTip = $"{FModel.Properties.Resources.FirstByteString} : {firstByteInLine}";
+ lineOffsetLabel.Tag = $"0x{LongToHex(firstByteInLine).ToUpper()}";
+ actualPosition = firstByteInLine;
+ }
+
+ //update the visual
+ switch (OffSetStringVisual)
+ {
+ case DataVisualType.Hexadecimal:
+ #region Hexadecimal
+ switch (OffSetPanelVisual)
+ {
+ case OffSetPanelType.OffsetOnly:
+ lineOffsetLabel.Text = $"0x{LongToHex(actualPosition, OffSetPanelFixedWidthVisual).ToUpper()}";
+ break;
+ case OffSetPanelType.LineOnly:
+ lineOffsetLabel.Text = $"ln {LongToHex(GetLineNumber(actualPosition), OffSetPanelFixedWidthVisual).ToUpper()}";
+ break;
+ case OffSetPanelType.Both:
+ lineOffsetLabel.Text = $"ln {LongToHex(GetLineNumber(actualPosition), OffSetPanelFixedWidthVisual)} 0x{LongToHex(actualPosition, OffSetPanelFixedWidthVisual).ToUpper()}";
+ break;
+ }
+ #endregion
+ break;
+ case DataVisualType.Decimal:
+
+ var format = OffSetPanelFixedWidthVisual == OffSetPanelFixedWidth.Dynamic ? "G" : "D8";
+
+ #region Decimal
+ switch (OffSetPanelVisual)
+ {
+ case OffSetPanelType.OffsetOnly:
+ lineOffsetLabel.Text = $"d{actualPosition.ToString(format)}";
+ break;
+ case OffSetPanelType.LineOnly:
+ lineOffsetLabel.Text = $"ln {GetLineNumber(actualPosition).ToString(format)}";
+ break;
+ case OffSetPanelType.Both:
+ lineOffsetLabel.Text = $"ln {GetLineNumber(actualPosition).ToString(format)} d{actualPosition.ToString(format)}";
+ break;
+ }
+ #endregion
+ break;
+ }
+
+ if (AllowVisualByteAddress && firstByteInLine > VisualByteAdressStop)
+ lineOffsetLabel.Tag = lineOffsetLabel.Text = string.Empty;
+
+ #endregion
+ }
+ }
+ #endregion Update view
+
+ #region First/Last visible byte methods
+ ///
+ /// Get first visible byte position in control
+ /// TODO: fix the first visible byte when HideByteDeleted are activated... 90% completed
+ ///
+ private long FirstVisibleBytePosition
+ {
+ get
+ {
+ //compute the cibled position for the first visible byte position
+ long cibledPosition = AllowVisualByteAddress
+ ? ((long)VerticalScrollBar.Value) * BytePerLine + ByteShiftLeft + VisualByteAdressStart
+ : ((long)VerticalScrollBar.Value) * BytePerLine + ByteShiftLeft;
+
+ if (HideByteDeleted)
+ //Count the byte are deleted before the cibled position
+ return cibledPosition +
+ (CheckIsOpen(_provider)
+ ? _provider.GetByteModifieds(ByteAction.Deleted).Count(b => b.Value.BytePositionInStream < cibledPosition)
+ : 0);
+ else
+ return cibledPosition;
+ }
+ }
+
+ ///
+ /// Return True if SelectionStart are visible in control
+ ///
+ public bool SelectionStartIsVisible => IsBytePositionAreVisible(SelectionStart);
+
+ public bool IsBytePositionAreVisible(long bytePosition) =>
+ bytePosition >= FirstVisibleBytePosition && bytePosition <= LastVisibleBytePosition;
+
+ ///
+ /// Get last visible byte position in control
+ ///
+ private long LastVisibleBytePosition
+ {
+ get
+ {
+ long lastByte = 0;
+
+ TraverseHexBytes(ctrl => { lastByte = ctrl.BytePositionInStream; });
+
+ return lastByte;
+ }
+ }
+ #endregion First/Last visible byte methods
+
+ #region Focus Methods
+
+ ///
+ /// Prevent infinite loop on SetFocusHexDataPanel and SetFocusStringDataPanel
+ ///
+ bool _setFocusTest = false;
+
+ ///
+ /// Update the focus to selection start
+ ///
+ public void UpdateFocus()
+ {
+ if (SelectionStartIsVisible)
+ SetFocusAtSelectionStart();
+ else
+ Focus();
+ }
+
+ ///
+ /// Set the focus to the selection start
+ ///
+ public void SetFocusAtSelectionStart() => SetFocusAt(SelectionStart);
+
+ ///
+ /// Set the focus to the bytePosition
+ ///
+ public void SetFocusAt(long bytePosition)
+ {
+ switch (_firstColor)
+ {
+ case FirstColor.HexByteData:
+ SetFocusHexDataPanel(bytePosition);
+ break;
+ case FirstColor.StringByteData:
+ SetFocusStringDataPanel(bytePosition);
+ break;
+ }
+ }
+
+ ///
+ /// Set focus on byte in the hex panel
+ ///
+ private void SetFocusHexDataPanel(long bytePositionInStream)
+ {
+ if (!CheckIsOpen(_provider)) return;
+ if (bytePositionInStream >= _provider.Length) return;
+
+ var rtn = false;
+ TraverseHexBytes(ctrl =>
+ {
+ if (ctrl.BytePositionInStream == bytePositionInStream)
+ {
+ ctrl.Focus();
+ rtn = true;
+ }
+ }, ref rtn);
+
+ if (rtn) return;
+
+ if (VerticalScrollBar.Value < VerticalScrollBar.Maximum && !_setFocusTest)
+ {
+ _setFocusTest = true;
+ VerticalScrollBar.Value++;
+ }
+
+ if (!SelectionStartIsVisible && SelectionLength == 1)
+ SetPosition(SelectionStart, 1);
+ }
+
+ ///
+ /// Set focus on byte in the string panel
+ ///
+ private void SetFocusStringDataPanel(long bytePositionInStream)
+ {
+ if (!CheckIsOpen(_provider)) return;
+ if (bytePositionInStream >= _provider.Length) return;
+
+ var rtn = false;
+ TraverseStringBytes(ctrl =>
+ {
+ if (ctrl.BytePositionInStream == bytePositionInStream)
+ {
+ ctrl.Focus();
+ rtn = true;
+ }
+ }, ref rtn);
+
+ if (rtn) return;
+
+ if (VerticalScrollBar.Value < VerticalScrollBar.Maximum && !_setFocusTest)
+ {
+ _setFocusTest = true;
+ VerticalScrollBar.Value++;
+ }
+
+ if (!SelectionStartIsVisible && SelectionLength == 1)
+ SetPosition(SelectionStart, 1);
+ }
+
+ #endregion Focus Methods
+
+ #region Find/replace methods
+
+ ///
+ /// Find first occurence of string in stream. Search start as startPosition.
+ ///
+ public long FindFirst(string text, long startPosition = 0) =>
+ FindFirst(StringToByte(text), startPosition);
+
+ ///
+ /// Find first occurence of byte[] in stream. Search start as startPosition.
+ ///
+ public long FindFirst(byte[] data, long startPosition = 0, bool highLight = false)
+ {
+ if (data == null) return -1;
+ if (!CheckIsOpen(_provider)) return -1;
+
+ UnHighLightAll();
+
+ try
+ {
+ var position = _provider.FindIndexOf(data, startPosition).ToList().First();
+
+ SetPosition(position, data.Length);
+
+ if (!highLight) return position;
+
+ AddHighLight(position, data.Length, false);
+
+ SetScrollMarker(position, ScrollMarker.SearchHighLight);
+
+ SelectionStart = position;
+ UpdateHighLight();
+ return position;
+ }
+ catch
+ {
+ UnSelectAll();
+ UnHighLightAll();
+ return -1;
+ }
+ }
+
+ ///
+ /// Find next occurence of string in stream search start at SelectionStart.
+ ///
+ public long FindNext(string text) =>
+ FindNext(StringToByte(text));
+
+ ///
+ /// Find next occurence of byte[] in stream search start at SelectionStart.
+ ///
+ public long FindNext(byte[] data, bool highLight = false) =>
+ FindFirst(data, SelectionStart + 1, highLight);
+
+ ///
+ /// Find last occurence of string in stream search start at SelectionStart.
+ ///
+ public long FindLast(string text) => FindLast(StringToByte(text));
+
+ ///
+ /// Find first occurence of byte[] in stream.
+ ///
+ /// Return the position
+ public long FindLast(byte[] data, bool highLight = false)
+ {
+ if (data == null) return -1;
+ if (!CheckIsOpen(_provider)) return -1;
+
+ UnHighLightAll();
+
+ try
+ {
+ var position = _provider.FindIndexOf(data, SelectionStart + 1).ToList().Last();
+
+ SetPosition(position, data.Length);
+
+ if (!highLight) return position;
+
+ AddHighLight(position, data.Length, false);
+
+ SetScrollMarker(position, ScrollMarker.SearchHighLight);
+
+ SelectionStart = position;
+ UpdateHighLight();
+ return position;
+ }
+ catch
+ {
+ UnSelectAll();
+ UnHighLightAll();
+ return -1;
+ }
+ }
+
+ ///
+ /// Find all occurence of string in stream.
+ ///
+ /// Return null if no occurence found
+ public IEnumerable FindAll(string text) => FindAll(StringToByte(text));
+
+ ///
+ /// Find all occurence of byte[] in stream.
+ ///
+ /// Return null if no occurence found
+ public IEnumerable FindAll(byte[] data)
+ {
+ if (data == null) return null;
+
+ UnHighLightAll();
+
+ return CheckIsOpen(_provider) ? _provider.FindIndexOf(data) : null;
+ }
+
+ ///
+ /// Find all occurence of string in stream.
+ ///
+ /// Return null if no occurence found
+ public IEnumerable FindAll(string text, bool highLight) =>
+ FindAll(StringToByte(text), highLight);
+
+ ///
+ /// Find all occurence of string in stream. Highlight occurance in stream is MarcAll as true
+ ///
+ /// Return null if no occurence found
+ public IEnumerable FindAll(byte[] data, bool highLight)
+ {
+ if (data == null) return null;
+
+ ClearScrollMarker(ScrollMarker.SearchHighLight);
+
+ if (highLight)
+ {
+ var positions = FindAll(data);
+
+ if (positions == null) return null;
+
+ var findAll = positions as IList ?? positions.ToList();
+ foreach (var position in findAll)
+ {
+ AddHighLight(position, data.Length, false);
+
+ SetScrollMarker(position, ScrollMarker.SearchHighLight);
+ }
+
+
+ UnSelectAll();
+ UpdateHighLight();
+
+ return findAll;
+ }
+
+ return FindAll(data);
+ }
+
+ ///
+ /// Find all occurence of SelectionByteArray in stream. Highlight byte finded
+ ///
+ /// Return null if no occurence found
+ public IEnumerable FindAllSelection(bool highLight) =>
+ SelectionLength > 0
+ ? FindAll(SelectionByteArray, highLight)
+ : null;
+
+ ///
+ /// Replace byte with another at selection position
+ ///
+ public void ReplaceByte(byte original, byte replace) =>
+ ReplaceByte(SelectionStart, SelectionLength, original, replace);
+
+ ///
+ /// Replace byte with another at start position
+ ///
+ public void ReplaceByte(long startPosition, long length, byte original, byte replace)
+ {
+ if (!CheckIsOpen(_provider) || startPosition <= -1 || length <= 0) return;
+
+ _provider.ReplaceByte(startPosition, length, original, replace);
+ SetScrollMarker(SelectionStart, ScrollMarker.ByteModified, FModel.Properties.Resources.ReplaceWithByteString);
+ RefreshView();
+ }
+
+ ///
+ /// Replace the first byte array define by findData in byteprovider at start position.
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(byte[] findData, byte[] replaceData, bool truckLength = true, long startPosition = 0, bool hightlight = false)
+ {
+ if (findData == null || replaceData == null) return -1;
+ if (!CheckIsOpen(_provider)) return -1;
+
+ var position = FindFirst(findData, startPosition, hightlight);
+
+ if (position > -1)
+ {
+ byte[] finalReplaceData = truckLength
+ ? replaceData.Take(findData.Length).ToArray()
+ : replaceData;
+
+ _provider.Paste(position, finalReplaceData, false);
+
+ SetScrollMarker(position, ScrollMarker.ByteModified);
+
+ UnSelectAll();
+ RefreshView();
+
+ return position;
+ }
+ else
+ return -1;
+ }
+
+ ///
+ /// Replace the first byte array define by findData in byteprovider at SelectionStart. Start the search at SelectionStart.
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(byte[] findData, byte[] replaceData, bool truckLength = true, bool hightlight = false) =>
+ ReplaceFirst(findData, replaceData, truckLength, SelectionStart, hightlight);
+
+ ///
+ /// Replace the first byte array define by findData in byteprovider at SelectionStart.
+ /// Start the search at SelectionStart.
+ /// No highlight
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(byte[] findData, byte[] replaceData, bool truckLength = true) =>
+ ReplaceFirst(findData, replaceData, truckLength, SelectionStart, false);
+
+ ///
+ /// Replace the first byte array define by findData in byteprovider at SelectionStart.
+ /// Start the search at SelectionStart.
+ /// No highlight
+ /// Truck replace data to length of findData
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(byte[] findData, byte[] replaceData) =>
+ ReplaceFirst(findData, replaceData, true, SelectionStart, false);
+
+ ///
+ /// Replace the first string define by find in byteprovider at SelectionStart. Start the search at SelectionStart.
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(string find, string replace, bool truckLength = true, bool hightlight = false) =>
+ ReplaceFirst(StringToByte(find), StringToByte(replace), truckLength, SelectionStart, hightlight);
+
+ ///
+ /// Replace the first string define by find in byteprovider at SelectionStart.
+ /// Start the search at SelectionStart.
+ /// No highlight
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(string find, string replace, bool truckLength = true) =>
+ ReplaceFirst(StringToByte(find), StringToByte(replace), truckLength, SelectionStart, false);
+
+ ///
+ /// Replace the first string define by find in byteprovider at start position.
+ /// Start the search at SelectionStart.
+ /// No highlight
+ /// Truck replace data to length of findData
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceFirst(string find, string replace) =>
+ ReplaceFirst(StringToByte(find), StringToByte(replace), true, SelectionStart, false);
+
+ ///
+ /// Replace the next byte array define by findData in byteprovider at SelectionStart.
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceNext(byte[] findData, byte[] replaceData, bool truckLength = true, bool hightlight = false) =>
+ ReplaceFirst(findData, replaceData, truckLength, SelectionStart + 1, hightlight);
+
+ ///
+ /// Replace the next byte array define by findData in byteprovider at SelectionStart.
+ /// No highlight
+ /// Truck replace data to length of findData
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceNext(byte[] findData, byte[] replaceData) =>
+ ReplaceFirst(findData, replaceData, true, SelectionStart + 1, false);
+
+ ///
+ /// Replace the next byte array define by findData in byteprovider at SelectionStart.
+ /// No highlight
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceNext(byte[] findData, byte[] replaceData, bool truckLength = true) =>
+ ReplaceFirst(findData, replaceData, truckLength, SelectionStart + 1, false);
+
+ ///
+ /// Replace the next string define by find in byteprovider at SelectionStart.
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceNext(string find, string replace, bool truckLength = true, bool hightlight = false) =>
+ ReplaceFirst(StringToByte(find), StringToByte(replace), truckLength, SelectionStart + 1, hightlight);
+
+ ///
+ /// Replace the next string define by find in byteprovider at SelectionStart.
+ /// No highlight
+ /// Truck replace data to length of findData
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceNext(string find, string replace) =>
+ ReplaceFirst(StringToByte(find), StringToByte(replace), true, SelectionStart + 1, false);
+
+ ///
+ /// Replace the next string define by find in byteprovider at SelectionStart.
+ /// No highlight
+ ///
+ /// Return the position of replace. Return -1 on error/no replace
+ public long ReplaceNext(string find, string replace, bool truckLength = true) =>
+ ReplaceFirst(StringToByte(find), StringToByte(replace), truckLength, SelectionStart + 1, false);
+
+ ///
+ /// Replace the all byte array define by findData in byteprovider.
+ ///
+ /// Return the an IEnumerable contains all positions are replaced. Return null on error/no replace
+ public IEnumerable ReplaceAll(byte[] findData, byte[] replaceData, bool truckLength = true, bool hightlight = false)
+ {
+ if (findData == null || replaceData == null) return null;
+ if (!CheckIsOpen(_provider)) return null;
+
+ var positions = FindAll(findData, hightlight);
+
+ if (positions.Any())
+ {
+ byte[] finalReplaceData = truckLength
+ ? replaceData.Take(findData.Length).ToArray()
+ : replaceData;
+
+ foreach (var position in positions)
+ {
+ _provider.Paste(position, finalReplaceData, false);
+ SetScrollMarker(position, ScrollMarker.ByteModified);
+ }
+
+ UnSelectAll();
+ RefreshView();
+
+ return positions;
+ }
+ else
+ return null;
+ }
+
+ ///
+ /// Replace the all byte array define by findData in byteprovider.
+ /// No highlight
+ ///
+ /// Return the position of replace. Return null on error/no replace
+ public IEnumerable ReplaceAll(byte[] findData, byte[] replaceData, bool truckLength = true) =>
+ ReplaceAll(findData, replaceData, truckLength, false);
+
+ ///
+ /// Replace the all string define by find in byteprovider.
+ ///
+ /// Return the position of replace. Return null on error/no replace
+ public IEnumerable ReplaceAll(string find, string replace, bool truckLength = true, bool hightlight = false) =>
+ ReplaceAll(StringToByte(find), StringToByte(replace), truckLength, hightlight);
+
+ ///
+ /// Replace the all string define by find in byteprovider.
+ /// No highlight
+ /// Truck replace data to length of find
+ ///
+ /// Return the position of replace. Return null on error/no replace
+ public IEnumerable ReplaceAll(string find, string replace) =>
+ ReplaceAll(StringToByte(find), StringToByte(replace), true, false);
+
+ ///
+ /// Replace the all byte array define by findData in byteprovider.
+ /// No highlight
+ ///
+ /// Return the position of replace. Return null on error/no replace
+ public IEnumerable ReplaceAll(string find, string replace, bool truckLength = true) =>
+ ReplaceAll(StringToByte(find), StringToByte(replace), truckLength, false);
+
+ #endregion Find/replace methods
+
+ #region Statusbar
+
+ ///
+ /// Update statusbar for somes property dont support dependency property
+ ///
+ private void UpdateStatusBar()
+ {
+ if (StatusBarVisibility == Visibility.Visible)
+ if (CheckIsOpen(_provider))
+ {
+ #region Show length TODO:REFRESH ONLY WHEN NEEDED
+
+ var mb = false;
+ long deletedBytesCount = _provider.GetByteModifieds(ByteAction.Deleted).Count;
+ long addedBytesCount = _provider.GetByteModifieds(ByteAction.Added).Count;
+
+ //is mega bytes ?
+ double length = (_provider.Length - deletedBytesCount + addedBytesCount) / 1024;
+
+ if (length > 1024)
+ {
+ length = length / 1024;
+ mb = true;
+ }
+
+ FileLengthKbLabel.Content = Math.Round(length, 2) +
+ (mb
+ ? $" {FModel.Properties.Resources.MBTagString}"
+ : $" {FModel.Properties.Resources.KBTagString}");
+ //FileLengthKbLabel.ToolTip = $" {_provider.Length - deletedBytesCount} {Properties.Resources.ByteString}";
+
+ #endregion
+
+ #region Byte count of selectionStart
+
+ if (AllowByteCount && _bytecount != null && SelectionStart > -1)
+ {
+ ByteCountPanel.Visibility = Visibility.Visible;
+
+ var val = _provider.GetByte(SelectionStart).singleByte.Value;
+ CountOfByteSumLabel.Content = _bytecount[val];
+ CountOfByteLabel.Content = $"0x{LongToHex(val)}";
+ }
+ else
+ ByteCountPanel.Visibility = Visibility.Collapsed;
+
+ #endregion
+ }
+ else
+ {
+ FileLengthKbLabel.Content = 0;
+ CountOfByteLabel.Content = 0;
+ }
+ }
+
+ #endregion Statusbar
+
+ #region Bookmark and other scrollmarker
+
+ ///
+ /// Get all bookmark are currently set
+ ///
+ public IEnumerable BookMarks
+ {
+ get
+ {
+ var bmList = new List();
+
+ TraverseScrollMarker(sm =>
+ {
+ if (sm.Tag is BookMark bm && bm.Marker == ScrollMarker.Bookmark)
+ bmList.Add(bm);
+ });
+
+ foreach (var bm in bmList)
+ yield return bm;
+ }
+ }
+
+ ///
+ /// Set bookmark at specified position
+ ///
+ ///
+ public void SetBookMark(long position) => SetScrollMarker(position, ScrollMarker.Bookmark);
+
+ ///
+ /// Set bookmark at selection start
+ ///
+ public void SetBookMark() => SetScrollMarker(SelectionStart, ScrollMarker.Bookmark);
+
+ ///
+ /// Set marker at position using bookmark object
+ ///
+ ///
+ private void SetScrollMarker(BookMark mark) =>
+ SetScrollMarker(mark.BytePositionInStream, mark.Marker, mark.Description);
+
+ ///
+ /// Set marker at position
+ ///
+ private void SetScrollMarker(long position, ScrollMarker marker, string description = "")
+ {
+ if (CheckIsOpen(_provider))
+ {
+ double rightPosition = 0;
+ var exit = false;
+
+ //create bookmark
+ var bookMark = new BookMark
+ {
+ Marker = marker,
+ BytePositionInStream = position,
+ Description = description
+ };
+
+ #region Remove selection start marker and set position
+
+ if (marker == ScrollMarker.SelectionStart)
+ {
+ TraverseScrollMarker(sm =>
+ {
+ if (sm.Tag is BookMark mark && mark.Marker == ScrollMarker.SelectionStart)
+ {
+ MarkerGrid.Children.Remove(sm);
+ exit = true;
+ }
+ }, ref exit);
+
+ bookMark.BytePositionInStream = SelectionStart;
+ }
+
+ #endregion
+
+ #region Set position in scrollbar
+
+ var topPosition =
+ (GetLineNumber(bookMark.BytePositionInStream) * VerticalScrollBar.Track.TickHeight(MaxLine) - 1).Round(1);
+
+ if (double.IsNaN(topPosition))
+ topPosition = 0;
+
+ #endregion
+
+ #region Check if position already exist and exit if exist
+
+ if (marker != ScrollMarker.SelectionStart)
+ {
+ exit = false;
+
+ TraverseScrollMarker(sm =>
+ {
+ if (sm.Tag is BookMark mark && mark.Marker == marker &&
+ (int)sm.Margin.Top == (int)topPosition)
+ exit = true;
+ }, ref exit);
+
+ if (exit) return;
+ }
+
+ #endregion
+
+ #region Build rectangle
+
+ var rect = new Rectangle
+ {
+ VerticalAlignment = VerticalAlignment.Top,
+ HorizontalAlignment = HorizontalAlignment.Left,
+ Tag = bookMark,
+ Width = 5,
+ Height = 3,
+ DataContext = bookMark
+ };
+
+ #endregion
+
+ #region Set somes properties for different marker
+
+ switch (marker)
+ {
+ case ScrollMarker.TblBookmark:
+ case ScrollMarker.Bookmark:
+ rect.ToolTip = TryFindResource("ScrollMarkerSearchToolTip");
+ rect.Fill = (SolidColorBrush)TryFindResource("BookMarkColor");
+ break;
+ case ScrollMarker.SearchHighLight:
+ rect.ToolTip = TryFindResource("ScrollMarkerSearchToolTip");
+ rect.Fill = (SolidColorBrush)TryFindResource("SearchBookMarkColor");
+ rect.HorizontalAlignment = HorizontalAlignment.Center;
+ break;
+ case ScrollMarker.SelectionStart:
+ rect.Fill = (SolidColorBrush)TryFindResource("SelectionStartBookMarkColor");
+ rect.Width = VerticalScrollBar.ActualWidth;
+ rect.Height = 3;
+ break;
+ case ScrollMarker.ByteModified:
+ rect.ToolTip = TryFindResource("ScrollMarkerSearchToolTip");
+ rect.Fill = (SolidColorBrush)TryFindResource("ByteModifiedMarkColor");
+ rect.HorizontalAlignment = HorizontalAlignment.Right;
+ break;
+ case ScrollMarker.ByteDeleted:
+ rect.ToolTip = TryFindResource("ScrollMarkerSearchToolTip");
+ rect.Fill = (SolidColorBrush)TryFindResource("ByteDeletedMarkColor");
+ rect.HorizontalAlignment = HorizontalAlignment.Right;
+ rightPosition = 4;
+ break;
+ }
+
+ rect.MouseDown += Rect_MouseDown;
+ //rect.DataContext = new ByteModified {BytePositionInStream = position};
+ rect.Margin = new Thickness(0, topPosition, rightPosition, 0);
+
+ #endregion
+
+ //Add to grid
+ MarkerGrid.Children.Add(rect);
+ }
+ }
+
+ private void Rect_MouseDown(object sender, MouseButtonEventArgs e)
+ {
+ if (sender is Rectangle rect && rect.Tag is BookMark bm)
+ SetPosition(bm.Marker != ScrollMarker.SelectionStart ? bm.BytePositionInStream : SelectionStart, 1);
+ }
+
+ ///
+ /// Update all scroll marker position
+ ///
+ private void UpdateScrollMarkerPosition() =>
+ TraverseScrollMarker(ctrl =>
+ {
+ if (!(ctrl.Tag is BookMark bm)) return;
+
+ try
+ {
+ ctrl.Margin = new Thickness
+ (
+ 0,
+ GetLineNumber(bm.BytePositionInStream) * VerticalScrollBar.Track.TickHeight(MaxLine) - ctrl.ActualHeight,
+ 0,
+ 0
+ );
+ }
+ catch
+ {
+ ctrl.Margin = new Thickness(0);
+ }
+ });
+
+ ///
+ /// Clear ScrollMarker
+ ///
+ public void ClearAllScrollMarker() => MarkerGrid.Children.Clear();
+
+ ///
+ /// Clear ScrollMarker
+ ///
+ /// Type of marker to clear
+ public void ClearScrollMarker(ScrollMarker marker) =>
+ TraverseScrollMarker(sm =>
+ {
+ if (sm.Tag is BookMark mark && mark.Marker == marker)
+ MarkerGrid.Children.Remove(sm);
+ });
+
+ ///
+ /// Clear ScrollMarker
+ ///
+ /// Type of marker to clear
+ public void ClearScrollMarker(ScrollMarker marker, long position) =>
+ TraverseScrollMarker(sm =>
+ {
+ if (sm.Tag is BookMark mark && mark.Marker == marker && mark.BytePositionInStream == position)
+ MarkerGrid.Children.Remove(sm);
+ });
+
+ ///
+ /// Clear ScrollMarker at position
+ ///
+ public void ClearScrollMarker(long position) =>
+ TraverseScrollMarker(sm =>
+ {
+ if (sm.Tag is BookMark mark && mark.BytePositionInStream == position)
+ MarkerGrid.Children.Remove(sm);
+ });
+
+ #endregion Bookmark and other scrollmarker
+
+ #region Context menu
+
+ ///
+ /// Allow or not the context menu to appear on right-click
+ ///
+ public bool AllowContextMenu { get; set; } = true;
+
+ private void Control_RightClick(object sender, EventArgs e)
+ {
+ if (AllowContextMenu)
+ {
+ //position
+ if (sender is IByteControl ctrl)
+ _rightClickBytePosition = ctrl.BytePositionInStream;
+
+ if (SelectionLength <= 1)
+ {
+ SelectionStart = _rightClickBytePosition;
+ SelectionStop = _rightClickBytePosition;
+ }
+
+ #region Disable ctrl
+
+ CopyAsCMenu.IsEnabled = false;
+ CopyAsciicMenu.IsEnabled = false;
+ FindAllCMenu.IsEnabled = false;
+ CopyHexaCMenu.IsEnabled = false;
+ UndoCMenu.IsEnabled = false;
+ DeleteCMenu.IsEnabled = false;
+ FillByteCMenu.IsEnabled = false;
+ CopyTblcMenu.IsEnabled = false;
+
+ #endregion
+
+ if (SelectionLength > 0)
+ {
+ CopyAsciicMenu.IsEnabled = true;
+ CopyAsCMenu.IsEnabled = true;
+ FindAllCMenu.IsEnabled = true;
+ CopyHexaCMenu.IsEnabled = true;
+ DeleteCMenu.IsEnabled = true;
+ FillByteCMenu.IsEnabled = true;
+
+ if (_tblCharacterTable != null)
+ CopyTblcMenu.IsEnabled = true;
+ }
+
+ if (UndoCount > 0)
+ UndoCMenu.IsEnabled = true;
+
+ //Show context menu
+ Focus();
+ CMenu.Visibility = Visibility.Visible;
+ }
+ }
+
+ private void FindAllCMenu_Click(object sender, RoutedEventArgs e) => FindAll(SelectionByteArray, true);
+
+ private void CopyToClipBoardCMenu_Click(object sender, RoutedEventArgs e)
+ {
+ //Copy to clipboard
+ switch ((sender as MenuItem).Name)
+ {
+ case nameof(CopyHexaCMenu):
+ CopyToClipboard(CopyPasteMode.HexaString);
+ break;
+ case nameof(CopyAsciicMenu):
+ CopyToClipboard(CopyPasteMode.AsciiString);
+ break;
+ case nameof(CopyCSharpCMenu):
+ CopyToClipboard(CopyPasteMode.CSharpCode);
+ break;
+ case nameof(CopyFSharpCMenu):
+ CopyToClipboard(CopyPasteMode.FSharpCode);
+ break;
+ case nameof(CopyCcMenu):
+ CopyToClipboard(CopyPasteMode.CCode);
+ break;
+ case nameof(CopyJavaCMenu):
+ CopyToClipboard(CopyPasteMode.JavaCode);
+ break;
+ case nameof(CopyVbNetCMenu):
+ CopyToClipboard(CopyPasteMode.VbNetCode);
+ break;
+ case nameof(CopyPascalCMenu):
+ CopyToClipboard(CopyPasteMode.PascalCode);
+ break;
+ case nameof(CopyTblcMenu):
+ CopyToClipboard(CopyPasteMode.TblString);
+ break;
+ }
+ }
+
+ private void DeleteCMenu_Click(object sender, RoutedEventArgs e) => DeleteSelection();
+
+ private void UndoCMenu_Click(object sender, RoutedEventArgs e) => Undo();
+
+ private void BookMarkCMenu_Click(object sender, RoutedEventArgs e) => SetBookMark(_rightClickBytePosition);
+
+ private void ClearBookMarkCMenu_Click(object sender, RoutedEventArgs e) =>
+ ClearScrollMarker(ScrollMarker.Bookmark);
+
+ private void PasteMenu_Click(object sender, RoutedEventArgs e) => Paste(false); //Paste Without Insert
+
+ private void SelectAllCMenu_Click(object sender, RoutedEventArgs e) => SelectAll();
+
+ private void FillByteCMenu_Click(object sender, RoutedEventArgs e)
+ {
+ var window = new GiveByteWindow();
+
+ //For present crash When used in Winform
+ try
+ {
+ window.Owner = Application.Current.MainWindow;
+ }
+ catch
+ {
+ // TODO : add Winform code
+ }
+
+ if (window.ShowDialog() == true && window.HexTextBox.LongValue <= 255)
+ FillWithByte((byte)window.HexTextBox.LongValue);
+ }
+
+ private void ReplaceByteCMenu_Click(object sender, RoutedEventArgs e)
+ {
+ var window = new ReplaceByteWindow();
+
+ //For present crash When used in Winform
+ try
+ {
+ window.Owner = Application.Current.MainWindow;
+ }
+ catch
+ {
+ // TODO : add Winform code
+ }
+
+ if (window.ShowDialog() == true && window.HexTextBox.LongValue <= 255 &&
+ window.ReplaceHexTextBox.LongValue <= 255)
+ ReplaceByte((byte)window.HexTextBox.LongValue, (byte)window.ReplaceHexTextBox.LongValue);
+ }
+
+ #endregion Context menu
+
+ #region Bottom and top rectangle
+
+ ///
+ /// Vertical Move Method By Time,
+ ///
+ /// whether the veticalbar value should be changed
+ /// the value that vertical value move down(negative for up)
+ private void VerticalMoveByTime(Func readToMove, Func distance)
+ {
+ ThreadPool.QueueUserWorkItem(cb =>
+ {
+ while (readToMove())
+ {
+ Dispatcher.Invoke(() =>
+ {
+ if (Mouse.LeftButton != MouseButtonState.Pressed) return;
+
+ VerticalScrollBar.Value += distance();
+
+ //Selection stop
+ if (_mouseOnBottom)
+ SelectionStop = LastVisibleBytePosition;
+ else if (_mouseOnTop)
+ SelectionStop = FirstVisibleBytePosition;
+
+ //Give the control to dispatcher for do events
+ Application.Current.DoEvents();
+
+ });
+ }
+ });
+ }
+
+ private void BottomRectangle_MouseEnter(object sender, MouseEventArgs e)
+ {
+ _mouseOnBottom = true;
+ var curTime = ++_bottomEnterTimes;
+
+ VerticalMoveByTime
+ (
+ () => _mouseOnBottom && curTime == _bottomEnterTimes,
+ () => (int)MouseWheelSpeed
+ );
+ }
+
+ private void TopRectangle_MouseEnter(object sender, MouseEventArgs e)
+ {
+ var curTime = ++_topEnterTimes;
+ _mouseOnTop = true;
+
+ VerticalMoveByTime
+ (
+ () => _mouseOnTop && curTime == _topEnterTimes,
+ () => -(int)MouseWheelSpeed
+ );
+ }
+
+ private void BottomRectangle_MouseLeave(object sender, MouseEventArgs e) => _mouseOnBottom = false;
+
+ private void TopRectangle_MouseLeave(object sender, MouseEventArgs e) => _mouseOnTop = false;
+
+ private void BottomRectangle_MouseDown(object sender, MouseButtonEventArgs e) => _mouseOnBottom = false;
+
+ private void TopRectangle_MouseDown(object sender, MouseButtonEventArgs e) => _mouseOnTop = false;
+
+ #endregion Bottom and Top rectangle
+
+ #region MouseWheel support
+ ///
+ /// Control the mouse wheel speed
+ ///
+ public MouseWheelSpeed MouseWheelSpeed { get; set; } = MouseWheelSpeed.System;
+
+ private void Control_MouseWheel(object sender, MouseWheelEventArgs e)
+ {
+ #region Mousewheel Zoom support
+ if (_scaler == null) InitialiseZoom();
+
+ if (Keyboard.Modifiers == ModifierKeys.Control && AllowZoom)
+ {
+ if (e.Delta > 0) //Zoom
+ ZoomScale += 0.1;
+
+ if (e.Delta < 0) //UnZoom
+ ZoomScale -= 0.1;
+
+ return;
+ }
+ #endregion
+
+ #region Scroll up and down in the hex editor
+ if (_provider == null || !_provider.IsOnLongProcess)
+ {
+ if (e.Delta > 0) //UP
+ VerticalScrollBar.Value -= e.Delta / 120 *
+ (MouseWheelSpeed == MouseWheelSpeed.System
+ ? MouseWheelScrollLines
+ : (int)MouseWheelSpeed);
+
+ if (e.Delta < 0) //Down
+ VerticalScrollBar.Value += e.Delta / 120 *
+ -(MouseWheelSpeed == MouseWheelSpeed.System
+ ? MouseWheelScrollLines
+ : (int)MouseWheelSpeed);
+ }
+ #endregion
+ }
+ #endregion
+
+ #region Highlight support
+ ///
+ /// Byte at selection start
+ ///
+ internal byte? SelectionByte { get; set; }
+
+ ///
+ /// Set to true for highlight the same byte are selected in view.
+ ///
+ public bool AllowAutoHighLightSelectionByte
+ {
+ get => (bool)GetValue(AllowAutoHighLightSelectionByteProperty);
+ set => SetValue(AllowAutoHighLightSelectionByteProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowAutoHighLightSelectionByte. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowAutoHighLightSelectionByteProperty =
+ DependencyProperty.Register(nameof(AllowAutoHighLightSelectionByte), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, AutoHighLiteSelectionByte_Changed));
+
+ ///
+ /// Brush used to color the selectionbyte
+ ///
+ public Brush AutoHighLiteSelectionByteBrush
+ {
+ get => (Brush)GetValue(AutoHighLiteSelectionByteBrushProperty);
+ set => SetValue(AutoHighLiteSelectionByteBrushProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AutoHighLiteSelectionByteBrush. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AutoHighLiteSelectionByteBrushProperty =
+ DependencyProperty.Register(nameof(AutoHighLiteSelectionByteBrush), typeof(Brush), typeof(HexEditor),
+ new FrameworkPropertyMetadata(Brushes.LightBlue, AutoHighLiteSelectionByte_Changed));
+
+ private static void AutoHighLiteSelectionByte_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.UpdateVisual();
+ }
+
+ ///
+ /// Un highlight all byte as highlighted with find all methods
+ ///
+ public void UnHighLightAll()
+ {
+ _markedPositionList.Clear();
+ UpdateHighLight();
+ ClearScrollMarker(ScrollMarker.SearchHighLight);
+ }
+
+ ///
+ /// Add highlight at position start
+ ///
+ /// Position to start the highlight
+ /// The length to highlight
+ /// Set to true for update the visual after adding
+ public void AddHighLight(long startPosition, long length, bool updateVisual = true)
+ {
+ for (var i = startPosition; i < startPosition + length; i++)
+ if (!_markedPositionList.ContainsValue(i))
+ _markedPositionList.Add(i, i);
+
+ if (updateVisual) UpdateHighLight();
+ }
+
+ ///
+ /// Remove highlight from position start
+ ///
+ /// Position to start the remove of highlight
+ /// The length of highlight to removing
+ /// Set to true for update the visual after removing
+ public void RemoveHighLight(long startPosition, long length, bool updateVisual = true)
+ {
+ for (var i = startPosition; i < startPosition + length; i++)
+ if (_markedPositionList.ContainsValue(i))
+ _markedPositionList.Remove(i);
+
+ if (updateVisual) UpdateHighLight();
+ }
+ #endregion Highlight support
+
+ #region ByteCount property/methods
+
+ public bool AllowByteCount
+ {
+ get => (bool)GetValue(AllowByteCountProperty);
+ set => SetValue(AllowByteCountProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for AllowByteCount. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowByteCountProperty =
+ DependencyProperty.Register(nameof(AllowByteCount), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(false, AllowByteCount_PropertyChanged));
+
+ private static void AllowByteCount_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+
+ if (e.NewValue != e.OldValue)
+ ctrl.UpdateByteCount();
+
+ ctrl.UpdateStatusBar();
+ }
+
+ ///
+ /// Update the bytecount var.
+ ///
+ private void UpdateByteCount()
+ {
+ _bytecount = null;
+
+ if (CheckIsOpen(_provider) && AllowByteCount)
+ _bytecount = _provider.GetByteCount();
+ }
+
+ #endregion ByteCount Property
+
+ #region IDisposable Support
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (_disposedValue) return;
+
+ //Dispose managed object
+ if (disposing)
+ {
+ _provider?.Dispose();
+ _tblCharacterTable?.Dispose();
+ _viewBuffer = null;
+ _markedPositionList = null;
+ }
+
+ _disposedValue = true;
+ }
+
+ public void Dispose() => Dispose(true);
+
+ #endregion
+
+ #region IByteControl grouping support
+ public ByteSpacerPosition ByteSpacerPositioning
+ {
+ get => (ByteSpacerPosition)GetValue(ByteSpacerPositioningProperty);
+ set => SetValue(ByteSpacerPositioningProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteSpacerPositioning. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteSpacerPositioningProperty =
+ DependencyProperty.Register(nameof(ByteSpacerPositioning), typeof(ByteSpacerPosition), typeof(HexEditor),
+ new FrameworkPropertyMetadata(ByteSpacerPosition.Both, ByteSpacer_Changed));
+
+ public ByteSpacerWidth ByteSpacerWidthTickness
+ {
+ get => (ByteSpacerWidth)GetValue(ByteSpacerWidthTicknessProperty);
+ set => SetValue(ByteSpacerWidthTicknessProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteSpacer. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteSpacerWidthTicknessProperty =
+ DependencyProperty.Register(nameof(ByteSpacerWidthTickness), typeof(ByteSpacerWidth), typeof(HexEditor),
+ new FrameworkPropertyMetadata(ByteSpacerWidth.Normal, ByteSpacer_Changed));
+
+ private static void ByteSpacer_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.RefreshView(true);
+ }
+
+ public ByteSpacerGroup ByteGrouping
+ {
+ get => (ByteSpacerGroup)GetValue(ByteGroupingProperty);
+ set => SetValue(ByteGroupingProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteGrouping. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteGroupingProperty =
+ DependencyProperty.Register(nameof(ByteGrouping), typeof(ByteSpacerGroup), typeof(HexEditor),
+ new FrameworkPropertyMetadata(ByteSpacerGroup.EightByte, ByteSpacer_Changed));
+
+ public ByteSpacerVisual ByteSpacerVisualStyle
+ {
+ get => (ByteSpacerVisual)GetValue(ByteSpacerVisualStyleProperty);
+ set => SetValue(ByteSpacerVisualStyleProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteSpacerVisualStyle. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteSpacerVisualStyleProperty =
+ DependencyProperty.Register(nameof(ByteSpacerVisualStyle), typeof(ByteSpacerVisual), typeof(HexEditor),
+ new FrameworkPropertyMetadata(ByteSpacerVisual.Empty, ByteSpacer_Changed));
+
+ ///
+ /// Add byte spacer
+ ///
+ private void AddByteSpacer(StackPanel stack, int colomn, bool forceEmpty = false)
+ {
+ if (colomn % (int)ByteGrouping != 0 || colomn <= 0) return;
+
+ if (!forceEmpty)
+ switch (ByteSpacerVisualStyle)
+ {
+ case ByteSpacerVisual.Empty:
+ stack.Children.Add(new TextBlock { Width = (int)ByteSpacerWidthTickness });
+ break;
+ case ByteSpacerVisual.Line:
+
+ #region Line
+
+ stack.Children.Add(new Line
+ {
+ Y2 = LineHeight,
+ X1 = (int)ByteSpacerWidthTickness / 2D,
+ X2 = (int)ByteSpacerWidthTickness / 2D,
+ Stroke = BorderBrush,
+ StrokeThickness = 1,
+ Width = (int)ByteSpacerWidthTickness
+ });
+
+ #endregion
+
+ break;
+ case ByteSpacerVisual.Dash:
+
+ #region LineDash
+
+ stack.Children.Add(new Line
+ {
+ Y2 = LineHeight - 1,
+ X1 = (int)ByteSpacerWidthTickness / 2D,
+ X2 = (int)ByteSpacerWidthTickness / 2D,
+ Stroke = BorderBrush,
+ StrokeDashArray = new DoubleCollection(new double[] { 2 }),
+ StrokeThickness = 1,
+ Width = (int)ByteSpacerWidthTickness
+ });
+
+ #endregion
+
+ break;
+ }
+ else
+ stack.Children.Add(new TextBlock { Width = (int)ByteSpacerWidthTickness });
+ }
+
+ #endregion IByteControl grouping
+
+ #region Caret support
+
+ ///
+ /// Initialize the caret
+ ///
+ private void InitializeCaret()
+ {
+ if (!DesignerProperties.GetIsInDesignMode(this))
+ {
+ BaseGrid.Children.Add(_caret);
+ _caret.CaretHeight = LineHeight;
+ _caret.BlinkPeriod = 600;
+ _caret.Hide();
+ }
+ }
+
+ ///
+ /// Move the caret in a screen point
+ ///
+ internal void MoveCaret(Point point) => _caret.MoveCaret(point);
+
+ ///
+ /// Hide the caret
+ ///
+ internal void HideCaret() => _caret.Hide();
+
+ ///
+ /// Return true if caret is visible
+ ///
+ public bool IsCaretVisible => _caret.IsVisibleCaret;
+
+ ///
+ /// Set the site of caret
+ ///
+ internal void SetCaretSize(double width, double height)
+ {
+ _caret.CaretWidth = width;
+ _caret.CaretHeight = height;
+ }
+
+ ///
+ /// Set the mode of caret (Insert or Overtwrite)
+ ///
+ internal void SetCaretMode(CaretMode mode) => _caret.CaretMode = mode;
+
+ #endregion
+
+ #region Append/expend bytes to end of file
+ //////////
+ // TODO: Will be updated soon with the possibility to insert byte anywhere :)
+ //////////
+
+ ///
+ /// Allow control to append/expend byte at end of file
+ ///
+ public bool AllowExtend { get; set; }
+
+ ///
+ /// Show a message box is true before append byte at end of file
+ ///
+ public bool AppendNeedConfirmation { get; set; } = true;
+
+ ///
+ /// Append one byte at end of file
+ ///
+ internal void AppendByte(byte[] bytesToAppend)
+ {
+ if (!AllowExtend) return;
+ if (!CheckIsOpen(_provider)) return;
+
+ if (AppendNeedConfirmation)
+ if (MessageBox.Show(FModel.Properties.Resources.AppendByteConfirmationString, ApplicationName,
+ MessageBoxButton.YesNo,
+ MessageBoxImage.Question, MessageBoxResult.Yes) != MessageBoxResult.Yes) return;
+
+ _provider?.AppendByte(bytesToAppend);
+ RefreshView();
+ }
+
+ #endregion
+
+ #region Drag and drop support
+
+ ///
+ /// Allow the control to catch the file dropping
+ /// Note : AllowDrop need to be true
+ ///
+ public bool AllowFileDrop { get; set; } = true;
+
+ ///
+ /// Allow the control to catch the text dropping
+ /// Note : AllowDrop need to be true
+ ///
+ public bool AllowTextDrop { get; set; } = true;
+
+ ///
+ /// Show a messagebox for confirm open when a file are already open
+ ///
+ public bool FileDroppingConfirmation { get; set; } = true;
+
+ private void Control_Drop(object sender, DragEventArgs e)
+ {
+ #region Text Dropping (Will be supported soon)
+
+ var textDrop = e.Data.GetData(DataFormats.Text);
+ if (textDrop != null && AllowTextDrop)
+ {
+ var textDropped = textDrop as string;
+
+ if (!string.IsNullOrEmpty(textDropped) && CheckIsOpen(_provider))
+ {
+ #region Insert at mouve over position
+ var position = SelectionStart;
+ bool rtn = false;
+ TraverseHexAndStringBytes(ctrl =>
+ {
+ Application.Current.DoEvents();
+
+ if (ctrl.IsMouseOverMe)
+ {
+ position = ctrl.BytePositionInStream;
+ rtn = true;
+ }
+ }, ref rtn);
+ #endregion
+
+ _provider.Paste(position, textDropped, AllowExtend);
+
+ RefreshView();
+ }
+
+ return;
+ }
+
+ #endregion
+
+ #region File dropping (Only open first selected file catched in GetData)
+
+ var fileDrop = e.Data.GetData(DataFormats.FileDrop);
+ if (fileDrop != null && AllowFileDrop)
+ {
+ var filename = fileDrop as string[];
+
+ if (!CheckIsOpen(_provider))
+ FileName = filename[0];
+ else
+ {
+ if (FileDroppingConfirmation && MessageBox.Show(
+ $"{FModel.Properties.Resources.FileDroppingConfirmationString} {Path.GetFileName(filename[0])} ?",
+ ApplicationName,
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ FileName = filename[0];
+ else
+ FileName = filename[0];
+ }
+ }
+
+ #endregion
+ }
+
+ #endregion
+
+ #region Save/Load control state
+
+ ///
+ /// Save the current state of ByteProvider in a xml text file.
+ ///
+ public void SaveCurrentState(string filename)
+ {
+ if (!CheckIsOpen(_provider)) return;
+ _provider.SaveState(filename);
+ }
+
+ ///
+ /// Load state of control from a xml text file.
+ ///
+ public void LoadCurrentState(string filename)
+ {
+ if (!CheckIsOpen(_provider)) return;
+ _provider.LoadState(filename);
+ RefreshView();
+ }
+
+ #endregion
+
+ #region Shift the first visible byte in the views to the left ...
+
+ ///
+ /// Shift the first visible byte in the view to the left.
+ /// Very useful for editing fixed-width tables. Use with BytePerLine to create visual tables ...
+ /// The value is the number of byte to shift.
+ ///
+ public int ByteShiftLeft
+ {
+ get => (int)GetValue(ByteShiftLeftProperty);
+ set => SetValue(ByteShiftLeftProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ByteShiftLeft. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ByteShiftLeftProperty =
+ DependencyProperty.Register(nameof(ByteShiftLeft), typeof(int), typeof(HexEditor),
+ new FrameworkPropertyMetadata(0, ByteShiftLeft_Changed, ByteShiftLeft_CoerceValue));
+
+ private static void ByteShiftLeft_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl)
+ ctrl.RefreshView(true);
+ }
+
+ private static object ByteShiftLeft_CoerceValue(DependencyObject d, object basevalue) =>
+ (int)basevalue < 0 ? 0 : basevalue;
+
+ #endregion
+
+ #region Reverse bytes selection
+
+ ///
+ /// Reverse selection of bytes array like this {AA, FF, EE, DC} => {DC, EE, FF, AA}
+ ///
+ public void ReverseSelection()
+ {
+ if (!CheckIsOpen(_provider)) return;
+
+ _provider.Reverse(SelectionStart, SelectionStop);
+
+ RefreshView();
+ }
+
+ #endregion
+
+ #region Line offset coloring...
+
+ ///
+ /// High light header and offset on SelectionStart
+ ///
+ public bool HighLightSelectionStart
+ {
+ get => _highLightSelectionStart;
+ set
+ {
+ _highLightSelectionStart = value;
+ RefreshView();
+ }
+ }
+
+ #endregion
+
+ #region Configure the start/stop bytes that are loaded visually into the hexadecimal editor
+ public bool AllowVisualByteAddress
+ {
+ get { return (bool)GetValue(AllowVisualByteAdressProperty); }
+ set { SetValue(AllowVisualByteAdressProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for AllowVisualByteAdress. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowVisualByteAdressProperty =
+ DependencyProperty.Register(nameof(AllowVisualByteAddress), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(false, AllowVisualByteAddress_Changed));
+
+ private static void AllowVisualByteAddress_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ {
+ ctrl.UpdateScrollBar();
+ ctrl.RefreshView(true);
+ }
+ }
+
+ ///
+ /// Set the last byte are virtually loaded in the control.
+ /// Note that all other bytes address after will not be shown in control.
+ /// This property are read only
+ ///
+ public long VisualByteAdressStop => VisualByteAdressStart + VisualByteAdressLength;
+
+ ///
+ /// Set the length from first byte set by VisualStartByteAdress property are virtually loaded in the control.
+ ///
+ public long VisualByteAdressLength
+ {
+ get { return (long)GetValue(VisualByteAdressLengthProperty); }
+ set { SetValue(VisualByteAdressLengthProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for VisualByteAdressLength. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty VisualByteAdressLengthProperty =
+ DependencyProperty.Register(nameof(VisualByteAdressLength), typeof(long), typeof(HexEditor),
+ new FrameworkPropertyMetadata(1L, VisualByteAdressLength_Changed, VisualByteAdressLength_CoerceValue));
+
+ private static object VisualByteAdressLength_CoerceValue(DependencyObject d, object baseValue)
+ {
+ if (!(d is HexEditor ctrl)) return baseValue;
+
+ var value = (long)baseValue;
+
+ if (value < 1 || !CheckIsOpen(ctrl._provider)) return 1L;
+
+ return value >= ctrl._provider.Length ? ctrl._provider.Length : baseValue;
+ }
+
+ private static void VisualByteAdressLength_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ {
+ ctrl.UpdateScrollBar();
+ ctrl.RefreshView();
+ }
+ }
+
+ ///
+ /// Set the first byte are virtually loaded in the control.
+ /// Note that all other bytes address before will not be shown in control.
+ ///
+ public long VisualByteAdressStart
+ {
+ get => (long)GetValue(VisualByteAdressStartProperty);
+ set => SetValue(VisualByteAdressStartProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for VisualStartByteAdress. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty VisualByteAdressStartProperty =
+ DependencyProperty.Register(nameof(VisualByteAdressStart), typeof(long), typeof(HexEditor),
+ new FrameworkPropertyMetadata(0L, VisualByteAdressStart_Changed, VisualByteAdressStart_CoerceValue));
+
+ private static object VisualByteAdressStart_CoerceValue(DependencyObject d, object baseValue)
+ {
+ if (!(d is HexEditor ctrl)) return baseValue;
+
+ var value = (long)baseValue;
+
+ if (!CheckIsOpen(ctrl._provider)) return 0L;
+
+ return value >= ctrl._provider.Length ? ctrl._provider.Length : baseValue;
+
+ //return (long)baseValue;
+ }
+
+ private static void VisualByteAdressStart_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ ctrl.UpdateScrollBar();
+ ctrl.RefreshView();
+ }
+ #endregion
+
+ #region Preload iByteControl at control creation
+
+ ///
+ /// Set to true for preload iByteControls at control creation for maximise the file/stream opening
+ ///
+ public bool AllowPreloadByteInEditor { get; set; } = false;
+
+ private void Control_Loaded(object sender, RoutedEventArgs e)
+ {
+ if (AllowPreloadByteInEditor) BuildDataLines(MaxVisibleLine, true);
+ }
+
+ #endregion
+
+ #region Zoom in/out support
+ ///
+ /// Get or set the scale transform to work with zoom
+ ///
+ private ScaleTransform _scaler = null;
+
+ ///
+ /// Allow or not the zoom in control
+ ///
+ private bool _allowZoom = true;
+
+ ///
+ /// Get or set the zoom scale
+ /// Posible Scale : 0.5 to 2.0 (50% to 200%)
+ ///
+ public double ZoomScale
+ {
+ get => (double)GetValue(ZoomScaleProperty);
+ set => SetValue(ZoomScaleProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for ZoomScale. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty ZoomScaleProperty =
+ DependencyProperty.Register(nameof(ZoomScale), typeof(double), typeof(HexEditor),
+ new FrameworkPropertyMetadata(1D, ZoomScale_ChangedCallBack,
+ ZoomScale_CoerceValueCallBack));
+
+ private static object ZoomScale_CoerceValueCallBack(DependencyObject d, object baseValue) =>
+ (double)baseValue >= 0.5 && (double)baseValue <= 2.0001
+ ? (double)baseValue
+ : d.GetValue(ZoomScaleProperty);
+
+ private static void ZoomScale_ChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl)) return;
+ if (e.NewValue == e.OldValue) return;
+
+ ctrl.UpdateZoom();
+ }
+
+ ///
+ /// Allow or not the capability to zoom control content (use with ScaleX and ScaleY property)
+ ///
+ public bool AllowZoom
+ {
+ get => _allowZoom;
+
+ set
+ {
+ _allowZoom = value;
+
+ InitialiseZoom();
+ }
+ }
+ ///
+ /// Initialize the support of zoom
+ ///
+ private void InitialiseZoom()
+ {
+ if (_scaler == null)
+ {
+ _scaler = new ScaleTransform(ZoomScale, ZoomScale);
+
+ HexHeaderStackPanel.LayoutTransform = _scaler;
+ HexDataStackPanel.LayoutTransform = _scaler;
+ StringDataStackPanel.LayoutTransform = _scaler;
+ LinesInfoStackPanel.LayoutTransform = _scaler;
+ }
+ }
+
+ ///
+ /// Update the zoom to ScaleX, ScaleY value if AllowZoom is true
+ ///
+ private void UpdateZoom()
+ {
+ if (AllowZoom)
+ {
+ if (_scaler == null) InitialiseZoom();
+ _scaler.ScaleY = ZoomScale;
+ _scaler.ScaleX = ZoomScale;
+
+ //TODO: Update caret size...
+
+ ClearLineInfo();
+ ClearAllBytes(true);
+ RefreshView(true);
+ }
+ }
+
+ ///
+ /// Reset the zoom to 100%
+ ///
+ public void ResetZoom() => ZoomScale = 1.0;
+
+ private void ZoomResetButton_Click(object sender, RoutedEventArgs e) => ResetZoom();
+ #endregion
+
+ #region Delete byte support
+ ///
+ /// Allow to delete byte on control
+ ///
+ public bool AllowDeleteByte
+ {
+ get { return (bool)GetValue(AllowDeleteByteProperty); }
+ set { SetValue(AllowDeleteByteProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for AllowDeleteByte. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowDeleteByteProperty =
+ DependencyProperty.Register(nameof(AllowDeleteByte), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_DeletePropertyChanged));
+
+ ///
+ /// Hide bytes that are deleted
+ /// TODO: NOT COMPLETED... NEED TO FIX THE FIRST VISIBLE BYTE...
+ ///
+ public bool HideByteDeleted
+ {
+ get { return (bool)GetValue(HideByteDeletedProperty); }
+ set { SetValue(HideByteDeletedProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for HideByteDeleted. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty HideByteDeletedProperty =
+ DependencyProperty.Register(nameof(HideByteDeleted), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(false, Control_DeletePropertyChanged));
+
+ private static void Control_DeletePropertyChanged(DependencyObject d,
+ DependencyPropertyChangedEventArgs e)
+ {
+ if (d is HexEditor ctrl && e.NewValue != e.OldValue)
+ ctrl.RefreshView(true);
+ }
+
+ ///
+ /// Delete selection, add scroll marker and update control
+ ///
+ public void DeleteSelection()
+ {
+ if (!CanDelete) return;
+ if (!CheckIsOpen(_provider)) return;
+
+ var position = SelectionStart > SelectionStop ? SelectionStop : SelectionStart;
+ var firstbyte = FirstVisibleBytePosition;
+
+ _provider.AddByteDeleted(position, SelectionLength);
+
+ SetScrollMarker(position, ScrollMarker.ByteDeleted);
+
+ UpdateScrollBar();
+ RefreshView(true);
+
+ //Update selection
+ SetPosition(firstbyte);
+ UnSelectAll(true);
+
+ //Launch deleted event
+ BytesDeleted?.Invoke(this, new EventArgs());
+ }
+
+ #endregion
+
+ #region Byte click and double click support
+
+ ///
+ /// Select all same byte of SelectionStart in rage of SelectionStart at double click
+ ///
+ public bool AllowAutoSelectSameByteAtDoubleClick
+ {
+ get { return (bool)GetValue(AllowAutoSelectSameByteAtDoubleClickProperty); }
+ set { SetValue(AllowAutoSelectSameByteAtDoubleClickProperty, value); }
+ }
+
+ // Using a DependencyProperty as the backing store for AllowAutoSelectSameByteAtDoubleClick. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty AllowAutoSelectSameByteAtDoubleClickProperty =
+ DependencyProperty.Register(nameof(AllowAutoSelectSameByteAtDoubleClick), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(true, Control_AllowAutoSelectSameByteAtDoubleClick));
+
+ private static void Control_AllowAutoSelectSameByteAtDoubleClick(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ ctrl.RefreshView();
+ }
+
+ private void Control_Click(object sender, EventArgs e)
+ {
+ if (!(sender is IByteControl ctrl)) return;
+
+ if (Keyboard.Modifiers == ModifierKeys.Shift)
+ SelectionStop = ctrl.BytePositionInStream;
+ else
+ SelectionStart = SelectionStop = ctrl.BytePositionInStream;
+
+ UpdateSelectionColor(ctrl is StringByte ? FirstColor.StringByteData : FirstColor.HexByteData);
+ UpdateVisual();
+
+ //launch click event
+ ByteClick?.Invoke(sender, e);
+ }
+
+ private void Control_DoubleClick(object sender, EventArgs e)
+ {
+ if (!(sender is IByteControl ctrl)) return;
+ if (!CheckIsOpen(_provider)) return;
+
+ #region Select all same byte of SelectionStart in rage of selectionStart
+ if (AllowAutoSelectSameByteAtDoubleClick)
+ {
+ var (singleByte, succes) = _provider.GetByte(SelectionStart);
+ if (succes)
+ {
+ var startPosition = SelectionStart;
+ var stopPosition = SelectionStop;
+
+ //Selection start
+ while (_provider.GetByte(GetValidPositionFrom(startPosition--, -1)).singleByte == singleByte && startPosition > 0)
+ SelectionStart = startPosition;
+
+ //Selection stop
+ while (_provider.GetByte(GetValidPositionFrom(stopPosition++, 1)).singleByte == singleByte && stopPosition < _provider.Length)
+ SelectionStop = stopPosition;
+ }
+ }
+ #endregion
+
+ UpdateSelectionColor(ctrl is StringByte ? FirstColor.StringByteData : FirstColor.HexByteData);
+ UpdateVisual();
+
+ //launch click event
+ ByteDoubleClick?.Invoke(sender, e);
+ }
+ #endregion
+
+ #region WORK IN PROGRESS // CustomBackgroundBlock implementation
+
+ ///
+ /// Use CustomBackgroundBlock in the control
+ /// ONLY DETECT EXE FILE FOR NOW... NOT POSSIBLE TO CREATE OWN CBB (WILL BE POSSIBLE SOON)
+ ///
+ public bool UseCustomBackGroudBlock
+ {
+ get => (bool)GetValue(UseCustomBackGroudBlockProperty);
+ set => SetValue(UseCustomBackGroudBlockProperty, value);
+ }
+
+ // Using a DependencyProperty as the backing store for UseCustomBackGroudBlock. This enables animation, styling, binding, etc...
+ public static readonly DependencyProperty UseCustomBackGroudBlockProperty =
+ DependencyProperty.Register(nameof(UseCustomBackGroudBlock), typeof(bool), typeof(HexEditor),
+ new FrameworkPropertyMetadata(false, Control_UseCustomBackGroudBlockPropertyChanged));
+
+ private static void Control_UseCustomBackGroudBlockPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return;
+
+ ctrl.RefreshView();
+ }
+
+ private List _cbbList = new List();
+
+ internal CustomBackgroundBlock GetCustomBackgroundBlock(long BytePositionInStream) =>
+ _cbbList?.FirstOrDefault(cbb => BytePositionInStream >= cbb.StartOffset &&
+ BytePositionInStream <= cbb.StopOffset);
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/HexViewer.xaml b/FModel/Forms/HexViewer/HexViewer.xaml
new file mode 100644
index 00000000..204445cf
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexViewer.xaml
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Forms/HexViewer/HexViewer.xaml.cs b/FModel/Forms/HexViewer/HexViewer.xaml.cs
new file mode 100644
index 00000000..fb9c6925
--- /dev/null
+++ b/FModel/Forms/HexViewer/HexViewer.xaml.cs
@@ -0,0 +1,217 @@
+using Microsoft.Win32;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using WpfHexaEditor.Core;
+using WpfHexaEditor.Core.CharacterTable;
+using WpfHexaEditor.Dialog;
+using FModel.Properties;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Forms.HexViewer
+{
+ ///
+ /// Logique d'interaction pour HexViewer.xaml
+ ///
+ public partial class HexViewer : Window
+ {
+ private enum SettingEnum
+ {
+ HeaderVisibility,
+ ReadOnly,
+ ScrollVisibility,
+ StatusBarVisibility
+ }
+
+ public HexViewer()
+ {
+ InitializeComponent();
+
+ UpdateAllSettings();
+ }
+
+ private void OpenMenu_Click(object sender, RoutedEventArgs e)
+ {
+ var fileDialog = new OpenFileDialog();
+ //fileDialog.InitialDirectory = FProp.Default.FOutput_Path + "\\Exports\\";
+
+ if (fileDialog.ShowDialog() != null && File.Exists(fileDialog.FileName))
+ {
+ Application.Current.MainWindow.Cursor = Cursors.Wait;
+
+ HexEdit.FileName = fileDialog.FileName;
+ TabHexEditor.Header = Path.GetFileName(fileDialog.FileName);
+
+ Application.Current.MainWindow.Cursor = null;
+ }
+ }
+
+ private void SaveMenu_Click(object sender, RoutedEventArgs e)
+ {
+ Application.Current.MainWindow.Cursor = Cursors.Wait;
+ //HexEdit.SaveTBLFile();
+ HexEdit.SubmitChanges();
+ Application.Current.MainWindow.Cursor = null;
+ }
+
+ private void CloseFileMenu_Click(object sender, RoutedEventArgs e) => HexEdit.CloseProvider();
+
+ private void SetReadOnlyMenu_Click(object sender, RoutedEventArgs e) => UpdateSetting(SettingEnum.ReadOnly);
+
+ private void ShowHeaderMenu_Click(object sender, RoutedEventArgs e) => UpdateSetting(SettingEnum.HeaderVisibility);
+
+ private void StatusBarVisibility_Click(object sender, RoutedEventArgs e) => UpdateSetting(SettingEnum.StatusBarVisibility);
+
+ private void UpdateSetting(SettingEnum setting)
+ {
+ switch (setting)
+ {
+ case SettingEnum.HeaderVisibility:
+ HexEdit.HeaderVisibility = !Settings.Default.HeaderVisibility
+ ? Visibility.Collapsed
+ : Visibility.Visible;
+ Settings.Default.HeaderVisibility = HexEdit.HeaderVisibility == Visibility.Visible;
+ break;
+ case SettingEnum.ReadOnly:
+ HexEdit.ReadOnlyMode = Settings.Default.ReadOnly;
+
+ HexEdit.ClearAllChange();
+ HexEdit.RefreshView();
+ break;
+ case SettingEnum.StatusBarVisibility:
+ HexEdit.StatusBarVisibility = !Settings.Default.StatusBarVisibility
+ ? Visibility.Collapsed
+ : Visibility.Visible;
+
+ Settings.Default.StatusBarVisibility = HexEdit.StatusBarVisibility == Visibility.Visible;
+ break;
+ }
+ }
+
+ private void UpdateAllSettings()
+ {
+ UpdateSetting(SettingEnum.HeaderVisibility);
+ UpdateSetting(SettingEnum.ReadOnly);
+ UpdateSetting(SettingEnum.ScrollVisibility);
+ }
+
+ private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ HexEdit.CloseProvider();
+ Settings.Default.Save();
+ }
+
+ private void ExitMenu_Click(object sender, RoutedEventArgs e) => Close();
+
+ private void CopyHexaMenu_Click(object sender, RoutedEventArgs e) => HexEdit.CopyToClipboard(CopyPasteMode.HexaString);
+
+ private void CopyStringMenu_Click(object sender, RoutedEventArgs e) => HexEdit.CopyToClipboard();
+
+ private void DeleteSelectionMenu_Click(object sender, RoutedEventArgs e) => HexEdit.DeleteSelection();
+
+ private void GOPosition_Click(object sender, RoutedEventArgs e)
+ {
+ if (long.TryParse(PositionText.Text, out var position))
+ HexEdit.SetPosition(position, 1);
+ else
+ MessageBox.Show("Enter long value.");
+
+ ViewMenu.IsSubmenuOpen = false;
+ }
+
+ private void PositionText_TextChanged(object sender, TextChangedEventArgs e) =>
+ GoPositionButton.IsEnabled = long.TryParse(PositionText.Text, out var _);
+
+ private void UndoMenu_Click(object sender, RoutedEventArgs e) => HexEdit.Undo();
+
+ private void RedoMenu_Click(object sender, RoutedEventArgs e) => HexEdit.Redo();
+
+ private void SetBookMarkButton_Click(object sender, RoutedEventArgs e) => HexEdit.SetBookMark();
+
+ private void DeleteBookmark_Click(object sender, RoutedEventArgs e) => HexEdit.ClearScrollMarker(ScrollMarker.Bookmark);
+
+ private void FindAllSelection_Click(object sender, RoutedEventArgs e) => HexEdit.FindAllSelection(true);
+
+ private void SelectAllButton_Click(object sender, RoutedEventArgs e) => HexEdit.SelectAll();
+
+ private void CTableASCIIButton_Click(object sender, RoutedEventArgs e)
+ {
+ HexEdit.TypeOfCharacterTable = CharacterTableType.Ascii;
+ CTableAsciiButton.IsChecked = true;
+ CTableTblButton.IsChecked = false;
+ CTableTblDefaultAsciiButton.IsChecked = false;
+ }
+
+ private void CTableTBLButton_Click(object sender, RoutedEventArgs e)
+ {
+ var fileDialog = new OpenFileDialog();
+
+ if (fileDialog.ShowDialog() != null)
+ {
+ if (File.Exists(fileDialog.FileName))
+ {
+ Application.Current.MainWindow.Cursor = Cursors.Wait;
+
+ HexEdit.LoadTblFile(fileDialog.FileName);
+ HexEdit.TypeOfCharacterTable = CharacterTableType.TblFile;
+ CTableAsciiButton.IsChecked = false;
+ CTableTblButton.IsChecked = true;
+ CTableTblDefaultAsciiButton.IsChecked = false;
+
+ Application.Current.MainWindow.Cursor = null;
+ }
+ }
+ }
+
+ private void CTableTBLDefaultASCIIButton_Click(object sender, RoutedEventArgs e)
+ {
+ Application.Current.MainWindow.Cursor = Cursors.Wait;
+
+ HexEdit.TypeOfCharacterTable = CharacterTableType.TblFile;
+ HexEdit.LoadDefaultTbl();
+
+ Application.Current.MainWindow.Cursor = null;
+ }
+
+ private void SaveAsMenu_Click(object sender, RoutedEventArgs e)
+ {
+ var fileDialog = new SaveFileDialog();
+
+ if (fileDialog.ShowDialog() != null)
+ HexEdit.SubmitChanges(fileDialog.FileName, true);
+ }
+
+ private void CTableTblDefaultEBCDICButton_Click(object sender, RoutedEventArgs e)
+ {
+ Application.Current.MainWindow.Cursor = Cursors.Wait;
+
+ HexEdit.TypeOfCharacterTable = CharacterTableType.TblFile;
+ HexEdit.LoadDefaultTbl(DefaultCharacterTableType.EbcdicWithSpecialChar);
+
+ Application.Current.MainWindow.Cursor = null;
+ }
+
+ private void CTableTblDefaultEBCDICNoSPButton_Click(object sender, RoutedEventArgs e)
+ {
+ Application.Current.MainWindow.Cursor = Cursors.Wait;
+
+ HexEdit.TypeOfCharacterTable = CharacterTableType.TblFile;
+ HexEdit.LoadDefaultTbl(DefaultCharacterTableType.EbcdicNoSpecialChar);
+
+ Application.Current.MainWindow.Cursor = null;
+ }
+
+ private void FindMenu_Click(object sender, RoutedEventArgs e) =>
+ new FindWindow(HexEdit, HexEdit.SelectionByteArray)
+ {
+ Owner = this
+ }.Show();
+
+ private void ReplaceMenu_Click(object sender, RoutedEventArgs e) =>
+ new FindReplaceWindow(HexEdit, HexEdit.SelectionByteArray)
+ {
+ Owner = this
+ }.Show();
+ }
+}
diff --git a/FModel/Forms/HexViewer/MiscelanousDictionary.xaml b/FModel/Forms/HexViewer/MiscelanousDictionary.xaml
new file mode 100644
index 00000000..4f339787
--- /dev/null
+++ b/FModel/Forms/HexViewer/MiscelanousDictionary.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/ReplaceByteWindow.xaml b/FModel/Forms/HexViewer/ReplaceByteWindow.xaml
new file mode 100644
index 00000000..1e2a0663
--- /dev/null
+++ b/FModel/Forms/HexViewer/ReplaceByteWindow.xaml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/ReplaceByteWindow.xaml.cs b/FModel/Forms/HexViewer/ReplaceByteWindow.xaml.cs
new file mode 100644
index 00000000..be175eea
--- /dev/null
+++ b/FModel/Forms/HexViewer/ReplaceByteWindow.xaml.cs
@@ -0,0 +1,14 @@
+using System.Windows;
+
+namespace WpfHexaEditor.Dialog
+{
+ ///
+ /// This Window is used to give tow hex value for deal with.
+ ///
+ internal partial class ReplaceByteWindow
+ {
+ public ReplaceByteWindow() => InitializeComponent();
+
+ private void OKButton_Click(object sender, RoutedEventArgs e) => DialogResult = true;
+ }
+}
\ No newline at end of file
diff --git a/FModel/Forms/HexViewer/StringByte.cs b/FModel/Forms/HexViewer/StringByte.cs
new file mode 100644
index 00000000..e274d085
--- /dev/null
+++ b/FModel/Forms/HexViewer/StringByte.cs
@@ -0,0 +1,299 @@
+//////////////////////////////////////////////
+// Apache 2.0 - 2016-2019
+// Author : Derek Tremblay (derektremblay666@gmail.com)
+// Contributor: Janus Tida
+//////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Input;
+using System.Windows.Media;
+using WpfHexaEditor.Core;
+using WpfHexaEditor.Core.Bytes;
+using WpfHexaEditor.Core.CharacterTable;
+
+namespace WpfHexaEditor
+{
+ internal class StringByte : BaseByte
+ {
+ #region Global class variables
+
+ private bool _tblShowMte = true;
+
+ #endregion Global variable
+
+ #region Contructor
+
+ public StringByte(HexEditor parent) : base(parent)
+ {
+
+ }
+
+ #endregion Contructor
+
+ #region Properties
+
+ ///
+ /// Next Byte of this instance (used for TBL/MTE decoding)
+ ///
+ public byte? ByteNext { get; set; }
+
+ #endregion Properties
+
+ #region Characters tables
+
+ ///
+ /// Show or not Multi Title Enconding (MTE) are loaded in TBL file
+ ///
+ public bool TblShowMte
+ {
+ get => _tblShowMte;
+ set
+ {
+ _tblShowMte = value;
+ UpdateTextRenderFromByte();
+ }
+ }
+
+ ///
+ /// Type of caracter table are used un hexacontrol.
+ /// For now, somes character table can be readonly but will change in future
+ ///
+ public CharacterTableType TypeOfCharacterTable { get; set; }
+
+ ///
+ /// Custom character table
+ ///
+ public TblStream TblCharacterTable { get; set; }
+
+ #endregion Characters tables
+
+ #region Methods
+
+ ///
+ /// Update the render of text derived bytecontrol from byte property
+ ///
+ public override void UpdateTextRenderFromByte()
+ {
+ if (Byte != null)
+ {
+ switch (TypeOfCharacterTable)
+ {
+ case CharacterTableType.Ascii:
+ Text = ByteConverters.ByteToChar(Byte.Value).ToString();
+ break;
+ case CharacterTableType.TblFile:
+ if (TblCharacterTable != null)
+ {
+ ReadOnlyMode = !TblCharacterTable.AllowEdit;
+
+ var content = "#";
+
+ if (TblShowMte && ByteNext.HasValue)
+ content = TblCharacterTable.FindMatch(ByteConverters.ByteToHex(Byte.Value) +
+ ByteConverters.ByteToHex(ByteNext.Value), true);
+
+ if (content == "#")
+ content = TblCharacterTable.FindMatch(ByteConverters.ByteToHex(Byte.Value), true);
+
+ Text = content;
+ }
+ else
+ goto case CharacterTableType.Ascii;
+ break;
+ }
+ }
+ else
+ Text = string.Empty;
+ }
+
+ ///
+ /// Update Background,foreground and font property
+ ///
+ public override void UpdateVisual()
+ {
+ if (IsSelected)
+ {
+ FontWeight = _parent.FontWeight;
+ Foreground = _parent.ForegroundContrast;
+
+ Background = FirstSelected ? _parent.SelectionFirstColor : _parent.SelectionSecondColor;
+ }
+ else if (IsHighLight)
+ {
+ FontWeight = _parent.FontWeight;
+ Foreground = _parent.Foreground;
+ Background = _parent.HighLightColor;
+ }
+ else if (Action != ByteAction.Nothing)
+ {
+ switch (Action)
+ {
+ case ByteAction.Modified:
+ FontWeight = FontWeights.Bold;
+ Background = _parent.ByteModifiedColor;
+ Foreground = _parent.Foreground;
+ break;
+
+ case ByteAction.Deleted:
+ FontWeight = FontWeights.Bold;
+ Background = _parent.ByteDeletedColor;
+ Foreground = _parent.Foreground;
+ break;
+ }
+ }
+ else
+ {
+ #region TBL COLORING
+ var cbb = _parent.GetCustomBackgroundBlock(BytePositionInStream);
+
+ Description = cbb != null ? cbb.Description : "";
+
+ Background = cbb != null ? cbb.Color : Brushes.Transparent;
+ FontWeight = _parent.FontWeight;
+ Foreground = _parent.Foreground;
+
+ if (TypeOfCharacterTable == CharacterTableType.TblFile)
+ switch (Dte.TypeDte(Text))
+ {
+ case DteType.DualTitleEncoding:
+ Foreground = _parent.TbldteColor;
+ break;
+ case DteType.MultipleTitleEncoding:
+ Foreground = _parent.TblmteColor;
+ break;
+ case DteType.EndLine:
+ Foreground = _parent.TblEndLineColor;
+ break;
+ case DteType.EndBlock:
+ Foreground = _parent.TblEndBlockColor;
+ break;
+ default:
+ Foreground = _parent.TblDefaultColor;
+ break;
+ }
+
+ #endregion
+ }
+
+ UpdateAutoHighLiteSelectionByteVisual();
+
+ InvalidateVisual();
+ }
+
+ ///
+ /// Render the control
+ ///
+ protected override void OnRender(DrawingContext dc)
+ {
+ base.OnRender(dc);
+
+ #region Update width of control
+ //It's 8-10 time more fastest to update width on render for TBL string
+ switch (TypeOfCharacterTable)
+ {
+ case CharacterTableType.Ascii:
+ Width = 12;
+ break;
+ case CharacterTableType.TblFile:
+ Width = TextFormatted?.Width > 12 ? TextFormatted.Width : 12;
+ break;
+ }
+ #endregion
+ }
+
+ ///
+ /// Clear control
+ ///
+ public override void Clear()
+ {
+ base.Clear();
+ ByteNext = null;
+ }
+
+ #endregion Methods
+
+ #region Events delegate
+
+ protected override void OnKeyDown(KeyEventArgs e)
+ {
+ if (Byte == null) return;
+
+ if (KeyValidation(e)) return;
+
+ //MODIFY ASCII...
+ if (!ReadOnlyMode)
+ {
+ var isok = false;
+
+ if (Keyboard.GetKeyStates(Key.CapsLock) == KeyStates.Toggled)
+ {
+ if (Keyboard.Modifiers != ModifierKeys.Shift && Keyboard.Modifiers != ModifierKeys.Control &&
+ e.Key != Key.RightShift && e.Key != Key.LeftShift)
+ {
+ Text = KeyValidator.GetCharFromKey(e.Key).ToString();
+ isok = true;
+ }
+ else if (Keyboard.Modifiers == ModifierKeys.Shift && Keyboard.Modifiers != ModifierKeys.Control &&
+ e.Key != Key.RightShift && e.Key != Key.LeftShift)
+ {
+ isok = true;
+ Text = KeyValidator.GetCharFromKey(e.Key).ToString().ToLower();
+ }
+ }
+ else
+ {
+ if (Keyboard.Modifiers != ModifierKeys.Shift && Keyboard.Modifiers != ModifierKeys.Control &&
+ e.Key != Key.RightShift && e.Key != Key.LeftShift)
+ {
+ Text = KeyValidator.GetCharFromKey(e.Key).ToString().ToLower();
+ isok = true;
+ }
+ else if (Keyboard.Modifiers == ModifierKeys.Shift && Keyboard.Modifiers != ModifierKeys.Control &&
+ e.Key != Key.RightShift && e.Key != Key.LeftShift)
+ {
+ isok = true;
+ Text = KeyValidator.GetCharFromKey(e.Key).ToString();
+ }
+ }
+
+ //Move focus event
+ if (isok)
+ {
+ Action = ByteAction.Modified;
+ Byte = ByteConverters.CharToByte(Text[0]);
+
+ //Insert byte at end of file
+ if (_parent.Length == BytePositionInStream + 1)
+ {
+ byte[] byteToAppend = { 0 };
+ _parent.AppendByte(byteToAppend);
+ }
+
+ OnMoveNext(new EventArgs());
+ }
+ }
+
+ base.OnKeyDown(e);
+ }
+
+ #endregion Events delegate
+
+ #region Caret events
+
+ protected override void OnGotFocus(RoutedEventArgs e)
+ {
+ //TODO: complete caret implemention ....
+
+ _parent.SetCaretMode(CaretMode.Overwrite);
+
+ if (ReadOnlyMode || Byte == null)
+ _parent.HideCaret();
+ else
+ _parent.MoveCaret(TransformToAncestor(_parent).Transform(new Point(0, 0)));
+
+ base.OnGotFocus(e);
+ }
+ #endregion
+ }
+}
diff --git a/FModel/Forms/HexViewer/ToolTipDictionary.xaml b/FModel/Forms/HexViewer/ToolTipDictionary.xaml
new file mode 100644
index 00000000..7f34ebb6
--- /dev/null
+++ b/FModel/Forms/HexViewer/ToolTipDictionary.xaml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FModel/Forms/MergeImages.Designer.cs b/FModel/Forms/MergeImages.Designer.cs
deleted file mode 100644
index b98dcb59..00000000
--- a/FModel/Forms/MergeImages.Designer.cs
+++ /dev/null
@@ -1,240 +0,0 @@
-namespace FModel.Forms
-{
- partial class MergeImages
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MergeImages));
- this.listBox1 = new System.Windows.Forms.ListBox();
- this.button1 = new System.Windows.Forms.Button();
- this.button2 = new System.Windows.Forms.Button();
- this.button3 = new System.Windows.Forms.Button();
- this.button4 = new System.Windows.Forms.Button();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.button7 = new System.Windows.Forms.Button();
- this.button6 = new System.Windows.Forms.Button();
- this.trackBar1 = new System.Windows.Forms.TrackBar();
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.button5 = new System.Windows.Forms.Button();
- this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
- this.progressBar1 = new System.Windows.Forms.ProgressBar();
- this.label1 = new System.Windows.Forms.Label();
- this.groupBox1.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.SuspendLayout();
- //
- // listBox1
- //
- this.listBox1.FormattingEnabled = true;
- this.listBox1.Location = new System.Drawing.Point(6, 48);
- this.listBox1.Name = "listBox1";
- this.listBox1.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
- this.listBox1.Size = new System.Drawing.Size(307, 238);
- this.listBox1.TabIndex = 0;
- //
- // button1
- //
- this.button1.Location = new System.Drawing.Point(6, 19);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(75, 23);
- this.button1.TabIndex = 1;
- this.button1.Text = "Add Images";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // button2
- //
- this.button2.ForeColor = System.Drawing.SystemColors.ControlText;
- this.button2.Location = new System.Drawing.Point(515, 309);
- this.button2.Name = "button2";
- this.button2.Size = new System.Drawing.Size(100, 23);
- this.button2.TabIndex = 2;
- this.button2.Text = "Save Image";
- this.button2.UseVisualStyleBackColor = true;
- this.button2.Click += new System.EventHandler(this.button2_Click);
- //
- // button3
- //
- this.button3.Location = new System.Drawing.Point(122, 19);
- this.button3.Name = "button3";
- this.button3.Size = new System.Drawing.Size(75, 23);
- this.button3.TabIndex = 3;
- this.button3.Text = "Remove";
- this.button3.UseVisualStyleBackColor = true;
- this.button3.Click += new System.EventHandler(this.button3_Click);
- //
- // button4
- //
- this.button4.ForeColor = System.Drawing.Color.Red;
- this.button4.Location = new System.Drawing.Point(238, 19);
- this.button4.Name = "button4";
- this.button4.Size = new System.Drawing.Size(75, 23);
- this.button4.TabIndex = 4;
- this.button4.Text = "Clear";
- this.button4.UseVisualStyleBackColor = true;
- this.button4.Click += new System.EventHandler(this.button4_Click);
- //
- // groupBox1
- //
- this.groupBox1.Controls.Add(this.button7);
- this.groupBox1.Controls.Add(this.button6);
- this.groupBox1.Controls.Add(this.button1);
- this.groupBox1.Controls.Add(this.listBox1);
- this.groupBox1.Controls.Add(this.button3);
- this.groupBox1.Controls.Add(this.button4);
- this.groupBox1.Location = new System.Drawing.Point(12, 12);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(319, 320);
- this.groupBox1.TabIndex = 7;
- this.groupBox1.TabStop = false;
- this.groupBox1.Text = "List";
- //
- // button7
- //
- this.button7.Location = new System.Drawing.Point(202, 291);
- this.button7.Name = "button7";
- this.button7.Size = new System.Drawing.Size(51, 23);
- this.button7.TabIndex = 6;
- this.button7.Text = "Down";
- this.button7.UseVisualStyleBackColor = true;
- this.button7.Click += new System.EventHandler(this.button7_Click);
- //
- // button6
- //
- this.button6.Location = new System.Drawing.Point(66, 291);
- this.button6.Name = "button6";
- this.button6.Size = new System.Drawing.Size(51, 23);
- this.button6.TabIndex = 5;
- this.button6.Text = "Up";
- this.button6.UseVisualStyleBackColor = true;
- this.button6.Click += new System.EventHandler(this.button6_Click);
- //
- // trackBar1
- //
- this.trackBar1.LargeChange = 0;
- this.trackBar1.Location = new System.Drawing.Point(337, 268);
- this.trackBar1.Maximum = 20;
- this.trackBar1.Minimum = 1;
- this.trackBar1.Name = "trackBar1";
- this.trackBar1.Size = new System.Drawing.Size(278, 45);
- this.trackBar1.SmallChange = 0;
- this.trackBar1.TabIndex = 1;
- this.trackBar1.Value = 7;
- this.trackBar1.Scroll += new System.EventHandler(this.TrackBar1_Scroll);
- //
- // pictureBox1
- //
- this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.pictureBox1.Location = new System.Drawing.Point(337, 18);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(278, 244);
- this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.pictureBox1.TabIndex = 9;
- this.pictureBox1.TabStop = false;
- //
- // button5
- //
- this.button5.ForeColor = System.Drawing.SystemColors.ControlText;
- this.button5.Location = new System.Drawing.Point(409, 309);
- this.button5.Name = "button5";
- this.button5.Size = new System.Drawing.Size(100, 23);
- this.button5.TabIndex = 10;
- this.button5.Text = "Open Image";
- this.button5.UseVisualStyleBackColor = true;
- this.button5.Click += new System.EventHandler(this.Button5_Click);
- //
- // backgroundWorker1
- //
- this.backgroundWorker1.WorkerReportsProgress = true;
- this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundWorker1_DoWork);
- this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.BackgroundWorker1_ProgressChanged);
- this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BackgroundWorker1_RunWorkerCompleted);
- //
- // progressBar1
- //
- this.progressBar1.Location = new System.Drawing.Point(12, 338);
- this.progressBar1.Name = "progressBar1";
- this.progressBar1.Size = new System.Drawing.Size(603, 16);
- this.progressBar1.Step = 1;
- this.progressBar1.TabIndex = 11;
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.ForeColor = System.Drawing.Color.Red;
- this.label1.Location = new System.Drawing.Point(337, 314);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(68, 13);
- this.label1.TabIndex = 12;
- this.label1.Text = "Delay 300ms";
- //
- // MergeImages
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(636, 364);
- this.Controls.Add(this.label1);
- this.Controls.Add(this.progressBar1);
- this.Controls.Add(this.button5);
- this.Controls.Add(this.pictureBox1);
- this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.button2);
- this.Controls.Add(this.trackBar1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.Name = "MergeImages";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "Merge Images";
- this.Load += new System.EventHandler(this.MergeImages_Load);
- this.groupBox1.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.ListBox listBox1;
- private System.Windows.Forms.Button button1;
- private System.Windows.Forms.Button button2;
- private System.Windows.Forms.Button button3;
- private System.Windows.Forms.Button button4;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.TrackBar trackBar1;
- private System.Windows.Forms.PictureBox pictureBox1;
- private System.Windows.Forms.Button button5;
- private System.ComponentModel.BackgroundWorker backgroundWorker1;
- private System.Windows.Forms.ProgressBar progressBar1;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Button button7;
- private System.Windows.Forms.Button button6;
- }
-}
diff --git a/FModel/Forms/MergeImages.cs b/FModel/Forms/MergeImages.cs
deleted file mode 100644
index dcfbc5a4..00000000
--- a/FModel/Forms/MergeImages.cs
+++ /dev/null
@@ -1,324 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.IO;
-using System.Windows.Forms;
-using System.Web.UI.WebControls;
-using Button = System.Windows.Forms.Button;
-using Image = System.Drawing.Image;
-using System.Drawing;
-using System.Globalization;
-using FModel.Properties;
-using System.Drawing.Imaging;
-
-namespace FModel.Forms
-{
- public partial class MergeImages : Form
- {
- private static List selectedImages { get; set; }
- private static Bitmap bmp { get; set; }
- private static Timer _scrollingTimer = null;
- private static List allControls { get; set; }
-
- public MergeImages()
- {
- InitializeComponent();
- AddAllControls();
- }
-
- private void MergeImages_Load(object sender, EventArgs e)
- {
- listBox1.Items.Clear();
- }
-
- private void button1_Click(object sender, EventArgs e)
- {
- OpenFileDialog theDialog = new OpenFileDialog();
- theDialog.Multiselect = true;
- theDialog.InitialDirectory = App.DefaultOutputPath + "\\Icons\\";
- theDialog.Title = @"Choose your images";
- theDialog.Filter = @"PNG Files (*.png)|*.png|JPEG Files (*.jpg)|*.jpg|BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*";
-
- if (theDialog.ShowDialog() == DialogResult.OK)
- {
- AddFiles(theDialog.FileNames);
-
- ReloadImages();
- }
- }
- private void AddFiles(string[] files)
- {
- if (files.Count() > 0)
- {
- foreach (string file in files)
- {
- listBox1.Items.Add(new ListItem(Path.GetFileName(file), file));
- }
- }
- }
- private void mergeImages(List mySelectedImages)
- {
- int numperrow = 7;
- Invoke(new Action(() =>
- {
- numperrow = trackBar1.Value;
- }));
- var w = 527 * numperrow;
- if (mySelectedImages.Count * 527 < 527 * numperrow)
- {
- w = mySelectedImages.Count * 527;
- }
-
- int h = int.Parse(Math.Ceiling(double.Parse(mySelectedImages.Count.ToString()) / numperrow).ToString(CultureInfo.InvariantCulture)) * 527;
- bmp = new Bitmap(w - 5, h - 5);
-
- var num = 1;
- var curW = 0;
- var curH = 0;
-
- for (int i = 0; i < mySelectedImages.Count; i++)
- {
- int percentage = (i + 1) * 100 / mySelectedImages.Count;
- backgroundWorker1.ReportProgress(percentage);
-
- using (Graphics g = Graphics.FromImage(bmp))
- {
- g.DrawImage(ImageUtilities.ResizeImage(mySelectedImages[i], 522, 522), new PointF(curW, curH));
- if (num % numperrow == 0)
- {
- curW = 0;
- curH += 527;
- num += 1;
- }
- else
- {
- curW += 527;
- num += 1;
- }
- }
- }
- }
-
- private void button2_Click(object sender, EventArgs e)
- {
- if (pictureBox1.Image != null)
- {
- SaveFileDialog saveTheDialog = new SaveFileDialog();
- saveTheDialog.Title = @"Save Icon";
- saveTheDialog.Filter = @"PNG Files (*.png)|*.png";
- saveTheDialog.InitialDirectory = App.DefaultOutputPath;
- saveTheDialog.FileName = "Merger";
- if (saveTheDialog.ShowDialog() == DialogResult.OK)
- {
- pictureBox1.Image.Save(saveTheDialog.FileName, ImageFormat.Png);
- new UpdateMyConsole(Path.GetFileNameWithoutExtension(saveTheDialog.FileName), Color.Crimson).AppendToConsole();
- new UpdateMyConsole(" successfully saved", Color.Black, true).AppendToConsole();
- }
- }
- }
-
- private void button3_Click(object sender, EventArgs e)
- {
- if (listBox1.Items.Count > 0 && listBox1.SelectedIndices.Count > 0)
- {
- for (int i = listBox1.SelectedIndices.Count - 1; i >= 0; --i)
- {
- listBox1.Items.RemoveAt(listBox1.SelectedIndices[i]);
- }
-
- ReloadImages();
- }
- }
-
- private void button4_Click(object sender, EventArgs e)
- {
- listBox1.Items.Clear();
- pictureBox1.Image = null;
- progressBar1.Value = 0;
- }
-
- private void Button5_Click(object sender, EventArgs e)
- {
- if (pictureBox1.Image != null)
- {
- var newForm = new Form();
- PictureBox pb = new PictureBox();
- pb.Dock = DockStyle.Fill;
- pb.Image = pictureBox1.Image;
- pb.SizeMode = PictureBoxSizeMode.Zoom;
-
- newForm.WindowState = FormWindowState.Maximized;
- newForm.Size = pb.Image.Size;
- newForm.Icon = Resources.FModel;
- newForm.Text = "Temporary Merged Image";
- newForm.StartPosition = FormStartPosition.CenterScreen;
- newForm.Controls.Add(pb);
- newForm.Show();
- }
- }
-
- private void BackgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
- {
- if ((selectedImages != null && selectedImages.Count > 0) || listBox1.Items.Count > 0)
- {
- selectedImages = new List();
- for (int i = 0; i < listBox1.Items.Count; ++i)
- {
- selectedImages.Add(Image.FromFile(((ListItem)listBox1.Items[i]).Value));
- }
- mergeImages(selectedImages);
- }
- }
-
- private void BackgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
- {
- if (bmp != null)
- {
- pictureBox1.Image = bmp;
- }
-
- GC.Collect();
- backgroundWorker1.Dispose();
-
- if (allControls.Count > 0)
- {
- foreach (Control control in allControls)
- {
- if (control != null)
- control.Enabled = true;
- }
- }
- }
-
- private void BackgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
- {
- progressBar1.Value = e.ProgressPercentage;
- }
-
- private void TrackBar1_Scroll(object sender, EventArgs e)
- {
- if (_scrollingTimer == null)
- {
- _scrollingTimer = new Timer()
- {
- Enabled = false,
- Interval = 300,
- Tag = (sender as TrackBar).Value
- };
- _scrollingTimer.Tick += (s, ea) =>
- {
- // check to see if the value has changed since we last ticked
- if (trackBar1.Value == (int)_scrollingTimer.Tag)
- {
- // scrolling has stopped so we are good to go ahead and do stuff
- _scrollingTimer.Stop();
-
- ReloadImages();
-
- _scrollingTimer.Dispose();
- _scrollingTimer = null;
- }
- else
- {
- // record the last value seen
- _scrollingTimer.Tag = trackBar1.Value;
- }
- };
- _scrollingTimer.Start();
- }
- }
-
- private void button6_Click(object sender, EventArgs e)
- {
- // Up
- bool reloadImage = false;
- listBox1.BeginUpdate();
- int[] indices = listBox1.SelectedIndices.Cast().ToArray();
- if (indices.Length > 0 && indices[0] > 0)
- {
- for (int i = 0; i < listBox1.Items.Count; ++i)
- {
- if (indices.Contains(i))
- {
- object moveItem = listBox1.Items[i];
- listBox1.Items.Remove(moveItem);
- listBox1.Items.Insert(i - 1, moveItem);
- listBox1.SetSelected(i - 1, true);
-
- reloadImage = true;
- }
- }
- }
-
- listBox1.EndUpdate();
-
- if (reloadImage)
- ReloadImages();
- }
-
- private void button7_Click(object sender, EventArgs e)
- {
- // Down
- bool reloadImage = false;
- listBox1.BeginUpdate();
- int[] indices = listBox1.SelectedIndices.Cast().ToArray();
- if (indices.Length > 0 && indices[indices.Length - 1] < listBox1.Items.Count - 1)
- {
- for (int i = listBox1.Items.Count - 1; i > -1; --i)
- {
- if (indices.Contains(i))
- {
- object itemTemp = listBox1.Items[i];
- listBox1.Items.Remove(itemTemp);
- listBox1.Items.Insert(i + 1, itemTemp);
- listBox1.SetSelected(i + 1, true);
- reloadImage = true;
- }
- }
- }
-
- listBox1.EndUpdate();
-
- if (reloadImage)
- ReloadImages();
- }
-
- private void ReloadImages()
- {
- if (allControls.Count > 0)
- {
- foreach (Control control in allControls)
- {
- if (control != null)
- control.Enabled = false;
- }
- }
-
- if (backgroundWorker1.IsBusy != true)
- backgroundWorker1.RunWorkerAsync();
- }
-
- private void AddAllControls()
- {
- allControls = new List();
-
- if (Controls.Count > 0)
- {
- foreach (Control control in Controls)
- {
- if (!allControls.Contains(control))
- allControls.Add(control);
- }
- }
-
- if (groupBox1.Controls.Count > 0)
- {
- foreach (Control control in groupBox1.Controls)
- {
- if (!allControls.Contains(control))
- allControls.Add(control);
- }
- }
- }
- }
-}
diff --git a/FModel/Forms/MergeImages.resx b/FModel/Forms/MergeImages.resx
deleted file mode 100644
index 4d8132c9..00000000
--- a/FModel/Forms/MergeImages.resx
+++ /dev/null
@@ -1,1356 +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
-
-
- 17, 17
-
-
-
-
- AAABAAEAAAAAAAEAIAB/HwEAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAgABJ
- REFUeNrsvXe8bVdVNvyMudbae592W2466YEk1NCrNKUrYIMPQRFQRBHEhkpRATtgAQuivgiiIvoKClIV
- pCihl0ASIISQnptbT91lrTm+P0aZY+2bIASSmLw5/EJuzj1n77XXmnPMUZ5S4Wb29eBf+D0c/dFLcOaz
- nwdc2aFZBW77wEfhnj//PBx5+j1w6cfej7Mf+tR77N596qOOO/MuF+3cdtLkLs/4cRx927vhtj/4ZNBX
- Jzh44CLc/2d+a/HIo08/6q7PfPImrqj5Tj/5s8Pt2PXw3Ueeev+T7nr3Lx5x1O3abfVRuPOzfhoXf/i9
- N7fbdOvXrV/f0Fd1s9r8z3kJlo7ZhfWFJTz7Db9Ln3zPObcf7d79gHpxsPeyt3148x7/8Pup/fjVD5zu
- 2fPydmv81G7cHT3YsfSFK951zsHtdzoVH/+9X8Hx93vE6UfsPO0pm1+95Iem+1Z/6tAXLju6OXLXdOML
- 5z19dvDAi7rx7LGzja5bOHbbpwlpdvmb34a7v+hXcfEH333rarn16xb3Rf8bL+o7n/8KMIBEABNhfM1e
- tGtrSE2NC//2vTj9R7575/pXLv2+dnXvT3XTfLvUjN5Xb1v6IxoOds2uueqlPNs8CwAyL3KqB++vl0cv
- utebX/qxz/zkb91rfMXel3bj2UMI44o5ATRoKfFe4vERzG0D1GAsbqbh0h8tHr/yu5NrVg99/uP/ige/
- 5FWgTq7vP1/2M3jwz/22XNuVVyE1NcZ79mD7He6A/3zFL926qm79ujUAfLNf3/VLr8BgeRlpcYS1C7+K
- 9Ysvw77PnI+rrvw0fuD976wuefO7RwBo/eJ9Z25dte953dbBxxGvLgME5hFQLV6daLPibrob3ICRQDQD
- cw2klS81K6N/5slVj8rTzbsACcwLYAaIZgDXYAwAJBBNALTIvH1aDQevHR2z9JKNS/buHd3meDQ7diCh
- Q6or0LDC+pcvxt1e8dz0rvs/NZ/wmIfgqCd/D/a/57/xsb9+5a0r69avWwPAN7Txn/8K7DjieBw4cBmm
- +1ex/9Pn4/Efe2P69yf84tHjvYfu1G5OT+R2dipydyIDQ55N75hnm2cSJmBO8iFoAiIGcwJzAyLo3yUQ
- TQEkgADClr5rA2YCwPpPBeYGAIGIQbSFnBfAvNJVC/XfLxyz6895YenqVA3XUuqm9eKgbXZun0337N+2
- 9pVLnwDuvrxy+tH/uf+TF42PuO8dcM7rfx8PecEr0M06oM1AzkAifPAPXnDrirv169YA4Jv/V16JK979
- AWw/63R89e/fjTv9ytOH+z/9pTMm+w4+ot0cfw+3kztwbreBqZbTutUTmvQfBtAC6ECUkfMIQBM+FmuA
- mOrPVZDT3zb7BERjAAk5D0A0A1HW3yMwD8FomNLgGka9DtB6qtMaqno1VbP9FaYr0438MOZmkwbDN9fb
- Fl57u596yOcu/IsP5aXbnYI8bUEdA90MeTYDGBje5hh8+A9feOvKu/Xr1gBwtyf+LHh1EwtHH7GycfHl
- 95+trT+uG299F7fjU4inFWgKIPvGlc0rp7R8P0sKDwZzA+YllL5m9gAgP9dKSGD72APNFjaQ0pb/LPMA
- zBYMJuU2MWlIIb0WBvNQ/74DqALSwoVptPK60bFH/FNzxO5D3LZEuQXybHbEfe+8f8/7z2Fwi0+9/fW3
- rrxbv/7fDQAPetGrMMwd1q+8BsPjjxruee8Hf7FdO/Rz6MY75aTO+pMMolZqfKSwsTs9qTPkpK7AvABg
- EDayBQroz0/nAkAFoAZzpcGBpV+AAZgTiDKIppohdPq6GUANyx6Yh2Cu9LUYhCmYBi1V6WsAbYArYtRE
- wFoapd85/9Nv/9e7P/7paLYt45w3vOrW1Xfr103+daOPAR/6Cy/HFIzZJOO//+zFWKYjH9cdvOxl1K0d
- UerxCkSkAQAeDIBWywAOG3ao/65gpYFsyoSSORAsC5Aa34IA62s1Eg0p6+lvvYFaM4KhNg1HYF5Azosa
- HKYaaLK+1hSJthJytws8PRo8Pho8PYozncBdus/RJ5315S+9/7++vOv4o3H0yWfhdo96PL728Q/dugpv
- /fp/JwBsP+EstAc3sPsHf6BauHL9EbO9V/4m2vVTGA38JA0b1L5X6n7b7LVfvvy8lQiVbvIOJcGx5t5U
- v59101IIEIBlF8w1iJL/rn3fshC7PikRWDOGTrOVBjnvBPOifpYxiDpwrndym+6z68ST9yyfuPLFras2
- 8hXv+DjWuqtuXYW3fv2/EwCOPfsBoOFouO+f3/Jj7f6rfo9nG7eVFDwh1u0xC5BNx2HTlu9bPS5fEjBS
- WkNKW9rkm/qpntI0vBZp5hA3OpDSJuzkJwKINpHSJog2NYPY1OsbAshIaarfbzUAbdOSpQZj6I1LoikI
- s115xt812TdbHmxbOJeINs567INx8n0fiUs+8eFbV+OtX7f8AHDKKXdGWls7cevqK/8oz7rTpNa2AFA2
- t5zA8WROYcPb3yV/XQkWGSm1fjJLKk/aH0i6ETudAlQhkMjryWbVsSFqfb3VUDpY7wHIPFTsQONlQuZF
- MCueAAxGAmOARBOAOhAYwHTELe7XjnHHwUrzxX0fu+bKz37g9fiPr+zBJZ/7xK0r8tavG/WrvjHf7PHf
- /1jM8h7MulytAXXWTr5sSA4bMl5WCn+2sV8z932r8WOGYIGDQgCxzWojxU4DhJUd1lcAiLZ0srAAYKw/
- Cw0sMyTaBOcV6TeQXVuYPLCWCtyA8wiUWnltHoDSRsWz7tHt2sKu5VNGT7rD3R518copR9+6Gm/9utG/
- bvAM4N6/+mp0HzgHpz/5p3Hl+Qdwwblfwe6jtt97fXX2ZOZ2UU7ueJrLn0tzrTTwSmMvhAROevq3kClA
- 1mZerZ18CSiSUXQaPDjM+y17sE2cEGt9O90tQyiNxkZei3IvQBEAooQM0jBEQOpkmkAE8ECvbQxwdzxz
- c/Ahf/eUD+77xCU46rjTccWF5926Km/ir8e8+A9x+/s+Aqd+16Nx2kMehds//FH40n+86xb5WW/QMeAD
- fv53cfIrno/P3efxGN7ngQvdhReetUAbuzauuPj5m+t4mJyqrLP8HLr52TejBIIZDm/Ycfizbe4KMvKb
- +J8BIOcV/ZkZJLvoYO9dTu7YE4hBRt+TK+0DjMEYIOdtfp2EBNaknzSuMld6hQmJNpGqgwADmUeA9g8o
- bQC0/NV6cfnx1Aw+d/J33he7TjgJ4/3X4M0v/Mlbd+JN8PWo33gV3vui5+LOD/lBPPl9b6YdAH7vDo/l
- emUEQ4Jw7gDOGGxbwNc+/Enc7+eehrf/zs0T5XmDlQDf8fO/h+2Pfiw+dcb9sXDHu5ywdc77njtbb5+4
- hc0V7iYrRLbJCpDHNrLN7MtGtFFdh/5EoAqb2LIAO8E5xDgK8/4OpTQASjZQNjtzJ5kDaw8BFeBNPqn9
- CRmgDGbZ+NwLSFpyEADOACeBJlMHQgfGTDOBBoTpKe00P3vbSUf96umPe+jetz3hOd22Y5dw9r0ejs98
- 7D237sjr+fX7r/8LfPhrmxhUBCLg71/w3P/xdx78E7+Md77oubjzvR+DxZNO3fXX93viM7rp7IjRkTve
- 06wsXZ2IKOcM7jp0eZrrUfra0WedvnG/5z0Ka1+7BB/4+9fc7O7TDZIBPOrFv493vPRnceezHoDFM25/
- 8salF718trn1vZxTZVBeS9Fl0xZAjpz2XdiQQMkE4uYlb7iV3kGnMW0KKQc0ZnOtrzsNP0vhFrCm+3X/
- ljCDUYExRCJBC2ZeAIHAnuIrBwFJ/7tDGUkmEBLABEproLQBIiBnLR9A0mugha2qWfpsqppPDRbTv46W
- +T+7WZ587P3/cutO/ia/fuBPXo+lo3fi83/5Vlz4rg9iYbnGWY++P7rpDB986xuu8/e++4lPxtve9Ebc
- /R7fgerIE3ds7bnshe1W95zcDYdUDfZSRasFTZrAueZUp/cuHbX8W4cuO3DpyY+8ByaHNrBy5un4t196
- 9v/bAeBBL/wDHPz392Fw7LEnjC+98Pem6+0Tch4mgdeOUWptDr+VvHtfkIDzl2kBwX4maRCImzpJms4A
- UAXEoL3O/GuHIAMyqGD5byTkvIREYxBJAACT1P5c+/UQE0AzyRQ4gWHBpFJiEoFojJQ2ALQeQAQ7QMpI
- XACl4aXNqHsiCB85+oeejMH+PRjWNeqmwv5Jh4WK8G8v/bkbdFE87Hf/BA96/k/hPS/8HbRX70VuW1SD
- GqMTjpUQN1rAfz7/f9ci/56/+b/Yea8747JX/w3e98cvxQOe/AsnrF9yyYO5G196wgNO/cDK8CgejRbw
- uhf+7OEH1q/8NnacdjrO+/M/w44jd2zfd/mVv9ROxs9jrhZsGkTIuh6kRGVuwFjmatC8e+GIxRd++gNv
- /tTdH/oUHH3bYzDOjMnmFOtXHML0wCZyl0HoAMpIibB09DZ8/N1vxHe/5I/x9l/76Zv0vt0gTcDHPOK7
- 8fF3/CsWG/zgdGPz+dwNKsPv9wE6nbP3bGxnMNyyYRMKOccYfqV2lwZebCDyYRtbPmalAcF+dz4LkIck
- 4z7WPxt6EIDBkTmBHP6rpQgnJM5AmuhGnwGKNZCSBvq5EzgPATJ2IgAeIvMSQJU2BtMKd+n9qRmdW1/6
- FTzuDa9KD3zIfenXHnxfHq02mK5did1Hn4arL/3St/25PepP/hKPeeufYM9HL8DHfv3P8bC/fjntPe9z
- o2px0KycfGR6/y/9crc8PArb7nYWTnzwo3C7x/4AvvKOt96kC/j1H34/3vJXf403/e0/4hM/8XM4+Qk/
- uLSC5UevfvXi354c2nh2nszuM9t76EPnvvO/93SpxiUXfAqfW8+44CMfxONf+0asf/py7L7P3fDen306
- Tr7z3U44dPkVL5xNZz/FPFwUMFeth0EDySpl9Csj4Rnltj69HfN3HHPynZrREduvPPFup0xo+0KdUzXK
- bToRic5OdXWneqE+ox41Z1ajwVHLxx+xd5F3zkYDxjEn3haXfencW1YG8PpX/TV++ldfiDNOPe2565vd
- HzHH9NzSeGvGzXRjN/rbcRZP6GPwoSM8CxBZM4BaA0inMOBYiwN98BBrL8BIRgY8qkOwySg8hKRp+7JP
- A8AAU0JCK7U/NzLjT5v6bhkZlZ7xIdCwTgH0faxtaFNEqg9JL6RaesGXzn/nbz/kqc87fu8XL/2hPO2O
- rQbVBdRUHz7xp5vzLn/9FMff94F424uf8215Xg953d/ij572Irz0r16Ky972YXz/W15Db37KL5268bUr
- Hs9rW/cAc+LE4zSq37148u53Xfmm9+4/7rEPxfazT8K2E0/Acl1jz8E1NFQjg/FvP/Nj/trf9yd/iV1n
- nIQL/v7fsXX51VjYvYJPvPHVuO9vvgrvf+Fzv6XrfuKrX4vjTj8N73vp7+Bez37W6LP/921337ryyh9p
- 19a+L7fT3ZIhjlCPFt872rXyyu2nnvDhKz55wcZTXvZjSKjw8XO+gKsvuBRP+L9/mv7+sT98781LvvrC
- 2Tg/knmgs93uWrZLRJeOde0MwViY1cPqs1VTXZRzxQAPc25PzdPZiQIYkYySCBv1KL1luHPpjz/1vjed
- +6DvfQpoOsWO+z0Q//Kib8/zvMkDwK/88m/jt3/nV3CPuz/0V9bW829J7d2GG9c5Jbd/k42/Pwundp47
- 1XPv8uV1bLPT3KkeP2YEG2W9hloD0EA3Is/1GWz7ZgH65GUNVBmEFpQOQfoC22W+T5NwvRpY9JoIrCVD
- kmuhFsQJjKFGNYDQAjQF6m2fGS51H0I7O2u6NX0gMw2AQYvUnDNcGTylncy+Nt3awIVf+uZ4BA//tT/C
- f7/klTjre78H49UNAIyUOizf9USkAxkffO1v00Of/Wsn7j//osdNDux/Sh5vnE25bdio0Wm0kYb1B0Yr
- i6/bftvjPvT0173imqeVaIwzznwELjj/Xbj3U5+No+9/H5z/6n/AiY97EL74F2/BnZ/35IW1L3x5xxk/
- fJ+rP/bif8y77nUati69Eh/71zf2rvFxr3wNpi2jaRIygPFkhjZLpvf+F8gGeeSfvh6Ty/dg23HH4F+e
- /cN4xi/+8onnfuxzz17ff/BJ3TSfAE5gYg+sjCFSGuyrFpp/Wjlm52+c8843XgYAP/fudw3PfftHj9l7
- /gWPnuy57LndpD1TMtIOwMwPGmbq6UWUwyKjZLUa6FmbxjAymb2Gkc+k/5Pq+ryFlerXn/YHT/ynf3r5
- e3l9fYK7POYheN3zbtzpzw0SAB74sCdgeccRS5d96fN/Md7KT5I5/Bb6YB/buJ026JLCb8dhs1aIlN5+
- D8Au36i5CYeDg1ibi13IDrKmcOPDmn4E1rl+Dt8hDQANOG/Th5tA3IKqgxIe8g55b4b8Pk2RWFN+Kg1D
- uUb9TNQhcUZGA+IEEOsnnPjYU0aGVdRByGmw8LLTfvGRL7ni7z7OmDGOePB90bUtKgC7hjXWZi3e8es/
- f63P5UicjqMfdn9sP/H45Y39h3YRZ6qavLb6icv3H/es715aff9/fd/smqueNd3cujvnbggmECrveWQi
- IA+RUrNGo+GnUzP6aFWljSq1NMtYHSwP3jy+Zu2ye77nOXjA0d+JN/zYL+I2z3hifdHv//XZm5ft+eF2
- c3qP1DT/Nty1+HfnvvcDF9/7iY/A2pWH8LkP/gMe9qq/xOOf8wy8/od+AVe+879w6cFzAADbAJxw98fg
- TZ94O37+F1+COz36objvQ74Dr3vla/H2n38m7v34p91resVFvzpenzwyd8OKdPxawFnK0sQAjCE3C4N3
- LK00HwcSTWd8fDvbPLsbH7o9d3mR0YAwlmfEjexnbz5beRrXWj+zLCzVNmBYDGwWM9qEnFdQ1eny4bbB
- zz72nLf/03u/90eZJzMccb/74R0vvvH6AjdIADj7no9CPRgevXlwzztzN7mrsOc6PdmTn752g4xEUxqB
- eW4zz5/wPPe9FFL/GCRIH1qLw4hF1OqmLCWDjfbk1Ch3hxRjkLttcIYhC86ASQMH4AhDOd0BUJJ3Yygw
- yIIBye8xhQKBQzkh5YlAieXniDogrYLS4JJ6++4f+8JH//G9d3vsT2B8zSHsP+czGOxcwc67nYmVu98O
- 7b6DGO7cgem+A6BBg2b7Nkwu/jQyH4WFk08b7f3gR3+xXd/6PgISEn1ldMyuV+XNgw+fHbjmWbkd72Re
- ckYlE5CYVWJtCsIU8Oc3AKjRpiflajh88/DYHT8/verQFUNs4dgnPW7lyvf+95PHe6/+OZ5u3JZzAmOp
- S/XCx5vtCy+7+3O+692fe937OuQZPv0f/4jbnfgd2P3dj9g+vviSu3Trm2eCueLcblbbBu9au3Tf1Ufd
- 7QwMdyzh4Hlfxavf+0Z63uOf8eDNi7/yym48uavwLxjz418r2Ygm3sRLyTa0kbwq7UWNBbmJYXgt2+yd
- 8kriRo7rsUIpIUtWW0bPCOtSMS55BVTTJaPto595y0f+9V9++Aeewblt8ZF/ecPNOwDc7e4PRd0Mj1tf
- veZ9OXdnCJ22Dkg61tS7P+eXzW/pVO0sO8sUrPHW39QWAOrwwOLNrjTwxIZi+XuZyw/Cg9HXoBbEJVgA
- FTiPNGUHiGtkqkGYSfeftUPs4KaxppEKD2IrBJSIJI2E/gPgSkBLlAFukAlaNijUiDbkWtL2C+uVhd9Y
- OvPUd7SrG0dMDx48g7puY7B7xyeufuu/H7ztr/8o3v/rL8KfM9PvnfZQvs33PRSpuxrv/4M/xh3v/5gf
- nO3f+FNuu91AA8YA1aC9krvxLs48JJqC8wpAUxATMsm9IS6lFNEYSK2muzWINRDTkGm08rfLpx73C7vO
- PAlXf+icX57u3/f03E23gViCJlfIWABVC1fWS8Pf2Hnbna+ljtopJzQ7d20/9NkLfrNdW3sC5247UBPn
- QZcW639aOG73K3eceeJXF485suPL9u6++gvnP35r7xXP7Lbasxh12WxsoCwLt3r/Kcuz6pWJ0OlL7QdP
- 5hEIWcfCxj61U730mKSZ3KGMpOcnVaUxbbTx8r4Vyjh8gFRXX22Wl59z39961jsufNN/8BFnnI5//MUb
- pxS4QQLA3e/5QDTN4NjVgwfel3N3ZtHcS3NlAHopfRkDpjA6K7NX+ZkcfieFv6sPS/9LLyHra+UQwWV5
- JJqEUaJdHofmJBXBEKjwCMs0gJWtmNBpY68GWAIWpS3tZ/DhVct1PQquBGGoQY+RQHkIRi01LTNSWpXP
- kxYOpuHo87mdHINuehSBWtQLH6xGC3/8hU+85T/u9phnnTW5Zs8jadS87fMf/IcLzzj1Plg6eeeZW3tW
- /7ab8t0kpFRyDyzjSRMQWnBell4EpMFFvcvXfgaNNfBVmq3IfWIMumrpiDcNBuNuemjPkzh3DWMgDEnL
- tmiqm3LH3sFK9cN7z7/8XQ//y59rPvPKv3jGdH3rFeC8VMa8QzAWM9XVpdXC8AtVk9d5snFKNzl0F3Tt
- gHkJTFn7KRrQqSg4kQZz2+xSXhLY10vWzM9S9dozUckq4Ou2ZABS/xd4uvWNTHLONv4MpU9VOCmyDiuk
- tKn9hQWkavDp4fb6B0B80Wc/cuNJ0N8wAeA+D0YzrHet7t3459xNHmSddNlo6AWBeeWeEjVnAcAzf8n9
- k7zf+S8TADkRMIce5vJvFw+p+7EoiVKw5um+aGIwKZmHRfoBYPBfTgr82eoFONYNBE/5rVQlgEhS/m6b
- n2ZsOAeu5SQjzSTSuugMAKI/wCMZWWIGVINzFk484fnTPXuf3260j6a6+US9MPjHwY5tX5juv+x7242t
- H2NiIga6vFv6CzyWz5kmSDClI5FFY9VgYJ+HQzOXDkwzkU4DwDap4QSkxMBEj9ARskGf0WkPhZEwQ87b
- UA2aj+086aiXb61ddcfx3mue1eWFoymMiaEjWQFl1VqOUX8t6MlMmn4zkT7mpN/LkuVZf4f7E6DyHhUY
- +jrU6tSnoEslAJhmRYcy2bISUBvE/ncRYBYzA2tAM4CJfm9xXC80TxrvP/DWU777Ifj3P/29GyUA3CBQ
- 4IXBNpxxhzMPnfOBj3ycOT9IxnU898FN4Sf1MoPScKlRFIJikLDGDAV5rxyaM9CFZpW1NrHiCW+AH/sz
- heOZWv15hfIiy+bLi7Kw0OpCavV9Q+xQUVLWBmap7QnEigvwXT+X/pdWITIauU+aWRBl6RBwQuIE5GUw
- DaSvkAcA1eiYUKX9IGzdeXzFlX+Wp+MzASSeje8163Cvbmv/Ie66EXNNhFaaYnq6g5Q3wRVA/fGWnJ6t
- Iho14/J0vlY2ZCclk5+0mTKG8vpchXRZshhplGZQdQh5tnCvgxd/9a8Zm4Oc64Y4lHBUaUpvm6TSFD3p
- o+uQMFPwVtbgUum66PQAkOssAK0hgA4pbGYJwMbqtNKy8/Vn4LUIV++fKglFyi55NlCazpXeTwsADYBW
- G9S17otulLv6tEsvWceuC248Qli6QTKA+/0I3v+ut3eM2V9SSn8BpL39JklsnJRGoM3n+3VWEQIR7b8q
- nLwxqmaX6fIZO9v7cb/iiMQiihuw1WBgdZ9KjxEBqfUGmM3zoboCkip2oGpdTiPqzxbIr5G0MWjjIuon
- Lcwl6WARJUmYllOPgExAJgsSQ2RKyNTpybwI5LyYJ1t3AFNlSEbKALfj7cwYWo8i5yXNKJI2G3Wz8VAb
- YlMhK6GSz6qjz5LHSCBkDJAx1IAimULmJVFE4oLjKJ9B7jPr/SMao+umS7kbNmApdzIa4U1w1v5CUwhU
- /qzYEZfcY5SyN2WBDowGTLWzPxN3Gsyq0CZkLeus4Su/n5T8ZaVIX0aOw+kfuSUWAExfstEN3l/v/UyY
- QJQz8fSaY49bwHDU3LwDwNcu+giu+NrXAKQvLmy76ifruv4NUD0rnVSEWjz77F02+NC/bxu4r+EfO72x
- CThEATaSp/hE11XnsDWIw393mvr3gwVx0gU/Kz9n/6gXAXfLmtqOyymH/mVGZIBfIiNkI6E8oZnCT5O/
- L7EtwQqUS3qbNGpkVEAehUVWsi6m5Ndk9W9iyCbsFsqmURSjjMQg/AXtf2SS+p0wkywAUgoIyHOAnJeV
- eTmSjMeDW9bP1On2rEDcObw2AqMILRJmCrXVsoMlGIAbECv1yprDHDYxukLMIqN+JwDWc2gB783ItCYb
- 5JvsCmrP4DgiTEkJYp7eF2Qqc+1TLTuASoPbviKmhQIPhuxgOEipu2h59wI+/I633LwDwFvf/Eo8/+3/
- hMExO9BOTuwS0SWk3TGiTmW0SjOPbfE7Uq8LAIpa03vSdKzF4R21iOYjX+jStU3hQSKcSjL2I7Qe+Zlt
- 5o1QHiryTzeBlQTW+GHi0gzKA02ZuWzsEE1oLv7Y5TBFyXECU9bFuglTJ5IeQMgQyAhI2uziDhXW9VSX
- U5sUVs0EIDe66bhkO5D3ztQo49EuSEeQ3Mh/p02dfJBuwtJkZbJ72YYMbwKCBDA5pa2kyUhKyGKy0VqH
- pLiLHEaqpWKr5JJ0dCfdfP1HAy0fNh5mee9cA9xqdjTQhiA7XoOjaKxxQLjW7KvuHyqhNOE5vEkUqu0D
- wWJ2YI1uY5VWARafQcBX6gEubEYVnvWav7p5BwAAeO/fvhdH3OGe+J63v7VOC6PbA7OmMPi0ZuMwq/Wo
- 2GkmMH9phchjUl+HN/4qfai2kG1Bpjnyn9ay/nqtn2hySun3mbXWlDpOFrQpBY9KSqjNKmijiQX8L5j/
- wyYeVIIMHR4YODQ45XU7ZIUPy/sTiHWqwklPZgZoSzYH2/Sj86BGlmURfMOCWoA2QaxZhtXDGMiiZ62z
- NQgkHZPJ/qn8vhKEBMXWSLOgTgSmDoy2BBseaCMvl74MB+g1VyWgcIeCoKx0kwcOCJMGzpk+JxGCSejK
- c/KTHbquBqWzz+SBXzKRAhoqBjEaBCzz4kpLhTqsTw5ZKuaahNBMIT7lqQrFTjUQMEDIVOV/+Oonhldx
- l/GaZz3j5h0A7vNDP4uV3Ttwtyc/qn7/M3/hqdOt7rnMqEr0q9GH90YtQOsBGNU3zSH2uBD2DvtqyyIk
- 1hSSNYWO2UIu/T/V7qNgPmKpa1lAVeg+p7CddVOGc0fIQvrQ7UIpcgG4nLQ4vDwhwwdoVkS5EqSg/lsy
- llpPd3ig8uuyz0qt3lZDNrY265ONkraQ0jqQNhSoNNDXsOnEDGVSM3IgENIEjE6zgKCWzElOfRprnZ8V
- Wj3VBlytwaT27MyDNmXNWpL2RgCmSoINKXhHa2ju3e0O4EUpV4jCrEWvx9N1SOlCm3r/S7biJVXvYWhD
- VK/PcSHoBAKOdk65ml19KqpYlRK1Dt8bwNysyqFXfzUNmredeNcZDl6yFzfm17c9ANzrSc9Ds30Zx/7Q
- Y6p/f9FrfujQpV/9jTzbOKqc8sbJr8LNQtDyR0+uq4+4yr1MQX64m0u75nvrjS7EWXk5hffCEW7cL/v9
- aC55Oltd7QzBLTktTDTENxuVw53m2gm+RCNXIHxUimkK+QYmnsuS0pbM6Rkgzki0LteQV5DzChijcr+I
- NRPRx61ZjZxYnWoUbAJ5Adwt6ga1wlrLHmvC2kQGMQuwzEln3JxAuQr9DutdyGZk6v+uAIlqzVCyTkR1
- JNfLykoT1QoF1ukIWOtxz070XnHZpBRq8iLx1pdzAxcvCblLU9FrMH8IhHEt90eRpeM/Tz03irplQVZa
- FCQs0EybpcVxNVrEyY962I0aAL5tdOBH/safYGVrGUvH7Mbx3/vg+tyXve5Jk6uu+O08O3icrO2YKkU9
- gMjRb+ZuHPppn9f/2SnEZaPWyskPWAIuTcFIyQWZJFgdTnWBuMTa3Gp9SuE1Yc0gDWKY60DTVL6voBrQ
- 4RIkuJY/W9IPLS0cNJwm0lEvx702BllG7hQES3kAJBb1YzbkZKUZzgx9uTMNtj6yEOy7nGQKoDLas3kp
- oPPAIOAZy9paFI8GeybJ+w1yvRqEqNLRoCkpkabzlfwO5yC1on4OmMjGozBJCp3U5CWaqjcDHkwYtbI2
- KayRcqCQYQUohzXZhIOo1Z/XSZNxQVyEtmRVPQ6Jl1QVDEUoa9CagOzZE/PCdmS66jGvedo5e87dg7v+
- 8I/j/HfdOGIw3xYg0KNf8mq849eeg/t+/7Nx2wfdbeHct/zn07b2XP4ibteOLYuN3dOvT70FTBVonukX
- 6cBWGpTaqZkLFGUxsgNWpPkkM2ptSGnjhXKjWbg9+DL3BYfgkzo95e07ETREc7E0ATQB8wIIY1Ca4FoS
- gMO+ZWcqoxZTocRCNkIF0ATgoSLiZIMIHkGuPaWDWsM3KkG+XrIjHkjnnpPWndBTLvcmEsyL6HgZQEJF
- q6p7GCXXrFHWlY3njVDZeGwsSWbPHMhKD5hAimEJkmgn9JK8RnovHIOqliMKehJyVAJSlmesepGkbEXQ
- BMCsX8JpvpBRybQEkEzER8exRrf7WykSkhyL4ZmRZ5NFh7LA3OPJ36HYzLXow9QNG2Dv3YBSc/5ge/VY
- gC/83DnvCkK1N+zXtwwEetiLX4V3/NpzcObdvx+DY3dv/8w/vP+50wPX/Cx3GzsLHHI+VYp6/jPNCixI
- 5NBg0QVmpYLDNUdG9QmjMtPeGwCYaUTvSiPOVHpy7QsrPjBv5DG0UWUYflWA8WGTAXbmqidjgTm+iK/j
- 2Ld+AM+NIMlTfTmlVFIsj/S1py5+ksDSRc+14vbFvzDRqr70QMeULP0Dr3XJtQ7JQFYmpIpWcARUiFHl
- 80N/1thy0suQgGIlRi6nJ3cK9rGb0en710U6rdegtSagQJ6lzGDFApC8L7dInLUsUGCSnvByn8eIuhFS
- x5On8yXIJn+SHa+AuEMysxdApxMCGiqZj76eZ53SpE6p7Y2orcEtCUZb7pX3uTr0m9dFy5Lz8JRukm8/
- PbR+4cvafTefEuDUBzwC2xeOx9Jtjjrq4Oe/+qvTg9f8DPKhbeWUJ1fGKQ0RII78SsoVRT/rECQ6fejs
- 7r0lo6jmNqHWosakCyQifTH0ivSAJCz031RScstgKPD6bbwTN7Sm5kxJySUGBaWAREw+8oMjIJO+qv43
- L2gaq3wEq6sBUBoLOCVtabNtC4atoDQDY6Rd+RT6Cuyw4kJHMu6EbUBb1CPhY1AB3DDJ9bnSsp10xKWk
- oMLZALGUPzTTU79yrL101zsQ14jWbgWlV2mjrWgyCKyXQWi0sckKwpKAJB93rJWJ8vURrs2VolsgKDlK
- iBsFDYg2bImMZEAnHinDszhSs/YsysFUygByHoet/zq4XMVDw5rdjWa1dU1pcNl9n3+f//jCmz/Jd3/K
- 03D7R34Pznvnv/7vzgDqHYs49IXzsXTqbe7drl39dOLNxYL6Q0jVq7m03mC/ZXMKnZbRr5qjQEcVMgGE
- 1+fQXIzZdiMdaxMg4aynhtWZgU5sKb1fL3z8xwFY7DNcow5r5gEdV4kc2LjMmDvZ2MLsq3Tjq4agpqSZ
- QnpIGYlEN1AgwDWARR1BVY4zkIxFamBB1XVudy5d8UrRZ1wIOxRm0px0o0v9boAY6wmw1srUa8KarLqO
- WIkVGGSw6ATCRO+v4AGEhz/Qsl0s15kUXUisSL+kt8KypqnG1g7EDTI1nqVIxmM9GGVh8qI/Z8IURcbL
- UIhV6Layj1orOqCZVqVBzijCFZhmPvKVZz3tQdhFHrwOWAIuQLGC8UTEtTBHhmuYHrHoZXSzwZM+83/O
- f8dnPvzPHziS7sJHn30i7vmgx6HadSSOPOs0jA+u4b1/+lv/ezKAh73yrzDIGfs/+xGMRvVd2smh7wc3
- jSzEHJx45+ufOPcvPP3CripsK4+oGi39sOfI71dnXyRV5ok5t0bea8PgcwoNoeA5YCi/kMOngO8lYj+B
- nElGbcCNdT4Gs1RcTq1RGYe5KrByC6y5lsZINAMw1M/SCkuPZqCkUmk8UnbdkkqVLYGRUNFa+cxqrEI+
- uei8ZCode+2w8wiZl+W0pS0XKyVXODZcAwWYLfl16bxOswsjDjUofIjC6xCodLlGey1W6jOZDDsaAVZB
- AwWmni1ZbQ5v1JbAZv0Rh0E7L6SUmPa5SFmEpPejVxYSAAz8lC8b2qTjG78vDuq2jU05rO2YjaSyfhD1
- KxrJmHK9rZule77mr//5djtPP+6IlSO3L27ftTiibdu697zqNyYn3OluOOqYU3HFhZ+/aQPAd/7mn2Dh
- miGIMy771w/gy1/5MI4//pR7zsazxzLXddTsKw+niGzC+dtTv+GlQWg3KZIr9KEom5DI5t7kJUJhfqWC
- +PLfg9e2ZUvbgkFAtlHpHYSFS1Y66IKiQPAASbpI0WfQ0lNlCAIZiWyzzLSDPFHT0RkMZ59oS8ucRWn6
- 5UUwBB8vwhuLyLwswQG1+xMk2vDPX8qoSjcDh3LIphJ5rlEmjEjKtd677D9XgnU7F1S1uejaDSOvkamH
- sq/D68htTLDywMZ/1muodRajpZg1bJFBSYMiiYKyi7USa4AgRffVc6ewbUYThW0Rx3KFsk3+WQiltPSS
- j7gEbpsokQGoUtnI3lcxOHHlnJGS9Zr5bcxsgZQmyC2OypOt+8w2Nh4zPrT2/ev7N75n/cpDD77N6XfY
- 99F//euLTjr7njjq+DNw5UVfuOkCwM7hbTA6ZjeWTzx+MXO+x+7jzvjB6drqj+R2ehJRojje66fm1Ev5
- 5626i+pvAZgwj3xBeQPJGkwe5VGisUI8C8ySej2Xfm+V3IFYMl4K4zKtURml7lUSDGsDKmlQ43AyxRPA
- BFCYF5SFlgqenCDCGHlRWXlJpKt4pD2EmQa6gZuRwJyTCEjmRUAtKE2Q1HqMuJZxmpUmFB91Kpx8lCmK
- 9xxQATwEcePXaL0WCVQD74bLNbYOhJL7oKUV29ivC4SH0AeBpdwtgBkSxc69Aoq4QSal5pqXozP7KjVZ
- iVMg27DGnQBsXGeMULaAkZfk/lD0jYwrI/lrWtYkz7PcR0JCtJGDZ1YoTWKyTMwOv2hHN69KnRwhSDQB
- YasGz5a6lo/KM5zZTdt7HnvanS/41Hv+/qun3vcBuPTcT35bAsA3PWu4//N/DxjPcPRjH1l9+aWv+PHZ
- vj2/yt30SPC0Nr29UoVnlfsqdlxFuslOeQNIDP0ENXMQ5pEIJ9CWbgCrec1lxx6sprbcqNhEPOX14fg3
- U+AD2JC+/Jn8dOqC2VdUgp2VSQYbUIYKU46UPszQOlfHnrygozoVrOxxElpQkvQ983IPJ+4NTwSYsMN7
- M1gZjATl9OvYiX0hWx1sz6TzQMye4VhzayT6hjwEkyj/iCFKW0ap9rOolcQ0mMPBxw53QU+CGJwH2ixl
- RdTNHE/RU4fyE7P0g0SuS5iHkYuh9aAGJgtok95n44DMk/+W55AYqmlQaMOsJYIAHRcD9VuzK51KFGqz
- ZLfsGVPZWmymMBqQ5LkCfdUryxa05+MN7mJdJ6Ihi0h189nh9urJ3Yy/MNoxwCf/41snDX3TGcDtfvjp
- +MCLfwrDK8cPm15z+e/kWXsCybwq1PP5sBhTxoHxoZo+APkpEgESZQSYwmKxRn5RlyHrzHofgXyjc2j+
- e7NRitwAvEtlISGOdVY0rWuDNkCGccNlTs9zIhVwf0Cnv1ovQ+3HpYwg5bNPVTgkq9rQQD9bPEumfjIl
- bdoxcUhP4ZlJ0hRTwpYpEaKIaXi9a0Cm7JuDsQTKSz4kZV5AxkI/e1AIsjTvan9GLnhKWck9pKd1qY/J
- w1j2ssOzLU4egK2bbqWeoB7VU5E6hwgHc7eSrvt9KWjPUvYUS7mETkeKJYPMVCFRW94PtQd0z3IoZDEG
- mqKCbyAbdXqp0QWgVJyK5VD6EvogLdtHA5iZbUozcMYxnOmqCz5z/gdPuP0JuPzL37puwDcdAFZWhzj+
- rg88cXz5Jb+fJ93ZpZ5i9P36InnD5Lga7SW1AUVVa4rZhsARBahisy8agITThq2+mxVzzlCFygkdm2Nc
- lHi8LkilFNDXJE5ap2sDzaCxVr70EMOCVCOfnZf5dqlJVU5cA4Gw/pQijVGogVGgsUZ1VlhwoZ12nhEZ
- 3j4Z9FclukxPUABJYQGiaN2ZDBtrg1IysaTBxj6f8PGl6ZkCLJfDv23k1nj/xQQ6jHnHKg7iPQiudXN2
- c/6Mpu7TglLrtbSdnlIONBpETW1BA5IfAJ0/J9mkNrWxsWoHpJneZwMu6RRHMxAZWVq2aa87gPeCnMa+
- EPwerLHchCzXnlmrwCM73OzzxCmZNSvbcE+Ty4sR1QvHnX7026ark409V1x44weAI5a2YVDxGbO19edy
- xhJpikgupIHeRi7f7wt4EBU34EIM6U8LiBBS8Mox5AXOGY9czRa4Kg1BCueon/ZRIITKJrXOdAwWNntG
- AnETGGkoIh+GXKNOocfqe+jpd4UyazfQjD3soTcFYbqEBJ/TG49BLmuC5MpIEQ6LkPLae3VhTGc6dK3U
- 9w5/Jp0qkDYah9q7mKpIau1NRdkc2tRyRp9NCqTjX/Dtls5Xqi1Ano2AQlPVMznStJvC5KHArNnr+k7v
- VaNlpGn95YLWCw3D+B6Stg/1sGmd5AUjIRG0d2Ly7UMPTD7F0ZOeDAZs1+brJnsw6TevqxAMSuAsfa0q
- wNT7qNd5gVspp6vtKdGH23G+8KSz74ArL/rWHKK+aRwAp4wBbWEDiaVpMfMavq/hF3X+4slN7rhThD9i
- zWsuP7NeBuE0S7P9jmQMa1K5A/B8Y+darMD8rwxFqJgELiULm59A1pmyg0+yU4YLh14htjwICGFLsbU+
- 1XGZd8fZxChr70V4I9Rn1lU5oY3JGNJpWUqVlyZmV+5jTOqQszUgp3rqzgrN1lyKqfXGX5UJmbcBEQlo
- c3EdQ2YegnjBswz4MMwwGVsK3snB7s0+ky49w31wcnyDBBepjdkbfTMfJ7KWQGRjxISCJfDeTA7UaK3Z
- TbqMKx1VFm9GcKUNR+1hEQEwFqPZzFe9z+rjQJjICgdsSclmmBd0xLcox1talYwjZKGGfykTgjmTWlcf
- agF0K+10cM92TO9qtn3rXL5v+hWGSwvo0K6DaEuaE6KUy7wwV/ebXHKDYpowlQUc5ZQsIs8FiTIzFb65
- iy6QSnQZucjbx3Yc5gIUct79XNOII3iDCunF0uOA/OI81Bl+7XWg0FYDu4xsQTfyIBlzPIFrwQSbmahL
- WyVnxpl8NuvpntIhJBrr9rE6X01POGkKuuAnEaNTxl9C1muy10NSvT+oxgCNkZIiCtHppU60KdkWPMNh
- izIhKxXXs6401uscgHlF/j4Py3vpuJSsPveNI8xG8eIrzDqOTlA8KBkgTfSfKcCtmq9IlpmpFl5DHoR1
- QQ4KMqi19GFmAS8QiRqalWXFW+SBNxnZs8ccAmSnE6GZiokuwNSI5I5NUYhZlXo/xMZyKW1KJpWuZf0k
- +bwd3XXnafXiZE+HJ/3WtyYe+k0HgJ3HjLC0Y7CPUtrTH2Nkb9jhMIac1T4NDmMAcuHUu04AdYrICgIL
- LrqYA+df57g2PtGFDI56f0G+mVNZDM5nD4scJpihghWqj8dm0mFKwXbrcl1UhPSCOPJ7jRFGfY9CNtSY
- n6qVa+xbcGMSpl+iVVnsaRVVWtffzujP4yMVVTMCyySMV0GdkqOshs29LM3n4VQUg0QvYA2gTbCTrEpP
- I7kqkrxGonWktIqELc0uljQ7aeeC4CwIcLSqGDQMegU6HnZPydBXIAoqQIqyU2BQojEStkQ7gA0NSKKE
- 5NmEPm+2YGClg3D02QRAMSrlbJoVuK8fOqVnVYBlUgLJWHMGwiYoHdK1eUCDavHBLII48TnYyFlGpKXX
- ZX6VGcx89/H+7sTxaou/f8Hzcc/vffr1DgDfdA/gft/7ABx75o720s/tf3hu81nzPn/UU1aIjcGEOEop
- wSJ5iuPze2/q9VGDpIKSFCS/CK2O1BBS7CLtRfOKQKHclyvtRBxPR1zkEFjDeSf0hAWNtONgGSoyT6YC
- RJ3WocERhkylJiIfO5edIm5g3nGkgUj0+Gw2XkaARsO1kyJpECwliQXAMId3odVc0l9uhPzCWseH0iNy
- JYhaJJtPcx2szykg8wICj7JLcLF2ygsuQ5tpvIgCMKr7IkkO8lFBGG26xaah/Ds5lFcQlgN9LVJp9+Tl
- gsz9JzCeCfeabvN/rlUpyaYKSQVToPfJ1h78ZAdXQOpUsVrQnRlN0YKBTDGKujUXzgXlsMZnYWvaxo8g
- ohbgwUqqmtHScUd8chvtXjv5CffBrmoHLrseU4FvOgNYOulo/PkvvHVCqXsXJd6wjVgEDnNIt+c9/IA+
- 42+uyQGew55bnduILJYufl9k3s1W9B1XhYRBJVPgCIBxzLnhzpPOWeNCMBrqTNB5mtqBYsrPTlzhvKTZ
- QQhyOjsvrDjrbViQqoM8mvULWsU8GNx0ETmL8WjOy+C8DdaB9oDno9DSRELE/Pv8GyisRvhzikYXCKAe
- 2bQT/wc00YAyjdW+nrByUzpeFBRjhGz3RsKzIC6iNbKOWSngLjiabag6EmsJlgLEmt2oU4NdmoJhFnQz
- fQ0th4xcxCvooCVrXiziJJxCmRNVonQCwaTpvWWmAy+7ct6GLh8r7HF0yHk7ct7ppZN5DcjExdSAUmAc
- Yi6TnqHPHdfP4WtoI802Z89Yu2zf6wZHbb/L+a/9T3zk396D577h9Td8BnCXh94L9bhFPew+301bRs73
- BXJT4L35Wmve0tyyk7/2lNMbgL6xa+9i2ziszMdNUqsqwqHWRPNOcOfd67LYY5+AgmTP3ITCxlL2kI2q
- ipJqlpmy/EzmJR0plVSS4pwe4UQ2KXE7HXwTU5Hd8rRekH0pbQK8IJmWBRQy4lJRqnW+PxWZK+lJFEqv
- jcXsnpUTP/fxC57wdOWZQFWbzZHZMhHHVJBMBYLTkiAU2x5bsIiUzOs7WgNW9fgZfiKzP1cLVPWcwGvA
- apClzklRg1EzclCmEt5A5SIWY9foKMhpmCjp5+RB6eLzop7sE9Ut4ACjNl8FayRCR5BUylf09z/1iG8V
- os+A3BuzuuuIOzotz/IpSzsH7znyqOM3Trn3HfHRt7z1hs0AXvfzv4/x6gyzrW6yfCS9smr49VLjz67l
- ZeNIz8Z6fZw+FdhJoXRCJwu51jFbJyexSjpLGTBzswwPMqHOlnVtWnXw37HNVTQI5jq3rCeQnnaeOXBV
- lIFdQqxRAs+6vr7aZREUbRbSOJqV1NyuRxcra+NO1tyCU3Il3c+O5WNbpNp3cLyASmGxioK4GrFTlDmc
- /HqSmAZf6CMQ5iTJgCLVrr/DPHR2M0WHp6DQUKas2kn3eflAA2YTgmNgD+ioj/OKvo9lZTk06TSrCvh6
- GKiHtRRx+fSmCJB4sxmu7cdpqv0I7e9ocCVVRpYSpFG24CwEmIkKhmQxZgHQeTBUhybKCvHOQaqsZC4m
- kebMSjfDMczLPHem0iYhKUV5CqIN5Hb2kOna2qMOXbF+vXoA12uO8PnP/BfWr9zCxp52a7DQ/C6l6r/6
- YgfzXX1L8uezA8kMij0XBaDNVk8CvNBFy+gKufH3Kco6OplQzLyp5YDj9ZSUGAYSsVqMilusfE9BIC4j
- VgUHGgkwCROpkVGykCJ4ofWhwYD9HiT9HLWgAUl8B6R7P0TBBHTKkkPg8tsoSzaEAZVko8z0dBGREDO8
- KDbqTSAuVb16lE1y2z+r3TvRw2NekKYZlyqKuGwo0/9gB/esw4RaWdWGKYwE3bwlKDDJfRhrKOnctJNt
- c5ECb3qjXSu9ZhqMBsFfAiIplhtf8kwZSGOF/OpERbNOgikCsYq7SiCQv6/7pC8CqNqPlPah4pmSuBSj
- gClS2j+XyqdQ+iTPlBhFut76aXKgbAGYuAZlCRABcMcz5NlkdbiEGy8AAMBdf/R43OFhJ+PQVVsX13Xz
- WqI8PUz+uneasNpj5VAvl783H1d5rFrLe/pvNX7dE30sDz90u92FQ08OMolqCpLbXQDJ2MPU8oFZ5shW
- E3KEdsLrRRtDRSsz9not6wkxr4BkUFDD08OJQjLN0OwGZX0TN3IihsBl2gCF7xC8EtTe3MUovE/Sharv
- cL1F00JgdWVmd9lVWysDARFk2pLWQtNvBkpbwRHJRrddCEKK+fB+TOXPvPAzyHEKbFgPa7jGw0OzQts0
- ljkCEA3FsJmNGGTMScJUfAmVmwE0yFq+Fkl5FlwI9zkOzAXkUxQihuh4GZm3o8u7kXnBszmblYDEC9Ez
- Ww90uV/y2FNx0JlR4tdBtImUZMpCtFlKCqqvrmo+vxlM8aofeeqNFwD+6TfejvW9W1jcPsRgMPw8EQ4W
- HD4OO/2dEMKVNoqG2gSrQm0df6MqBg0GbcXXkdUMzjtS41foWTdxMX10DIHX/oUcxAG5Z1Zj5E61tXek
- S8q/pWIRkk6SjypTL61mrydbRGMSYzxyXvDGG2gmnf0IjeaCFfdswDQQIrrOTlNOwTBzXq02ZGG90W0u
- UxSQfn5TUx7o98ZyMlHrOP+ELRBtKU9BtRosg0KjOJHFUGJUipmvS9ZE/WKYle5svQDXY+JKWJPRk1E3
- GntplAML0SYt1ivKXtKwC58WPUpL94k6FVAxKbOqqDxxAnXbkbsjkbsdyBhJx58BymavNhKLtKiF4BlA
- V1SFA9sYYWrEGCDzSF/L/tEyT7ECgspMn6Jq8xKq8o2bAQDA/gNHY7DjSGBhaR9RurrIKmlHmsPbmD4b
- LyKzgUcGnjL1u8XxdCpL4rDN70y+rhcS2E55tnSrSDn1ZMBg9s3x7Ti8Y+hQcNKpwMQ7t+ylBTn2XurO
- QWG36QYia6AZljxYW8lb1O7BB6517FRremjZywwpHfL602DRkkXYJy8b2jcC5SAymb2j3pcEs8K+DUtD
- 8fvMQB5qebDpkwCXXEtjCX40dvyBjQrL9HTsgqlyyo9DBtOBI0kMU4idVy6NYTK0Ri0WaC5AUoUDImmJ
- M4X7I+jmN35HydAEul0+Uw5oQ7UlU95CQqtqxeZUZHqFMnGpOIvnIBvKdUk2f7fb9RntOp127YcNOc7E
- pM78cODQvORaN7+NiyvhLyX+0MbBEzf3fu76QYKvVwD4zt/8S/w8M9LyNtzvD1/eUF09gsHHyVybr2Uj
- 60bkodZvtaRdXCsFdRkZw/KzHFL565LS9dMeJT3UAtRVfIOJo4BNGnC3TVLqvKQ3u/UObyHCWH3feO1e
- WAnm2RfkoNTo0kuMQJu1BplDie01VQMPSo5yAJHTZTskBf4QGCltgNKGCmYGmW5AJxmDsOEC9sKNSmJH
- OWQD8V66B4DZm5W+jNTFJl5SeO85TF9AW6BqP5AOOZIQtImU1hR1l7wpJot75mUUeVpNfXwFjVUUNClK
- clA+m2sIwrv9RiWPJiTWW7FsqzQVDcRUOQJTTllTXGrK6DNNZEXagUMbAvKBEIZqbIHSOlBtKIWaQNVB
- AVN5kC8K1KV5azL1RlNuYH0sVyriWPdHABSvEybnNMNV3P+3Xni9AsD10h7+LWa87qg74OgnPXXn+uc+
- 98zJ3kt+Ls/GR5VPWs+l1uxusBLNZ44Dz3lZT8QNbXpUPg1GD/E2h+VnhJqTPe31M5tKd9uMHVx/gDpV
- xoXoB/CiskZt0xQ+Ait7T1ReYziqQ7yiILVl1xe0C51voL2NqLSrrrdSM49LFgGtybkS/Dg6MK/o55ih
- aC2IsEci0wNgFD8M65GUTjK8+zxPNrF6dKaTlSE4D/xE63hJwUAy8ci8JEGUWqTqSoEA8zbp8LOAohJp
- EDAZM2PbIWrwWy1bkJ6grCVRLhZlvlxNU7F2hWBfHwYqyori0zqbUOzmiYPzc5Qv1+eTTdxFHLvAqXWp
- c8I08Ag6wRHwkmg6dtslGNR7RKGJbTTdOgjMek/F7ixIlpkBjJOCGs88i9pxbJbOQGnhK81ifjgYF537
- qfdfrwDwTZOBnvDC38dbHvEUHPnwhx9z6JwPvWy2dujJnMcLxfBwMveA48aUD5MwBhK7uCa7co2ZL8BB
- OteaAegGJ29FB4ehKPLBKcyP1/XmtkrrlYia82K52YrIM64X5wGYMhKtaYe7j2+IcmKMUvc6rFibnnAU
- nFmQR4+DTiGzAdzDyRtQKW0JEIgX/P6wnUxsNfnYewTuW8BR+COKmiqtmc0irbgMC3YCWnvnMkY07hs3
- eq1ZRUOASsuXzItAtyI6hZaZpakrIZWyMGt/pk8fL1OcyoNA9nm7YQiETi1ux2WSUcZuC1rfM6haReGi
- NFpjKxowNCjddUlZllVeRNaGobylIv8wAZMgJt0dOU3AnJFQgWmEjhJqS+cpHBcsn8EnT1wVKXsfgho+
- w1C1SnpyR6GuFwAFgFTt7GZ0dDfji/783W/DTzzie274AFDvPgYfe/cbcffv+O4fnK6uPhU8a6Szb2CF
- 5vB8neAKtT6rppkorrBJZQ9A3JYa1Dr0dno6RDiVwtmstJ0LrgtJG1miPqukGzLU3gJyHHOZ+g9lzQpm
- SMngquorb5kLorWX7lXr6kcLc4cVW5SwE6oLJ5ihFXUcxQPdGF1Y2PCSgdKmBhgdVTE5LoLzEopqL2N+
- xEdzHZICQy5QbDe74EFP4MTS8sSWlw28x23fIwtMfg9L/6ec7BJABEqcCxvODgsL1iFrIv9M2qFn89XL
- YMyUigxRL3J/g5lsVB4WdKQ3aa3+D5sxNhOJgESgLPRhKfU6nSSlcjC5V6QyH5mAaj8aJhBtBtq4sgF1
- KsQeSgs+xCTGOWafngW0YZvmUMIZLLzdmYgftLXVfeQ5j/7R65UBfPOCIDnhDf/y3uPXr7rqJXnWnoyo
- lIv5Ezum75UucAoNlzLyI+qCfmDYoGRbblh49/4gLWsIABtvQjVew8uIjX0DyYNZFqAGzZRKnEBpI6DW
- SPXmk6rDsGvIEQrmwCWeCWVs6XV5EYzkKO7g6aep4DYKiQVAE+SWkTMhcwZzq/+MgdwiM9Axg7EJxhZy
- N0DOA+QuIWdGzhWYZ8gZ8hq5BfMUmRk5i+x11yVkhv4cyfcxRZdr5CzfZ2bkLIGduwq5q5E5A1gDY4zM
- QM4JmVv5XmZ0uUaXh2D7Pd4CY0veP2ttnzhoiVhmUDwBiqJPHYIpIer7kbPsLJi1YJPvIvg6sa57SmsO
- SiJT+CG+lmJYx3Omk0BNUYuC6gWoxZc8OzusVLAj0LThKtZyAMmEpEFP+ccUkntW4SZAWhXUJMfRd68U
- IuZ6//G35X/ZfdRx+fJLvnrDZgCP/43X4dzXvhy7TjvrTu2ku3M5fWmuVpkFwY/kMtHFFbiCUCRbEAYg
- JmGWURCY1G6noPGSc76hAJgi96y1mrP9OFS1jVhOoxaXXUhamjBFZhL9Oy8JKnfRkUUpqrwiUqHlhPHo
- o2eB6cKZSGfJD8Lamgc/1a5eVODKHXJmHHvcsXjKU56AQTMMs//OobM++yaDXTRxCKihaYIiNmGpt5Uq
- xq7UjCRi6WM6bCpHjqkYurKwnFjk/QsBHVkXfuQ1M2jiY09KhE9/6gK84x3/oe2ZqBjVRbRI4BKY1Fv2
- rIR6mUwq6w+NegxqPwSKxAvaehQyUkTLbndxsqboTBp8PEHHK0isKEwuKk2k917S8xpIonGYPcjb6LfM
- /70foiVj8gxHnyFHWrKVkdXcnuivLUZ1p0P7cXzu+OKX/cPf48VPfNINFwBaAJdfch623+akM5jz4rWE
- UP0ygEYH95iPCimcPFB4mkjjgvMwa2xE27DA80eQoOJSRbmbLAPg7Kw9s5QSvv0CiuJMq00hRqJW0jw2
- YVDFcNMMSBsoTMbgOGSRmksFe/i9mE/ATY229lGSvNcQnAm7jzgaT/vRH0QzaHBL+2L+J7z9396Hyg1T
- tSFJnfYUuADEIrOzZ+ihNb8fAHVPJFWMRFs1VDWxVWv4mpNwCdHRm5F6oZoB2kJFGZyXfT1HhKcPT4nl
- s1DrEyhKrVON2eTXtNlbVKTFaMX5DabbEJSfVAVI41U751HYAXl2cp7izptr44t/54k/9U0/k29qDLjM
- M+xnpnY8PgE9t40u1G5FwYeDNgArO04mqw0yhpKGYwiijR4rykQThQE4tG8W4oiO0eIcm1WlVwI8B3ut
- iYtmlvmy/GqiDVDaBKWxnladgy/6ogxB28/1DDk8mHjCd8FMgstYCn2jkRLdFX+u4Bpmxqxtb4Gbn7F3
- 716UGp76M2/gMKVk9OTWG/2vmYdUUiEO2OZwNyVB91HacpahXMO8dbz1pcwyvQcIcSk2ShvuFk3zzhIK
- 4RaNgQqJ2WXF2JGY7IGq8DhU449Vel5Pd6bSQGZOvcyxN/Eq2goLucMPn3ynY7ef/Z33x3c++ntvuACw
- gCnOOPZOTOj+nQjXyL6chdFOZF5xLxMgTJXoY5tYRCbZ6KYW+R1jXmi90PKAPSBobehjE6vBky8uDt4C
- mZeUp6+Kr9RJvZ/GAX6rDSwHqyTFXzfIvISs4iDgwFQ0SW2mgkL0ciji/YdzEtwGdbDat9Vu/qZy1m95
- X12XsX/fhuoeVEGhmAJSryrTIg4oTm2I+YY1Uo0CZBzFh0YdhIc6i7f5fw6JdX8DkTcx42FFZSGySK5X
- sA69NbsLd8K0CGTdcVC4Uktywxx4NmD9IQMCpTJhsqmFo1XJG9QlIJiJTgNmRjudfs81lxz6sR9+wRPT
- 0s5teOKr/883/Fy+qRIgg3DanY/Dzp3p37983tr/nU3TszzFCRsj3mB2C6ZKH0OreuxQEMgY87N+T+eN
- aKIQYukFmKJKKQnkN6NGvCLkCDJKoik4j5zjXxo1tVeHOliReTaJtbOdMoJgq/ynZNJQoM0UcAvs5Q6X
- aG6QUye5ZH+wbK7FsPU2ukUGgJwz9u9f1c86C8pLULlv0wRMgTwUoMmqLGwQZccWmBI0q/ehMg1F8BQh
- LNuf6TBp12hccm05grDHN7XvEfolTEFIVXtIQWFapj3wRqL0J7IT4IjYpdLswJLDsAQnZj7sNfv/VMi5
- HU63pj/7Fy96/ce29h340BV/+7YbJgN4/Yufjc31Mb7wmT3taFD/G9FsozSY0mHRFQgzca11ZExjHnST
- gAXnHkGHgy036wMuOv9l08D/ri7UTxTb5eQGFK2/F6s0FpvkFw81IxmAeRk+UqM2yFm3vaAjmzqChS1n
- NLejIIkeuA59NmJQF9YOMWdG110/XPf/7gygw4H9a5Dmb6ePu5iGlLtRLMyjiEy5Z9EPcoL+6NXWRhRD
- 6atCmwwE0eGI1eIuUPwQi6JPVw4r7yEU0o8AsFLAVVjLofWrJyQ3tUFPlq74FVpW6HJmtop61mzz67xC
- 7vLxm2v4maVTbrdyyoMehKe+/A++/QEAAD723x/E4qhGM0iXVFU+0FP+cfHNFujxvQGr/eTyZ0X4gIuy
- qtMxtdtPyKrvpnjw1Kq77ExqRCY/xUvQCCQLx5EXUVLXftMOdqKpEm8QsOJRsXhYHGLnBD7YgUsUThBl
- PIbOu9StbVmYlP0EEpTiUDdD1tqPb3EBYHNzCxtbe9xmvJcqc/F69JBKqjSkGgE+LTCiEVsTzSYXY0/e
- i2hIIWJx7Ppzf9sXHsHANSjN1afUDgOZChk02lJ+FXeREmCkrylw6mLeErdadjyLQb4lpsh7Z5v5u6ZD
- V0xHKMK4I1NRrrmb0aO29hx67Oc+cC7u8YTH3TABAAAoVUiDARc3hxSS4y5slhRusUoh6Wb0FGwOzss9
- 8T7DajdBQKEL+utFy9/x3YEHIOm1oa2S31BXb6UOSFJ3u4MLFSKJSHCZHZg2Bo1tZoy/aztHuAQ/yT62
- gDT1TERew8ZB8lMZ5hr8LTu2/6/8Wltbx9ZmgIlzGYe5opGvGYUva2/JrLwyD1VjcKxBdKDNtFwyRMk3
- 0Gvc9lEDmsobYQoqD7ak7zUsWUh0Mc5LyvewZnXnIDHKVtMX2HM5JCL8uvUDAlFAJeheJpqIkUvqAuSb
- wzjQRE37o19mAni22I5nT7nno+64/HfPfj6+/8/ecMMEABCBM2dwxe5KG8QZuGdzpFHPpahysYf2x5Ln
- 8jNVygnpnAs/GorKeeKtw36L+oyJao5RUFudcLW5iC/Iw9JubRQa8TSr8+5uadjUYaIc9fVCDelklq7o
- AjoaLi6WwtW3WX9h6t2yvlZX1zEZb/QNMqNnIZmgSfbgkI2WreduUrah8EoiLn6imaBNjII+Qk+8NJ7G
- Bp0WdqYg9WrVedAsLBKl0lQbjzp2TDOXi2ctN4viVCozfSUZuY26X0YwjGHth0ERi6bHwMPALC0aDXJ4
- BSyKZ0IZmemsjb2bJ61evg/XCaP/VgPA0uIKmqo5AFTXFAfagq931VgO/1AZo/lbW+MDRceflM0nKb7K
- ebH6zlPQZDdhUVPicQRfFU4YBCixpf+VC30ACuIIqD1TOe66HY4td043V0H/tjgBF2U98q5zFHKUBTtw
- fXyfEOShyvuZAOa8S+0tKQPYxNa47VnASYVkGYFt3OwpNTlmRO+w2qlJo1QFPkzfQWfw0lcKpUHstKsk
- upGwuu5o5LwCzqrjrxMmh62XU0kmQiQkHTPxzObdYHBjzsJ1SLNSBur1sVPgC7xacChcRG8MQchDpSpz
- GKV35T4AwVm7Q093kvOx3ZRuMzk4KdnwtzsA7Fw5Ficfd9Y1hHyebKIIdinnYvlDKgCJWCb00hiDx1pd
- xYEIoYQSU5Jh02lTiS6C24L3pHtzOd2lNpyFRFA1Akg49CLo2PkJLPiBtjD9bNMCPd1iSTvJ583kqR/g
- Wm4OHlIbK1Z7K4d61p75HC6oekvJANYwHk99VCu+CiP0O9pQPn8xcmFUPvyTJRIUiqwWzyqcQRHiG0eI
- kPQ97wDnJSGA5RWAR7rJFtDl7U5ki1qH3gUkRqINpSdXQWsyMEQc4YiQsSYXTnFzVT+1i5YEKxzaFJPK
- KFvTfs1ube2zHhyCKg2iq5xrzmhym1HRDRQAVqeE933g72ZVnT5FxN21/pAgKwInP0SEKJdtmYOm82LV
- lJTtN/VTlhzyWRc12dQFgI8SbHRSYKlmYhMDGUhSaXbQNNEUbQQyD0AzGMEMqTqgr90GVZfZXGQzPXc7
- uezkp57AZnGyTa4bJ5mFaiKq3x3xLfP0B4DVQ2uYTs2kVBeI6zFmN+WUO9Ch7xgVSkRb7Eyu1egjQ+S5
- Ei9uTxLQF7VINFOC0AZyXhH3Jdooa2Kedg5dy2jdqbkYUnHxNjAjGOZw8CXXEGCK3IZCxzalYLOlRyri
- tZmXtXSNvps8d0ZEe/WcgdxSReDc/Y/P5XoVnNROsbSyG8Om+vR0wmuMtMNPXY+YRsagvvSzgYHcNtkU
- eYpdVPENyGFzGeeeCvOOKTx8m/Hr8IQSmIbIIFT+ew0AFctUySk2qSvT8TONv7wop3raUAZjCiAnAx/Z
- LLvRRRJKnZiJmJdBXgiS2Vk58gON4lsuQ/aN1G43t68DB/cDtAlgIZyK44L0BDQVVmyFk2Ssnpe+CaU1
- ZdhJlpZ5m+yHtKFaCeNwD/v8+TihSrSBnLeD804Q7UOidfQbc0XbgXobrdFRnYGErM9jSD/VdmDToYww
- 8RyITkm1JrjM/VlQsNnHg7VqGVSgREE1M+nY0cBmFkxmADV7QO1VzXKNyTcwTr5eGcC2B9wJzWARGC6t
- U6IN78TO2XtHMeoowlCovlozkXLU3crNlHRqDagjHZXpDYaBRozYojLPqh5bOv9G3jEEX1N42MF1qKi1
- dOW2KHfAWGSm21e0BcvnZZfYTgoPJl9s1rW1h8zWj0gTnQgocIW2BAXI7S1uDJhzxoED+0pA9BOVA/tP
- nwGZu5QJYo4DlTcw7WgmgZNbUeJBnJPPj8qsHJihN5qmKSjtV6EP/SleckVhCtukSIzX+gxzjzlqjTzb
- uHxYgUAolvRdQZ/2dkntDFGbnBFtudVYf44R5fcK1JyIvjxYoouH2wbf0LO5XhnAtpNOxLmfOwdn3+u7
- 7pozH+kkDjL1X0t7ywNgNT1gDg+coBsazv9mj7oFHyCCF4Nw2keTkRnmqThyw401t6WsMBPfaDTNVxsn
- LlHflGCipLQbdLj545zrEdeSXNhUIpA1CokFAAbeIBTLLz3Vkl27lDmZM7quwy3pS0BAq9LY0zS+uOPU
- OlozDAjrTD+qKbVK1JuTiaOsCkQGozXVnVg6RFBQMB8BVM14MwijZsf19w+yWh2aZMskV16ukMnYmiZz
- LhiFRBPPJ9hETrScJDvBqdLGpTXyamf8UcyYzUcyD/pr1a5bhWGAwZjS7I17zpse/MLBj2AX/c8l5TcU
- AB7wa69CpoSqqTD+5OfwiT/4K9zvB3/8NgcvOO/J4G5AlJC5CqgpLuUAs5tIsKf00aZbAR+BDCqvoeKH
- mOlIbaKACZ2HchfGiSnMW+1GJi09ZhLhzSfOZvxBeSZi9AsdlvtZgopKsFpS+4nuXO4yWUCUg0JgRZrj
- kctBtY79Z43+MjW4Re1/4QHsX9f+TDA3cWwGl6DNTVD1VWcfI864ZNhUZ+2tcP3dbCQ6PbW9TTyvU2Ea
- gTab94MnQHHLlz4vc4zWprLLfptRqI/7sga1eBA0RWAWRT+Dg7iISbV5ZsC1WtSbiax9tg7FvzIXoZlU
- vbcazf5h16k1nvv6N317MoD7P/ZpuPMLnoP37z4Jp7z9P2v+yqVH8lm3O23ta19+Qp6N7y+bsu5BLQwD
- T7qZyBo6jKB6ozwBE/1Q9xSirq/plgfIVLkWv9foatrICDW1L4A+NZkZQZG1k/ENW31FqvYS2IVKz3Wq
- al4IkwA6TD3YCUtBj19iYFP48LQlRBXiIgeuwcLlqnOjPYJb1lfbdjhw4KCOympkHkmGRygNXNfts0lA
- DgKlg5KN6QmdzTFISVuJxsoSHYJyA6TusE0v8307bBov/bq8Q/wC0rpOtKKKUu3CqsYqlVI1q1GIpt7O
- 9SdP1wtmRH0YAecLcNS5NBcooDTBNeCQswNrFAi0ZhM80hKzQ+ZtXZXat4wPjNaa0Sre+KPfmC7A/xgA
- TjvpNnjXbW6PbQ940B0u+cVn/2ieTO+X2+507jZ2E5BYa2v0AB76/2z6c8bYmpXNyQO9Ga2fAO4UgyQ0
- Sx6CVI2HVWEl0QGfjbKSLWxk2IMCAyi1oCi8MrXIfrzWBVXm4h4VkCaafo3DyTEDHKQTUY65vK/9ncGh
- fdyj2O8MTdU0W/B59lAFUVsJdGqhdkv62tzcxMbmqi75YYGBO3uyCXBftUfHIsBt716LfkJhCZaR4AIi
- hVcQgtPw/KI2n37PLcM6rd+LZTlceUhH0nkZgh/JyCTiNcx1GBGrYhF1nqEWkxFxFooqVtL4y0UlGSji
- pM4F0B6AE6QyTIOAOXBHHEVIG9QMzm9GUzziF38cFzz949/Qs/kfm4BrVOPhv/DsivZd8cx2dc8v5PH+
- +6FdPYrQJkuPnNXVG/dFzDtQoJOdm1YUocgo+MBgr9EH4DQG0SpSWkXmkYhPomjlsbKxgL5Oik8atOGS
- jHKcF7QbD6Xfbin6S4k/eQjujkDOu9DlHZ5SGiCoZyLp3fwq9C6KGCmH6ynpm/6jTEcJbkPkbrsGlE3c
- 0qYAggKcCAbApba7AKkGkIeyqE0ay8VAakQDVyFrJXVRbgroLC8GyfUmiM6UQ6F3VxWVKnyQtfA857YF
- FyNPG1UimsPAhEJqN28tSFguIiQayMiazTZBck9N7h1apNqFZnZSuCf2OnCOiWQXeZCq+sRDV63jJU/7
- cXz3a78xp+D/MQAcSVOsXnDecLa1ejsoccHqM7e39pl+/OK5k7JYcAkIppM0Tbv/ceNS7MbbVtIxoSPr
- 3F+t8j+bDZNYgSGwuqYATZDSBpg6ZBvFmfVXXvJxoDy4IpAp2v0qC04TlEmBjXPKCeDUaB1xUhg7sSkR
- mZEHL2hQ3JJGFKB494XDhCtuCQFgPOkckWkmoXaAOADGs6u+gUuxLlPpNc0YbPpENHG2HanKjrj2koPH
- cJheUzE+cWdrIGgDWIaQQbQG8oxQT2DWcsAJPdnTfYqBxCHrKIHNxt5aRljjj4O2JZvwjbfSDTNgI+sJ
- +r4Zk1E3aZ9zwj1POfFB9/xuvP2ZT8Xj/+R/1gX4ugHgYb/6Cpz5sPvi7173p5sd03luj8UjTYdbv3BB
- KC3o3zUoVNgcBA+LIAIF9yBy6mVG3/xgrA2eJWReBtIYKW3peGTT6yW5JsNLF7964r4SLqNDMqMKakEO
- Ktos2QLNpEtPa2Lq4OOYTYcSs/YtfP5q7ER9K0L0ssvgblk579rIzAvgvF0/56T0LXiAeQO0W0YAWMNk
- PIP0VdR4M8i7mUuynLJbarc2Lpmekr9KoKiKBLvO9wUHUGmwnyLzAjJvK05EnkXIa3AeAXkk6b2RwKxN
- 51lf4xvYvCXdKjxZg9cOsKx4j0G/NKC+sCkHpSlW01j4vxt1RM49/ceea5M5RyOBMZJAhwqECfJsfP+1
- q8cvbY47+sjb3/1xeOuzn45H/vYfX/8AUB+7C3/yzJfhHo/9sROImlNjtCyIrqQWySFq+1glWDHZR2HW
- h5sLkz6WaQjS2bQlQSBNFWPToa8U27pcOM1NEVz0EsbThv+OIMK2FFtuph/T4C6rC4vGvUBmgp7+WXyi
- kT29s1KiIL2GyLwiGQhtAC5rteWNH8GiQ6TR5qSqbxkBYAPjramKuWQf35YlaKXQwMkzcj9WNRgX6reJ
- g0oWaTgMyURFOr3WZzl25ynmUVDiSQ4iYjTI+ajATIwioQM19ygS9IJnM2ObuGhrFPfl5PBwp4NHaq/J
- 1+lKYMuoyYQSU4HL05y8nJdFehC5LbwckMxM3XjzKRtf2/ebi8ft3H3GmQ/F0iknX/8AcPDAGF+54qOY
- 7bv6h7pZ9z3GSCp1im21xgE65WSvfdzFXFhu7AKIYQJgcl5MPhN3Qg9NkWgLVdqvKXg/kSsBgUMTJ/jM
- UVeEnmhWHHOMrNEbExmgIrYzi0OuAZaoJ+bQFcFJk0YLRo/FboyEL861QE4rQ55VAmRRwAvz9BaHAzh0
- aBXTWRds3FoUKzcuJ7R7K5qK9KJuBrVnxzyU1nwkqpKVkmkJVpqVZT0pFzz1Zj3AGIIDKeVI8IW0bn1e
- Et6AWYQpPFx+uipaE2hBPEVFGw7wKiM7lQtn8mBHvcZkhjSd2TMBE6Xh3lSr7Lie0Yw7HtUgjKtua+vp
- G1+7+ueOedDJ1VXvfvf1DwC7rrgaD3vazy+2awfvC+4qOJdZPhhHOXCKFFoO0XCgIp9hNKiputEmS5Ok
- yGCLQ6vywb2ksHrQsouqJ8gpHO4Upq1Wx818YRQYcXTaNU3BiNGOFuQGRY2AEvuXnSqz8m2ayeI06qoK
- kDAvqSqwaSNoJkUtknoSMLfI+ZbVBDxw4FDvv9lO8J7wago6j+bqaxTtGsa1KI0w9W5A64xPcpk3Bc3q
- lEdYeo2my3B/wBSUhksGWylEe+TO1NlHzeFw8sMBQGoDE7ZSebK2pOpub5Y0Q5ExdtYDUJqIAnITwRtW
- cRHDBNQuQFuOrFlRNWKa66FMwLPN/R/48//TzVZXv+6z+bpjwPHFF6KdTnfmNp+K3hvYv5UaidYRc+7O
- g0rRWzTX2NNTQIzm0et6xtkoN4X+G3QCoPLP3hV1y24EqabAFaAwWomzVn0g7kNoGYs7Dhf3Fu9hsEb0
- HqefFcsfnXkSxP58Eb35sy1ELKrEuDQEiRowjV1R+Zb0JShANdFUa27STFAYbQGvzkHnn2s9xSdOCooa
- /yUCZy3VFgqtlhtfI172oQknPdTWy55RVoSoyYbLCUzcSGaWNhS5R35guc4E923WiQfah1AMv0uAte51
- aJlj0mYzuY6FrjeufS2xBjnzQSTKvXEj1GBWpNbUVDSlt9bD8evucJf7o15avv4ZQLtxCO14bQzw1eVH
- u97m8Q2lcEX2+WxXILoKtuGwoYiCEIgRgqi4/TAV1pPNR/087nnDl8DEvVM7biR1XO0JlvRvAzswpQ1i
- JA0i0yraapvhqAtS0FQJGkUiyu8ZU8k0lBHoX8ot98B4C/sSENChwu5zg1RyzjyrFj57YzAYvfPQ0++e
- EaiZxPDAff6id4AZq3rzTJWXPWBwQs47dJSop3a05XKJ8hE4L6o4RxQQmRUUKdc9fT/2qUVyvgAZ7F0b
- 3eZ+LL0Ig7ab78RAGooqRyd7ZqrA2oF/D5iFPoM7VedUD/92vL/exy1j7YJzr38A+MD7346tMe1LTfUK
- orQPrv6T0UffR6kug7UOBJHlPvb9tNapkeb7R6EmREHLwUw5KWD2A3mnNO9QjB59c4X63porNn+mLhAq
- AKvj0JP2CNgEgxh72cGawUQBkoFkRVHnwIlCJvE8lnKBCzGIbV5N3PNHuMVkAAcOlXthklakWaO6HZO5
- FHlmMNF70wB5URF/kSmpfno6eYpEnF6dH0e5Pu5rgbwC7laQMJMxMBqXoica+1iZHdFfuyOQ2K0nRw3K
- 9CEL+Mgbx6Zo3eqSSuhjEuxQGWpwISk1yAxxREQmuWWeakj4v2uZiKUN3QNbPs1ComnmFnd/2a/g3I99
- 8PoHgAe85BW44jMfwmBlZUWQGoHuqrNQBAqvpC8DPbin4qijo6/i9KKddK5c5EH2d5Bp4qTiiCahVPm5
- Syou7hgAT/Vqd2BBL2WX5pyAfYq+gNWahtByUE5P7HOmvYjc4/fLbLgNAcRUf0KPwQBBecm9DIimoLSq
- XnUCThKQ0rgXqG5ZGUCLAwfW9HlXeuJaJqanu/Z4PACT9Uzqwvm3ngFZ2mzCm4TDbM7J8BddWRu8qPwB
- qffbfBRabEemrGsPyFD5LZqpr0By6q80/8hxJqSwdbOON9lyyRoHnumylqju7BMOGfmMilKFCX3UyjtR
- bAijwOi5aA1I01Ot4tXxWGnU64TpoXqBgPX1//H5fN3VNhhn3PFnXjpoN8ffw5yXS4rTHHbCOhoKjJQ2
- XLiRqOD++29naOjaoysbxNP9+Kz7Tij21ylsbqA4zGo6STEVs+DBJdPooRZz0RE0lVrvwnIpB7QZhcBX
- 7GkZmnoRFcFSdqqrXi4ETy5B4KCno/J768KVp4zD3ZVv3l8bG1vY3NzUe9HqyNZg28XDUJzmiq+eCHdM
- 9ZDQKYo7F8v3EqY6WmXXDkhpFZTWPdMi//0WrFbqmRfBvIiq2iMZgPYl5GfVAIbG8EZ3gNyaxTil9XIt
- eqA4Gcl9FVMwHrG1rbbrmu3ItU6VBGXZZKPmNVv6d8EaLLJRuRbkqgPLEkD5/Hqh+uLiEQv4RnrJX7cJ
- OL3qKnQb63U7GS8imGmUkxceZQUB1xZFF0CjO4fC3eiNrFMAPU05kiM48OkpbFhrjGRXT2Hl31MoQYoc
- WVZj0FQEF6gNDsQW/6yTWkRMvUnl3PPkxpClgUmuBU+9ppRctyxegOsOlIcyEUlRM8GTZBBV4fS/aUqA
- yWSKvXv3S+JcVajrCilV+ueElIxeTYf9mzTKxX8TEVJKOHhwFZPJBOaFKBj4SgNgpcQgS/mVqckjoXGj
- E6ENL8OSB2f2zv0MRBsqDbYUeg2GnKuU9z9Wz8eE3B0Dwgx1cxE4L6HrjgPyMqpqT0+E09aMBH7FtBgk
- 2EQ9fEwn5iBsgc4JYV3R/uXkMl+ylgwLMZvjC7BCozsUJ+Hso1JCBtPMD1ajBxMBVKUPfu6j77nmJ9/3
- H/izh37ntxYARgfX8NXPfXRztLj0Mk44ljPu3z/5ykyTXZ8cZcObrYorsujYMNd68sUkIjk+WjqyXXFE
- UfJEdAeO8tIZlaTT1GeAuQiDG3maCm8O6j6WjppS0UzHl7YAMoBpcLM1MpN1fcn/rmeESibhPAWniQpO
- RohzYTD6JMIt1m78MeAXL/gqfu3XX431tVXUdUZKFYAFpARU1QwpLaJpMuqGUVUDNE2Fuhqgqgaomwp1
- VaOuB6jrBnVNaBqgaQbYu/cAVlfXQaQOz9QWvQU/MMhr9NztkACQ1pDSwbBBptroqhF7M8QDJYOZp4Ku
- nbSpmYbx77V84BFyXkZV7ZUsIWVwN9FeQuNjN7i/Q6HcSo0P3Zxc+gJaHshgz4RlWoCsB2H4BHJsjJeS
- MN3JKQqztg0bQ3+Gh6pxWRUovtPNfdoxpWrhQ6ef8hBc8Hf//A09968bAOjkE3HfZz4An3reaz43WB6+
- ZLa5+bec6ciS9nYhzS4JObPx/HOv2uCYPvsH1Mia2nACd5g3PYiGCjZqjOMAcf6lojrc81FLvmELF5t6
- +znQEeDzYO08CwFFoMl9/n9Um+GAd8hFYlwlzUS1Jm5uY4HlOPwE8wRde+NnAePxBJd+7XIcOHBIMhI7
- cWgLPpazLjoPRCZbwTXsfRpyhWaEpZmS3Bs2WS8M9dHV2vCS2lxKge0CiOqOUhDYppZfjfo2olCqvZRr
- FF8x1UYefDws1zsMPoQLogGYDpRnl8bIPNRTPuA85kxivCntn9dYqASmgYwsmQCqhXxmNGBeAngownZq
- YMJqpS7BzaZDVEhM1MIs8KTZOZBJGtcKXtKMWzMpOeSqWarqQ1Rt4ajveADwl39y/QPAw3/zz/CeF/4k
- zj73Kdj58EccufrR/3o88+b2YsnFboLBfrp2jpUuXAFN+bRhSIEua2OSnoswl7Pbm4QGkzTV3lyFE9Pc
- VgsCMQ4ES0lRu2ovczEtLcATfVcXMVFUI3VArtwmrBBJshtHsCH6mH2hSCd5WLz+Minib4q+3lxBd5n3
- 3E0CA6KElCqkKiMlxU4wgcjGUhOYhZlnPaZT7yesgFCoF/CNLZqVTal4dhcARZkGKWGKUYPSBrr2BBBt
- IlV7YCIiRTcguYqvYPbVhCW1OsevdBTLYEpItCmv3W2XBp/+dxkP10WlCQiOPG0Qi4EqQHUawFQoBo1Q
- 35OKgxqPAKL6wwZ/Vsi3ZITFN5JcR0Kbm1QMUYWQFtarTzRayVow9Aw782DAmXZ00xqT6fQbeuzX2QQk
- Au7wyGdieNKpRxz6+MdfNFtb+7Gcm0Fx4iEV6UBR/6UIEupcvjhqu7OjlqzOhpcGnE1YEcUJ1YwYXUtd
- YZU6OmM/9QuQqPAA2h42wNRdybMDkxmvg1oLu4ehI7fSenEw9vcy5yHuN49QB5xBF076obgUI2QYwdvN
- RlY5b8f19Wv51r60i+1Er6pw62laxCwtlXbvhyZs/rKQ2QuwuueE2Ge8VT1TFigRSOr/DKQNcF5G7o4E
- d9vVTr5AZdmgw2R9KBuRpZ6Cjmz+Tn6fkjbwbN2ZVHexh4t4D4q6hTxC5hUpUWx6xNQbRXNe9FvBPNLD
- aqbAtk4xCIUKHKXqi8NPVZSj9c8iYKLYgbSKVK25EKob2TKa3OW7XXLJFt7640/F4/78W3AGOnjeF/GF
- d70Wm1887wfaQ/t/ImcMiAqd0Tr1bBGck8N8vYOephrRdCRjH0ZHgIRO0Fa5Fl91Tx2rAC22YKKXqrNy
- 7mkNzAGA3KPQDBztn+y/Sz4BMHBJMFuMeIIA0iGKtVldTnDiXunhEmc2FdCTK/VM6ZKPujgvKeZ8oUwt
- boIAIMSbrSB4OdEUsy2nvKkgK0S3uBlzmYsbas907YOZJbERvSYqhLKlzVuB8lb11cquJCdJpWoPkLYE
- uOMqwiynH6eAGWkK3p6m8rzSFJlH6LrjVHOhQ3Y3H9aJlkKKXTpc3KTLZKAC8wIyhi4Sa/BwCTLa9+Ek
- 75V3IXe7VLI8CfsTFaq06g1EolY8MpkADHvsRmEe1mUaYA1lkjIp81AOplwpRd68NKfImR5y54edfORd
- HvgDuOxf3oFHv/ovr18AmF11lSyLzb3Hcm6HZaaeSwoSHHeLO07sBxSLJFYqpINALL6qLgBTMQQxp6Ei
- 6hDVgnSxcvERKKnktGQgnA77eKVjWoRIXY5cYZtSzZA3bxgFyCNBzBhoNuu3s6TMgj07AiANRDO5KKcg
- 80hlqXdo1jFWuvPqTRQAEohrlaEy1J3hKQbaICMQaiXWLLgMt6v5mNMPN46e4x5d23pEqYin0gRE664T
- IDp/+xUBOFPI8KLOxVuZ5VsZ4ddWVIIK8k4UdTmPJIPgoWQIeZv808kmzd3Rek1Df8aUNkBpUsxHHMCj
- +g3WvefCQZX71fQkxHPe7v2iogxd2I8SWIbaQyjwdn99U0XGuLwvM4hH4LzNOQrkiMkMtLP7bV2z/uwd
- dzixqRcXcZ+ffsbXferX2QNotoREkLoJ5vHppJLMsgBar+tcaNPntjazt9pFbnDGQKm95Fp9nmYpVJKd
- V6/1JFNZYDpnjzqEPb8e83DHpKTYHogIfRtScn4/FI4sP2eQz4gWpOBhZycIufOPXPRUx1UDkbSiFuCZ
- 6gOyw6EZAzElSQf03plKUoWb6kvSzQbEueA2HOyVEfs/Uv4ptoIH4T7V4ZmpAKpDv9s+M04ZbDJqZZ0Q
- LIBoAyntR9eeoDPzBYA7cN6pzjySFRDWAYzCgcNqptHoGl0GdysQ1NwhgKZo83YQD5Hzkch5BygdREXr
- 4i/gqr619nCknCj03AnKSNLg7iZppj0I6hyRmiAaB0jZwT6eCQNFlUiRj/b8OQ/0vQphSgLtGODF4i3h
- B6WZ6LQAJnU7rp69/xNf/M/Nvav/+b6n/eT1CwCcEk69zWkA04VENGVxsNCFsOAoJuZOBTY2gzBiVTzy
- iINcGxc1XDudFS1lZcV8dx6xeUjamPK/oIDdrgLop0PkA/RtmrJqElh9Th602OfYOsbRE7HIjpvCjFqS
- oUwyTBWmvB8VEhNMPbiIX3Je8CyDfJyTgxvOjb37LUMzequd6hpA86Kw8dwJR4VVKVhY20gubaI04ZSW
- y+w4gUKggT7PVBq5NIZ1/OvmIi0nNmQT1FeKSGw+AkRTpLQPiHJeZEzTEXK3C4wlGaHlnejyIlLaRF1d
- 5qIa1Eq2mHmpAHLUhVg2VHGzLuIz4bl6tpSReQEVrSpxhyTgoAPngeBIXLoulZKRK+0HDIBch9KiVvmx
- ia9j4hQAZp0GFC19CMImtcZ41+3mST5xcnCMq7vm+pUA61++CEccfQKGTf3elPAJUghkxiJy3qYNr+yk
- imKJnLwMKOyn6BaEoLKSDuvgO7nBSCKmIgOA2CifKGd4b9yXPR11sw42TLYSRjgQiPw0Dxr0oWwpp11U
- ZbVyJ5fbx1BFpLqki9R6bQsknQ+bctI2beRcg2KqQj0blRv9i6Q+z3kZuTtC6+1t+u+BY+uLWq6OL91D
- odFU10o/ZbF5rmV6CCLQkXlJxTYHYIPM6sltmpEyAJp6lpDSAVT1Faiqr0mJ0R0RVKhEHSd3xyBPbwfw
- EoCppOFpVUu0TaR6D1I6qAhC1dPjEai6BuYb4dmO9orEsNYao6VDX3QhrP9VqRydTLZyXhEKOA+KloUe
- LjmvqNeAQYED/8VNaToVRtUDh5OiGzc186ydd2Kfn3mEJPfsto/+wC+lo7Yl3O2hj/3mMoBH/8UbcdKo
- wUWfPA+T9W7/+KP/cV7X8f2QR6rqWrj70lATAAdVa2pgYB367AKQhmVmO2G56kk1Fguo2Gjs5k519CYC
- HsN6kwAoZDQHueWqVyc6Boht7suaMhqRxx6+GlZY5PX3rYvir6EZXammKSeG/TfXoHRIFWqWNfXfKqlv
- MKJkzsi5vSkKAH2WVtIMtamXtUchBBUKbtCmsZDzYoFkG/lFM5qE1nEh1oDzGT1l3YgzmaPTWG3YGlVW
- QgBoKWaftBNeHZBUOq+ItBc1jvqkaj8ojZHb46V/wJZVdD6RYh5J/0lHhcnVoVvNSBoP5DJdaEPjuw5C
- sFaHj72HIezAgROBsjUL2azPlsEYyKFAQXVafSuigI4rA7ueRZG0p7Qqv5MXNbiStp9WMZ3iRz7843/z
- 9snBzY/uOvOobzwDeOQf/BUmnz0PV1xyNd79hy/B1te+eP8udw+zKJTUVy2lQyAao6J1bwSJ3bU2y/qZ
- HopDTnYMALtGWpATM5toFVlkrbOKXPK8gUjoA3AUc+z8ZGKundPvCjMuKGpfucx3XeMtB7BP7bRdNu1/
- 3TROGvEOt46EVATEfAPKwukwbzDqJRIzcnfTCIKQgZg8QhrLTMGmTngxFN8MiWxyMFNFI+uMd8V5OdCn
- ScEzSUVT5ORa8lTaxVOtXDOVJhqLKnS34ipTLu9WHQSlNRAmIMrIvAO5PVL8AtIBpHQQVO1DztuRu6OQ
- 8w7kvFMD0ghV2uuZgASKmfc0JKuLTkFJgEW86JwFn5yoWjGldSDNXKRWgKwjrRoGSBgjYVN7ANo4dw0A
- wR0kmkhQolY3PxVZemIwTQTeTBNI4/QAqmoffErTtSfy5uzxP38BwJPuGwsA3/mbf4or3/thjFvCd7/g
- OXSfR/9/D9rcc9lvczc9iZSTLc2LCQSDLXp9RJvaOd0q9RiEzCGuPCoKYjUwMTgp2IammrZHvb9oF9aV
- jIPjpi/qQuWkN3y61q/zoBpS2yg3Hw1mpijlAEckWOhRyAleB5MQ9tTMgpOTn3igi7kqQclSS27Qtcc4
- Hx0GXPH35pto+5MKT+T+PWGdwOSq6Bqoa43bnTnmIXvtD8sWqJNAgamOtsyJ2daRIi7zUniOxUvPFXMU
- MWiIT0kqK32Mm5LaV3tQVVfImuiWZFOnLaRqH4AKXd4Bztslc8AQVbUXqb5cdQMHjoWAs0RzMCkxZGFf
- gA7E4Lwj/AzgIDhXs1KdQR+xCu4gBlDnM+j+KWpFWpaqgKjpHea8IiNkqlxP27Ibog65zfd4w+OPWFo4
- cjue9Lo3fv0S4NF/+FfY+8GPY+mE4zC87RnD13zX937f5Jqrf62dbp5RNlYH5qx4OpMqMiedqlBsfb4e
- BD1c5cWq94KIKyeq/V3l3PEo3yUXkT11Zz/xKZz6hSkFd56piqYcQ28iA5gGFZ4q1OHa/AokIjNrkO59
- p4QmtYia8yUQI9ElB72YJDopaQQYqKCEIsJ69NXuJuwFhP4FssinqwgGIyFxB1OegeHfTc1W14ec2mtK
- 4iEkOqR9jko/51Yo9ZJLhSMvw3kaDGfSOVaDq4DOM9HXMqrkYE1HtImq/hq4WkTudqDrjtfmnI6PaYoq
- HdCNNwYwVPWfiWaMhERQgZIu5JyBqad6BOZeTejAeVmmOl4adiDE2n8KeIDRE50qFQWxwDoMXgEy8yc3
- Lkm6N6Tf5mNTWleS0zbdB2psw/Vp4z0HT5zsWz3/io995rozgAf+5p9hz39/HsOTTsSJT31Stfft7/zh
- zauv+sN2OjlDkFi7kLsdyHlJP9wIbmTIDTKvqKvqoj6aNuD0ixIPodN0pszkXc7LRnWqoxcZgdIQMQsl
- +NiwGD9YfR/qcm8Q5kCygS+WfvAxgYcCWIHNqrlynjarFRX0AQJ6yiswg7lGzksi+W2yUrSlPO5UUkma
- Sp1KW951L2VAV7TebuQMQD5vEUAxkQ5GB2KjugzDBGhUmmVpQ8E3EwfAlBInF2EOsGok6D95RRd9hyKn
- FnUZW21uLWojrw0BMpfms7PrOvcQINpCqq/RzOAA6uqrqJpLpUOf9NTFQD+H1eEZlMa+BjyT02ZdHHP2
- +Ag0FbBQXvKyztx9BUk5kYxYf95H6CHLEeDcJNw3y5D1AKExkCYAA0kDi+yFMRJa5eYY3KwD8+zYdtLd
- bv3KQ6h3bcf9f+L51x4Atr58EZZOPwkf+oMX4Eu//vJHzvZe8WJut46SWksWuDQZrKG2KHUULwuYxR/C
- VBYLmVwxuTmDpGqmDzjzUSDzQPfrGExZhUCsDKi0WZjRk3xy6Gef+1dOfgpNwzos8IDRdrCq6c358Y2+
- 4jDpPVjUzzhxGSkjsnBelsZOXgFYT/6kkuY9g5QqyIGxZ0gIvgrX07D5W/9ykdY66OhTadRR9qzIGqWC
- SDME29gtzohmIGxAcBjZT3YZyW2Dyayxa/QvhQwoex4owdzkuJIr+5CbggwUYzAtWWZeLOIhnEDcqUbA
- qgYihWzzQGG9Nt7UphtNAiMwafApzs7u/WjehL4NB2o6sw0ZC1oaz/pZJVhIVJpBGBDKTUVymitwOfgM
- kisiMQboeEnFQoCOV0QWHJFWTgB3o64d/n/bb3faSV/+/bdiNEp4wBOf1Q8A3/GCP8TgrvfGlb/1Ipz9
- mKfdY2vP136DZ6snumwzcdDnm0HIHpOiQkJASmtISgIRNdWqbGCH2LJi/Qv4w+vJrJ1yzFyv35t4psOO
- ov9viEBvlLgxaHKDBy8XrHOajZ1n6bjixZ3/nf22k/cLINdsY8W8GIRBB/ozk5I6+wix889CHhh1k8Bk
- q+FzXXZ1GVUTvomswdjo1yrVJdMc0sCmG8AnInqvOCArXeU3g9JMTlLKGvw75LxcAovjRWrXTxQcQNFs
- cEYlI2yKzgMEu7hI6exL85k9ixCjDcsGG0mn7Vlnlfjy8i6pfgCjBw8PtOXiGaEnsEJ7My+UMXVeAmU7
- GMTFWDQxFVjFjSYpXSEuIaJebcRae4CVnkDl42ZCQqIxUjqEhKyCKhSOriGIpujG0yesXXrgb7affer9
- PvxHb8BoxxLu/30/VgLAZrOI7m9ejV2P/4FT2iu/8jIeHzjbUlK/UUwgniKlVVH70WieaA1VOqQ0yIQu
- r2iEr5XAV7T8jCvgWmtEmm4ptprN2imjTI5n0tlVUI48UCWZuPZ+DkSeOuixa6plC8cNQLLWUyjjLHcs
- 0pqTM5Arv06isboE6SKiqdbqYl5SUnhSOegxDJDCCuoQZRcAaV3Tzrpni+4pr3vB3fglAHHQbqAoq670
- brQq9dYqhHez1+uRgKg1vtlycaNd+wHMRLZgNEhFW4ogJzluQ5BxTKlsnliaGViGzLjV8Ag5GG7WnjmY
- wCa768+gPG90ofRUyq/3fyZa7wfPAHDIYGW8l3hW1iwzurwTOa+UwykPnM5ONJasKi+qVJk2lpUcxMaI
- NMKTahbKu2spHRS6DYRmcHJQi+x9mdWUp+vfMT208adn3ve+9/nC69+Jwa4V3PsxT5YAcPL6lTjnEx/A
- 5IrLHtdujh/uktxmZc1tWQRcXFqhowtXRJEnJ8m7n5RwoIRt+JKWK+zVNPS8oyynT3ZWXbFTKpLd7P8r
- WyjgA8ImKtoCKCMli+V+slhzKHu1ADKQsKEWdQrikmMzFH3Aqae7ibY0rjQyAkRbfAlU9YVovUiGW4w0
- ocmebsJNkAGkTZiXIgVXnIJjt7udC8jHHHaBAMzSdm9e1vKKPWiWhiz5QFfktGc67DH9PyhHg3xzoSf6
- 0um905P7MLEaY3XOEMe+AqgxLb+Zj7FLs69yezfjAjhVWI1HPd3W9UKp0KCh6tJJdf3sgMlWHgIFt8IJ
- nBeRoRkDhHjEZjmXNkDVocI+pC1QtaYCKIvgbgdy3qbOU2tqdDqTwMoLipg8AO4O3GWyuv7Hx9799Ht8
- 9a0fwD2e+31ytdOLPo1n/vQzFni2eTZzTjnvQJePQM47JfoQ+bhH8PEsjQgSLbXMox7FM2kjzr7PISqz
- arMLo2lQUjyV4GZzDaaoMdh42uioJ0/ViwmI6cuX4Yymlt64MbHGQPCg4LfuqD2g6AlGpKCdgBPYuJJC
- vUqUZRZNE8kA0iZS2o+U1h1c47+n1GLOO4WYgsb1E5lbdN1NIw9ugcv+KzOBaB2UJn76inquMfu0eaWi
- Ia7nGO+NGqPEJN6yM6SJ/2427oU7KlXe5SGaCe4kbRZ3J1SKSyi9AVeK4jjGtXWjJiFKpUVSrX0/wGYK
- B+7KgcXqJJ312ixd90b2wIlAxVYuqbpvYPUZ2csP16HgApzhOvEpBVjrfq7UxLZWtaBOM0ctl2hVJg5c
- g7gC5QZmIy6HUIucF5Hzivw9TcHt+t03D45fvXzKsWd94IV/hXs/7HGo19fGuPLygytdO7kdMEDOy0G2
- eYRClVRVEhjH34w1p+bDIlFPlW8k5VoIPnA6I8+Ne+cxaiXJTHVcZ/WhdvN73fByzheNwb5BRMHjk+sQ
- FCy/NXE4NKbgJ5lbkpGdEL4lgnRTSHf92LTsYOy/Q9o7gQex5FkDKQbBkYAAkJfkBOAWuVsOrMcbOQNg
- 2Xg5G37BniMA5ctTTJzUqadScFVUficf18LreVlDsimdku14eIHOprSqa4pCGWoS4Cb/PS2deRee7URC
- W2tnDkhT6bFs6MXXYMwUn7JccB4+clYLO1j5Ro4nkc/Uagqu2ny8oGtyrC2DZekp6FSAkEC0qSA9w7to
- H4xEJDSlTekhWCpv95hHwjo1CjEUOJRXkGhd+hDVqvQ88pIiTDc8YBA3UoakBKI1ABPkWXOfdgOPWr9m
- fP7yETtRX/blS3D0GWec2nbNKYasQl6ATQB8pq8MsaQSRBJtpsrplxM10Uy5z02RAAcrxdWQW1sCk+RK
- 02mtF8kaaXWQ5UpFTSXITJm3oPQVEiIt1zZvgRajjBkRLJrsFKIuqLaq2oyNwrzfUNLeGJSM4kppqzRt
- nDCkKkFaerCBoCxTSmsClTa0Yt4uxBEe3STS4HWdsH37EkpnO/CZLHDqHF2e24LfWUoFXUlgTCZTbI2V
- vgsIQtQ0HdwgQ/kTqFRKTZuyeZubrEjtoDr/fvLNQGmfcuRVfhutSsJxkXQn6ZYXARlt9nIFQg3Qhjr+
- aMbjmU8Oh54Cv5KSeDAVaTMdDZKuacYiCOuiY8gzkTXzNTXRkakJk9ghMgNoAZkXQXlUSmwi33ecxiCz
- NDPlLaM584LSpDeQMEUmM7Eh/fmkQUIl7bJKndMEoMGdjr/PjsHW/um0vvhr52P5yOPP5lztlig6RqYB
- CiVPmwvePe+APAzw320uWcw8QFZmnP2OQzy9waebPs2cIy3dV5NLTt4osm5o6cpGjTaENC/Ic/s8mwO7
- qkCPe8w9DvbLrgqUSkMGJtNdoTgNc9BAUIw8sjb8okCj0ZJnmi6jwIYpKd3ZrNRmSOkguNumqjE3fg/g
- rLNOxmv/4pf75UevF8lzf557BtbBqSq8+c1vwev+z5ukd5jWtFM/ks/tlOoUTvgU2JaWMc0U+daEnog+
- g7xdpNVVLNPqdns2Aoyh4OY79SahMQtl9Mh6/5t+r8AFbiYo/nwGxmmUxJQCIaxTnILKeFf7ZCJAtW9U
- WfPrMEIaOAmUtzOMw0QaeJZNOANQg5vqH0hjfUOznGUUarIJ5yw5rsJKmq4bKGtTgi8zn75xxXghd5jW
- J5x2eywN8sVj6jaYsd3BFK5c2qKMSKTbmvMuAC1StVcVSyZgrtGhUfDDuuPhi5ab+qdzuVhT+HWChaY4
- 4kFStP6LY3DJDIA2bHxT71FnGbeHaoNIpclYmcCoLShtDPUgwSFwKB+BwvZ2VyI/obTOi5mFlg4+ZaAI
- Hw7sP4XGmtSTlEI3fgBYWBzhtNNv8215rd27j1A9QSpCosomj43CEkaKuSaUOyByV6NA4uICMsqLAC8r
- PqEt/gv+uqxw2InyE0ZO9pKl1DiqUBCEOk3g2tWARAfRbMT0kCJ21SE3rtX9UVSJrPSoC4CJ1uWa8hCU
- WBNKG3u3nnWW/ojskcyLOlrstA9Tl5JR4crMI2QQquqAGOrk7Up3j9ORAYD1sh8zlvJsWnFOSF+58PO0
- sLi4QFRlBL8yS4NJN5bN0KVuBzJF51y42mqVDmq61/gDFJBEjSK4aMy93DMYcxw4D53m6U0dp+paJoAy
- TXAXXl0E3AS02aJGeyiARDc2hVPaZtyMub6CattR3yxUfqrMZHvAIdNHNMRXvE0cG5MoqjiGiEwzUHUI
- N5U3wLfrazbrVDFJFzMP5d4bcqWn01jYfqyIOi/Fim2UrjEZiYnxzETAL3mHnMh5pNLr6DeRecHvd0pr
- oq5jxiFpE4k25QDLS4ATnTRz5ZBFmGtwHvgaFjKOKiKliZ7SHPoHW24wkmhLm3+LahCjOIJ0UBuhlaBt
- u52KrN0mKFuYa9BNSFydAACAAElEQVSiBx1pgE51hU6RaDUIt3SCfaBOAXvLSLSm98Np6wOmumJUqO/2
- nU9+xOyafS/rurwTPT67vHzOy/oQtrRmq4X8Yy4lrCkRN1JzuMKO2HHJPL0umHdKvU6zO8KkdSULTcBU
- K4tuGvTSNU0zKzA3b2hDDmD/LddlD8QceQ3H3hsBWtnBsfBNngH0Ov2BRUgONonNSNMZNHShuhW5MEpy
- pyEojpz1+uBiILhJMoBv51fOrA1FrZUpI2EVqd6js3FJ9RM3qu1Y9AOsnwQsOxGHNdsyLgmb6QYPdHxI
- of9Sy2mZxuEZzzzVl4wrwMXNKCboSBpxB8YPYCpZio19FQvi4jEuMLogJy5N9O+njqAlzTJEAr9ki4QO
- Wef8Io6qyFdSshCkr5AVfUppTbot3S4FW1l5OlAGoeg4MhNSkvF05m0gDQSZeXdqmhM44Zp6sm/fY9tJ
- dQeRHyJwbsJJp8YfWocYgCNVh3oWXTK62yof0FJtVuFGmAR3cvVgdgMN7mnESSq8iYpVLgmmDWDGIkNH
- jPXw/crRF785waY7riA4BkmzrhiYFDkyHf+wzX0Du80RaIqLd4ZgVP2J6kBFcYiiboGTZTofqRVRigac
- qyL3dDP+amfKl+ChBtBWOQMzVcqxpp+OtXTuLXcxl01j4CL9vieKTu9WkKypNFEnHXeFrxPGcOPVCB5j
- cnUe6aivwktEayRq09Gh50phJ+M7oHO7N2tes01P0qaSqBYLMpUHEpSyqUGNBDugZYz0LeqgjqVTGYxE
- gSuZlNpIHZMYmQgJA50OmKz6VFWVjQinzMmcACxJec7Ynmd0OzA+VVNua3a5arhoJimiy+WxodZWxknO
- C0J+IYGxyvgvRGIMA3qLfR5qwUAaOIPAhGtcPlnMEsZ9zXxuRLoJnQo5DPVB62bmBkgHNdKy3CRXkCVx
- DwIpUk012DmXjCDuYdaAQvNGHklHPzrSotDUNGFIZW2VLEXrWsohYJqacEZxOe5A1ET/x5vtV5dZNkNl
- gTCB81DGUYaaJIGTU16WYJ63oShKKZ4grQuQCLUDiPqDYYWDsfgIRLEW1hPRnIIEvq5sO+Qgbz50aXHZ
- wMkzOUPjkc/37dwuhwIbHoWHroNAqvkouBERFMmodB4/C/J1anNnwCiw6BwSNIO1XlYtTMy0pU3IXa7P
- AMx0dA/RIcgDKTNogswi3ZfSfiV2SWbP4FGetrsBoGZQ5yKfwcRQ0qwhKB10ZpWcvtoUpIIEo7Smp5iO
- hgJl12ad3INn1o4GY8WSu9CEA02yAjVsjm8lQKvsOyMgmcnmWNNraAARlRdrIUr9tQ1IpQEpfm7Qhxms
- wNzFOGmjr2gUsI3pgsOwL8hgMGKlDbnpp93ToLJj1Fd5evr6U3Td7OYdANpQ7hniU5mPMqIirbIsNd7S
- ocqidrdVflv1FKJBaDFxic48gyIQk0dwsBqTjKaNEEYF1yG/36iST11ovdQWQhinwtFQu25XI3Z9y8h0
- ROnWc5KRuqsONfqsNYuoDoliMTVBwJbVlbhT8t0Qhv7jvKIHj46XaU0VlIYgNuvygcj28TYQtzoqbVSd
- WPoUmqMho6rztEM9GKSr20ndArl2fh3Z+G/DrYgomeLqEhKtKgpPomDCTCW0yW23WH3OpRNrJ6XahSkB
- hx3LT6okpHUzCRWVrPvq8tHJueImn2wsr6L+a3h2U0st7q3QNImtFk9m/qngnDCGtOsphUNV/k0FAlrO
- ojgCZOdylR80PEHJhNibjm1QM7p5NwABIOeCqIRKpIGSnE6kqDQTaXVOvKXNJaOL+HsHYzm4zDahndYD
- b6bBRWAr7dK3KmWniDqdMllZ6ZoVWsayagJIc29TKL4mh8ZGMCo5iOFSWVGQhe+/oAfYQF/PRop6+qdx
- YC9WoGpTM27SIJCdi0IEFTHR0jSNIXoWQ9XWtNJoIvuVZBpX0YYbmZgICfEElJbvtOPM0bBuBvR5oukG
- c7Xdm9VMIFJZJ2503r+kkUcpngxUmYRXDbj5hamnCJFnXkpJF7gBHMzTzH6GKq3FKtffp+A2JNcFvakR
- 5EO9tNAabt5MUVNJebha49OaiFDomAfuO6CzaO3ks6naeopvRp995R5SVxey6YJTVimo/gJm6Og68zD4
- cj5Mzfjm+MXMksEo5oHSxBuC8ixY0Z+qhUBTDb4ZSKugzFrnBgFSB2bNS6YrJ4E65LyElLKmvtsKWZwN
- 7j3V69NnQ2ZUuiioQM/utOuOWvUKK/8nE4F4QSTt3dGHUHQlt/Q9VDOSh8gGe0GZfBkYLWEGVAdBLAhc
- 1o59YcAOXKZNqNamG7jl2ZEcVmKJJsrcauxK04I6pYnL0clXDeTu1K2rDi7WOdWfT+nQnpyXtrPP8W2K
- pZLVnMBYVGQR6yhBrI6S1l6+kGnac+l1iWzXuy+iGFajC0IqjtkGChwxOekcUvkKZe5aBbsuQwjOwvvY
- yA8gbBVfAZi2X9Zaa1Z+1qYGZsOsQgvy1fhmNnZW+ZqqIIOlppNQpVaeVro1ehDccEn03n26uQYAQLBE
- pF13hfVqr6eYsujJpf2f4pDblTPDIOjG3eChCmkamk4ENRMUJ59XAKrVRCSMlFV/QLbdllCTeeBqPYWb
- P9VUv9IxmowvE63JjF2Vj+EowKBmDVNECtLdSD5GlAAz0FbnBCBChwEqbMihkiqw2Y7RppYNk77/BG0q
- MnCgXIVG2bQzzbbZFbpYG6yCIRjPG+VkoH3H5z/5gQP1Ebt2XTw5tO9DXTe7LXMTutcorD9tBkoTdRus
- 656qgw5mEfjtTLMGCiKcBnrJXsL5OAXTED1N5pu8dpExzNSvx1hZJcE2IUf2Dm3xXA/pt5J6cl7R5tKW
- jvK2YAQhE+UgP+UHrujL1VQbPvDFTEwuKFJYi1ZB2Wy/mmPRQS2sycdann34vcg3i43+9TKA3E21W84C
- HdZgTq7rsKh8fuHKE01V5w+qdyfCKORYDJV3V5ZiCfDFxZmq/UBeArCgtbE2H813wdSNeFGhyMVJiF2J
- aKCThLEG5yGQV8A0kU69BvOijswAbQqIjMU1CTxT/ctZMZqhLYAImReQeYDEi2BMZdyNmWfLxUzVTv2Z
- qho3znaVzRwYiQyd82dXaiLaUDLQDoGn8UwBQdZsrD9P1fgfz7zDg5C++NmPjuumfnuibr1s2BxQSgPd
- XC2AkYoasjZ1xi59ZYYR7sHXWxUU/k1lJOiU3VwWv/5ooom+Z+qJcXLQ7ovvCaOuUjj5ufb038dOeQHc
- bS+lJW0CmAn6iwdKylkJAaS4zBbsWgopvbHBdLyE0jR0vwEvYdTTjfQzdSsq3BBcdG/uPQDmAicOmn+y
- QFVgxBY0W11bTrmSIW4VtySaIlUHZZO7ylKQnOMF6Q2kTVC1T78vJ3kitdWiDZkq0FRRmTmMXJNPCors
- t/YutLnN6kZsfS23x4McZGSZsfasSOXgZPPrmsYGEjaRfUpk164GKgwvoyUjLB6M0FSe3BK8Q00HVYtj
- FKjGQSdAy7DcHaHTkBYZgw2k7o/GW99xMXgd9e6jTkDTNF8Yj9f2I3fL7L8405NdRDoFEFQWaZU2AumF
- kJhDRzyi6jhkEtnHJlCyhWOpo8CXg3wmOgKqgg6/jdXMD23iqK0YcLin31YUiNk43ahgjrDkePHFIs9M
- M4BqlTWri2RYaPyUkVGnKWbqwYYNh8DI6BmO6lyciUvmcDOv/f3Wg9F1JdgxlD2nmH35qBMQGk2FZ/K8
- yMRHsmZglb+iWXIxL7loiWx8W6uVPvOlwDMQc1q4wchEtfpnel0KJMo1OJHYt6vEtilhuYIxGy4g94Rn
- 5YDU13cRUJ13WZZnWSAPJEBhKrU/mwpR5bZppO/t4Y0YCeOideHZojSiOYlWI+eV4juADGDkegtCM67V
- rQlIKV21uKt+/0L+DBjHoF5f3Y+lbUfcRpkFCt8FCIs61yxSWaUra5TIkW6gmafqRTgknsjWVBDgBLtz
- rKZlRHPNMDPQJI248BOdfJNJgyN3292qitJB9BWCu75YiFM+1dXI67hWGpOdKrMkGS0K/BJBqLFnVeF1
- Hwf325Lql64+mdw2m/XZwG3AxIfPGqg3cwAArAmoUxwy2fQiCks9dejOzUW83+R6gQuK0zAR1plPnmDO
- ur3Teaqp/5KyMlSxx3sBjQvaMLFvWMkKs6sYQ30eZXw7U+LPtBwiyNKwAyGlTW3IjVSbsNPeUFKcQ1cM
- RjTzkcOqAzDs3QNhuA90LcTmeEHDiDyfxKaMonxFaUtLkmh3x4FApIeemPbcppsOfmj3vU55+cal+6bp
- 8i99Fl3X3Q7I24rYYqX1r3mtFXFPe0OO+HurXxkoYp1V6DySp+q22Qs0uO2dglbXFFqqNS5MlIRdCAk0
- QzIzTtvkqpAihJHFwhvPoyJpFcdQrn2v7KnqEIwMRLTu/HT0fIyiISmcn0DUes+Doqa7st3ItOKVHCRi
- lVvBZ6BCzkDXtf+b9/j/VAEgd6wAGELX7ZZAkCYemIla1e2ze9OqClEpPYlLh51dXiyhuOMUliapoIac
- +mvFYzJb/a9ZgpaMCaZcTG657X6NMFrtyLUIesIzui6l+W3itEEB2eTKfG/o972mN9BQKB/Nrcr6YF4O
- KV1d7xlxFuFQ7sRYRCXuOWtpjlbUhXhRA2Gj41GVGeMBGBvD8fr0F676yEWP2/f5fUgP+ukXLWZu78Fo
- a1dXURKL8GRME25LyTRtOdkpYOuRixMQQWsqjUjMiKyYwtaLkFvl8esDI6dqFmEIqamUZmwWTtR6nSc3
- Vim/xCj4enOeHaJPREH4LK2rrpI3rFBEQ4PrUDFojHN+m0h0btJQmlatBEkyPMPYKceue0+tLg4C55tv
- JsDMaLuxYi9qaaKZuk8yVVs9bZMy6gx5Sq3G2a6k+UFAFDH3chRlq7Wx2H/J1GhNsjizqvNmq+FbNtXZ
- aqt30LDKvNs40BuFXNwsimdfFZpuU/30VVkHCEY1QOAE1A6Hdxl1G0H35NRIyWwjwQMgqfT+gp7+WVS3
- jOxkylraxJQKglXHo5iHEk2BPN7RTfITtp3IS/WBr3zprNyOH1Tkr2wWbxLbBeogTTd7cUHhSSdXP6Yp
- q3B2Qgz3eN9+dmtnV0U3EXT7ScFCpthDAS2HrBroYy01xlqyqDCENmdi5uBiIqw8AqNv0qQ3hTBragMG
- wbnoCspQkAXStAQtKu4xsUVIAdgpF2FoMKCMK83ApIKPX3uWYTffAJCznDZUbaBqLtR6u3FRlyLtZiVY
- LUGSNT2314o27GaxZRMmVrNRcxWiVmv7geK+iqMPcescf6ZKegkQqDHxpvaSTIlX/f1oKrwXE3PpsRNb
- YQWmsQR07xONwTQGkyEG1eRGS0iBGlvZRz4eJBMtRVP2HoKnpZLkpGFNrrFIpnlBWy5pl0x/w9iMvo/V
- wUuViLnrztw6MFmpN67Z/4iu606S6GkgmYk3bpBZsfULKmKgaCtVYoFqxs/TN1mjHaMG5xESTTwad7yC
- lA7qgrBGEXvU4lBHR3tuCkKgUEMEae4s+NyzpOqVuKeqVr0ZWBQu/wzFtFQpoJhpCaL+ARYMAIU5J11M
- 0e2YdQ5r15VCqgovX4pxpmu2x22j+AWSBXAzjgGSAWi9zgUrQcoHYe24e1pPRQ9CFKbExTeTkYms4ZeC
- bZlJihs6JCgwuV5hEmBZgPUyamWnmurOpk4olLugAqGy0bSZmDYls8hFNi7ROnJaRhQwEcRsA0rrSFgI
- 8GJrKiqBh5eQVPUYKuyZ2UoP28D9koK7FYAax7jICDrK7icQzyT4cCWIQ+bQE0jh+Xh/LnEH1Hm6dQpn
- aoQQVAemHYHSuvCJoWo2bCSHTeXJwxs3DrntfeWArjJc9QTJZZt0IURdgaj+QpVv/ZJM9UdABBtJtppN
- dAAvofNGX1XIJXSglym4d51hBSjLaNMX1EivpgnvHRst0eAzFWy4E4Cmzq9wHEVsFpLVmJoBkYGDbs4B
- AOA806BYqXAFNOhOwjSAgmiFjpIBzYZKsdgL+D4eg25cc/KtQiZl8F61hHNvPh1PU+0CtZJSjLTO3oCL
- e7r8nACNpD80DQdT7eAhorG+Vo3MI1C2snOo4DPdS3ovyG3PoGKjgpCk1Orh0hb7syw0+cyLCmU2kE+D
- hKmWUATOS8io1YlZgk+iibw/NwI55kqb2mMjMY3SYLRSE/GXiWiTOS/Cefya5tKWzBlN215TVj+JXbct
- Kt0Y9FKwzAnrQLKZ6kR7CtpUY2izqMTy0rUv9tygki5STzbbGjCqU+8p9yoqnqr90laIhPHUTUpW6cIp
- Yc7GeoJRB+TtMN0/hyn3gpCpyuRyX6gtwiMuU6ZwV6/5BqWpSqa4bI6yN+8MQHqYwoLzU9DcgWispBrt
- yZiXJJPeAz0BuVhwFRVmZddR0eWHyXuj0tO21sywVcz/ll5DyM5oFshk0pwUcFgpXXtUb58oGQBHNi17
- mTkDaABgrMO0Sjw086KO37K4KOW6fF49vQkzZQN2On0yLoQ4XHFeLqr71Gqg0h4FtwFOX7uLU4S0F+/E
- 5bIHhFhwNHLzgHq0OHgNeLY5m238StfhOGEXNT4yE5VRT+QAqvTGtv25f++r3EQTxDTH2MzLKn+UgaQb
- Us0fGYWX72NBqxcpuYLv4TuE5pD5mhUYaISjC3BM03X3EYcHnsNDCAahaX3u9xsX+hT5pwAl9uajYRzI
- +wQFnpyVxWUBqD3sPW+2ASADBTNSFYMLmES4Ot2aDJwz/SaO5S+/T96MY9deKA5FFLnT7kXReMMuWYZg
- TV2E7rzBfVHEWY1sZt4SJkNm6Y03hBXJ6s8fwjwUzT3TtRwh8cTpvuwaFgqXp5I9ukaE9bO4QSYJEokV
- d8C2Xk1n0xSMEIJfGwKeZNCZF9UG/aAGgxEY7VKeVY9MXdetfu5zH/3jxcX6JVW1sQWIhVOhHvYeLwrF
- ty05n22ksPmlJt8eACHs9QvRlgaWSBJKDv2UkU0BQxRjCe+vh/cCDmftVeF6uaAEUVRmS8ZSFG+LNx58
- o9pkQEYrjUdvtocGLohFCk1FB0BJ+itvKSkfWYBTUorUf0O97gZ8M04BWJGArCAyl/Q2ohMvqOMPeTYk
- AVYFNXmoUGDyvo88l0pm/4auA4IOn1rLkeoAuJnmxP0s2A1dVS4OQ3C3WGbxjuNW70E3DIkELZaUnTr0
- rc1GunlVVZmmgligTSk/ldeQ0pr4RJhICHWunGUQY0YjuhvVKnwaogrBmSrxoDSIOo9AWmK77kDeUfwq
- s3p35qUwxdJ7wwzO+aGpHW/iHvd8MOrhytuJ6HzRTYvqu3Mzb6AwAlHMLQvzSgQaMi9KPR2w/JJqjYOM
- UtYOagMKKbpEw4gO7HfIuVdyWCkwf63BNtz/nfwa5ZnyXPmS0Wd3jZ1hRTbWQxfGggTv1Mb3MOEJrz9z
- 3ynJGp1cOSWYA3mKb86KIMzIXavc/wV9PLOwpjiQxVLvwHDgFGfPoriX4+lmVRKQ3Dcd7Zr6sjdTUUw/
- vKuu6NKoOKQOvuhJz3MoLdBbUwJSyvCyRtGOkgUOw1pK2gDfVsbeMICbbuA8DNc68LVHbOrVRlSaFRKa
- NhtdQcmIed5HsTG4kfiEpSr+gWo0ooEtd93udO8HPRxNs4j7PfA7r6TUvJOoRVLr6n4GEOW4S0DgAJIo
- eXgnozqNthLprBYZesZg3nuOCvQz3rZDNPIwGFAkAHOJko7GI0S8vqeGfsmGuOj3LPpBAGGxTdUFaVAW
- m9XpbgrSht/twumviEeyBTNDsTozpVvresj9yTkj38yBQG1H3giFyVjxQGf0ZolVhcBonPkhMpYCnt7W
- XVGILqk+lfl+mqoRq2EspgVfARuVTXSzt6ExywHmGxuGRRPT/9vtwCqdcIw0y130TDGlgyLyWR0Epf1a
- 5s565Sd3O0Tfj2oXLvXMGKZ+NVBBGQanmYw0LdFm8gmb30MQMhZVt4AKGIiUoqxemIyBgOR4UfsJLafX
- vvo3cYczz8bb/u+buK6qTxJh4/DU//CNP/83/l8U/fLKhnKwkMkqe4e+nIBS4liVX0Q/y4kfbmTU3/ez
- Il3LdVtJkcrp7gGJ54KGbXr0MgQOJ3dJ3aZgLwVMXMJKGS0HnKbcB4YY8cM0DnyBqGQU34zHANn0ACy4
- A4pRl/sqlnBDx4ew2sKRAXoUMMVxwkLsiD/r3HPerpsvO8KyWL1NRf2XNr2hTSE7JPcG3NIGc1UOuTC6
- LIHGnp86SXGxq7PRJnSkWBSQWLPdLeeeiCCqIg/zArIfKA2y8QasV2Cio2w9hlpNWVotGal4GlKLSolM
- UjZPvWGabMROtgttz+UJpelf1ABwxdXXYHFhiLpOX5tO8yEAS3Nx/bBUKP432QYhS9Zsrr4JM8T0KXla
- k9PQmYD28KiUzj5S4zlVnWs9c0JwiGVB3HDB9POwIMbO/+6/Tgg1NNYub12CiP2cI8YKQlKaWnVYlHoK
- cVADwjCknewCGl//s95MgkBmbZDZZihKzmTlIU2CWUwOoitVSCajJHgD7naXcoJmLhsvTemBz/oJWZh/
- wTzDegKkuJXyqEsfiD0Id0F+3jgDCk5T3IkPnJhBaRqYsyP1HWhR/B8Mn5B0nG5Fq5WUI0iSrmY4PHOv
- AwbJONCYr5lUFHSqV9zp+NCy4aTZu5YGllVA+xqYSdaZqr9LTffLNQBs376CAwcWUaXq0smE9rYtHQfM
- +/LRXCCYk7Cm1EufhalFIO5g7r4yERhr7VsXKaZe/57QVyWma9kYRcyTEU7pIMzFll46yNq6+3VRag3I
- rvBE9ULC7EN93+TUUfMImDJt7gdCQ3g5kcWYkMmRlaZMq0VcGB8CN3dJcM4ZbWsNv+C5p41deUITvScT
- 5eM3bspRmriGlKRgDZeLyi+zazIwltCzaHfwi/UcJkqtbUBUgWi99K6sUUsmDsNza7qsO1m/inR1l9+g
- du2eD9LHoVCWyqsmteyaycQjTZV/MPSxcFYsC2ELot3XSLWvOhpMtUqTDXSkaofdVKd7leJnDFPROT9C
- ltsCgMGHKc1eyi0dqAHgiAFj7+IiRoNhs7a2mts2zE0P2/Dxv+Np6PG/AB3AkgGwCYhmdReqQyMnl4PY
- N3cOr2hpdcwGlNXVM/GgMAwsSkCFmYgA8Y0qQuTyYyWmpZCW53IKkN1Uw0l0gQBl/AaraU2QsvK0Umij
- yVNaW2TMVh7dNKag384vSoSsDEeBnxb6bUlbKYhf1P1gi4lKYdsGtWcna4XceKVGse02hijgUvaAQr+n
- eiJ2qrizIOuOtAHtMmPaPDQq8LwtGlGZEHH/sIhHIekokEzMVE//rOuPKItDEAEZtWAF8gCghEwA5YSO
- AOIRKmQgTZFJ/DcFZZV0UtyiYi6wet070tdQMFDaVJn0oaMtGaOvpmryAmDpYpr9pwDuL92xgsv+8YM4
- 4m73uU/btqf1P338eDEg5LmAEEBA4LkEwTbaAthAGq47EO4xcJ3ZQNGNj8IZMRAVlxkOWQJ68tvzopvU
- MwjpX3RE+1kZ02q5ULlkFTuJSfXmVMbZ3ZW4UaSxiZeoElAve9DThvJNkgHkzDjvCxfi0suuUlzXXBPV
- 7w8HgE7/MGDFqK+vHcDBA6sgSs7jB4mMfOngZ5faFoBNn38ROz3MRoFNZWOyjt/sBDZ5bS0hkqlCqatu
- EXiRjroIi255H0fe0+jsAWTmClHxOZWDURB3cppLJ36plLQAjNosd1PWD/MyMoZI3IC6FpxMsIbddq5i
- uOQXd7Xy/rND5YhnoJyUwhzXuvAfsga+lFad5yC9h8EVqWqff8F5H/rQHe5yL3TdGaif9OJX4tJPfxon
- /OBPjK767H8/puu6lbknj8Nq5sOCw3ygQBA2UOVWkwTzEZv9HPe7pMCcom6eYwFEwsx8eaAdUq/nox+f
- 3iiFNPc/C13LYp8LepQ1mqpgJc18s5dxEULtlwIqUBWVKPu4xjMW14wzsNCNHwS6rsPfv+ld+Mc3vxNV
- qtGf+LTaaBJPPs4rztyTGjwqMsuIuMsZREPkLP51lDYVYrvlG12IV1qOadNK7viKZgad9wCkNFDEHlAw
- GMkk4JKLtxrUmFzAVrUZuUZKM22mAQLBnfgMHXbKxvXOlTMWnXGnEwM2MBdtyHrLS0Gurtiiu0wekszw
- 8wjJGszUgnKFnLi4VRFJRujljdmTB6ly1bVkapENJZumKr+2BIBQ0dVQ2HsGcAmw8MWU+M933e5jb73j
- 4L4ABrjggo+jzlWFyfoacu52t9PZvfubYv6kj2ac9iE79LH8czAdj+xLEn3TrNh9cLTfjvlDUNvx9Pra
- NgaFkyQV0oV1bntoxRgEMJcdzGUEh5UCFrQmuuiTL3iohLQLh3Iq1xREGtwe7bCRpjUTk7/eTfGVO0Y7
- q8GVkk5YNxCNhZTjfY2DQjzhoeoYJlX00RRcG52s98NFLNG54xopq9O787QFAUJNAWyAebs/BKJNNbwY
- KXJP749rNISxMBcXXVca9tcx+PnIXa4I28WINh3UBCeUHBxHwmpKwja1sFJmLKrYWXUnzDHI3bHU8JVY
- ZbmGWr5Uqoy8DmAoVhXW9tSaXs5su4fKqNUSMZM1FCuR6M/L6Fg9B22SgBGYFztK6W9Tmvxuzt1Fa9ec
- PK6aLeRMOP/c/wIA1AuH1nHgsoux+7gTTgV3Rx9+0ifEBsu1pX+HZwwo8Fof/xGAEYjVLZZSH2IcNnT/
- tV1kKfQB4ow2zIa94ZSvpaFGc+kSlfLE0l7KpfHDoQfgZp/igMQBiIEgD1YILLZoImdBHiyF4sZPexsz
- 0Qy5I+TuphAGNZRkpSe+yaIVeTfprFfCzHNdO10lNFWEX3LB1pTWkHlRkX1J1XXUETodUtadKe1qvyht
- Qjwpl4JRrXpSYtLL9vy4oS25x1QpLt/u7wicl9xfAsYAtbXkVNs4rdCAZoo76jgt2Y2s40RTCUo0lawI
- jY4ct5zj4MQblR5nHgJpgpShYqMJqd5EphqcG0n5dR0SdaiqvahoXXQAuiPQ8RJqGgvW31ClaoHGREic
- YD6UpEGIsXLJcLn7ndzi/Ly5he3HfhWcK/Bsw596Pew6HDqwFzt2HnESg1cOT/kpwF6vLQDEbCF4/XK0
- f2b1iTdxDjiE2DMGIt1nRpJorZUWNr+yCK+1HOlf8eGcgfkRX1Av8dOfrj2e9d5GzR9MNclfvkK/J2FB
- oNWPXJUcx3jxLhFehSvvkPNNNAakaUE7Kp0aartVxGFnyMpdJ9c1IHHkURVguacNMq+o1HbEXBjSc6Sz
- 8y2xmaOiRUG0ikSVC2Dmbqf8roHTbKRqG5+XYChARqO6/a0ax6gXIRsST/0YeeDmMe4WTYGP4bTlWhmG
- cH1IpA1ZYXkxiMCa1HgVxEPVNYiHopmZDoGqhA47QVmxEGkGStfIMacciIoOIdE+Zd6OxXGbO6S0D8DM
- QiiYF9F2x6DIj2ufQ4VnUmrHi8ujjaoe4cA1Ged95r8Oe+R1XVXYecRuAPlLBOxl4Pj+5urm9kQAz1jH
- NG4u3wPkyr+kta/MOSe6cODzUI7R3MsKwKTCYgeADmsV2uLNiOjEax1VzgcOupYAwXHSwK5l2IM+O5Ak
- KyqLhOqpaSIZ2IJaTQICwwxZsN7IepoOFHcuikDXTqu+sXKADEqzIHAqjagKmyg+fI2e2glSfxvEN5X7
- EzwZOC+JBTdMvBKlqecei4UtWKS7R0A6IE+cOliXXjTzR15ysNpukbpXG9zbXYddgt44BLOCDTApt7RV
- 0n03EpkVNWyKWSZU2mtYRtC87AQgyRi3QGlT7mNeBvKyZjA13MzU9P2w5XZgCYdQ+h86IUjreo0HdKK0
- pDumFcEV7EFujxFXZSreirKi8zRxN01UX+vmt5WNI485HruOOvbTKdVvv5bqEP0+ABX5Zuo34STtaMJ9
- 7I8HjbNdjlZ17HGopaLqwlydrgUKXNLvICeO64LP8nVkCtwDgfRHP3MkIgfpDOZkwIK9FGrtDwwUbdWE
- jnkGMHahSPamTtGm72cSN8Xub2XT8EgYcwwg6/iIh26YIfoOJZCT6j3GoEVpTTO+iXSvFbHmsGgi9bDb
- Ds47nAviMuqsLDeWUoDNfDNv0zGekYwabaB2Dq8WzMaGbkLzz1NxGl4AQRyKBa67Ea7bDDtVa9BEQ111
- uNbjZ+rBLamStInhCK8lAXlJyx0g8xAZA2RK4G4ncrdLSDsUVHuDNTypxLw1miUDroURyI02VDeVKryg
- cuebqrFYDs+EBKJ0UZs29s/outdU+pM/eBHu/MCH4aIvnj+tmoU3gqqrr7tGLCfF/AjO1G45LyngQjv9
- doMp60mgpybHZJ3CZucADM4FQHEYHDk6nYSNfJ2lAV3Ht+Zf17Dg0YyyC0CUgHG3l1FFWvn1xsOkx1gq
- Emd9lZbaJc1dzainNXgjfnGSU8SbkQV/IRtSutiS0Y21jGlc1tvMWV18QwVfbdqTeaQQV1NhYldeyjqm
- 4x54R4VDeVGNMRfCoaFNMfO6M20BNun5RmnnQwCtqFEpe85Yd9YwFG/JFmYvLkS2FZTeV0SWCqhGejYz
- J/YQQl/B9Z05XDdLWaK4GCAj1XtcrLMsRoXq6v1nxfCDTJNjoq89FN9Oo1qnqWAIGEhM6lPQbRDh3Z99
- 3/HT1SuuvO4AAAAXffTD2HmbE7Bw1NGfSXXz0XhB/Y2T+runJ2JowppjV2XtZQEcrb8Kq4/Cdp/D013H
- Bs5zD+a6AErpOjY/zVUCcVHF4HEt5QPNUMwd+xBlF6ZU4pBUD43+eQirKeWembtxLqenUkMLeejG/kqu
- lOy0bNoKkm868qO4yE1SfepZGKETIdCsgpaU1c69OCPLXa1LFsdK0c1L4RTOICRRToa5/LBnA+ChmIpo
- 2m/ml0KRZT+pWc1g2RydkERLkBcEm++6EPCUn9Rxur+2Z+LKAxJRTl3jSdWMgaBDCACokXlZEol0SO3v
- JPAlJlAeoidb7nwWlVNnFOckRdOS6lZmlUI3rQlw441OphlS2rw6Ne1zKa2/4fSzr8Tm2uVfPwAs3fEu
- WDz6GJzz7jevN006h+ZRUB6dUnEqmetyyyawm5Rhnn4CezUbMLWBMlUXyoX3P7fx+jiAHJAB0X3n2jbr
- tYmTfB3TDeagCISQ8udree1rkwSz+2OQyw3VPzTW28D9DE1XUB7yWCO6hb0Wh0ue3YgVgFNglX2ms38J
- DIseAIvSDJR5V3uGABg7tHZoK+npC8e5h14Ol9GsKeyCCEhrRXiTkzTySDafk6h0lKg7D1AMgCgxi2dl
- OYzsHbtC/HFlpm2qtjvsufAwhsqpXyzKu0hK6NFRZ15E1uauvN+WTk+yaAzyQAE5G6J/oSc0U0LO27SU
- Qih7Aq8G0CC3DZm3+7UTJ1QqDupKybnxrAhpDEr48pF3vM2bFo48aivPCIvbjrnO514DwD//wa/iab/1
- p9j/+bujqQfnzmhrnblbLqmPWWtXQQa5ncsGqv7JZZ1+G8f5fF6jnQJgEB5P+EUl3/G1lB+HzRuuY6OW
- gFFGh10/aBCH2TzCuA8ohCXznwu9Au5Cy7KvSyALYFXT4lYeIi8oHLMD0sRPCQ6ljCy8myj9t5CbWmdh
- mjksSE1MfEQGHZ0Fz0fd3O5Y64g/CXScF4s6U/BSYDIEXO419SS9nYm6Li+o0OZG6Kt0SGkrOOYM1fSi
- AefGO//mvZjSpjpbmUuzaTHW4vvHIx3FybNM5ortdnSKRU1rMqbkYVmHKlYaxUlL2UTIPADU1ttK3EyR
- 9VoUokq2gYKXSFPXOSxZ2NQh6exO1qUXR5wzd4l23vZkfPJ9f/w/5H36deGFX0G1sgNdM/gcgEtw2Jar
- VNTTtPHiV9YmRJyvp4JRppKWMyW1eebrYB1zTxEePc8cg/smuHloT/Sj/+eoWtADdcR/W4CKGO/45xhc
- OGQJ17KBonCo01DTpjbFNrQxVt6fTFU2L7rJSqkBb/TtX+jOptDkwa7IVRm0g32sVnvTk72BWYGYkGgr
- iKUoKcrUlhHo2RHXwUln6DMXqGXFAZSLHRbtflXllWA1C2XYIoxLINz6GODNKGQsY0u27MR8KUTHkJF9
- 6EwgQUGaHD4qpLThPSrOqnSEhKzaAcRJ5vN5Gyjv0BQd+p44LMMFGuS8otMgG3lv6ecdBsGdgYrt5MIq
- 9b1Xg6ijhbrBcpXwjNf81TcWAIaUMByNsG1l19VVVX22BwVF1kXZqW5biz4Q59qkuqwE4P6m44GgrxBF
- F+nw7JeTjjXgi8qNQX3TjEoa1ON0F8ffw5mM19YM1KZfr1KY6zlwDGT98NL/2T5BSSL5VHnu+XCuv3bV
- jfOdcy7mmjfql4pcqFquAGq2ND4mT79NA0+mHbXea3Pp4XLC0qbO66MNGwUYtU1RJqF2jt6QVWAH1oWH
- D6h4ZueSYNKANTWmqQqQ1MU5mjjEfAtUJlCzoht+qs95gGKQA9UhmPkJLQ1C9pKpqg5oBpN85s8YIlOF
- TIzsoCSRQZO2U1/JyseJeRE5HwWBKZdeAmgTiTZdTkxKk13IeYcqTwnkWqjGFYB00sHL99/+3Pd8Bn/1
- rB/7xgLAv//Vy7E4WsYn3vOmCVP6UP+YK0ouRagjjuBi042d8NE7HH1TdCUVvzaKAffhneRNKdFeE+RX
- 67NWt9vi5OMqSd/05Vx9N+Hr19bczwqIy4a3ANET9uiA3nae0xj0Fwrv65Ed5URK6wIXTeuy6bi7iSTB
- gi18VMSh4JSk+nUCb91ylFzCZuBSdZ7x8GHYegQRCzXLwAhw5lyZ28spN1NfBxHbSGldtQPHfjgJonDd
- G3TwgKUBIi4z12jUGt40/MBgEl1GEesYIbGqUmi5S5gAaUs+vzoHm4CHzfFljerIVAVRiOV8z3rGJSU3
- WZDNvCRIv/YEdPloGOFK7tNE3YEW0fFiQRdWa1IWpUNI6RBAE+Sk41AeIXfViRsHx8876o7HL93n+56M
- 73rJ71znU+9Ru+7xzOdh31WXg6rqvK6dHeDc7eqnt7ZQbCOUyO7pI5KTXjwDILUHIw6KN9T7/9ITslEO
- Fwinyxnnwjhww05D8rbqD2/KMXC5J1ajE/9pb/bNR5+Q6nt/AOhpIzpUOHYioiIwgsj5PHvy8CBEhjNX
- x2NSodCbIgMoHfrsdax3XPQ0lvu+KQIceaUo06Z1rVl1Rs9DOcmoNFlFIWiocHB9PxPKgOrzW+9FJePI
- SgBWQRZN9YVlWYGwgTJbUEUf2ipcfB03GhMzO6IRUv8H/AArSMgnU8Tycdy/QUqYTGZ0OkXmbch5O4pz
- tQqZcVZuP4JmRdazJYPSqmAh8goSV4oiNN3/BU1MrdfGyvIb6Xx/QzIf1bgg2tKgJF6AmStMp/iu1csO
- 3TGPxx/d9V0P/J8zAAD41PvehWrbLqTlHZcA9b5r/7FCleU80kaLyWQVWm7RLEOZK+vpTmQBxGyd2Wef
- fbop9cQi0ZN2mkseHL1WlWv01G+APjyXv77AUEhDe8QghoCHeF6UtJfmhGuM2UA6nNTEaU708qazCBcs
- Q1boq/nhlWxHRk+ErKardvp70ZfWVel5qkCYpSKlhkGA2abi0ejw2+AgbeAbLTsslXctQZO7UnIP85Iq
- 4Q6lNvfpkiI1DQRDU+30V3qQVGqeIU67UnurgawiMwn/f3tvHnbZVdUJ/9Y659x736HeGlKVOSGEIQHC
- JIMKiNgMirO22rTSqC1222p3O6C2/aGPrX62trZtq63YtjNIi4jgwCRKGAPIEDJVQkiqkpCh5qp3usM5
- e6/vj7XW3vvc962QhKQCfrl56qlK1b33vfecvddew2+IiKiL+0dZxcjWJUVjCBbr1mW8gYhIhmIxOLiO
- BY+D+SRi3AWKun+YpmBpTTtAv3M0xytvOnLyIDRbPTR29ARUUUwfQPT5sTs7tviSO687jrv+71vuWwA4
- EoGWl9HKniNCi3fPS3/1U30b6dnYJY3vyJHA06TUCuKkRaapenlaUtGnlzRrp2QX4gIPfd751l1bYSsG
- INrNVnuye32IbMMdqor3lbmsoSgVen2GWDwnoix5aO46yjbXV06LXHzoSwDiDcMqLEB6Z9dIpxpS2wJr
- 8iK0mTziQupEZyGMKmVGEpfQU5GmCQCTAScolNcVlnu8Cknd7rLESoxRn0qY0SZjbBDchUJ70hR1ZGBe
- k14CVLbBFahFUiVn4jTGRDEJMucskQox7kIMewu6rjtb25qxsR/RRIVC/QCrj4B5ghj22TUxdmFkRQtS
- QIUxiE+Aad1Kr0lxcBAk7Cz6X6onGCnrXkbR941d/JIn/ssnNEuPf/x9KwFqCLrpGIOVs6abldweA+Z3
- RDJF6OveO1Rz0UAhm3Y6uClDV6S1bq7gSMF5Uw7vRBs/PqHLkDMPKYU/8kKRnqK+2A1T5SFxyPE2bMNc
- 4ZT0XGcBlpuU7e/ng0/IQWdbWa95anVWPSjJUbkkOvMPEdOOr8aQsGLfZ6ZzfsysZzfURcaGnENj2T0D
- cESce0b4oZDl0/rkqWEasSXHaRewdInrCFC1OmflzgY5r4rSxBlwIwMdsaX5kvkBibeBQjkIhXjt2Cq/
- YUKhJqKTNEnlWYhyA9o5CWXAJ0IgPzaC9SdOIAirdmCsEONeq/Pz+Fl4bFnRBMSnIDJEkCUND7ye9prC
- fyeFopVO5pg3TF6szoKrITxudmS2Uq/dfey+lQC/9bOIywv46Dt+o43S3FDWNDl9nufl+2iC04aRuKKL
- RepCQz9bFSe57EIEAT2KaQaW0Bb2n+ThQbnB3EM9WYHVpkIT7XRoMSfe1P9/xwOIFONAKfDgxcb27yQl
- XNiDCc/xBeYnEHM/t/fdHh4SkP50NvZZLFJeG7WSTn/ANpJKVN11bcxhmtii7nKrJBYX4wxFsLbMyhR0
- 9FqouIpmjmPD8ock/ZWDf4VssV2lYytNA9DqISSjwrsCSWqN0Jkzccz3zJ19k8sPDI3p+WmbOA+6tg3V
- 6ZMvk/KSMpMziDNVhxVNKQ0q2gChU1APTQBuU6qPyGA+joqPqIqPufkQCZjVzzLGRWUfmjKyy5JHWVJ+
- A61aBu1O1zWAuMbt5qQO4b5lAACw9ITH4Ul3vAhUDW4MXM9EukF/sZalQK51dSa6aZt3QVMTH/PARQ1i
- lgsTmcPily01QjbYyEllkmJK0lRl1z2kUiAZcTqLjGKidG4LHS5Hf0lH0Dr9Tm+lspst/bcoTpQcKEv/
- ARTfpcwK4tY48HD1ABDs5G1BtK7zZeudZLUeMhOMaDX3TN2jedOus1tRm0Q2OUBnQdNrXre6dmid/CpT
- iiUaMKgx1JtSWqMsgmktZX758xqvgMzR2hqNzMfS5xYbQVIpACqNdecbwwtUuTmY6vv+NEhLCi97BgaH
- ZoCnFryWs1olTYC4gMjRQEOsTT2WxFcQGmTGnlmPU89fwgoPWtdrbsSirHQ8Uk4CyDK0xvgCZAGOjGZM
- N9U77xyfOHgW7lMGAABhYwO0Ywip+FrB8JqcBWx3qs17BGj6p+OadTBmoBKzR0U2QAX4RjidvpKAGkia
- ApnbXxfgn3lCkAtM1hZAgmHZPXWvis+/jX+A9HHfGR24/XfNikLzJ3shDirVNj+rJDCVl9YLlIAYH4ZM
- gGbKUoyLIJ7piKk6DuLjuQNj6jzMJrIZl3SqExftNIc1z7qsH2BSXgqQWUj1fZQlm7k7BNinBwPjBNSG
- 9Vd3HU33x6amm63BSEonoQEEiylTdedqB3Blj+mY7LPIbLI0SzQCE5sfYFJ5GlhTbmhrDCZC2kIw6sOb
- 49DusjUpSSxQ+GE1y9MC1p4FZAAJeyBxJ7b0nKSyoKNBMcqSTSwG1kwNVi7nA7pSMlBgjh+54/074sJK
- c98DwEd/71ewQRtYWD386WY0+FGuq/1bT01gW339xGYa5E0Nd4eNgHQpxS/FN5LeWa/p5i6sDaj4r+/7
- Z6MZNIY7n1ij0br+voi8NvKJhdSFC8w2mzK9vy+eeSQgLNWSNN7Mn7kMmKEXzHJ2UDAP02XUQBWjPDwB
- wGplBSNlbLwaXExzum2lm5itdiIyJS9ATXMlnGVZmjWACSYNZqg7V3nyRnJx6AoZqCWBcKvklOMiHVnt
- WUyB2AhZpt/vTTIFNE2KcSRnrT0fuyXFX4W6Rxtv6oRqpGWPrUN/VLRpZ3VnS8GAQuQw6oXMOpS8Pyg5
- RpmGHwmEWnTxbKDbi2Sca9dUdQNi0tXUfkCnWVWhbC3JcSpqA5Lok1XTvnP3oyocvOnu+x4AAGAHFtE8
- 6lE4eudt7x0uLv8H4voz/ZMvQxIz/NNII3GxaG6FXE/56C3JMrl+AG15XySwT0iNJV0Is8KyzJheKL3m
- nW8wLGi5PrpxA08fKVYoZ/egeRXcOecgKScBxSiwNBspMPJlv0QwNykQ3iaryv2Wh8cakJDrcHe/UUEP
- xFHGrMdFrYNNA9/T0+QARbCUliyrGAHSmaptl+XUva+Q1HhdW2GrzHzGwi/k+2zOvtI7ENoETe7bynlG
- GFMhw+l99TuqNsFypj7HZUjclRiKJI6OiIkRSn7YpSQypDgfZIgQzkWUsxBlt6X/MA2CAI6N8giSVFmH
- KCMAw5S9uHaGIh1HSTEoyopN31prCjoDNak0RarkdYeuv/gzt3ziKjz+KRffvwBwzUfeCplN8ZhnPhcv
- +8g/vIuqpdcBdf/posgpcsshg1/CvMj6zcJ5g1HvsupGzM0gx8cP4NbiPaIOlSSfQpfAiRNJoKMU8nDK
- rau8UNGAbIrFW8qe92HQ+iVtg5bowF5GRP1THlluihJMdr6Mmn9EPHxYAMonvVQF4hOF8WRjC1bZfYnD
- YHqMitkX29gwRd3KsgbbOC4LTmNr1BmBhqYFDh8po9LLoYFdLb2c6bduiMN1azh2BjOeGTU7+wMyb6T1
- 4VJhWpIsJaafKwKTDJKLT8Qg8RCEPAfN4hpkNNzITmlXDoRwq70AABRrSFiybArqzYcKEQ0EDdiuHdMM
- gUlZggCEnM7s2oJjExypTYl4otmt+WtI3Km7h9dBPLuhGnRv2vfE2/Goy78YH/r7v71/AQAAPvTev8Ja
- DPjTL/oq1MOlPyWub8v/Wll6bj7lrntGm5aWlJsC/UUvUvTezGOdpghYSKouukGbzOP2zLmH6x6mMsDr
- oywmMSuEId22K6BnxdWD6dri8M5+afzgKduWDCj23yct1FDgIkpnYv8acy7GKTBkWPXD1QZUbMemNdtC
- 0d+oUte5tEAXl/OSysA/u8xdZ0Nhs3Bee2MjXddHdAXhjMnPpaIHzVgAblQ+XMU7LBOQhaRSRGb6qQFm
- WmSZcY5/IckcNMZl5etbFpraUYlLIukAimhU8i3hIgb5flFQvT/vJYgdLHEBHJu5sifYZ1U4M4tmDWxZ
- LUEQ407EuKjCo7RpmfWSEvF4VXsqpp9ACGBaQ5Bd6LCs656n4Ir+5oar33bwca/6egx337vK9L1a0cQI
- DC66EMtPeM71qEZvSXWuDIvT1inC4wz8mSfKCGGL533K9sXGSJ01hcSgnjE30chRYZTktJLsVhoXVkYC
- aQopbskADQtc5Wm7BU/o+m80l4ZKtXXDe28gNTHL3F2KssXSPDtFqSw9yEdU82XQw/GIpvtvtaUx4hSP
- zpbKc8rOku6iNJYZ2Pg27AFkUSm9RoV23T9KeBDXQuxS80riMqKsZPdoKQOzaGBCY+62I4MHj3LabqM3
- /Q5LkLBsafyS4emHuvmjGouSNOBoUm5lWZsCs5uKBnMeFiSDThAiBgCNwWituo1Jz9G9C7Qf4CNDvQba
- 9FzUlJ9VKCXKDjX6QAfEIWJ3QWZE0qqVAJUFvQXlw/ImQBOEuAchnAOSWjEzhGNU4W8uu/yrcPht1+OT
- V737gQeAa9/5J2jHE5x8/1sC6uG7AZ55jZRTbSrSOcyl0Cia5XNCnFTuGVE7ceoyICUJRarGuyR339K4
- Qo0mBQNL14z+aSaNWs92lqEsWCrr0FCHk26DCZhP06mQJZNCKMRZjD1p7z7d2NlzGQSTJUDy5o/YajJ1
- Jh/G/kPQ60w+FrTgSpMC8SmpXmc+abTdPMAVirbpTAPAxVVs/KeinHXB2JS+0w+iKQsXqkEGMxc7mZVM
- NEu1s17zcuLCW5e2swPjQiolUpLXW7KSyhXxLj4EjM44D55dsPWgamsiUlKXF5NVd1FVCGt9T50FFZWf
- F54hcpcMUBgug76ErrsYSsWhVALo99YJTIzLCOF8hHi2ZR8MxhQgvLdZnlw93EWY3nP4s975+rM9YfPC
- C9EcOQFwdbdwsypB9lJv7t4WSKh5lZziBE3upbZxnBwk5YWfaKpjabuU3mviW8ckpY0GSlLO2q3uiyM7
- XQcG79TxEvFGvzQpR4RF1xlzYiWqaFRoG0gJ/CFsGWtCtE4Wn1S4R3yHjAAsJw9iGgcPFwxYG3YqPjG0
- U92vk0lmS2eNvZChusRZILanFB2zqCZmBtoRO6VqGwC1hYtylUagunEGyQpMIGq/lSzZYpr5+2skcUbQ
- m9Onxq9bbZkvASMofBYEpqzIJKhzkEsioHYlhNBzMCY17tT+tpaK0YlRvgxoBg4jJQ9JoyKrfMq4FIKK
- ZghJfl0gLIUE+QBduAgcN1MpoFgE9T9w/IIjbpnWQdwd47p7zfjIcKMarOOaD737s975z+pGGcdTdIMd
- 6HjxhKA5qZG2w2nUPLDFwUcGmoolOSzk0ZmjAMuGGrUaUYmUHdc7Teehsl1R27Up2oInSbQBZkmVkWFF
- U9HT1pSeu4vtHGIvBYcK/dFhWe4UsuEFWUMfLfoiKrL1OqG0VDvTQcCI1y5SKTlLElTmA1AX98gou64d
- 0GvcGeGLNW1lF/ZwoLawps28AeIZ3ChE43GVQULcGtLOTnkwINa1FzXjiK4tIA2AQSH66doDjZV/lUmw
- OydfZ+vq65ehxFQ4VCkq0tdIg8gZGqxSaD5/0p5DJM8W9LuyEDi61JsGvSg79brQzOTBAiqxiZhlEdoc
- DEoOQgvEIULcjRB3W9NySVGBhCSTJjQFqg1Q1b5htHN85WjXFOd92TPu053/rBlAszDA4p5lSJBjmxvh
- mIg8NlsufXb1XUVMjVOHNJtM9nH50jMVEUNr5ZQ5QU0tJcwuMb6pQzFGMsVaawhKsp8qPx/lUqCg8WZm
- Wql5CDj2HUXantGMQN8XQezE5K1pPZXoP0dF5msWozxMgiA1RNhOxFmRAYWszmQuvy4IQ2KL3hpwztxU
- VLVZqBkStO+haNfbkXo+AeIN81RQ/oF39JMEeNIfdNyHZ3yLdv9hJ2Nln3OampQkhhg0Sa5sL66iIRHD
- QvsHvWNHN7pJd1O0NBwAmSqvNGCpjNZiuv4mhKpIP1PMJkbEDjCvoaOz83VNPBiYiUq0z6YGulkDw8h0
- JkpK7lJEGx1zfFtdj//79EQ1q4aMd//Ob9+nu/5ZM4D9f/DfsPOsnVhaWZ5Cmomg7hFfeyl1WQv7v1hX
- lgzVp4u97p/8Ygw/KhB5aXHFUjPFbsYMhIkJRszsZvlp3+b3TN37Uq5rTrAjpf9hmzhWdPCpbAIi4xtk
- Xh251EYI2/w8mpMbm/MggJgH35l8iGnmczrhk3lnckZmc91ZtNm4wYQTJyJmYg25FTWMX8+5tCMpmsUo
- JOYKGzkQBItpYp8DsAuUrBXBwbWogq4JmhpKr7PmcmtirbM0paHkT4ieToRSd7M9GLn/BKlGAaepBIGr
- Y6irQyCM03g0YgFRBghY1Kw39TBaRKqBOICEXYgyRMUntZSlGYSiKQeJjg8pJJ1///sMkjf/BKm1tOCT
- gav21wcLa989ndAt+2+4E9d94n33+c7fJ0P6nSvnYMfyLuuyL0Ili+Z2SynvVXa2JVo6bKcDCukkaYy0
- 4OswK8KkLN3+QCjdA+x9LHZnd9kuN6RoZmVAt02OUm7Yei6bmXcVjv0THuhJg6HIWvRRoYdWpPm6fr5B
- VVyrbZmEZyYAKLbc5bsHyMAmDQiEzlBonoYP7FcDN9zMHAi/Bj6lKbwUJCtKMTkDzv0jh0Um2JlD0HAL
- G9D1/kFjWyNVvq5S6DGQ5KmClSIklSkAEbi6G1V9p43uYPJk4yIT9HU0tnMp5D6NmGit26EBAE3A7o9g
- tOoIE/ewrFRQoZOzoMKmp1R/QZwX0KbsynNiEkIk1WUkEfVepKhlFFoQz66smvEvdbPhsZf/0BKe/bxL
- 72fedx8eJ2cNuplh8EUBFCpNbDbY0hRTgYgtfuoCq8Ots8xTq9MKNVT3EiRndtmNlYDsESgmPjlMdVif
- ZeaMwm4ujSvHelk0JFuXz2c0ZcYwjxmQQiyjnOf7v4Uirae5QFIVi9XGbDIXXHqf40w9rM6VEchEOlzH
- UEjFO8RTUZe+So3PKguKWoOUeGwZBCe1o3Kp5dHgpNjYteEPBklKXFNqax6aCYnj7+F+CzQBMLWNVFv2
- 4Sd8W4jLMYjWENmzlTZ/Nt4AyTIQhyYNRtYrEJAoBVqStbuWojHuRvKr5BaImhlEGWlzUQCO6iYlxDa2
- U0g0xxoie0HVYRC0fFFMgLtnVSAEM/uoU8kRsWzMxQDidVS8eT1z91PSDQ5v4j/jZ37gK+/3nb9PAaAa
- DSFxpp0JY3yJ1NZ4G2F7XkBRKCRIr6WbVtuktp5UeTwijHlrT/KN67ZUNnKMcUkXJU/nTno6Pbe+SPll
- ngk4b3nujMOe3HmRISRTiVBUB1w8j+aowXZtSv4AFWo4D+NDip6Mp9Y6umKjxFLBoSjUk9N9rQyUYxMX
- QcKvC6CnvW1kxXxwAahhZMEUt2JXIg+5bJeYfLizEAmppmcaJwFZTu5NLj8XkCZGJJCgVufq8OMKVS2A
- scXhBcOYxARYEnQpc1DRUaVEqxz42OTLKrD5E9Ri66ui5KlAonbhYnwA7ZcMDJuwjEgzC0CWHcUKgSPA
- YzCtI8pOQBgVJgCvgnh2Ldf4DxvHd161cv4JLGz+2AO67/epBHj0BWfjyj/4T+O6oXcRdVEvmOOULWXx
- C7fF284XjnVmyUZe0lgWEI0gkT8OJZXYmJR5khsvb9qYqS5O81Bo8JV8dppTKq63Nu22NeNwAJIkEFLm
- ANhmTeVK2Hp6S8kdmMcuFEIqyUB1S7Q74w9yoE4KbLkJmmDeNuby0V/S3XPOA3XKfCObmduYlxwJZ5OB
- FKStFHRptCwtb5+Fx0WgFcsCQgrvrhQcwy6FwsYlhLjLmHUrtu5GkLAHobsYoXsUIIuIsoTQXaRWZyTW
- RDTaL21a9hMtgOhaYpqaOE1lmH2T/IKCkpjWtATAxK6BZhiB27TxhTLBzLOUSE6SZwhTUsgCgFrGqg5E
- UWHH1AK81nE9+zNqJt++cWjflTvPPwEI48Ybr3noAsDmeIorvugbQM3wL4jr/SLOGGugcGBYY4g1hZyf
- BBhaTP9nkIBE1DML4W1SYbXPjmJdXnY/eU3JFAt+yggmpbR0ruG22oSHfMKXI6/C8CphAXrGqHM6gyh8
- D6UcZRavkdMJf0jxs4uxo7MkH5aHZy5dSgyzwqPzKaZqbJL4/u4U1Bj+fhM+UnNbdG+oRdmBGJeTJXe+
- L2yKQW0CFekm8dN2kLMzs1yDe0umf+ckFEKO2pRKjTi9B+CvT1b3omaj3fkIGCXmY5QF4w9of4J4rAAb
- zMywhEzBJxSt3ZDQf0JubKMN0gqtLXFvY9ufndQkw9RQVl8/fV1gIDIhUmOagavCfGKN68lrqkH7/ZDB
- dTsvuR0xMq77xFWf612/98frfu7lOOeKx+Paj/7lrVzz67X4GRiwwkkyvqHnuACAnZwDgwwHuBmmZgEN
- tqjmpD+SSUe5J18LxFrhqoWklpQAlEJui3q+BT4eLEeYVY/7r6CSIoMompU9bn/a1wVnAIU1ehkcejLg
- JcegkFUvWw2fVb78oaoBqoLCzcXGM9acZVwsAUwT9bqjNdUImJ+umGEm8URHwOTsOSThTve0TwIWNE3S
- 467Zp29XJ2quXu8mqQVnU1UYO5ATP8HLO6KuwIW4uq/1f6Qx0JGN6XxVycDWgpgOwEpiC2p/olhjKQjm
- xrQ6BCuDkKNeVzISGiOALaMgKcxFpUmwYRcezQrYfKhqjv2Xqjn5tTxsfzIGPi5hEe3GFNdffdXndNvr
- +/rE8fGTuPxJLwTV7R9z175EUD0fSXO/OCXFfOFMS15T9wUbIZmuvAyNVdYVC6feEjwkjlRwgcZ5Y/GG
- tQhDaiCXndlyh5pGTCbkekobm9y1RsgehuVpTaHAIZT8/nnAU5kR+GKW/Ls4gMjUhVKwon7X3zIRkQB5
- GPQAxEVQCdBBeSHxhs5stoeIWCiagTo9EBEjp0wKsYtJMtmsaGIjMeuiy67U6yGfNMTlNNHRRlwNpjGi
- IGkK5r6yWo7FuGzXPKaxXW7WeQ+C02uEMrBHUinmzUvYxIHANDV3YU4HhZYyA+MlTDMVOQmNGL3ZNAAE
- FVrWYKgd+6mVUXrIME0RZGdGwFgTUIz7wuSiJx3Aw3cuXbzxC+u3V61ExVl86qa3Pij3/T4HgA/+ze/i
- /OWnY+Xi3Xc0Q3r1bCp/LDFc4p1fr9ElrhjSyfDPaUt2YDIoLk+T5r9SQCldHFC0yDi011ndFRft9YW+
- /zYJPiXZsPlnSEYMF6SldLoTDA46n+5ziss9b4SyH9A7sEtKrwcBnwCUkxHJ2UBhNxYlIsTujAeAxNNH
- rTVsWY646IcFMZE5tWTaND+AIgBLgygNiDZNfntm3f+S8dkmzH8yTREkZZ4s+sIgGlvwUdchMbssF9hQ
- i6wq6RQq028EyCwJZVJBDhNwofkvdqscSwLj6pvNuYjBbxsLAKv682hmI8VKPQlpYnX9IsRO8AozADME
- qsBi/S1aBXgCCTvBAkSqrM7X6xmT/0Xloh/Xrh7c1daDu3DDtdc+qPed78+TL3zhc7GwexHXffIf3sc1
- /xJRnGSt9qBEHnYLozEyzVUSoisv9GX1T0/GDFMQqfS0yKj/EcXJGUUHmvrL14Eq3vzrTwL60CXtDM+S
- cpCmeqW4RBEE0EFkXplYemu9/5r5/y15E9wXEEGhiEz3Yl12RiJAAVqiMdx5V+y6u+U5pZGs+zAsGGAm
- FuVcodogQ5PqGiRwkUNomVRTT5turekIuKuPueGmSdHQehGblnw3SWeRrCGo9TOQrcq7It4O0vb34CYG
- 2Wa/P9TZhnfTUrLufSkvbvwFCjaepBzgvS9GUwAdKrQmDeZWZ1MQxmBeQwxnqQcgtWCnEftYUXzlb4LA
- G8zdLVU1BTB80G/7/QoAH3nLbyJwjcc//itQL6/sB+qJJIvjaJHclIBd1RVNBvxQf2pPhLnGXUnqMbEQ
- byiRa8she6y5jXOCiZKhwArX3W0MN5LAmMlR9VR8es/0VN4DWdHxFy4mBEUe7WaYolLZ6IFY5k5JmgdO
- PYyzQGFD8nkN7puAkzSWYJR08P06kcSsFVCAqinRxY0EldTPHKtRIbvptimj0vFbZ6dpSPqOVPhQaDlp
- 2SHNVIkHbsE+Qox7CgkxFCjHmGSzyLIaITESj5PLYkEPtq68+FrTtRplaIIfSoxicx5SiXDNpJQmzMpX
- gP6/+gIcR5AddsiRAUmViBQxAMfGxolkGgD8ZqpX3wme4YZrP/rwBgAAOHXuY9AeuxkDHj+OMFv22XkS
- ZJDaUj0CYWydXRSjPl8cGwBtJGolej5uPmLr0KfVdql0JuG5E5uSqQiKGa4HJ5pLzTMYKGJbp6GS9JPQ
- imVqv91JbWmxw5175UohG56OpZJe7GCZ6mHIAryZFosTXjeeGF+WkkQ25fFqIaTqjcCsxBOK6Y6bh/q9
- 6YB0isMmOGbsQZsgniY7MBUiNVtucwPybEXT6WCnfbAAY/58pXBsciimwnQkczKEOoBmiFB4bbRFVkKG
- 00YlczqSWr0pqVVeP4zZKoQ6GtXcmn76RhNwdUQ5EnGpyFyb5EpMNEGoOgR2QRS6p6pn/0u6XetxY/kh
- ufP1/X3Bnh0jfOLYZ7Aye+KFAq4pze5nhgg0Dz8Z5VqxVNlNp3+hACMwPcGhTdSMR26nUnIHouw/KK68
- S/PQXZ8ZO6+bs/eQjFKjyWv1aHWkwkEXjDRUwn9DceL3jT3Qz2dszQVkDEI/pCT1HG8KZpN5lNbccsZH
- gZLYktlxx+W1Jln3LxllGpyWpYAOx8ym9FSWrO6OI4MTw7r9rtYTcp+BM0FMYpNwJZTul72nI/x409R8
- zMuAx4CYsq80WVfPrMHZFIUdTKY/e2BSXwKWzhqIC6ZeFECV4d5QgUwIBdYnEDetpVbXjY8/QQpwkmBl
- sKIAmdbNuHN3yk6ZYhK3AbdgdAhS2ZqdAVzNlvbuWNs8topLfvDrcOnef40VAtbXV1EPhnjLK7/zzGcA
- KwsDPP4xzwJX9SeIsJE3SzS4Y0ngNdYSr2UBRswr4NgFs4upsmKtpUB6Q4VKPX6yZuOCXWjKtE2Q2jT7
- yCn1BvSrZq96/+nRBEOqrGMno+IELLQFqSQTbSce4hz5vJH7CkTzKUYpF8Y5C0L1QG7Lg5EEmDlpNjbV
- 7vsMVB0HV8fhTSnidZX8cqde+65iqE6RAShygeysrbm3YWM0q8njMiTuRAwriGEPouwwqu/AhElcPyEj
- 9oS0HxDtFHUJch2suKjJNB0ugkFiMUpctOeYGnDSMBhoIw9VKk90bSjd1nUCSSqLV6SlZ1zWkSevg/kI
- uD4Mbg4B1WFwdRzMx8HVYW1gyjK6uNcmHJWVLjODEIvpBFbW61I8gkS5cOPE7OeWzj/rqc3uZrneUS+e
- 9cxn1jf/+l/hLa/8TnzXH73+zGcAkzbggksvwmBheNVd47WrZxM8N28OjXqSVGFXM1fcjSfnWHVqdGDu
- rTxLWOiEmHMIpqdidoIyr1u9SMUCC7a46jzyKcd7BUeBUhefko6hjpZWLL0z/bm0YwO2agGU6T2KgOF0
- 5WrLz81dfxQMyvLvOzwc9mASVQ67qjYy5RTazyGemIpPY6O7Ngc5ngAYAbHOJ34COhmpi2cJWCVxOSvq
- pI3GmbNBneJFnDpOUz1thXssQnctUqbfuOhBRMsUpygVgjQ7VTWdgnxtRh3GMJUhYtKVqBHjjhSQidjW
- dZuKHlAE8ykQdQhxJ6IM1MDTeAyBCRzdI9H6EaXFjcOlxcstbaKydAAWIDFwuzn+xpN3VFes/drfHohA
- /DS/9uBgz+J/e9IXfdOt//Cq1575AHDeomCy5zwsnrV7Hbcfu1OMNILiolJyMRWU8Ny+7TX1nkOYJekk
- KhF3TiAiSbJLenMzTVhHM13eUzRHwe3ReIOpvtqrXWwCsMUzsxtDPTGSvnRYnm6U37t/onbmg2D6gVTI
- gVNhRZbq1HLk9jDgAJLRxIam6Sh6LBbQhVrrxoeimTbVGTdVSdfZv3+2sbJRK0/MdKM1Pv4gN4tNti33
- CIamIVCUCeIiHSEDeeKiqf5OkLQHnaTmDUjqdAgoiwngQybWiUQBJoU/GFBHu/pWTqYxdQRLQDSaL/Ea
- mFrE9lwQBiDOOpYigir4rXegGaUy1rNRchKV8RbYxt8CQZAVUGxA0+6xcdo8VjAA8xrQxQuGO4c/sPPR
- fPuli1+PW2/7qwd83+93rhkE+MSb/hK3fvyj/6ydTr+8v8mKU3DrgHybTSnWyJlpN9bqL+KxkiyQTUil
- iBlqNOFcdRQlQFbYpdTgs+BjJxclFWFGhoUW5iU0tlNNejpE/aAVt/k+1Jvn29FXjPhoS8qdfzlakSAx
- INyLl9tDtf0TGs308sjKMcgCYtiHGHYiE3bsCxDsNWayYiNgJcdoHa/CIE1GPtLUePszUwWaIjVjCw9H
- gevnGa3XFZppZuVYMNlxJS1JAdRSTUJr1DmQy5vNLgEu6uijOYObagRDnppOo2EUEmiNp8rB152gmUfc
- gZ6norkhMU+tSTiGcAvwDBWmSWJNiFJci+Su2MoXCIZJiSQIPvqzQy3GFXRT+trJqdn/bBb5wsWzazzm
- kpeeuQBwwTDi96/+Q5bp5otiqM6hVG9hLkX2bqs30eaDgdeLNdwdVsVFx3aR8oYTkaS8krvVBYqLlCct
- SeBhzuEnIf1Mxjx9rjCXbHNyyMkbfTsc/5w4SCIulVkCYwuNmOZGnilmZuqwSESMD4ckmBNVRsX3yOQf
- oUFyyMkijcr5TwYWQlbmTVPwFRdp9e+ZJiqcrmXyj3SzGKn1pGRHkjqCrrRQz1p8+hgaTbhKfyfSKFkH
- QExAs6l19Wd5fZl+JFsgioBpBmatCPGDxzasqwGLmaZG7sDwKcY6iI+B+ERStxLjDyDx/W1Dszsej4xL
- oAEvEoHRgYUQaGTZmbv+LiJM4zeOj3e/Olypzl/cN8BlT3pgQeB+BYDnfck34+BdE3z1E18coyw12qQb
- z22UUsEFp8kKnALMeWYvbHHX1WOTziyIXOyhMuHKrsc/T4sxucCWS9vMGiyddTAI9Zx/CrERWdiGwnu6
- y3U645N51+FSN2BOK6HcgymInNkAUFVa45Y6hlKId2h2UHThixSm5HI4Y1Bz6agi0s6ht40v5ikhiRHa
- 9AJEMvVAB8DgsK7F19Nm4P6lS9fYWKLiGciClRYwlCkQqSuUpshci3Tj69+r1j8j09gJLVhaaytbL4IA
- 5g1wdQRVdQhcHQFXJ02n0DJM6gzQM0W2ry8t5lUFmaL6H7AQKp9CkI3RhU04tLLJR40YF9GNZ9+ycXj6
- izSSXc1yjed828vv972/Tz2AL/7un8TZz3oiPvP6t2LlrH3NM17w3V8u0j6baAN96Cv3T/2esGY5C3es
- eWt1/2Jq8Ci10sRGEs7aR43TFGyUbVUq8gYoUqqwhQaKufVc+SFk2nHSW0DKdCuwCai2OfXvbZPOgX56
- Kj+ns0ErbcYe+hGgRMHa+hirqxu48zNHcPPNn8YN118LrsbqQJt6In1MgjfbfLSWr4CXal3i8Wv3vcm0
- LJsyILLq4Bduzg7QyUFZDOexqPdDBkkHUNBamWCNXsky5mLUcydnSlzKEybTGXRDGpFhqvmTUQlN0yHi
- mpRCOkLMXIIhlBm4mdasQtSpyFiXzYBE34etPyFmWafAoFkSVRXzDeAIE16JlmtkncqkLUiSZNVFagrT
- 7tvaU3jH9OTsddd9+K8f/ADw4lf+Z9A5e3Hdf/417HzGFRcdfM+Hvk/a1e+UcOqCpNOWovHpPO6LibjZ
- JSf0F0WjkepNqGjaT4+T1maVQTvE1kcz0hE687ODmVZOrLtMptspcwtW4ZyUHG6Kz+magik7CT1nGeTz
- cavZyfw0YLtjPmEXiv/3k18efGGQ0AWsb4xx6uQp3H777bj1wEEcuPUuHDhwCrcdPI4TJzcwmx5HiMdR
- N96gGhWAJR2bkTv0pKAZrVFIiY6dFJa5tQaaWlV5qZC/s4/txshS6TFRxEVMJRdZQ0IRikNoyWGdfqmM
- R6IZXjYeQerkE6YQJsRYo0KtzERqQVIjMquDdTRdiqRRMaf0ZFgTRoeAJsGFFZXIBRK2SjLhDlVmTCwo
- TqBn+6I1TBvDSAwyP8wxARJRVUchspwEVFKPwcRL85QmDkMbv2vpouatTz7/a04s7l7Eh9/25w9OAHjq
- S78HT37l1+CN3/pqnP3MKy7dOHz8l8P01Dcy1jnbX9E2pyPQn21z3vxoCkFH30xtb5MoLLMoIxJMtLYo
- 6PV/C4esikRzB27SItExlCsMzSHAEvWXEpe7BBK5qw/16EQoLTCw1VSkzHq2g/ZKEQQCStGN1Af4HBKA
- 2azF5uYEx44dx20HP4Nbb70bBw7ehgMHDuPOO+7E2voxjCcn0bUzAAsAlixNbcEcbNMM00lKJTBoPgja
- pIeMOiyigBcRhsQFG48FK4EGCp8VAuCmGZI8GyUuJmKYSJlNtvYzDAdPYyRUYZqmVAV4CQk96r0i8WyO
- ODFXyYBYHBkEE+Y09+hE+xLY+FFs/t8gUtSAYa6+VJiYZL4AVGLM1zYjTRAIGyBaAcwTUEiRhWzS4DGp
- A+taZT4Kiot2SE5VgyM2CUUa4w4wr0LC5Mu6dX7ZDVf/9W8//9v+9YOTATz95T+O2e134x3//n9iz2Mf
- dfHG4aP/NU5PfRPTOpWbug+OKVNczrLPFGx+Twb5bOc2TNFQk9Jdp6jz0oy/hB7bgvFTXpzRx8XpXmoC
- SCH1PHfyo0LW7i8Vb7Y/+8vTPYOO5qcf82ahjmozY4ee1FiZOHz2KDCdTrG5Ocbhw0dw4MDtOHjgTtx6
- 61HceuvduOfue7AxPoTNzTG6lgAsgVEBTCBaAbP7JJy0uXxngKmFHLRLAUx09pE6y6oMJYjOPAOMhJUc
- ncyf0SnbFHTz+0lup6am9ebyLANEzkrO2cg7as8g7MjmJSmLymjPzAFxCfMFawpno1fftBBOmn9AZ6Yf
- xckvNSKsWw8Bw4lQUwOaDUEyKWzAGmQ3X8qHk3hT0+TDMUBEBZZo1F9jXJphqQZkW4eGv6Aqy98zi2YF
- spAAbDEuoaLxME7D9zztuS/5qzgLdz4oAWDpnHMxO3wC9e7dS+MDt/44pie+lWiTSg23PipuXtQjL6TS
- OYa2zLjncfjzYpzFCUmxR/SBFIAeZBkrcnAFua8cEv22lArJJ73DiqsUxeeLBupJVNM2n7mP+tNOdtc/
- Oan/iowR6DcG52kGk8kUG+sbuOvuu3Hw4O04ePAzOHDgNhy49XYcOXIY6xvr2NzoEMICQEOQjEA0AldT
- NE0LkXWlr8rQTsZa5/lsI09Rp1+4wWl05Vw/Cp3gVJvuPdJMfd4xWtNiwwsk1d+oCrrQ95NYzPypA9Ma
- BEs5JNPMtPlqy/rs1JcRSGZmSoKUHWYIrjXzDEbsYpsx5WyUy0co517MDwFoIWTzfamRBcI74yTMTNty
- alBjse9VJX+IGHdCpEbF6ykgRFk0a/EqwYd1iuAHm4mD0cCISO7A7KhXvWfKsJ2a5+JiCgreIBWZHQyT
- 1ZMx3D9oz2mffeS6a1B/6lbMztr9AmqPfwd6mz9uk972g0HEUJsfQpZ+mXRTOk2wzSlJWfghYfy32XSJ
- w13WzAx3cE8gGykQ+YVwLeKwUJj1zWma7+Rz6ZLZxkXWsN3pnE+OTHgJ/VQ/ZTTb+Av0PmPEsWPH8MlP
- Xodbbz2IAwc+g1tu+QxuO3gAx08cwvr6OsbjgmIKgFjAHMDVGiBj2+wDiOxAFDFBTFXFoWj/hgVIrJJo
- izs+abPLSDXokuCKztX7o09tCo7sNDJpcBmAeSPBfSEjnYeb6Gs0WXkmQxc6JJcC2P0H4k77TJs6naAx
- wO7K06afk4N+a7wRVxdeLO6p8v4VhNPZyT5TNl8cGfrOp0VRdQyMts2SbcDcTYh4bEmaZQ0ULHhwWvne
- G9PrxtYktFIJHZKAKrU6HoyFj4aHK23yIU9beO6AqRI7EohrXHV/MF3fuUFy7MEJAKHrUA0Z0k7GQCd9
- Pjy2SeHLGr5CDLtB1bGs4CsrIAmgarNXDm+tnZFSr1LXJ0ttlYlGbtToYmvgoyN/H/9hIgVP3bMEsGUQ
- 3uzLJB4lDeWJhWxbBPS7ArEkABUd7a19gnlMQE56YyT89m/9PgDB6uoqptMAWCebWZF1VUVzpUKX0YPk
- 3HolPyEuG5ln0Zh1mxDprA6OkLhggKUuE1/QmWruwLr5Vu/yFFEaZGgtwLyWTVddNi0u2GkXzI8xpA6/
- nnIqxQ0n3sRFgxtnWTJKCIQ2BRuQIUW96WebXpI8vf67yMAsu6NRhRubGLkIiLn4oAFLf4StZcPE8omh
- TYSDdoPcKJSPJ5ceKghimvHUSdabEHXzU2tCuCME4tRAVt5Fi0gj5DGnEp+C7IDEAZjWwbyq6ysupZGm
- 8jZaDe4c310N1t/DdY3L/u0P4lM/cN/7ANXp/mHXRU8A6hqohvdgNn0yob3is7eo3TLa6lvKCrBEE0OJ
- 5U5+kpjulQVcRHOk9D9v3HJkVqTNAIBhZiOmMVRXhBgvHYaJ45/OeSqbT8VNdbqzor8xT2TKv0yUMqX9
- 2xGGtot8FeaBS5vjTYzHE0gEuAKYASYCkQcs5OvmjkpbgonxyVPPYZQMPIg3bFZt+vye4Qjb9bMAyVNL
- r4OZZljG4QucgqWlISnpKM/dBTCCEWoM6CIL1tDqLI02fABRphBTm0ouJJmyqvCJqJJ3hNiUxzO2KItG
- 5pJcztEUJAMF9RAVCkJVFvI034N0Aic368am19q3YMzseTZhoDbfA+tvqbNPZ+u3gkA/k94WvQdcZLVE
- 0ZSCsm8FuWeGOSirduHI3mdowXemwqUk61W1+dNhtnRNN9nEB1/3mvuVAZwWCHTre/8MVddCTp4YB4z+
- MMrCya1Pp+JtqFjIVZG2eM0e5pBymMsoaK4lUKDoiHsC3775pTyJjdMtBRdcZNFSUypchRYSsowoZlUv
- kYIAwkmd1t2Hsk2VQ4i3mqPmzV+yCU/TI0m/b0UbElUgqooA6giyyoJmKToas0pND33o6MQOrDryuXaX
- pYKVWWVQTtIzqNR2PS4Y9XacOBnOrnSzCq1ZTfbdXXeAHk1bVW4WDWS1ZFTfQc7wpEo0XP2bGj15d2ls
- hj4s9IaCBWXJpZnrEVKBMpTKjEZDMjARD7p+/xnpeqhNl5p0lvdGQEBszGOwDOTW7I4Nylm/ZqQDpbjL
- 0KzCKgOx5YDt+oXKlJwVwVhSGRnjHsTuLMS4Yuu7guIRIojD+7hZ/ft6tI6LXvwc3N/HvSIBZ11EHAjA
- 7ZVA87PA4LatScNWGXBHCDJtpPqTnBSSBvtWu5U1sNfEKX2mxJRy5lYOFKVnmn+SGRydRtSCeB0RI5RW
- XYQJiFdN6bZM4CkP71zqKW1QygEoobHm+Q+2UbcAhWibzX8vAbBX6FFaIPreXq/X2IouhDXrCpusFBwD
- iNbUegqzbPDBBfUaLdxtNglnxuUCrbeUcPScZMLbYiOYZTuvGpCrTbN8T20rPmXptZ3CZt+eyhhpgLik
- 789Oz/aTuk69CjEvgiRX7ienBQZ15Y3W6VfVX0XUWdUbB1rfC5scVw75LIRKdO7OEkHSJWEQdfg5hZqP
- m5UadIMbrRmyoJsVKogTZQE6knZ3ZUX0EbwvY0HZbNbFjhpJB1OlEwcvR3v9MGMVVkMa7r1skYYX4ILn
- PPN+B4Dq3v7xxKFPY8/ZjwaEuvrczQ9j3LxfZLAbQpcRdbz1dKPiFAuFChByvZ081+aDyGnIQ5TT/MSg
- KoE0VBpyIkmJaY0U0wIi9pGUgUiKdCIRilJdlymvNFf7g1yY5HRswLK0kDmiUpktzcffecPQaKm4N6Ky
- SClk2L+WZR0kjO1QiErumdnpaAvLkZXOukvGFcPkvKPvMcgAJspjLr3H7mc/So1URm3W3Tb2lMaCQdCU
- GFUOZOSMvJAyEr2lpufHrQF8cshlmpWkWoAILJwEPvyXBgR3I3I7E1uH3sU3KXZ2BWgq1iJF+7psTT8B
- Vyc0GDupB2wjRzKZsIhIZl8nbJoBg9y4JAteBvHNa0CBPVRwDzghYN1CzUfgiljVjGp2SZxNDp341PSq
- C170ZNzw129+8DIAAPj09e8G0wzx6FBirD/aVXt+ADx6Z44d96ZlV2MLMUiqghDiRIgFq1HrOX28Psae
- OBhhpDSD7HvzaWo4S6g0nSMvQmTRmiiDrPefYKJImUMyMCEptIDntAyLzU5FeeG/aFtGP29TGsReQKDi
- Z6WgQq1tzDplV6BOEWTbuQx70KT57ENlqYhOKsYcAEwgQw1X+kQdEbLnyRzAprHRmae2C6BEIGL71KUb
- FDK0OKX5XREcrYlnmZ8akK5pSmzisnparifGXGkoAgPrqJRXgRvxz2waCzDX3apUhLLvxM4QJf9UCidW
- 157cbxIiBNlR9JDIGoWSR4rUGf9gGQGqJyA2SnV7Mb3zQ0QM7BaKof1yo11VqroscZdo62WPSsFu0k3G
- w5UZwgMQk75PQ8NPXf8BAMDjHv1VqPmOIwv7Lvj96ermV0iMC1vZcuVpFvv1aOLf+yKrs1Gk0TGYNnqN
- uy1ZhmcVUm6q1urSLFgpLsdNlZqJeO1mEFFBDfAETGv2zgNE82oDtRZkapWz7iEHfNwjc+rDGU1Yogek
- d224+CYls7CUMSvrS8cudLbYK4Pdml8eagBlGu4ZUYW+q1F5OQOIVkEyUyqrG626EEbSYiQb1TVFTU3W
- jQ+p3HIZMYW/DkC0hjzuta65S3FRtnPXda8ee8wTyw4a44J00G54Z6c32aadWo09MFlvRc8JGBTUx1AS
- lwCI0Tvm46wSxTPTM6wQTY8PpHJgFJs08nOYM1h7HRwbHfCFfQAtg/mIrnBZMBl7NpEQMSXhTDFOvphk
- asRESQU4rdekhhxT/0SYUnklpWmL3WvmdRC3VxLW/2Jhd434AHQk7hcbcPfznoHpsRZtHO6SWDU4LRbe
- T9RFA57Md6jFNv+KzlZpwxRZSmvt7bQECH1EX0ipYAb4NKkG0+g5sybYKVTVcbtoq+DqGJhW7R31JNMy
- ZZbFJmRkxBfq6QX3tYNt9tz73NuM/YDtuQeJPFW+ri+bps83spTHbHI9RZeKDnPXqUJ/QjFPTZ6C+BSA
- DlEWEWWo70EtCJvqdQcbM9FYRTd4PdetRk91CXedLKylyQ7xxOS+/Wu0psnX2LpoFOCTLLx1szC5caiV
- A70gyV4lpxDM0JMxUpPIN5R+F+s9LViKHeBIRJ96JLi3gX/yVCqgkhYctWcQjVVaSwuJC4jhXABAJeZ6
- haHi++OCKSehUEZGcY/cJ8INR0x1OflR5saipJFrSRcnuyebIG6vY568OoblwzHuw5v/3f2DAd/vADBo
- ahw4cS24Gz8u54vzNthlOjoFejj/IjxQMEaV0Ylp1ksj+1BjbBNomrzJratK4vi6WSKoaK3c9fkGVrsS
- asS4y6CVMzA24OQUJveCq5H52g3mx3/Sy3AKBCRQaAvWvUyhHy7nr9m9NQzd19DKKsPUo9co9BQ7FGVG
- eXIwMoBmBuJNZbtJDZGdiHE3ouwyfb4lZdTFHerSFJcN7eaowgUAru23mN5P72mbFIFyiRMKApBLvk80
- QBtHQNl/jdpxWddbZGA4+EXTfvDN5Rbg2WGKpCRpOYnHriX5FCVCuFMLbyA3I43fQmLZBTipBEeqraFs
- oiTFJEgPnQYxjhQYVRSCQnlqpCCrTPnWicrQDEYHpqnY6LUWNR2NsQA8pX2jWAGuqyt/5YYPfni4q8VN
- N95/JuD9DgDMjCde/jzUlfw9sxzKae12kwFj3NFpUlHz+iOzevYOfX8jcO80lNR4izmtKn+eN50cayBl
- 7e6oKm0SxrjDaMhdEqvMY7y8ofUkM0JLXC7MJks76zlMf4IYl2PPeq4k4G3EyH3p9LEIW8sqW+xJfs1n
- xjKXn3A+/VPfs0r2VTkbGOtkhFbNyCKqWKV5OZD5Arg6L9EMXJ0C8Skwn1CwjyzYeLHW4Cyjwjrevkdi
- fwaz9DZaLaZaO9s4UMh8GdGo+KcsGWaBdEJgnA89XCgx8FyqXDU1Qu8ukUGCIynfgCIj23X6Na0MQTk0
- UFflM0L1+UMESQ0uXIPJfQxgEGXzGVB5/AaIgzQ6FZNAZ5qgog0NCK4bIFWSW9O1aFoA6Rohl1xiv3dx
- 339+1hXDMH3gTlL3KwCICJ714hfiJf/yZe9dXFp4V95QXa82yfDFAWLcBUWylTvEmjeu4+8LzBZ4kpgq
- Nof0OvKwrnVEMgpwswq/0t6AEh8hSS9N9gvLvGrcbfcPRN+mGlMlmtC6SZ+PsqtML0C590A5PQj9UsEN
- UraAiTyolQGLsT1uoPC6S829qSnnDIrr5e/EqQstbveVTqECvUczU7I5YdMB0+33CUEKPkVDETlgioN7
- 0JrklwOABobacw5BUzQvB8kgg6m1AOwZmztKtYqxFNeBiAB3uZEnhWSXnbCRPUtwxx1W6KzkIMqASnVR
- a3r/nbFV2bANo9ytZz+oZogcU/dHzW6m6d5XycQm3xsNPgWITdTAJsiy6Ra4EG6hrIygcGrHaVjwyyzH
- RicfDR245+ZHTZdWls9MAHjf7/0Mdl/2ZLz0h1/RgutTROVmrzE/1mLeMBrjSqrzYkojB8Xa9rm9YZvn
- 1HqSNLT0aalJrsrttVC49RhCzm2rnDThhBetzTqUOHz0fhqjb3JlLrm9U708tedPX6sCPdNAa0FrKy6A
- Un07JxSaUIiYkyovA5Ags+/qDBTqjSmdFl1ZA6/rB1ipshSaafUl3cTk04fEmCMvQ8ibV0MT9JhaWu76
- ij71cbDRok1xRvbnNqfDbvedMCRTq+9dfYAT4Ig8qMsCAhZ6zj/Es5R6k5junlF62aZCelK3BW7CfgLN
- wHwS6iSsKkBCXdJIFDuwNIhpA1Cdh3VjCgWwhOQErNfODhSKCVwkNoqlqONd1w7M66lOsudbFqcB3CA1
- Ytc8/YIr1ndOpw94/99/VeCPXXM9bv/Dx2My9eZEKQpSnhSabrpMuMgygDUjjjSIcQXMXre2JuhhpUSa
- LddpcWeRx2mu1RLCEOiPu6DNkqJjny5kATOmeeGRHjdfclAx0JHQVPnjaABpiylctKmDzDX6CNkxR4Dk
- MVj2N8rJQEkcCsCcBl6/aZizD31GZwppA1PbNTMW748kwREX24jFtTMkYbI7C+YG7Pc327qRn+JxmERW
- pRBg1TS2SV1ttYYbmX+AU18LnIOIYQHsnnp6HQcWaCx4JLIN588EBkc/tbNKlIhy/sWyQ1d/jiYE6hmL
- mN0cmzaBxMZOV7EpR2e9gCEiBaXxGnRZKACyCMg6Kj6p3JdYa5BgVSJGHCXVHw3BFhxpbAIrYn0c24ru
- Ht1TleofGEqtt2wO7Z7QYSRRTp2RDAAAVoYNLlgZI8aKSrfXLAVe1vh6cmiaPdGuP2qruTvV4PeLn5x3
- sm+cdpG7vCF4hn6HXHq1finmma1BY2JlOcZA5slEXjvCCW8h9RGkt5mjNQa5R+0tU2Mp0nWCWG29lumw
- ie9ewqdj4pbTFlWhiH5fQlLtmd/LO/0Z+58ag9RlWC7FXqCk+XtFIWcvNEliH1oD+/sH+4ylXVrIQVYY
- EpdMDdiQgGY0qj9pkL9PVOyHNhzdeWeoAiFFQCZhVGKDOSknKpRYc5pqh0QRFwo6oBTJ4h3UGnhmALKN
- z5a+E4KWFmCQRFTSKbJPFnVejxFElq1hV+esLezRGp3XEIhVrdrGyNFLTwEqN/wUyRwEKgVsS3hwnwGb
- NRKpd3aL8AWhXb60HY/wxKe+6MwEgDZE/OY//5JITIc1DQO2V8DpqwWRmSlqfT+wheE6fmQCHyHdJA0O
- nBatNxOFtlPppYxdT8owzvyz+ouMl56YY1tT/6zbnhuQeYw1TxYKaeH0Mwnqpfku50RznelcXli1nkZf
- mLuG8wGvbPDNNyF9k06LciDLZeuLI7aKmWVh1YRzoBagTQuidQ4+LtkG0/8zYBUMTKTTkkxV9nGlC4HC
- YNQJ4kxRN6m7BMUl0BZ8A1QkE/NcC4JwTKPbXK60RlByjT0LcjTRzemAIbH6PKrOYTlFAo0hvGnrbYZa
- WpOvRwE6i4ioEeIeVLSGik8Y+m/RQD/BYNNZml56DlOWbaUsrfQ8jOlgZT5hjMCQMkCdFuD8MJX/uHgW
- 7agXqjMTAIY18LjHfgWE6ysJdKy/QL1GGWrta0ATX2AqalCmlsE2+46509tcaimbO0ocaW0u8/JjThaS
- 1KVONGDqo+rEfQh6zD7aWg5YViEG8MhZhmHL0yk4D+Wde49tQFJucoqeb0GZ7gNlLZix/aWuHgqpLkJP
- jqpszBbdfiWWAP0eQ0+t0VLf/F3YUIiUmIf6WZPsmgzzhk/NxNKUI5hAiHENZIQYdyv0l8cARUXSeZPQ
- aMV6plhTzJGh4pmY8vUjKgQaGFBJNfsFFSLVpqBrCj4uGWbWXmTYf/UxUElv8CbAE21koqCKWymUhU11
- gzK6gj2oGU+Q3WoRVh22AFxgWkzOTkCIZoCiB2JjCj9uXzZvDEtWLi+axoFDgT37qRDb+KLN493jpqci
- vv6//85DHwA2WqBZJlA9u4pq/hHQ0icVtFDNZQJm2V3KJKFNeoDMp6w02NRELMk3k/37BpzGqjTSXDdu
- OSUFOer3/k6y/o/Mp7zIwpf2klQCSGF1hnnC0CyNfDJ8mAoAsJOH3H2o/FXO/Gep9tvql+gpuk9YYhEc
- 8yehovnowKiUipv0dVIASqd/1sfZqm3sHW6VR49mBRati54WJWpEUSsx37zetGLaBGNajGljVvuNC6qn
- j5n1OyIo1ka5dr69Oeta8M2io2JQXbMAD3uAOFLnHKunyd+blWbMaFFhggqbIG5VlYcCmE/q+sMMJK2B
- olb1BOd1nf2z6f5ZAHNmoTYWzY/QNy8qSFxACPsQUYOrozoepS7de0rqwyFRiYlOFHlgXQCEXL/CVYGy
- nXjOhivPKXYhdk9sNx+Ymuz9zhsOfvTd2Hv2owFQGN+9+cnRnoV3ibpyPBlA4yQg7QhPLQAMcxbtnWRP
- o6gF07TQkvON5UATazYVIqL9KOnvJ4U8R9GZTz9zXnSzMPIgKk5AKnwFi1rZalIqFH0kSUMhWT5RL3XP
- 5USJ8y/sLucwCmWAsBPEpMr6GUTKtbZkGH2qctbJz3gM7gUQvS9zjab0Ov9cpucolbH0VKSE0Wb+PklW
- 5eWxEV2a1NshN2dhB2TVIDT587AfDrnuT8KfJp2dORGD1NX3DCkmAlcDt4RVM1DrulMEi7L5iMeI4awM
- ZJIRRHboxuSNLB7ilOfU6zJykvVEFPRTWUi1BqIMgDgy7YsJRJbse3W2/CiVsam5jcrWeLdNVlmK2nDS
- DdD9tdlyNXsD1+0bKHRH9j7rqbjpnX/z0AYAADh66AD27bsYw32LQNsdX1yp39vOqgYizyLq6n76Gw36
- uWyLJGzPpnOKKrRHoDP5rggkkj+ycF9bgDC3OQr6JJUpL/cDR2IWFwxDmqf15IWYTtuEt3fr88oWmiDZ
- YKetjjkhkTJAeODwFD/OsQ81UNKWjjChD5aal2TNIE1dL3UOYomYJUUA2LrgyMeAZpVFqAwuXIN4oqe8
- MS/z9/AejTXIrNnmoqGg4orIwDa2BcfEhc+zclAOnpwCtJdEEREDTfmB1LhVFl6lCsXcFdh6MoLRRFGF
- 1PRGq0KtuR+N1H9PGgi31ngc2Ioxn0Ga2kQKRkAKKRsjk5CLsgiuTtnGXTKla9OfTCVUaZY7f3DMHVy2
- 9j2QMo8DV7P/XQ83f1Ric0eYNdj37CvOTAAAgCOHDuLRX/6tmN71aQQZtNVo8R8RJpdAuqfOfyFKJBAp
- JJSipqYySE2PDAQJBgyJRvDhorFWruy4bVWTVPvTPpFE/0wrPhkysGm7SVE6FOuvHDFSESESZjwiK+BE
- 9F1qOL9Xb56Qg4q4JkFKbIqbL6MUxKiYjmQkILbNDKgXeGLahFTSq3tyZlS8fzE6TQHDs6ypnc4juwUO
- GFowKG3MtGofLZIU2ZU78ZhXIE2SyIfLwGtAsIyDqIfFyMFDabMadBoQWlS8quAd940wiDObhbnqEgJR
- llJzkmKdtPeBOgF2Kxpbjb9oTkJNUhPSNL5FxJKN+Dzr0D9H8nWhaMCqWrUeV53KWz3YZkUALWHanTX8
- PAMrMjvz0eRqdczV7A/q4fjVsatPRBmgqo7iA3/6ew99CVA+7rz2/fjyf/5yPOFlr8LHf+8XZ3suvmxn
- Ox2/VEN4lfeae6rLwBZNsBpKU7D+c7ueQwwKdlTuRMde+r81XaqKEsADiElpUVb6Id+dW/AEc8q8Xpa4
- dzxlNdcciErjkvJEreYm+TT37x4MQj+Vl5L0UzZ/YlLCySev5Ou3BWKMjPoDG9NuPuUvOQ2ln1J2ByKw
- lWoeZD21nymPgKwRSRasZdEwAq7Q1BhGoTYg1gxM0RR/C6BWsuMutXgy0YuiqgkJRZAs6LWtJmC0EKnB
- sTbQDgFhJySu6HRIRkBcSJ12phmEKpM5iykoid14Nn2/BA+XYRIBZZoAYUWVhoyeraNFywTIezGspB2q
- wXwcVXXCypRYaCkMi1KLinKXgERX1+yFq9Wuqk5eSVX7M1U9+V/S1aei1Lhp/7tx9OihB7SHGZ/j442v
- +UUcueZ9eNVNhyrC9ImEbqjd8xK7HpCbgrGoq8joo8rQUr7+CH3evG0UmWfZxbmvUHbRNYBIT2TUQS4w
- fLBViklUUorN0t/A/vfbzunF698ptoiWIouN5uykwCOkRl8ZzDxwtcbf7/JzpIQL56mDn/gifUl1KtuX
- yXW36ikpUcGtoN51RfH3plJj/YToG0NcXnwD7vQUkeHOgjq1wKgwUFVKcVegFjVjiMm8w9HC5bC0QcQA
- gWrLIkb2WbVEjKiV1GQaAhDF/QtVudSjHIijjFSymyZ22ivTkKMAcQURCybf1Vg2mp8HiiYzZqQrMQMR
- Wz5iJQnzMVO5dpGaSdEX095Ybq4CDvVV5Kw3/QKYV8G8eYK5/fmqkZdBRq+XWK/FwLhp/5Wf0/79nDIA
- f5y7ay/u/tBV55+4++CPde3mhXmOWXw1+0KunBrjMogIzJt26neGcsrdTh3v9U+G/gC7bLQRSoEO8jrT
- OP79cZezyaxPb+o31Evx0Uuwc8shuwv563PmoGlvDkX9YWO/H1Cm8cWorghoVAY3sRTeVHrmwcS5pTiv
- NtRHHZLJXNMct7xfYuTPp6Ip5qxrS0ZFQT2vUXdnRXIuWFOsNgAO5oKm/xxLbxOnwj6bGWm4+o52/kk3
- ChpQbFBJhFCtCkD2PYimqv9PA/s8riHZJC1AkhqRRhAMUMWBWnTx1Fx5HE2YA5eQgHnDkI2K5GSaaMZg
- 3JGIUepJaJOPEtQYBpHWcZ+xBGls+IehUaw3C1xMuVK0gUo0BVfrG8zTD3G9+dNNc9P/jvGsdepuhKDB
- TTd95HPeuzUehMfxu27DeG31knY6fvzWbranMAExuqChZBNJGdjp5CCITlM57hBlYBe1Nenvaq7G3s6F
- x+GvytJSkop6yLu0tZSqwj5/pmBoPbbTPpipiBSCoAUhSWQO/mBknKRaU6Gc75flSqpECs/D/mfqBys4
- OnGLBiH1soG+uqGfdo5115QzWiorduLLFmqzbX433bQ5OpkRp6bebRYiJcXE62ZhCznB7puP8Pwz6xxe
- hIsJSGE0Y4acPu4UYev0u8pQlddSSqG1Bo8UUWFdRTSkNnyCIwYrBDQqFS6VwbKCSYcruUvl45ok4sFF
- aSIwHIoTnOIu1VPEDGrzpVqNmoWEnCMam1KiE9NMB8H0AHW+P5zbTR6oJyBeH1d195+4OvW6dnrBCcIY
- wBT7P3UIwKEHY+s+OAEgBMasjWMRVz+Yh7PmOllBEOtgXjOw0G47/deSRRTzGoAO3KuL/fWlJuCcoKip
- DBE52KZVTLgs2xocmTlItluSlN572RBTGuooNipBAn1p4gxWogDVP5hnCZZOydK3FqESr5D1CEEZw+9u
- JiRdsdkzwiBv3jg3BvVr1CUSj/IFioC3Req8T8XW07PTBF5MvMIYawVowpB1VgZZ70KpBy50MTUt/ybJ
- u0cKZslVGWahtQCjWUUwdWdV6RFEUqKPlw0E9dQTyxoFhMACFrUAE1FJLxYGS0SgCEGLiqYQjoo4JKXW
- MrUAZgj2XskwXmoIAqIsaaAA2aGiwYLFMRKK5WBy4FBElBGY1u0WjvQ7hYxz0T7Y4lxAz3uFeAxC/BTX
- 47+QODoxaD4NwRA3XP9RPJgPfjDeZGnnDizvWrmjqutPYU4EwzdajnorNvvsrEGyoe6usqJyUMm3bh7m
- 6ouz2SapLhfwYC6qRuMebGajyBKwY6NGsUkBJbSbnzjFyNIIPym3LTZ2Vt/1foJv2Np+uV88gHnpJsqf
- J+PAiyxHuFAhLpF2xVv0MgIpgkR5qiB9Lm9mCkoxsn7GBhPcgFS2GYwenGDS1vkXfT+G6gsS67XWvgFn
- g5ECHs3img6xmBq7ycvIOt4TCHcITIYUrE0CzK4QVWouIs5IVbkwio2p/UZ9PhkGv4cKBOD6kchdE7Yu
- v64Xg0HRJG3kKANEeLYwSMGfaaYKU7SpgZVaEJ9S5GM6CPKazofQ3PkvbOu1vYfryc9f9O0fvFsQcf31
- N+CG6z+BB/vxoASAZtc+vOetf3IkYsefCRYmTg/WRl+mrRKtA4iIcY9p0c3AvIGqOg6ik/b72typWSzy
- VDbMyWIXvzIi0TH2I0TZaTX+rNgA/Q1M5cmXLArKpmHcvuQo9S4caksRJfnGsfRioyGFtInBmmNBZjJr
- LjdCsT6IKxG5zLYg01ixDaqftmWSFdMOFPP7VCbk+XoWUtGGl6riDKwJJklXIJILYihnX8xhmKD31RuI
- uTvRpefqWFYl3aIsGyEoS7CR4UcgtSr3CBKAhs1BiDDWBiRvoOIjGiTiAiIWtR9AnEjWupkrPc3jEoQY
- AYuKasTAuAqxKFmcfs65NPXgmPgORr5K/oQM7TlFMB9DxILSnmlcqGRHg/cuY57xp9nrBERty9Xkl3/n
- ve974x2v+2LN2h6iBz0Yb/Ls538DQlzEYHHl3FN33/rnsT36PKeGptPHBBy8y+lkIBfaON1MPzegzAAy
- WSNtbvsVHFmlm6kzocmRyY9ZvSmNpavzKT0ZjTgmTbkUjOzUT+7EvckBmz35vBtQsZDIWF5UWVfYnHb9
- G0hfDixv7Ww15Sl7Wnww0VMRbJEIL3EIeU5ggcjwFzyxwFZnhaAe6MryiLhTwSzUpk3BpvAspIxHb8iJ
- DM17Ecal90Bcp8yF7dRXGa09ht9nTekrddWtMIZU6yYYo68S60lE09ZXTH55T3QTuRcESUDkQhoesBNf
- rcADRdQwgo/r8olv4rHKmwklIxMUvn+a6rspaRZeIV4H88mivC2Ro31ilza9B2l9eyOcq8mbmuHaKyVW
- JyQG3HD9hx+yAPCg9AB27TsXp46NMVxcGhFkJX/BCebFLolmqKoT1gBZgMhOS/dOnsY2PG7dUD05MCBb
- imcwUYzLEOrAKcBkafKIkQWBtkjnnX2V9evy5kEBKa4KQYyQU9e0a+c3f7b71QVq6DeqIHOy5z0ycYoF
- 5h0vS5oSJ71DS9slmg4A1EhTykajjwkldbiTzHTqdYQs3FGUXLmY8P5BtElEMBXdTmWr48ieG8yvYKqI
- OlNU1sAScwC005gAY/4F4wfUAIag6CKuqzrqi8MemjMigKuTmXwt/j2VbUgcUWHVsooRvEko6JLWfjF4
- tMAVCpUkpKxFocsBBDcyLY1ILIOjkDMD+44h7LWT30av3iAusjZlvfrrJv7eQhzeRrz+4yGMTgyXVnD1
- h/8aD+Xjcw4AX/mDv4oRZnjHG38CX/Tc73hJaDcf39+gJSzYI2Bnjb6xBYHGGiIT5AlBTM8tT2jMKa36
- a7VuGxfRdZpPOoqWXs1MF8Br0rUCdOSPOJciFSepFDRUx9wTm5ZAKGr7PIpzkoc397Rere01022qkXLG
- ZyNLCUlRN2P6KTUuy+DiCLqeAYuIZUPewPPSowJxbk4ijUul6HGKiXf6oldhT29+ZQIUcuDksYFvSlQj
- J+pvQl2TZTFQWG6kgIo2wHQKMexSdWf3FyDVz6uqQyBMU2PT3yzKCkLcbWXHRGG4NEaMe5DGatYqZZqA
- quOpYefOv9p0hJUDAuLsuETi7j1ZtMZNRx33EJN8FxdmHhHM64hxh65J8T4WirKsAvN4RlX7W0STXxIs
- 3jNbeSvk+LPxUD8+pwDwDT/2P7FyyWPw0V/7H/jSl972lOnaiR8QmY2I5DTVRSn44aKgrS1Yx4+X8Mc4
- F0iQIMWpfSEjtaJKgp7ZCcedZZPGoAFXclOyw/Y6BtJbEkYAAB8uSURBVKUtGQwt1iXlnZikpCVj3xNs
- tegbOEFFsv57MsR0Jx102WFAiuS/lBL0z5v865D17YpgUUgjFozGfP0oWVO732GduOhZxqsIYMlWO4Cj
- S1ypKi7JEJEqtcgqmpoiw8L7ocpUWIoWyKLdJf8ctWklsnb5qzXEuFtFRVin89F6BSTB7gMh2Yojw78Y
- qjRNsUIIZ6PiVTAfNs2CxoLwWA+COITEPUrPNcgt8xoiRcSw18amp0DoEONOu7ZBxVL9kBICaB1u4Kly
- Zq0R2Ry6O4b3WGIczWURyJb1hMCjHR8a3zW55+Chf8Dllz8bN954zUMeAD6nHsBrRfCzT/w6nH3ZYy89
- eduBX2s3j3+dNvrmT+1tKLw9DMC8EQhtu/nTmWya/cxjayZuoq+s0rcaU9jxCKnZZ+zDDDKaxxQUP1mc
- 0mwQZYHpzZVOPOWlvBejFMnsRDEdfqW+FhWDlxwmJJmMeeBuswX3P3kClomDKQCX/Qgp0YOchSniCMAs
- 23ulMi0WX4ONrz5KYioq9z2Dm2coK26ajCvJDUXmCVhEUPv2BkGsQRZHRtVgoFoDVSfQxnNVj9/vt2UO
- LBFUHzGUZJsyICJBCHsR4y4wbdpMfmTybxPznYjoiWzGYYJ2Qwio1sGYopMduXPCp8A0QYxnaVYifaSq
- Zg8Gh6aZbXDHD6gfI1GLEM4pXldCrp0q3aroR8NvXbpw8WWgau3j73gjzsTjAWcAX/ptP4TXfvuP4Kkv
- ed7Sp6/6wI914yNf67VMfyPqj/Fmh5+6rhjsASDDJMuNvoCscFOuo6iHqgwwrxyzHUBIUVobNseOBe5+
- O+Vd9E9NOxld2tnRiZJw4lXepDTXjJNCnMQ165KI5zR/XJqj4krCrhazevfTm2dRFgEolQ1ctCbmLMUL
- HIFv6Mx1KunTJRejg2CG7OjLJtsVLHWuDRffKuhF6iIrkBTMBAxylWCoYEdgH9kFoDqpEFxT582dCGP/
- cUDFHUJcAsUaVXXELgElMZEoO4qiaKKW3qZboD9fexCRKpA0JvzJoDiCcDBeQ1tw7mH334xiJGtciJW6
- zCfsebuy36LBr1Unga38LI1vKstOKzBPQNRFCN3RrZ6ID1Jr7j49HtB84Rkv/1HwcIgrX/srGPCeb5mu
- Hf8JyMZCf/SkG18VgNXXXGf0ZZ2UCT7aNKE5Q9GBpl/UFWVCloTSuqqzIMI5zdsmIBCKFHYuMaZtT+m+
- FHcezBVU2gQdDnO0Tuk1/1Ceyj3W37yRZ/GHpD/QD3xE895/yDRb0p9Bzg8oadJUqhC4QrKfZFY+kU9B
- CvZj4rDXGWnofQyqCqqtBUrHYLg6s4OH3F7M3pPtzxWfAPMGmDbUJEN2mpxWBcYMnGr0RseMaABD1CEu
- WbmwDMgoS6SQgMWIxs6kNIReTGagMZds1EGoUgszoy47TVtJQe4q5AeKp/EDuy8t4JOHNEVxC3pJ7lhE
- KKS+XNiUAMzAVbdWL4z+3+mJ2Q23XPsP823uz68AsPKYp6HbfwDnXf6sx02On/xvEtYek9lcnmY12fTT
- 3Hr7K1tuJZZ3EMkbiWY7iCbnO3ZAL1hM3XvvqLpjr0ZV00e3mbhaMS/kVD9d+LrgJXBG221Do80L1z9n
- 3c8MhAudAclN/y2cbvTphNshljGXKAm2ARfRnAQA5Z9baiFssQ+Y55AjnaRUli3i5i1dOvnJbo+kZiKj
- x9IzLXwVBqmtnEBPzCIjJ8msr21TSWWBqYNggE52g+JAR4yyaM3cwmHRYbWE1K8gByAJ26GiwYVMFCSy
- QZ5IezdqwEk2/tN1qJ+3Tf0YAplzsk5cuEB5ulGKrsVZAill0ZaSDt4ik92Gtsm7gvjmcHcugkRnnJIw
- BOHGT930Le990vNaHLr9ljMSAB4QEOi88/bim6/+C5qdWnsZwtozvbsuLhMlS2Ng+ThQiVs722MdhP3E
- 3c9y3X51M1r9rvVPdz8r9eJ3gYd/S9yK6gYGUxAmY0Jt2PuaOwwrlJj5FFxX0GG+SN14ToEo9wJcQWbe
- cmseTYi5P+d0WHqyX+gJYPR2q0j/7XvvWfAJtlQgVHCoq37kSCc6ZbalzCkdFdOD/JmRgmL+f6foNgbR
- bfIw0k5gKfsjyT7bJK/RmYS3GEqvKiYbpqeIxkaH0eS/kYw3NCA0tvkXlKrryswOLQYQWX82Cxlxx5Sm
- aarN3ySD5kpC83ldTAo/Ws5MEyxJpDHZrw3ATF90SrJpBCJA4o5kCJNQo+7i4xZzRmZzjQsHXJUyalmN
- 2tciw4VVlRA3u5tkfPMK3ow4nZ2xEuABNQGf9fXfBx4u7jx143V/JrNjX4nkSsMzEL2Pq+73q7q+q2vj
- FQBfqisi3AGSm4njDcvn3Hlw/Z4LhEhAy0vojs9Ay8vnyXT8cxTa7xKhSmTJ6JQzS/eXoeOS7N+HwnY6
- TxUAFJLZeVcYdRUe6ed5BBW24At6JU3E6d16ymYitilB5vwTkwVRJh+pBZUtSJhDr8OCqS10UKngEGQp
- sx4WoQwYUj4HKWiIjBDCuUZgEnB1uHBKjklXgIoRrvS0juyUltpGqjZ6lUWtayWqlLZDnONufU51wjaX
- YhuUl0DWo/Ha2sxELAOgqBgB8BoIARFDBZChNZSngFPTlM3+y7+yOggzbcDNUUQqRQjKEKBNlaXjDcS4
- iCgrYF6FxGHyqtAa3zPRaSpjyRSDc4YkNm7ukOf9JyGyu3CEKuHxUxBtRqrCe5i7nx8snXxPO67C/us+
- fsYCwAMqAc7bdzHiZGNft7HxyhjoPKt/psThV6t6/MMSRx8hxsG40X5k5Unydwt7w99t3oGreEA3E9HJ
- dnMZEoAb938IZ13yRNx99buwtOdR67Sw+AEKfDZi9RSiGTOPc2S36Js3oqdZXfGr1M7fOnmg1APYbuwn
- 22QC5abmbYIDp3HP1tf3Ey3ZIjEOJFsziCrMyEibUdTYCDMkHEMxPEefiIRiepDr+pKskyuK0v7Iehrc
- gWnNXJy8q575+G6dDhkaqEd9/9xujCBmpOqirAERi5YSB03PiU3YtbIuvfdVGnuOMwg7E/swqLI05mbk
- Ih+O6qOkTJwchIkNYuyfOo9mbcqmJUUaMysjseJTNsKL2ozjDbgicrr2IDBPbbZf21rbtMPJy1BvCE7g
- kwAYTVoDSdbDUEu6NRB1M65mv14Pu1fFbnAtVZBuE7jgCZfj0B0HPn8DwIWPeQKWzlneWD+8tk9i9VwA
- M6L217na+HmRwWo9mECqCry8gO6kSLvKUi8xqBLsv+YDOHr4Mzh29DMAgKN33IynfN9PYe39H8ZgZce4
- WRpdF9vwQkScg7SoZNtNSXOz/+0L4nLzbh8Ytr6OehmGPpq5z8AJogqa13RTeCpRiSlwMlAs3qavBKyK
- O3VKXV1aqpwbb8ndKPe80+jQXYB6vQRvQDq23c1IIrha7yHcxGTSyDQOXRNAY0+bU3ieQjDMpBjjaUg6
- 2acm/InkredFgH60ESLqVLLpJ67SxIVdWSdZkxFAY6DaNADO0IBSHvgYlbEAyVCCaTxKLk2XaT+gmcqC
- GyydeaKjPheuScK0KMqxNjVj9fcNS+8XjdsySd1+siCivYoh8vTHPgvjr4eLp35YQnN0sHgUiA323/CR
- M7b5H3AJ8Mwv/2aMT55AZN4r0/ZrRMKUMP1boFpTlNva/QYxXPHKn8TisRNYPn9vc/d7Pvb7YTZ+uaIF
- S/eU053acpoTmtINUHzCdgHgtDtrm0wByGw8zKnvkt14zoAbMyLxzSlpM0ds7fz5zH9kwhqdCkggy6j1
- X7Ndz6L47lI2IxlbextiHncDxbxnN5UkYFmahWgWYCNQWUhUaWUq1mARq6nrQgl4nEoHprHSZN1GHDW6
- uFdP/wibpCjaj5JBSczCm+IbeN2aiC4gspR0Any3R3M09galf2U3hBUTiUHCNYxTfynKKPc1AJssBdvo
- A+u91OlNtYY/klh/ym5dhnf3YZ6IDv/VADKOVLXvJmp/GNJcWzUzUNXh+qsfOsz/g5oB3HXbfuzZcxHA
- 1aYE+SQE1xHJTNO29QeEYDr88ffjJS//QfzlL/1IvOCiJz01dKtfTpjR1mYd5k7bCv259VzqLTt7E4Sc
- EdC9BIPTlQF5A1Hv3zMWXNF/SHDb3K2nJHzZYxIWGIAEt/URErfozfHnP1ZvQ89lNIWDjQuDKHa9fEmV
- TiN/rQYp6n13xQz4qTaDoGTJRVMQrkwKWyWwI2VdRnbIMnlKDIMKL6o2fwLkmGxbug6c9ZwtbWYerxLF
- UyIri4SWKl7T0Z7U5v7knHxXbc6ipC60Kqa24/0lY+BBJboaME3sJB8YE890/hJWxTr3NEsZQob7Bmzt
- DzkgaQKibkbc/mY1mP1oDIu37j3v7/HxD9+BI/fciYfj8YARBzftf9+D/mEOHz6pZ6z4bo2UxCTTiMXH
- jEMAMgOqg6BwPSE8BWgfM48g9Jvc38gR945SPN0kYH7Tzfn7oeTll5gAsUWXufzk0uUyMmVZb2w2lv5O
- kHQFRAoZdMypB8/rl0lfybi0HzPfu4QjkFICORYTk5h/N2wAY2YTDzFK74JtsInxMOx36/JXkZMOY0Sn
- NXUCTzGiLIMkmEW3deqNHWdyH2rIabU2YwbicAsx//iIwoFJCL/QdotfFVGBKUK4TXTaio9PIM0oxL32
- Nask3irkikE1FAU5g46UOyvbsmKvbmqzqEuMVFhq3yQ0J8zKLKf8+nfaHwpJ7BaQlmj2GxUf/RkJO9cH
- g2tx/O6nAHjoIb+nezA+jx4XXXABAGA4nNoGQLroMa4gxrMMWLQIgD4Nwg+B44t5JN8h9Y7vF1r4dH90
- JgZLLbXuyt1ymvQZtM3zseWUlUJjv3f69v7sp+WgkO7KzxcZIoRdiLKi/niyYPXydtBk2TZTke3aHjL/
- mSwz6SV9tM1bU388mWS+zdraGm+MToOJ24NJrUaaNs/X2bwDj0r0G1KF4opBas09nrv2tSH1bM7O9du5
- Dq+4bf9XvOn4jD+xNDz1/U218buEZj2abkDF65t1fex3q3r2nVyN/zfzZCM13FzkxaTiYtxj62mpwKtY
- /yUdGiU/xXEnlNZVtgALvdepY1Ahuyp2rNH096rq7p+NsrgukXHdNfecEbz/F0QAeNl/+T0wpvjNq040
- TOF8IHK6gArIEQF3QL0J4E1E7cvGG4/+bQC3S+TxwnXvfydXzXeBBn8OVKeyr56lqDJEX3+dsR0qR30N
- d0Jk55pg+ZDIEFtLDz8JS9uuMqhkJR/IwIQk2zkxr8ZUiScFVdbILIlGOoLITtO759PEAiqcfVAo4G73
- HUMRWEqcgqEIU3lCQCEM7nZWYkq8Ktwx1HQ6muaD1Ab00UZXmucnS4ZayTrGWGQaW7NyZGCgUcLLJ7NM
- BMX8U3uQB9NXizQffMzT/xoHb74SXWgO7Bgc/o+DZvbKut54N9XH7+Fm7dXVYP0/kFRvOHsQ/mNVbbxB
- UX4BxGuo+aQJe5r9t5jjb3QzWs0WYtxpuJMGqbRzxSGUpi7zG99n+5s9ZKgGi/iPVb35XyN2r4o0uOnG
- 93xe7Dv6vPgUAP7dL/4xPvXuN2PnuRc87pZrPv6m6Xj9itRRRn2MuHsNMQ6KxOMkm1cKhsd15MIIO84C
- RQZtbKIehqXQxi+TgJeK4IuBcDkh7tQo7tGaeuKMWT0oeRVErma/DB6+UaJ8F8nay4HJzq27j07zZxRM
- O6/ClZueGIguT0UZyOLzZU1lNT4TJtqtJgfTdL7D08hPUBqSWPregyJH9EFKvjiNJcdjZEmyyjrk/hrT
- RYhL1h9wpdwKMewCeAzmNYPjmoMSb6jghqyArHkH2/BkUOMoIwTZZVeuNZEQQZBFgEj5AbwBVBtHmGc/
- dM6O973+6MYzJAad/CxiHwLNsD7dh+GuY/vaiVxS190nETBrMNDqkMOzZrOlv2rDnnMV1ruhEuKybMpD
- NdQBuVBDSo1jhzd3RVbSZmHQJEtO5t67adRjwMuJzENp72Aef1+Mu9/a1P+IG2645/Nl26H6fPgQL/7x
- X8PFlzwOr/3v/wnnnXvBN68eP/aKGAeVbn46QTz7f+rhJ38lzC76GIT3E4WxxCUQNnDj/qtx7M5bcN45
- ++x+SBu77tOTU7veXi/FvyKht9c1jkahy0QGi3lMZwsgCTl4sBEQxU9WdfsqAe9fPGfXO9tNEUj4MkKo
- tk/Dee5wLpSLACTFHW8QyTJEFqbA4C5ifjsIlcThPthIzQ7Ajih2TBtVMppIBitlow6g7WI5lRnJ3L97
- HCDDJ1C23VaobL9voCl7lT0KKCjmi6dgWgPQIHbna+ecp3ZNZ6BoWZcZaCircGCip4tJclvr8kHWGzTt
- RuKNwNX0VxYuvv231k5eLpAK+/d/DEePHsLdRw/gvEc/Cpc/9gCOndqzGUJ9FyMEYsL1170Xl15yKZYW
- upMbk+WnShxeDjBr938CZsVYaFNxPc36TYjT1gEKkw4DDSVoePZyVK/B6WHm8Bd11f5lVW++h2lyE/F0
- RhSPEMK7qmr8i3vO/cDbZpMRJC49YBOPf7IZwPf+4h/ino++G+ddeMEFH//gB1+7dmryAkvZbyNuf5qr
- Q6+LcVcAGDft/+yjkic88Wkgigi0AukIvPcSlhN3fiNC+1MQejQgItIMgLDYOzWhoiHE8edP3T3+qfMu
- W8J4sgzwYIdM134TceMVIlJowJmJKYbHmTeuYpLLYoyXAuCs/wdL8U1VlttPkAzeHCV+gqru5mbY3dp2
- O54kHX5eYngxpGqIw6eA7jeIuYVMfhyQSwFpCbJBJJBIy5pzx0KFiLAtJqI3DuwTpBycQqnh6KcgUE5K
- xOSyGZPM909uQNrhj3Gn6TIEm4lPLHNYRnRzTFEyGFOHIDsA0/+TBN01oowMAF4D8+aV9XDjX8bI90Tp
- 8KkbPnSf19RTLnkiNuQiLCzOLuzC8NnM4Xmd8HMlDp4g0iwAXCe3at48wcB+yMJjgzRnx5jVejVDbM2h
- dxFqRKKNTFUumr2HaPpTXB3/0HT8hJZoE7fc8jd44tOfu0+CNBw+fahtnxzqwTGI1Nh//cc+bzb/500A
- +KYf/WU87ZtfUV35M9/3qkN3HvmFth0xUfePzJOfOHH8Re/efdbbIaju0+aff1z2lBeCGNi4SbD0mPAo
- xLgXAhHQLgi9SEReos7GMjDTjXuqZvYNsZOPDJcazDbVkZWHC5d24/Ufk4izgRBz3TckYvztYLD5f5u6
- vmjWhm9qO/5XiLicqKsss+iA6iCh/Vuup7/Rbl54CzWnwPU6qqbFbLqMehT3xhl9JQmuIEz+bNxdevX0
- 07dj55PoixHxjZDuk8x0c8WtxIgXSMSrBO15Wzb+Flmy4shH3z/J4NtbFWqlsCsTFOzNaVLEke5sg9xG
- cHXY/BwcpWdYeXRJbAM0A+ISXKY8YAGaxZloiHXfnfnH1fGjVR1e0U7qt+268AQ+9t77Z4Lx0v/x2/jA
- T1yNiy+9GZvtXhw6/iO45OIfPCdMB4+OcfniqqbHRQmPAmb3SOR3Pnqlu+eutT1/tNkuPEc3uJq++ojZ
- NSiShgMiqmptjQezb4+z+m+4Pq5YhSpCYgtudkJigLRrADFu3P/Jz6uN/3kVAL74Rd8GDIZnbdx550/P
- Ju0+IvkAMHu7yJ5bquouAA323/DAI+eTvuSF4FGF9ugUiFprSmwwOXUOFs76zHkSm6+QiK8hCieB8A7i
- 6TsAnt54w0dwxfO+DZ95/0dwzpOuAGZHQfUa6uoWVNUEzMDG2gsBGmIwOoqmJhz81GGcc8mjL0UMzwe6
- 50mkIcB/Rzz9IAa3H8Ds0tAMPoV2ej5uvFEXxSWXPh/DZUa3OYTMltEsHEbFh0BL56LdjAibNephBFcd
- mFtcf905eMpTjn1tCNPfDCE8Kp/YgtOm/Wn751ufa90ZepgGKTat1AnApOYqaocV4zlwgUzFyqsLLtO6
- kWrckKS1Zp97Hc6MNLYLESMFAYm5K/PMev4TUN3+8eJZJ/9NO16YMkdc+9H3P+D7f/nlT4HEFtVoJ+Ks
- wmz2KGysXwru7sTyzhsxWljBP38cD998M/3u+qz5V9nDsiomSE43174A8wa4mr5+sLT+b0QG6zRgXPuh
- Kz8vN/nnfQC47LKngaqKJWLYLK1PJycvi1VzBDV9AkEe/5CMSp7wpKeDcRyBLkI3XsbC2bfz737whviv
- LvsqVI1G8xvvR8oJAFc87UtRN2NMNs9Cu9ngyS97Fm5+15u5PX5xrAbHIFgHpEob/4E8rnjSs3HuuXtx
- 6aUXL378E9e8YX1942v60tKDjqm9BYTzRGTl9ChKZwNydvmVyjrbpX+hA3TM004qgGbKw7d3YV5NUxai
- sTYEbZKR+yNusqKgoRjOKToY7hkZjZiz2laD+Mp2bfrH+55xPq56058/pOvvJ7/6y/E71zR4zK740lPT
- hddHoZ2uIyhSqhq5bPfmlKrpH3M1+TmihTse9RXfh7f/xrd+wW1+4ExKj9zLo6oZgERqeCzdLgxwE+oX
- /Atc85qr8FCBJPabycJTvuF5WHvL6zDY+aXxe77ky1AvHMP+T/7jA3rP666+CgDwvb/zOvzuv/0O7PlI
- BcwW4nD3SVz70Q89KJ/7uus/ggsu/AYcP7FOIpIhgqqlEMDVH+47e+f/OHny5G/MZrN/dvq4TwVj2R2R
- C+t2IoMKs83qO8PyazbA1VFkpKBLn7fKDaCgkt2oEY0Fx9JoV5/GoLjDWhOtkoxQKioRQDzmqjs03FVj
- 9Y6HvmPOTYOn7QsQie/ZaNtf66R6JbBxQerxuBsRhU3izU8Qxz+ph7PXhVm9vnl8Bbe/55e+IDd/vvOP
- PL6gHs9/wUvxxre9GS95zgv+/WTc/qpIU4ssnmJuf1Oaya/8+W/96vrLv/+H/mrWzl66/W3OYiF66pcl
- AJCbfyMrAeAbIIucovQ6iEBcVFyDNEkjT1/FZgtOiWkXZSdi2KXoSP95YgGINkDc3VOPNr8RwIf3X3Nm
- 5uUvuPzr0FYTLO64vTq0ueuL2igvFeFdSCQNngHVh3kQ3j++a/nownmbkNDhkn/9vXjbj7zyC3YtfV5k
- AI887t9jNl7DS1/49eCFXa/DbO18hOrRxN2b68W1v+C41D75ec8lZv5zIn6aiJx3r9oEp30UNmHGEFTr
- raml9yYZboKg6guwkMBRCWcBMvJPZcGkBuJCslnLctvaw2DqwNy+oR5Nrg6z4Rm7pk97/AjvP3gXBrI3
- hHbjH0/uv/ofL/zu76FBvYK19fPwL/50l/zR4/4EPCB0h/8O+77j/8HRd7/rC3rzA49kAF+Qj5d8zctw
- /DN3QSIwWWam2XFevfMJ3fLZt2BxtISVhRH27d3L+2+++QVd1/5SjPLM7RuDbkflZCAfA2ZZK+18w4Qw
- zLDTJNfFwESuBah4hYmOywywJFKbMejATDRYswVZSLoA2dR1A1V18jgPwjcB4b0yZdx085Vn9No+5/kv
- RhTB2toEUczWTABIADUVwqlTWHjyU3H1m1/7T2ItPRIAvkAfT3/JtwAETO4+BAkBxIIYBN/zLV+Lt175
- PoAYd911GxaXVr5pOp3+iShvdu6205yCjf9byVUYqCsRQmG3XReIuCFAE9POg8GWjfQUF9XrUQbJrgvG
- SFS8/KBnCkqYgetTd1eD6dcSycd3PP5ifPiNr3vkZj8SAB553N/Hc5//1ahlhtFodOFd99zz123bPm3+
- 1osp9pYaBWK24PowyKsQoiybFr/Px2GovimY1w1JuZgwA7m3gEIS21l1jcGeFRyl79OCeANcjd8wWtz8
- 3ij16nWfeP8/9dv0sD8+r9iAjzwevMcH3vtW7DvvIlzx9C+5h0CfQCFsruM6PsVMh4n4CBEfJqLVRMDp
- UZmzmrChHhMoRkzeSqRCDHsBMXScNQHFCEQiA9PaJWjJEJLsNhDVULM61TJP/4F59gvTzWZ1c/WR9tSZ
- eDxylf8JP674slfgj37lu7vde879tSgSu8BfA5FFInnHaKH5/aquT81aYNg00rbhnHY6e3WI4Znle2RL
- 9mBW2wrVETDYxUCkAUgQZRkcYSamOwxn36lRKwhE62BjyYWwVzc+TY6DcDUxXs/N9C3d5LFHFne+B4Nw
- /iM38JEA8Mjjc3kcuObvcOC2g1jcsfeaHbt2/8Cp1en/Ma/vD0uMJ/MMgLC+vorl5Z2HZDp7TYzdU1Ma
- z81VTN31Qu3zBLyHQDsgaMR4E8qy6wA+RTEuVyLLiAIQjeGSblXlpq0RQL0uUh3n+uQBgN9NFf8D0fST
- 46PnrC7uO4qq/jhm473Yf90HH7mBZ+DxSA/gn/jjhS/6WrzrT34az/i6H8V4BiAKIB2+6vsHeNf/aXHt
- J67Cc577ElRLy/jMx67G0kUXPTfMpj8r0p0LNFPQ4NU7zsI714/LWdRUF4fAl1AMS+QS7OKgHwyiNC8M
- YfElEge71BcvbBJ1txPFDiTHILiS6tHHYuQbIw0O3X3dv189/0m/DpIO1VB5B2Gy/rCLZDwSAB55/P/u
- 8Ywv+yrUS4v48NvfhCc95fm7Y+iGIIoicryqqIsd6RgsVKAYkwy7SASjQwyC4cruHe3m5lfGUL8ionoK
- EF/DPHsdIc6Yqb3u2o8ff+IVz0CMjIgGVLVAs4ybPv6OR27Aw/T4/wBWnHheq8GaCgAAAABJRU5ErkJg
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Forms/SearchFiles.Designer.cs b/FModel/Forms/SearchFiles.Designer.cs
deleted file mode 100644
index 5fa7bab4..00000000
--- a/FModel/Forms/SearchFiles.Designer.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-namespace FModel.Forms
-{
- partial class SearchFiles
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SearchFiles));
- this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
- this.listView1 = new System.Windows.Forms.ListView();
- this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
- this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
- this.panel1 = new System.Windows.Forms.Panel();
- this.button2 = new System.Windows.Forms.Button();
- this.button1 = new System.Windows.Forms.Button();
- this.label1 = new System.Windows.Forms.Label();
- this.textBox1 = new System.Windows.Forms.TextBox();
- this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.copyFilePathToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFileNameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFilePathWithoutExtensionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFileNameWithoutExtensionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.tableLayoutPanel1.SuspendLayout();
- this.panel1.SuspendLayout();
- this.contextMenuStrip1.SuspendLayout();
- this.SuspendLayout();
- //
- // tableLayoutPanel1
- //
- this.tableLayoutPanel1.ColumnCount = 1;
- this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel1.Controls.Add(this.listView1, 0, 1);
- this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 0);
- this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
- this.tableLayoutPanel1.Name = "tableLayoutPanel1";
- this.tableLayoutPanel1.RowCount = 2;
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 5.545769F));
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 94.45423F));
- this.tableLayoutPanel1.Size = new System.Drawing.Size(798, 652);
- this.tableLayoutPanel1.TabIndex = 0;
- //
- // listView1
- //
- this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
- this.columnHeader1,
- this.columnHeader2});
- this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.listView1.FullRowSelect = true;
- this.listView1.Location = new System.Drawing.Point(3, 39);
- this.listView1.Name = "listView1";
- this.listView1.Size = new System.Drawing.Size(792, 610);
- this.listView1.Sorting = System.Windows.Forms.SortOrder.Ascending;
- this.listView1.TabIndex = 0;
- this.listView1.UseCompatibleStateImageBehavior = false;
- this.listView1.View = System.Windows.Forms.View.Details;
- this.listView1.VirtualMode = true;
- this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
- this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
- this.listView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListView1_MouseDown);
- //
- // columnHeader1
- //
- this.columnHeader1.Text = "Files";
- this.columnHeader1.Width = 569;
- //
- // columnHeader2
- //
- this.columnHeader2.Text = "PAKs";
- this.columnHeader2.Width = 219;
- //
- // panel1
- //
- this.panel1.Controls.Add(this.button2);
- this.panel1.Controls.Add(this.button1);
- this.panel1.Controls.Add(this.label1);
- this.panel1.Controls.Add(this.textBox1);
- this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.panel1.Location = new System.Drawing.Point(3, 3);
- this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(792, 30);
- this.panel1.TabIndex = 1;
- //
- // button2
- //
- this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.button2.Enabled = false;
- this.button2.Location = new System.Drawing.Point(708, 4);
- this.button2.Name = "button2";
- this.button2.Size = new System.Drawing.Size(75, 23);
- this.button2.TabIndex = 3;
- this.button2.Text = "Extract";
- this.button2.UseVisualStyleBackColor = true;
- this.button2.Click += new System.EventHandler(this.Button2_Click);
- //
- // button1
- //
- this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.button1.Enabled = false;
- this.button1.Location = new System.Drawing.Point(627, 4);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(75, 23);
- this.button1.TabIndex = 2;
- this.button1.Text = "Go To";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(9, 9);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(44, 13);
- this.label1.TabIndex = 1;
- this.label1.Text = "Search:";
- //
- // textBox1
- //
- this.textBox1.Location = new System.Drawing.Point(59, 6);
- this.textBox1.Name = "textBox1";
- this.textBox1.Size = new System.Drawing.Size(438, 20);
- this.textBox1.TabIndex = 0;
- this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
- //
- // contextMenuStrip1
- //
- this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.copyFilePathToolStripMenuItem,
- this.copyFileNameToolStripMenuItem,
- this.copyFilePathWithoutExtensionToolStripMenuItem,
- this.copyFileNameWithoutExtensionToolStripMenuItem});
- this.contextMenuStrip1.Name = "contextMenuStrip1";
- this.contextMenuStrip1.Size = new System.Drawing.Size(256, 114);
- //
- // copyFilePathToolStripMenuItem
- //
- this.copyFilePathToolStripMenuItem.Name = "copyFilePathToolStripMenuItem";
- this.copyFilePathToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFilePathToolStripMenuItem.Text = "Copy File Path";
- this.copyFilePathToolStripMenuItem.Click += new System.EventHandler(this.CopyFilePathToolStripMenuItem_Click);
- //
- // copyFileNameToolStripMenuItem
- //
- this.copyFileNameToolStripMenuItem.Name = "copyFileNameToolStripMenuItem";
- this.copyFileNameToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFileNameToolStripMenuItem.Text = "Copy File Name";
- this.copyFileNameToolStripMenuItem.Click += new System.EventHandler(this.CopyFileNameToolStripMenuItem_Click);
- //
- // copyFilePathWithoutExtensionToolStripMenuItem
- //
- this.copyFilePathWithoutExtensionToolStripMenuItem.Name = "copyFilePathWithoutExtensionToolStripMenuItem";
- this.copyFilePathWithoutExtensionToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFilePathWithoutExtensionToolStripMenuItem.Text = "Copy File Path without Extension";
- this.copyFilePathWithoutExtensionToolStripMenuItem.Click += new System.EventHandler(this.CopyFilePathWithoutExtensionToolStripMenuItem_Click);
- //
- // copyFileNameWithoutExtensionToolStripMenuItem
- //
- this.copyFileNameWithoutExtensionToolStripMenuItem.Name = "copyFileNameWithoutExtensionToolStripMenuItem";
- this.copyFileNameWithoutExtensionToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFileNameWithoutExtensionToolStripMenuItem.Text = "Copy File Name without Extension";
- this.copyFileNameWithoutExtensionToolStripMenuItem.Click += new System.EventHandler(this.CopyFileNameWithoutExtensionToolStripMenuItem_Click);
- //
- // SearchFiles
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(798, 652);
- this.Controls.Add(this.tableLayoutPanel1);
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MinimumSize = new System.Drawing.Size(814, 691);
- this.Name = "SearchFiles";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "Search Files";
- this.Load += new System.EventHandler(this.SearchFiles_Load);
- this.tableLayoutPanel1.ResumeLayout(false);
- this.panel1.ResumeLayout(false);
- this.panel1.PerformLayout();
- this.contextMenuStrip1.ResumeLayout(false);
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
- private System.Windows.Forms.ListView listView1;
- private System.Windows.Forms.ColumnHeader columnHeader1;
- private System.Windows.Forms.ColumnHeader columnHeader2;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.TextBox textBox1;
- private System.Windows.Forms.Button button1;
- private System.Windows.Forms.Button button2;
- private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
- private System.Windows.Forms.ToolStripMenuItem copyFilePathToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFileNameToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFilePathWithoutExtensionToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFileNameWithoutExtensionToolStripMenuItem;
- }
-}
\ No newline at end of file
diff --git a/FModel/Forms/SearchFiles.cs b/FModel/Forms/SearchFiles.cs
deleted file mode 100644
index 0dfd14bb..00000000
--- a/FModel/Forms/SearchFiles.cs
+++ /dev/null
@@ -1,308 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.IO;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace FModel.Forms
-{
- //todo: refactor this shit + search with multiple word separated by spaces
- public partial class SearchFiles : Form
- {
- TypeAssistant _assistant;
- List _myInfos = new List();
- List _myFilteredInfos;
- private static string _fileName;
- private static Dictionary _myInfosDict;
- private static Dictionary _myFilteredInfosDict;
- public static string SfPath;
- public static bool IsClosed;
- public static bool FilesToSearch;
- public static string[] myItems;
-
- public SearchFiles()
- {
- InitializeComponent();
-
- _assistant = new TypeAssistant();
- _assistant.Idled += assistant_Idled;
- }
-
- private async void SearchFiles_Load(object sender, EventArgs e)
- {
- IsClosed = false;
- FilesToSearch = false;
- _myInfosDict = new Dictionary();
-
- if (PakHelper.PakAsTxt != null)
- {
- for (int i = 0; i < PakHelper.PakAsTxt.Length; i++)
- {
- if (PakHelper.PakAsTxt[i].Contains(".uasset") || PakHelper.PakAsTxt[i].Contains(".uexp") || PakHelper.PakAsTxt[i].Contains(".ubulk"))
- {
- if (!_myInfosDict.ContainsKey(PakHelper.PakAsTxt[i].Substring(0, PakHelper.PakAsTxt[i].LastIndexOf(".", StringComparison.Ordinal))))
- {
- _myInfosDict.Add(PakHelper.PakAsTxt[i].Substring(0, PakHelper.PakAsTxt[i].LastIndexOf(".", StringComparison.Ordinal)), ThePak.AllpaksDictionary[Path.GetFileNameWithoutExtension(PakHelper.PakAsTxt[i])]);
-
- _fileName = PakHelper.PakAsTxt[i].Substring(0, PakHelper.PakAsTxt[i].LastIndexOf(".", StringComparison.Ordinal));
- _myInfos.Add(new FileInfo
- {
- FileName = _fileName,
- PakFile = ThePak.AllpaksDictionary[Path.GetFileNameWithoutExtension(PakHelper.PakAsTxt[i])],
- });
- }
- }
- else
- {
- if (!_myInfosDict.ContainsKey(PakHelper.PakAsTxt[i]))
- {
- _myInfosDict.Add(PakHelper.PakAsTxt[i], ThePak.AllpaksDictionary[Path.GetFileName(PakHelper.PakAsTxt[i])]);
-
- _fileName = PakHelper.PakAsTxt[i];
- _myInfos.Add(new FileInfo
- {
- FileName = _fileName,
- PakFile = ThePak.AllpaksDictionary[Path.GetFileName(PakHelper.PakAsTxt[i])],
- });
- }
- }
- }
-
- await Task.Run(() =>
- {
- ShowItemsVirtual(_myInfos);
- });
- }
- }
-
- private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
- {
- if (_myFilteredInfos == null || _myFilteredInfos.Count == 0)
- {
- var acc = _myInfos[e.ItemIndex];
- e.Item = new ListViewItem(
- new[]
- { acc.FileName, acc.PakFile });
- }
- else
- {
- var acc2 = _myFilteredInfos[e.ItemIndex];
- e.Item = new ListViewItem(
- new[]
- { acc2.FileName, acc2.PakFile });
- }
- }
- private void ShowItemsVirtual(List infos)
- {
- Invoke(new Action(() =>
- {
- listView1.VirtualListSize = infos.Count;
- }));
- }
- private void ShowItemsVirtualFiltered(List infos)
- {
- Invoke(new Action(() =>
- {
- listView1.VirtualListSize = infos.Count;
- }));
- }
-
- private void FilterListView()
- {
- if (listView1.InvokeRequired)
- {
- listView1.Invoke(new Action(FilterListView));
- return;
- }
-
- _myFilteredInfos = new List();
- _myFilteredInfosDict = new Dictionary();
- listView1.BeginUpdate();
- listView1.VirtualListSize = 0;
- listView1.Invalidate();
-
- if (PakHelper.PakAsTxt != null)
- {
- if (!string.IsNullOrEmpty(textBox1.Text) && textBox1.Text.Length > 2)
- {
- for (int i = 0; i < _myInfos.Count; i++)
- {
- bool checkSearch = false;
- string[] searchTextMultiple = textBox1.Text.Trim().Split(' ');
- if (searchTextMultiple.Length > 1)
- {
- for (int s = 0; s < searchTextMultiple.Length; ++s)
- {
- checkSearch = Utilities.CaseInsensitiveContains(_myInfos[i].FileName, searchTextMultiple[s]);
- if (!checkSearch)
- break;
- }
- }
- else
- checkSearch = Utilities.CaseInsensitiveContains(_myInfos[i].FileName, textBox1.Text);
-
- if (checkSearch)
- {
- if (_myInfos[i].FileName.Contains(".uasset") || _myInfos[i].FileName.Contains(".uexp") || _myInfos[i].FileName.Contains(".ubulk"))
- {
- if (!_myFilteredInfosDict.ContainsKey(_myInfos[i].FileName.Substring(0, _myInfos[i].FileName.LastIndexOf(".", StringComparison.Ordinal))))
- {
- _myFilteredInfosDict.Add(_myInfos[i].FileName.Substring(0, _myInfos[i].FileName.LastIndexOf(".", StringComparison.Ordinal)), ThePak.AllpaksDictionary[Path.GetFileNameWithoutExtension(_myInfos[i].FileName)]);
-
- _fileName = _myInfos[i].FileName.Substring(0, _myInfos[i].FileName.LastIndexOf(".", StringComparison.Ordinal));
- _myFilteredInfos.Add(new FileInfoFilter
- {
- FileName = _fileName,
- PakFile = ThePak.AllpaksDictionary[Path.GetFileNameWithoutExtension(_myInfos[i].FileName)],
- });
- }
- }
- else
- {
- if (!_myFilteredInfosDict.ContainsKey(_myInfos[i].FileName))
- {
- _myFilteredInfosDict.Add(_myInfos[i].FileName, ThePak.AllpaksDictionary[Path.GetFileName(_myInfos[i].FileName)]);
-
- _fileName = _myInfos[i].FileName;
- _myFilteredInfos.Add(new FileInfoFilter
- {
- FileName = _fileName,
- PakFile = ThePak.AllpaksDictionary[Path.GetFileName(_myInfos[i].FileName)],
- });
- }
- }
-
- ShowItemsVirtualFiltered(_myFilteredInfos);
- }
- }
- }
- else
- {
- ShowItemsVirtual(_myInfos);
- }
- }
-
- listView1.EndUpdate();
- }
- void assistant_Idled(object sender, EventArgs e)
- {
- Invoke(
- new MethodInvoker(() =>
- {
- FilterListView();
- }));
- }
- private void textBox1_TextChanged(object sender, EventArgs e)
- {
- _assistant.TextChanged();
- }
-
- private void button1_Click(object sender, EventArgs e)
- {
- ListView.SelectedIndexCollection col = listView1.SelectedIndices;
- SfPath = listView1.Items[col[0]].Text;
-
- IsClosed = true;
- Close();
- }
-
- private void listView1_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (true)
- {
- button1.Enabled = true;
- button2.Enabled = true;
- }
- }
-
- private void Button2_Click(object sender, EventArgs e)
- {
- ListView.SelectedIndexCollection col = listView1.SelectedIndices;
- myItems = new string[col.Count];
- for (int i = 0; i < col.Count; i++) //ADD SELECTED ITEM TO ARRAY
- {
- myItems[i] = listView1.Items[col[i]].Text.Substring(listView1.Items[col[i]].Text.LastIndexOf("/") + 1);
- }
-
- FilesToSearch = true;
- Close();
- }
-
- private void ListView1_MouseDown(object sender, MouseEventArgs e)
- {
- if (listView1.Items.Count != 0 && listView1.SelectedItems != null && e.Button == MouseButtons.Right)
- {
- contextMenuStrip1.Show(Cursor.Position);
- }
- }
-
- private void CopySelectedFile(bool isName = false, bool withExtension = true)
- {
- if (listView1.SelectedItems != null)
- {
- ListView.SelectedIndexCollection col = listView1.SelectedIndices;
- string path = listView1.Items[col[0]].Text;
-
- // if file uasset/uexp/ubulk
- path = !path.Contains(".") ? (path.Replace("\\", "/") + ".uasset") : path.Replace("\\", "/");
- if (isName)
- path = Path.GetFileName(path);
-
- if (!withExtension)
- path = isName ? Path.GetFileNameWithoutExtension(path) : Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path));
-
- Clipboard.SetText(path);
- new UpdateMyConsole(path, Color.CornflowerBlue).AppendToConsole();
- new UpdateMyConsole(" Copied!", Color.Black, true).AppendToConsole();
- }
- }
-
- private void CopyFilePathToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile();
- }
-
- private void CopyFileNameToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile(true);
- }
-
- private void CopyFilePathWithoutExtensionToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile(false, false);
- }
-
- private void CopyFileNameWithoutExtensionToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile(true, false);
- }
- }
-
- class FileInfo
- {
- public string FileName
- {
- get;
- set;
- }
- public string PakFile
- {
- get;
- set;
- }
- }
- class FileInfoFilter
- {
- public string FileName
- {
- get;
- set;
- }
- public string PakFile
- {
- get;
- set;
- }
- }
-}
diff --git a/FModel/Forms/SearchFiles.resx b/FModel/Forms/SearchFiles.resx
deleted file mode 100644
index ef8c177d..00000000
--- a/FModel/Forms/SearchFiles.resx
+++ /dev/null
@@ -1,1356 +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
-
-
- 17, 17
-
-
-
-
- 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
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Forms/Settings.Designer.cs b/FModel/Forms/Settings.Designer.cs
deleted file mode 100644
index 79c15454..00000000
--- a/FModel/Forms/Settings.Designer.cs
+++ /dev/null
@@ -1,532 +0,0 @@
-namespace FModel.Forms
-{
- partial class Settings
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Settings));
- this.groupBox3 = new System.Windows.Forms.GroupBox();
- this.textBox2 = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.groupBox2 = new System.Windows.Forms.GroupBox();
- this.checkBox1 = new System.Windows.Forms.CheckBox();
- this.textBox1 = new System.Windows.Forms.TextBox();
- this.label1 = new System.Windows.Forms.Label();
- this.OKButton = new System.Windows.Forms.Button();
- this.groupBox4 = new System.Windows.Forms.GroupBox();
- this.comboBox2 = new System.Windows.Forms.ComboBox();
- this.label2 = new System.Windows.Forms.Label();
- this.comboBox1 = new System.Windows.Forms.ComboBox();
- this.label10 = new System.Windows.Forms.Label();
- this.checkBox8 = new System.Windows.Forms.CheckBox();
- this.checkBox7 = new System.Windows.Forms.CheckBox();
- this.filenameLabel = new System.Windows.Forms.Label();
- this.trackBar1 = new System.Windows.Forms.TrackBar();
- this.label9 = new System.Windows.Forms.Label();
- this.trackBar2 = new System.Windows.Forms.TrackBar();
- this.label8 = new System.Windows.Forms.Label();
- this.button1 = new System.Windows.Forms.Button();
- this.wPictureBox = new System.Windows.Forms.PictureBox();
- this.groupBox6 = new System.Windows.Forms.GroupBox();
- this.button5 = new System.Windows.Forms.Button();
- this.button3 = new System.Windows.Forms.Button();
- this.button2 = new System.Windows.Forms.Button();
- this.label7 = new System.Windows.Forms.Label();
- this.button4 = new System.Windows.Forms.Button();
- this.checkBox2 = new System.Windows.Forms.CheckBox();
- this.label6 = new System.Windows.Forms.Label();
- this.trackBar3 = new System.Windows.Forms.TrackBar();
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.textBox6 = new System.Windows.Forms.TextBox();
- this.label12 = new System.Windows.Forms.Label();
- this.groupBox3.SuspendLayout();
- this.groupBox2.SuspendLayout();
- this.groupBox4.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.wPictureBox)).BeginInit();
- this.groupBox6.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.SuspendLayout();
- //
- // groupBox3
- //
- this.groupBox3.Anchor = System.Windows.Forms.AnchorStyles.Top;
- this.groupBox3.Controls.Add(this.textBox2);
- this.groupBox3.Controls.Add(this.label3);
- this.groupBox3.Location = new System.Drawing.Point(12, 12);
- this.groupBox3.Name = "groupBox3";
- this.groupBox3.Size = new System.Drawing.Size(560, 49);
- this.groupBox3.TabIndex = 13;
- this.groupBox3.TabStop = false;
- this.groupBox3.Text = ".PAK files";
- //
- // textBox2
- //
- this.textBox2.Location = new System.Drawing.Point(46, 19);
- this.textBox2.Name = "textBox2";
- this.textBox2.Size = new System.Drawing.Size(508, 20);
- this.textBox2.TabIndex = 2;
- //
- // label3
- //
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(6, 22);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(34, 13);
- this.label3.TabIndex = 3;
- this.label3.Text = "Input:";
- //
- // groupBox2
- //
- this.groupBox2.Anchor = System.Windows.Forms.AnchorStyles.Top;
- this.groupBox2.Controls.Add(this.checkBox1);
- this.groupBox2.Controls.Add(this.textBox1);
- this.groupBox2.Controls.Add(this.label1);
- this.groupBox2.Location = new System.Drawing.Point(12, 67);
- this.groupBox2.Name = "groupBox2";
- this.groupBox2.Size = new System.Drawing.Size(560, 49);
- this.groupBox2.TabIndex = 14;
- this.groupBox2.TabStop = false;
- this.groupBox2.Text = "Extraction";
- //
- // checkBox1
- //
- this.checkBox1.AutoSize = true;
- this.checkBox1.Location = new System.Drawing.Point(443, 21);
- this.checkBox1.Name = "checkBox1";
- this.checkBox1.Size = new System.Drawing.Size(116, 17);
- this.checkBox1.TabIndex = 4;
- this.checkBox1.Text = "Auto Open Sounds";
- this.checkBox1.UseVisualStyleBackColor = true;
- //
- // textBox1
- //
- this.textBox1.Location = new System.Drawing.Point(54, 19);
- this.textBox1.Name = "textBox1";
- this.textBox1.Size = new System.Drawing.Size(383, 20);
- this.textBox1.TabIndex = 2;
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(6, 22);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(42, 13);
- this.label1.TabIndex = 3;
- this.label1.Text = "Output:";
- //
- // OKButton
- //
- this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.OKButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.OKButton.Location = new System.Drawing.Point(475, 486);
- this.OKButton.Name = "OKButton";
- this.OKButton.Size = new System.Drawing.Size(97, 21);
- this.OKButton.TabIndex = 15;
- this.OKButton.Text = "OK";
- this.OKButton.UseVisualStyleBackColor = true;
- this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
- //
- // groupBox4
- //
- this.groupBox4.Controls.Add(this.comboBox2);
- this.groupBox4.Controls.Add(this.label2);
- this.groupBox4.Controls.Add(this.comboBox1);
- this.groupBox4.Controls.Add(this.label10);
- this.groupBox4.Controls.Add(this.checkBox8);
- this.groupBox4.Controls.Add(this.checkBox7);
- this.groupBox4.Controls.Add(this.filenameLabel);
- this.groupBox4.Controls.Add(this.trackBar1);
- this.groupBox4.Controls.Add(this.label9);
- this.groupBox4.Controls.Add(this.trackBar2);
- this.groupBox4.Controls.Add(this.label8);
- this.groupBox4.Controls.Add(this.button1);
- this.groupBox4.Controls.Add(this.wPictureBox);
- this.groupBox4.Location = new System.Drawing.Point(12, 122);
- this.groupBox4.Name = "groupBox4";
- this.groupBox4.Size = new System.Drawing.Size(560, 190);
- this.groupBox4.TabIndex = 16;
- this.groupBox4.TabStop = false;
- this.groupBox4.Text = "Icon Creation";
- //
- // comboBox2
- //
- this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.comboBox2.FormattingEnabled = true;
- this.comboBox2.Items.AddRange(new object[] {
- "Default",
- "Flat",
- "Minimalist"});
- this.comboBox2.Location = new System.Drawing.Point(85, 48);
- this.comboBox2.Name = "comboBox2";
- this.comboBox2.Size = new System.Drawing.Size(294, 21);
- this.comboBox2.TabIndex = 31;
- this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.ComboBox2_SelectedIndexChanged);
- //
- // label2
- //
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(6, 51);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(73, 13);
- this.label2.TabIndex = 30;
- this.label2.Text = "Rarity Design:";
- //
- // comboBox1
- //
- this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.comboBox1.FormattingEnabled = true;
- this.comboBox1.Items.AddRange(new object[] {
- "English",
- "French",
- "German",
- "Italian",
- "Spanish",
- "Spanish (LA)",
- "Arabic",
- "Japanese",
- "Korean",
- "Polish",
- "Portuguese (Brazil)",
- "Russian",
- "Turkish",
- "Chinese (S)",
- "Traditional Chinese"});
- this.comboBox1.Location = new System.Drawing.Point(70, 19);
- this.comboBox1.Name = "comboBox1";
- this.comboBox1.Size = new System.Drawing.Size(309, 21);
- this.comboBox1.TabIndex = 29;
- //
- // label10
- //
- this.label10.AutoSize = true;
- this.label10.Location = new System.Drawing.Point(6, 22);
- this.label10.Name = "label10";
- this.label10.Size = new System.Drawing.Size(58, 13);
- this.label10.TabIndex = 28;
- this.label10.Text = "Language:";
- //
- // checkBox8
- //
- this.checkBox8.AutoSize = true;
- this.checkBox8.Location = new System.Drawing.Point(206, 167);
- this.checkBox8.Name = "checkBox8";
- this.checkBox8.Size = new System.Drawing.Size(177, 17);
- this.checkBox8.TabIndex = 26;
- this.checkBox8.Text = "Use Featured Image If Available";
- this.checkBox8.UseVisualStyleBackColor = true;
- this.checkBox8.CheckedChanged += new System.EventHandler(this.checkBox8_CheckedChanged);
- //
- // checkBox7
- //
- this.checkBox7.AutoSize = true;
- this.checkBox7.Location = new System.Drawing.Point(6, 87);
- this.checkBox7.Name = "checkBox7";
- this.checkBox7.Size = new System.Drawing.Size(15, 14);
- this.checkBox7.TabIndex = 25;
- this.checkBox7.UseVisualStyleBackColor = true;
- this.checkBox7.CheckedChanged += new System.EventHandler(this.checkBox7_CheckedChanged);
- //
- // filenameLabel
- //
- this.filenameLabel.AutoEllipsis = true;
- this.filenameLabel.AutoSize = true;
- this.filenameLabel.Location = new System.Drawing.Point(115, 88);
- this.filenameLabel.MaximumSize = new System.Drawing.Size(260, 13);
- this.filenameLabel.Name = "filenameLabel";
- this.filenameLabel.Size = new System.Drawing.Size(60, 13);
- this.filenameLabel.TabIndex = 24;
- this.filenameLabel.Text = "File Name: ";
- //
- // trackBar1
- //
- this.trackBar1.Location = new System.Drawing.Point(58, 141);
- this.trackBar1.Maximum = 100;
- this.trackBar1.Name = "trackBar1";
- this.trackBar1.Size = new System.Drawing.Size(325, 45);
- this.trackBar1.TabIndex = 20;
- this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.None;
- this.trackBar1.ValueChanged += new System.EventHandler(this.trackBar1_ValueChanged);
- //
- // label9
- //
- this.label9.AutoSize = true;
- this.label9.Location = new System.Drawing.Point(22, 112);
- this.label9.Name = "label9";
- this.label9.Size = new System.Drawing.Size(30, 13);
- this.label9.TabIndex = 23;
- this.label9.Text = "Size:";
- //
- // trackBar2
- //
- this.trackBar2.Location = new System.Drawing.Point(58, 112);
- this.trackBar2.Maximum = 1000;
- this.trackBar2.Minimum = 1;
- this.trackBar2.Name = "trackBar2";
- this.trackBar2.Size = new System.Drawing.Size(325, 45);
- this.trackBar2.TabIndex = 22;
- this.trackBar2.TickFrequency = 25;
- this.trackBar2.TickStyle = System.Windows.Forms.TickStyle.None;
- this.trackBar2.Value = 1;
- this.trackBar2.ValueChanged += new System.EventHandler(this.trackBar2_ValueChanged);
- //
- // label8
- //
- this.label8.AutoSize = true;
- this.label8.Location = new System.Drawing.Point(6, 144);
- this.label8.Name = "label8";
- this.label8.Size = new System.Drawing.Size(46, 13);
- this.label8.TabIndex = 21;
- this.label8.Text = "Opacity:";
- //
- // button1
- //
- this.button1.Location = new System.Drawing.Point(27, 81);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(82, 24);
- this.button1.TabIndex = 19;
- this.button1.Text = "Watermark";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // wPictureBox
- //
- this.wPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.wPictureBox.Image = global::FModel.Properties.Resources.Template_D_N;
- this.wPictureBox.Location = new System.Drawing.Point(389, 19);
- this.wPictureBox.Name = "wPictureBox";
- this.wPictureBox.Size = new System.Drawing.Size(165, 165);
- this.wPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.wPictureBox.TabIndex = 18;
- this.wPictureBox.TabStop = false;
- //
- // groupBox6
- //
- this.groupBox6.Controls.Add(this.button5);
- this.groupBox6.Controls.Add(this.button3);
- this.groupBox6.Controls.Add(this.button2);
- this.groupBox6.Controls.Add(this.label7);
- this.groupBox6.Controls.Add(this.button4);
- this.groupBox6.Controls.Add(this.checkBox2);
- this.groupBox6.Controls.Add(this.label6);
- this.groupBox6.Controls.Add(this.trackBar3);
- this.groupBox6.Controls.Add(this.pictureBox1);
- this.groupBox6.Controls.Add(this.textBox6);
- this.groupBox6.Controls.Add(this.label12);
- this.groupBox6.Location = new System.Drawing.Point(12, 318);
- this.groupBox6.Name = "groupBox6";
- this.groupBox6.Size = new System.Drawing.Size(560, 158);
- this.groupBox6.TabIndex = 19;
- this.groupBox6.TabStop = false;
- this.groupBox6.Text = "Challenges Theme";
- //
- // button5
- //
- this.button5.Location = new System.Drawing.Point(168, 48);
- this.button5.Name = "button5";
- this.button5.Size = new System.Drawing.Size(124, 23);
- this.button5.TabIndex = 34;
- this.button5.Text = "Delete Current Banner";
- this.button5.UseVisualStyleBackColor = true;
- this.button5.Click += new System.EventHandler(this.Button5_Click);
- //
- // button3
- //
- this.button3.Location = new System.Drawing.Point(102, 129);
- this.button3.Name = "button3";
- this.button3.Size = new System.Drawing.Size(94, 23);
- this.button3.TabIndex = 26;
- this.button3.Text = "Choose Banner";
- this.button3.UseVisualStyleBackColor = true;
- this.button3.Click += new System.EventHandler(this.Button3_Click);
- //
- // button2
- //
- this.button2.Location = new System.Drawing.Point(199, 129);
- this.button2.Name = "button2";
- this.button2.Size = new System.Drawing.Size(93, 23);
- this.button2.TabIndex = 11;
- this.button2.Text = "Open Image";
- this.button2.UseVisualStyleBackColor = true;
- this.button2.Click += new System.EventHandler(this.Button2_Click);
- //
- // label7
- //
- this.label7.AutoSize = true;
- this.label7.ForeColor = System.Drawing.Color.Red;
- this.label7.Location = new System.Drawing.Point(106, 113);
- this.label7.Name = "label7";
- this.label7.Size = new System.Drawing.Size(86, 13);
- this.label7.TabIndex = 33;
- this.label7.Text = "4:1 Aspect Ratio";
- //
- // button4
- //
- this.button4.Location = new System.Drawing.Point(6, 129);
- this.button4.Name = "button4";
- this.button4.Size = new System.Drawing.Size(93, 23);
- this.button4.TabIndex = 31;
- this.button4.Text = "Pick Color";
- this.button4.UseVisualStyleBackColor = true;
- this.button4.Click += new System.EventHandler(this.Button4_Click);
- //
- // checkBox2
- //
- this.checkBox2.AutoSize = true;
- this.checkBox2.Location = new System.Drawing.Point(6, 52);
- this.checkBox2.Name = "checkBox2";
- this.checkBox2.Size = new System.Drawing.Size(97, 17);
- this.checkBox2.TabIndex = 30;
- this.checkBox2.Text = "Custom Theme";
- this.checkBox2.UseVisualStyleBackColor = true;
- this.checkBox2.CheckedChanged += new System.EventHandler(this.CheckBox2_CheckedChanged);
- //
- // label6
- //
- this.label6.AutoSize = true;
- this.label6.Location = new System.Drawing.Point(6, 82);
- this.label6.Name = "label6";
- this.label6.Size = new System.Drawing.Size(46, 13);
- this.label6.TabIndex = 28;
- this.label6.Text = "Opacity:";
- //
- // trackBar3
- //
- this.trackBar3.Location = new System.Drawing.Point(58, 82);
- this.trackBar3.Maximum = 1000;
- this.trackBar3.Minimum = 1;
- this.trackBar3.Name = "trackBar3";
- this.trackBar3.Size = new System.Drawing.Size(234, 45);
- this.trackBar3.TabIndex = 27;
- this.trackBar3.TickFrequency = 25;
- this.trackBar3.TickStyle = System.Windows.Forms.TickStyle.None;
- this.trackBar3.Value = 1;
- this.trackBar3.ValueChanged += new System.EventHandler(this.TrackBar3_ValueChanged);
- //
- // pictureBox1
- //
- this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.pictureBox1.Image = global::FModel.Properties.Resources.cTemplate;
- this.pictureBox1.Location = new System.Drawing.Point(298, 45);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(256, 107);
- this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.pictureBox1.TabIndex = 10;
- this.pictureBox1.TabStop = false;
- //
- // textBox6
- //
- this.textBox6.Location = new System.Drawing.Point(74, 19);
- this.textBox6.Name = "textBox6";
- this.textBox6.Size = new System.Drawing.Size(480, 20);
- this.textBox6.TabIndex = 8;
- this.textBox6.TextChanged += new System.EventHandler(this.TextBox6_TextChanged);
- //
- // label12
- //
- this.label12.AutoSize = true;
- this.label12.Location = new System.Drawing.Point(6, 22);
- this.label12.Name = "label12";
- this.label12.Size = new System.Drawing.Size(62, 13);
- this.label12.TabIndex = 9;
- this.label12.Text = "Watermark:";
- //
- // Settings
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(584, 519);
- this.Controls.Add(this.groupBox6);
- this.Controls.Add(this.groupBox4);
- this.Controls.Add(this.OKButton);
- this.Controls.Add(this.groupBox2);
- this.Controls.Add(this.groupBox3);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "Settings";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "FModel Settings";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Settings_FormClosing);
- this.groupBox3.ResumeLayout(false);
- this.groupBox3.PerformLayout();
- this.groupBox2.ResumeLayout(false);
- this.groupBox2.PerformLayout();
- this.groupBox4.ResumeLayout(false);
- this.groupBox4.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.wPictureBox)).EndInit();
- this.groupBox6.ResumeLayout(false);
- this.groupBox6.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.GroupBox groupBox3;
- private System.Windows.Forms.TextBox textBox2;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.GroupBox groupBox2;
- private System.Windows.Forms.TextBox textBox1;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Button OKButton;
- private System.Windows.Forms.GroupBox groupBox4;
- private System.Windows.Forms.CheckBox checkBox8;
- private System.Windows.Forms.CheckBox checkBox7;
- private System.Windows.Forms.Label filenameLabel;
- private System.Windows.Forms.TrackBar trackBar1;
- private System.Windows.Forms.Label label9;
- private System.Windows.Forms.TrackBar trackBar2;
- private System.Windows.Forms.Label label8;
- private System.Windows.Forms.Button button1;
- private System.Windows.Forms.PictureBox wPictureBox;
- private System.Windows.Forms.ComboBox comboBox1;
- private System.Windows.Forms.Label label10;
- private System.Windows.Forms.GroupBox groupBox6;
- private System.Windows.Forms.TextBox textBox6;
- private System.Windows.Forms.Label label12;
- private System.Windows.Forms.PictureBox pictureBox1;
- private System.Windows.Forms.Button button2;
- private System.Windows.Forms.CheckBox checkBox2;
- private System.Windows.Forms.Label label6;
- private System.Windows.Forms.TrackBar trackBar3;
- private System.Windows.Forms.Button button3;
- private System.Windows.Forms.Button button4;
- private System.Windows.Forms.Label label7;
- private System.Windows.Forms.ComboBox comboBox2;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Button button5;
- private System.Windows.Forms.CheckBox checkBox1;
- }
-}
diff --git a/FModel/Forms/Settings.cs b/FModel/Forms/Settings.cs
deleted file mode 100644
index 06ebf3b3..00000000
--- a/FModel/Forms/Settings.cs
+++ /dev/null
@@ -1,484 +0,0 @@
-using System;
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.Drawing.Text;
-using System.IO;
-using System.Windows.Forms;
-using Cyotek.Windows.Forms;
-using FModel.Properties;
-
-namespace FModel.Forms
-{
- //refactor asap
- public partial class Settings : Form
- {
- private static string _paKsPathBefore;
- private static string _outputPathBefore;
- private static string _oldLanguage;
- private static Color headerColor;
- private static Bitmap bmp;
- private static Graphics g;
-
- public Settings()
- {
- InitializeComponent();
-
- // Check if watermark exists
- Utilities.CheckWatermark();
-
- textBox2.Text = Properties.Settings.Default.PAKsPath;
- textBox1.Text = Properties.Settings.Default.ExtractOutput;
-
- textBox6.Text = Properties.Settings.Default.challengesWatermark;
- if (string.IsNullOrWhiteSpace(textBox6.Text))
- {
- textBox6.Text = "@UseTheWatermarkBecauseWhyNot - {Date}";
- }
-
- // Check if watermark exists
- Utilities.CheckWatermark();
-
- comboBox2.SelectedIndex = comboBox2.FindStringExact(Properties.Settings.Default.rarityDesign);
-
- //WATERMARK
- button1.Enabled = Properties.Settings.Default.isWatermark;
- checkBox7.Checked = Properties.Settings.Default.isWatermark;
- trackBar1.Enabled = Properties.Settings.Default.isWatermark;
- trackBar2.Enabled = Properties.Settings.Default.isWatermark;
- trackBar1.Value = Properties.Settings.Default.wOpacity;
- trackBar2.Value = Properties.Settings.Default.wSize;
-
- //CHALLENGES
- button3.Enabled = Properties.Settings.Default.isChallengesTheme;
- button4.Enabled = Properties.Settings.Default.isChallengesTheme;
- checkBox2.Checked = Properties.Settings.Default.isChallengesTheme;
- trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
- button5.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
- trackBar3.Value = Properties.Settings.Default.challengesOpacity;
- string[] colorParts = Properties.Settings.Default.challengesColors.Split(',');
- headerColor = Color.FromArgb(255, Int32.Parse(colorParts[0]), Int32.Parse(colorParts[1]), Int32.Parse(colorParts[2]));
- if (!checkBox2.Checked)
- {
- pictureBox1.Image = Resources.cTemplate;
- }
- else { drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); }
-
- //FEATURED
- checkBox8.Checked = Properties.Settings.Default.loadFeaturedImage;
- if (File.Exists(Properties.Settings.Default.wFilename))
- {
- filenameLabel.Text = @"File Name: " + Path.GetFileName(Properties.Settings.Default.wFilename);
-
- Bitmap bmp = null;
- if (Properties.Settings.Default.loadFeaturedImage)
- {
- bmp = new Bitmap(string.Equals(Properties.Settings.Default.rarityDesign, "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(Properties.Settings.Default.rarityDesign, "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(Properties.Settings.Default.rarityDesign, "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(Properties.Settings.Default.rarityDesign, "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)Properties.Settings.Default.wOpacity / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize), (522 - Properties.Settings.Default.wSize) / 2, (522 - Properties.Settings.Default.wSize) / 2, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize);
-
- wPictureBox.Image = bmp;
- }
-
- checkBox1.Checked = Properties.Settings.Default.openSound;
-
- _oldLanguage = Properties.Settings.Default.IconLanguage;
- comboBox1.SelectedIndex = comboBox1.FindStringExact(Properties.Settings.Default.IconLanguage);
-
- _paKsPathBefore = Properties.Settings.Default.PAKsPath;
- _outputPathBefore = Properties.Settings.Default.ExtractOutput;
- }
-
- private void OKButton_Click(object sender, EventArgs e)
- {
- //INPUT
- Properties.Settings.Default.PAKsPath = textBox2.Text; //SET
- string paKsPathAfter = Properties.Settings.Default.PAKsPath;
- if (_paKsPathBefore != paKsPathAfter)
- {
- MessageBox.Show(@"Please, restart FModel to apply your new input path", @"Fortnite .PAK Path Changed", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
-
- //OUTPUT
- Properties.Settings.Default.ExtractOutput = textBox1.Text; //SET
- if (!Directory.Exists(Properties.Settings.Default.ExtractOutput))
- Directory.CreateDirectory(Properties.Settings.Default.ExtractOutput);
- string outputPathAfter = Properties.Settings.Default.ExtractOutput;
- if (_outputPathBefore != outputPathAfter)
- {
- MessageBox.Show(@"Please, restart FModel to apply your new output path", @"FModel Output Path Changed", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
-
- //CHALLENGES
- Properties.Settings.Default.challengesWatermark = textBox6.Text;
- Properties.Settings.Default.isChallengesTheme = checkBox2.Checked;
- Properties.Settings.Default.challengesOpacity = trackBar3.Value;
- Properties.Settings.Default.challengesColors = headerColor.R + "," + headerColor.G + "," + headerColor.B;
-
- Properties.Settings.Default.rarityDesign = comboBox2.SelectedItem.ToString();
-
- //WATERMARK
- Properties.Settings.Default.isWatermark = checkBox7.Checked;
- Properties.Settings.Default.wSize = trackBar2.Value;
- Properties.Settings.Default.wOpacity = trackBar1.Value;
-
- //FEATURED
- Properties.Settings.Default.loadFeaturedImage = checkBox8.Checked;
-
- //LOCRES
- Properties.Settings.Default.IconLanguage = comboBox1.SelectedItem.ToString();
- if (comboBox1.SelectedItem.ToString() != _oldLanguage)
- {
- LoadLocRes.LoadMySelectedLocRes(Properties.Settings.Default.IconLanguage);
- }
-
- Properties.Settings.Default.openSound = checkBox1.Checked;
-
- Properties.Settings.Default.Save(); //SAVE
- bmp.Dispose();
- Close();
- }
-
- #region SELECT WATERMARK
- private void button1_Click(object sender, EventArgs e)
- {
- OpenFileDialog theDialog = new OpenFileDialog();
- theDialog.Title = @"Choose your watermark";
- theDialog.Multiselect = false;
- theDialog.Filter = @"PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|DDS Files (*.dds)|*.dds|All Files (*.*)|*.*";
-
- if (theDialog.ShowDialog() == DialogResult.OK)
- {
- Properties.Settings.Default.wFilename = theDialog.FileName;
- Properties.Settings.Default.Save();
- filenameLabel.Text = @"File Name: " + Path.GetFileName(Properties.Settings.Default.wFilename);
-
- if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename))
- {
- Bitmap bmp = null;
- if (Properties.Settings.Default.loadFeaturedImage)
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
-
- wPictureBox.Image = bmp;
- }
- }
- }
- #endregion
-
- #region RESIZE WATERMARK
- private void trackBar2_ValueChanged(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename))
- {
- Bitmap bmp = null;
- if (checkBox8.Checked)
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
-
- wPictureBox.Image = bmp;
- wPictureBox.Refresh();
- }
- }
- private void trackBar1_ValueChanged(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename))
- {
- Bitmap bmp = null;
- if (checkBox8.Checked)
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
-
- wPictureBox.Image = bmp;
- wPictureBox.Refresh();
- }
- }
- #endregion
-
- private void checkBox7_CheckedChanged(object sender, EventArgs e)
- {
- button1.Enabled = checkBox7.Checked;
- trackBar1.Enabled = checkBox7.Checked;
- trackBar2.Enabled = checkBox7.Checked;
- }
-
- private void checkBox8_CheckedChanged(object sender, EventArgs e)
- {
- if (!checkBox8.Checked)
- {
- Bitmap bmp = string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N);
- Graphics g = Graphics.FromImage(bmp);
- if (File.Exists(Properties.Settings.Default.wFilename))
- {
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
- }
- wPictureBox.Image = bmp;
- }
- if (checkBox8.Checked)
- {
- Bitmap bmp = string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F);
- Graphics g = Graphics.FromImage(bmp);
- if (File.Exists(Properties.Settings.Default.wFilename))
- {
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
- }
- wPictureBox.Image = bmp;
- }
- }
-
- private void ComboBox2_SelectedIndexChanged(object sender, EventArgs e)
- {
- Bitmap bmp = null;
- switch (comboBox2.SelectedItem.ToString())
- {
- case "Default":
- bmp = checkBox8.Checked ? new Bitmap(Resources.Template_D_F) : new Bitmap(Resources.Template_D_N);
- break;
- case "Flat":
- bmp = checkBox8.Checked ? new Bitmap(Resources.Template_F_F) : new Bitmap(Resources.Template_F_N);
- break;
- case "Minimalist":
- bmp = checkBox8.Checked ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_M_N);
- break;
- }
-
- Graphics g = Graphics.FromImage(bmp);
- if (File.Exists(Properties.Settings.Default.wFilename))
- {
- Image watermark = Image.FromFile(Properties.Settings.Default.wFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
- }
- wPictureBox.Image = bmp;
- }
-
- private void Button2_Click(object sender, EventArgs e)
- {
- if (pictureBox1.Image != null)
- {
- var newForm = new Form();
-
- PictureBox pb = new PictureBox();
- pb.Dock = DockStyle.Fill;
- pb.Image = pictureBox1.Image;
- pb.SizeMode = PictureBoxSizeMode.Zoom;
-
- newForm.Size = pictureBox1.Image.Size;
- newForm.Icon = Resources.FModel;
- newForm.Text = "Challenges Design Template";
- newForm.StartPosition = FormStartPosition.CenterScreen;
- newForm.Controls.Add(pb);
- newForm.Show();
- }
- }
-
- private void CheckBox2_CheckedChanged(object sender, EventArgs e)
- {
- button3.Enabled = checkBox2.Checked;
- button4.Enabled = checkBox2.Checked;
- trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
-
- if (!checkBox2.Checked)
- {
- pictureBox1.Image = Resources.cTemplate;
- }
- else { drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); }
- }
-
- private void Button4_Click(object sender, EventArgs e)
- {
- ColorPickerDialog MyDialog = new ColorPickerDialog();
-
- if (MyDialog.ShowDialog() == DialogResult.OK)
- {
- headerColor = MyDialog.Color;
- drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName));
- }
- MyDialog.Dispose();
- }
-
- private void drawChallengeTemplate(Color headerColor, bool isBanner = false)
- {
- bmp = new Bitmap(1024, 410);
- g = Graphics.FromImage(bmp);
- g.TextRenderingHint = TextRenderingHint.AntiAlias;
- g.SmoothingMode = SmoothingMode.HighQuality;
-
- #region header
- if (isBanner)
- {
- if (File.Exists(Properties.Settings.Default.challengesBannerFileName))
- {
- g.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, bmp.Width, 256));
-
- Image banner = Image.FromFile(Properties.Settings.Default.challengesBannerFileName);
- var opacityImage = ImageUtilities.SetImageOpacity(banner, (float)trackBar3.Value / 1000);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, 1024, 256), 0, 0);
- }
- }
- else
- {
- g.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, bmp.Width, 256));
- }
-
- GraphicsPath gp = new GraphicsPath();
- gp.StartFigure();
- gp.AddLine(0, 256, bmp.Width, 256);
- gp.AddLine(bmp.Width, 256, bmp.Width, 241);
- gp.AddLine(bmp.Width, 241, bmp.Width / 2 + 25, 236);
- gp.AddLine(bmp.Width / 2 + 25, 236, bmp.Width / 2 + 35, 249);
- gp.AddLine(bmp.Width / 2 + 35, 249, 0, 241);
- gp.CloseFigure();
- g.FillPath(new SolidBrush(ControlPaint.Light(headerColor)), gp);
-
- GraphicsPath p = new GraphicsPath();
- Pen myPen = new Pen(ControlPaint.Light(headerColor, (float)0.2), 3);
- myPen.LineJoin = LineJoin.Round; //needed to avoid spikes
- p.AddString(
- "{LAST FOLDER HERE}",
- Properties.Settings.Default.IconLanguage == "Japanese" ? FontUtilities.pfc.Families[2] : FontUtilities.pfc.Families[1],
- (int)FontStyle.Regular, 30,
- new Point(30, 70),
- FontUtilities.leftString
- );
- g.DrawPath(myPen, p);
- g.FillPath(new SolidBrush(ControlPaint.Dark(headerColor, (float)0.05)), p);
-
- g.DrawString("{BUNDLE DISPLAY NAME HERE}", new Font(Properties.Settings.Default.IconLanguage == "Japanese" ? FontUtilities.pfc.Families[2] : FontUtilities.pfc.Families[1], 40), new SolidBrush(Color.White), new Point(25, 105));
-
- g.FillRectangle(new SolidBrush(ControlPaint.Dark(headerColor, (float)0.1)), new Rectangle(0, 256, bmp.Width, bmp.Height));
- #endregion
-
- #region quest background
- int theY = 290;
- g.FillRectangle(new SolidBrush(Color.FromArgb(50, headerColor.R, headerColor.G, headerColor.B)), new Rectangle(25, theY, bmp.Width - 50, 70));
-
- gp = new GraphicsPath();
- gp.StartFigure();
- gp.AddLine(32, theY + 5, 29, theY + 67);
- gp.AddLine(29, theY + 67, bmp.Width - 160, theY + 62);
- gp.AddLine(bmp.Width - 160, theY + 62, bmp.Width - 150, theY + 4);
- gp.CloseFigure();
- g.FillPath(new SolidBrush(Color.FromArgb(50, headerColor.R, headerColor.G, headerColor.B)), gp);
-
- g.FillRectangle(new SolidBrush(headerColor), new Rectangle(60, theY + 47, 500, 7));
-
- gp = new GraphicsPath();
- gp.StartFigure();
- gp.AddLine(39, theY + 35, 45, theY + 32);
- gp.AddLine(45, theY + 32, 48, theY + 37);
- gp.AddLine(48, theY + 37, 42, theY + 40);
- gp.CloseFigure();
- g.FillPath(new SolidBrush(headerColor), gp);
- #endregion
-
- #region watermark
- string text = textBox6.Text;
- if (string.IsNullOrWhiteSpace(text))
- {
- text = "{Bundle_Name} Generated using FModel & JohnWickParse - {Date}";
- }
-
- if (text.Contains("{Bundle_Name}"))
- {
- text = text.Replace("{Bundle_Name}", "{BUNDLE DISPLAY NAME HERE}");
- }
- if (text.Contains("{Date}"))
- {
- text = text.Replace("{Date}", DateTime.Now.ToString("dd/MM/yyyy"));
- }
-
- g.DrawString(text, new Font(FontUtilities.pfc.Families[0], 15), new SolidBrush(Color.FromArgb(150, 255, 255, 255)), new Point(bmp.Width - 10, 210), FontUtilities.rightString);
- #endregion
-
- pictureBox1.Image = bmp;
- }
-
- private void Button3_Click(object sender, EventArgs e)
- {
- OpenFileDialog theDialog = new OpenFileDialog();
- theDialog.Title = @"Choose your banner";
- theDialog.Multiselect = false;
- theDialog.Filter = @"PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|DDS Files (*.dds)|*.dds|All Files (*.*)|*.*";
-
- if (theDialog.ShowDialog() == DialogResult.OK)
- {
- Properties.Settings.Default.challengesBannerFileName = theDialog.FileName;
- Properties.Settings.Default.Save();
-
- drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName));
-
- trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
- button5.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
- }
- }
-
- private void TrackBar3_ValueChanged(object sender, EventArgs e)
- {
- drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName));
- pictureBox1.Refresh();
- }
-
- private void TextBox6_TextChanged(object sender, EventArgs e)
- {
- drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName));
- }
-
- private void Settings_FormClosing(object sender, FormClosingEventArgs e)
- {
- bmp.Dispose();
- }
-
- private void Button5_Click(object sender, EventArgs e)
- {
- Properties.Settings.Default.challengesBannerFileName = "";
- Properties.Settings.Default.Save();
-
- drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName));
-
- trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
- button5.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName);
- }
- }
-}
diff --git a/FModel/Forms/Settings.resx b/FModel/Forms/Settings.resx
deleted file mode 100644
index a12630e6..00000000
--- a/FModel/Forms/Settings.resx
+++ /dev/null
@@ -1,1353 +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
-
-
-
-
- AAABAAEAAAAAAAEAIAB/HwEAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAgABJ
- REFUeNrsvXe8bVdVNvyMudbae592W2466YEk1NCrNKUrYIMPQRFQRBHEhkpRATtgAQuivgiiIvoKClIV
- pCihl0ASIISQnptbT91lrTm+P0aZY+2bIASSmLw5/EJuzj1n77XXmnPMUZ5S4Wb29eBf+D0c/dFLcOaz
- nwdc2aFZBW77wEfhnj//PBx5+j1w6cfej7Mf+tR77N596qOOO/MuF+3cdtLkLs/4cRx927vhtj/4ZNBX
- Jzh44CLc/2d+a/HIo08/6q7PfPImrqj5Tj/5s8Pt2PXw3Ueeev+T7nr3Lx5x1O3abfVRuPOzfhoXf/i9
- N7fbdOvXrV/f0Fd1s9r8z3kJlo7ZhfWFJTz7Db9Ln3zPObcf7d79gHpxsPeyt3148x7/8Pup/fjVD5zu
- 2fPydmv81G7cHT3YsfSFK951zsHtdzoVH/+9X8Hx93vE6UfsPO0pm1+95Iem+1Z/6tAXLju6OXLXdOML
- 5z19dvDAi7rx7LGzja5bOHbbpwlpdvmb34a7v+hXcfEH333rarn16xb3Rf8bL+o7n/8KMIBEABNhfM1e
- tGtrSE2NC//2vTj9R7575/pXLv2+dnXvT3XTfLvUjN5Xb1v6IxoOds2uueqlPNs8CwAyL3KqB++vl0cv
- utebX/qxz/zkb91rfMXel3bj2UMI44o5ATRoKfFe4vERzG0D1GAsbqbh0h8tHr/yu5NrVg99/uP/ige/
- 5FWgTq7vP1/2M3jwz/22XNuVVyE1NcZ79mD7He6A/3zFL926qm79ujUAfLNf3/VLr8BgeRlpcYS1C7+K
- 9Ysvw77PnI+rrvw0fuD976wuefO7RwBo/eJ9Z25dte953dbBxxGvLgME5hFQLV6daLPibrob3ICRQDQD
- cw2klS81K6N/5slVj8rTzbsACcwLYAaIZgDXYAwAJBBNALTIvH1aDQevHR2z9JKNS/buHd3meDQ7diCh
- Q6or0LDC+pcvxt1e8dz0rvs/NZ/wmIfgqCd/D/a/57/xsb9+5a0r69avWwPAN7Txn/8K7DjieBw4cBmm
- +1ex/9Pn4/Efe2P69yf84tHjvYfu1G5OT+R2dipydyIDQ55N75hnm2cSJmBO8iFoAiIGcwJzAyLo3yUQ
- TQEkgADClr5rA2YCwPpPBeYGAIGIQbSFnBfAvNJVC/XfLxyz6895YenqVA3XUuqm9eKgbXZun0337N+2
- 9pVLnwDuvrxy+tH/uf+TF42PuO8dcM7rfx8PecEr0M06oM1AzkAifPAPXnDrirv169YA4Jv/V16JK979
- AWw/63R89e/fjTv9ytOH+z/9pTMm+w4+ot0cfw+3kztwbreBqZbTutUTmvQfBtAC6ECUkfMIQBM+FmuA
- mOrPVZDT3zb7BERjAAk5D0A0A1HW3yMwD8FomNLgGka9DtB6qtMaqno1VbP9FaYr0438MOZmkwbDN9fb
- Fl57u596yOcu/IsP5aXbnYI8bUEdA90MeTYDGBje5hh8+A9feOvKu/Xr1gBwtyf+LHh1EwtHH7GycfHl
- 95+trT+uG299F7fjU4inFWgKIPvGlc0rp7R8P0sKDwZzA+YllL5m9gAgP9dKSGD72APNFjaQ0pb/LPMA
- zBYMJuU2MWlIIb0WBvNQ/74DqALSwoVptPK60bFH/FNzxO5D3LZEuQXybHbEfe+8f8/7z2Fwi0+9/fW3
- rrxbv/7fDQAPetGrMMwd1q+8BsPjjxruee8Hf7FdO/Rz6MY75aTO+pMMolZqfKSwsTs9qTPkpK7AvABg
- EDayBQroz0/nAkAFoAZzpcGBpV+AAZgTiDKIppohdPq6GUANyx6Yh2Cu9LUYhCmYBi1V6WsAbYArYtRE
- wFoapd85/9Nv/9e7P/7paLYt45w3vOrW1Xfr103+daOPAR/6Cy/HFIzZJOO//+zFWKYjH9cdvOxl1K0d
- UerxCkSkAQAeDIBWywAOG3ao/65gpYFsyoSSORAsC5Aa34IA62s1Eg0p6+lvvYFaM4KhNg1HYF5Azosa
- HKYaaLK+1hSJthJytws8PRo8Pho8PYozncBdus/RJ5315S+9/7++vOv4o3H0yWfhdo96PL728Q/dugpv
- /fp/JwBsP+EstAc3sPsHf6BauHL9EbO9V/4m2vVTGA38JA0b1L5X6n7b7LVfvvy8lQiVbvIOJcGx5t5U
- v59101IIEIBlF8w1iJL/rn3fshC7PikRWDOGTrOVBjnvBPOifpYxiDpwrndym+6z68ST9yyfuPLFras2
- 8hXv+DjWuqtuXYW3fv2/EwCOPfsBoOFouO+f3/Jj7f6rfo9nG7eVFDwh1u0xC5BNx2HTlu9bPS5fEjBS
- WkNKW9rkm/qpntI0vBZp5hA3OpDSJuzkJwKINpHSJog2NYPY1OsbAshIaarfbzUAbdOSpQZj6I1LoikI
- s115xt812TdbHmxbOJeINs567INx8n0fiUs+8eFbV+OtX7f8AHDKKXdGWls7cevqK/8oz7rTpNa2AFA2
- t5zA8WROYcPb3yV/XQkWGSm1fjJLKk/aH0i6ETudAlQhkMjryWbVsSFqfb3VUDpY7wHIPFTsQONlQuZF
- MCueAAxGAmOARBOAOhAYwHTELe7XjnHHwUrzxX0fu+bKz37g9fiPr+zBJZ/7xK0r8tavG/WrvjHf7PHf
- /1jM8h7MulytAXXWTr5sSA4bMl5WCn+2sV8z932r8WOGYIGDQgCxzWojxU4DhJUd1lcAiLZ0srAAYKw/
- Cw0sMyTaBOcV6TeQXVuYPLCWCtyA8wiUWnltHoDSRsWz7tHt2sKu5VNGT7rD3R518copR9+6Gm/9utG/
- bvAM4N6/+mp0HzgHpz/5p3Hl+Qdwwblfwe6jtt97fXX2ZOZ2UU7ueJrLn0tzrTTwSmMvhAROevq3kClA
- 1mZerZ18CSiSUXQaPDjM+y17sE2cEGt9O90tQyiNxkZei3IvQBEAooQM0jBEQOpkmkAE8ECvbQxwdzxz
- c/Ahf/eUD+77xCU46rjTccWF5926Km/ir8e8+A9x+/s+Aqd+16Nx2kMehds//FH40n+86xb5WW/QMeAD
- fv53cfIrno/P3efxGN7ngQvdhReetUAbuzauuPj5m+t4mJyqrLP8HLr52TejBIIZDm/Ycfizbe4KMvKb
- +J8BIOcV/ZkZJLvoYO9dTu7YE4hBRt+TK+0DjMEYIOdtfp2EBNaknzSuMld6hQmJNpGqgwADmUeA9g8o
- bQC0/NV6cfnx1Aw+d/J33he7TjgJ4/3X4M0v/Mlbd+JN8PWo33gV3vui5+LOD/lBPPl9b6YdAH7vDo/l
- emUEQ4Jw7gDOGGxbwNc+/Enc7+eehrf/zs0T5XmDlQDf8fO/h+2Pfiw+dcb9sXDHu5ywdc77njtbb5+4
- hc0V7iYrRLbJCpDHNrLN7MtGtFFdh/5EoAqb2LIAO8E5xDgK8/4OpTQASjZQNjtzJ5kDaw8BFeBNPqn9
- CRmgDGbZ+NwLSFpyEADOACeBJlMHQgfGTDOBBoTpKe00P3vbSUf96umPe+jetz3hOd22Y5dw9r0ejs98
- 7D237sjr+fX7r/8LfPhrmxhUBCLg71/w3P/xdx78E7+Md77oubjzvR+DxZNO3fXX93viM7rp7IjRkTve
- 06wsXZ2IKOcM7jp0eZrrUfra0WedvnG/5z0Ka1+7BB/4+9fc7O7TDZIBPOrFv493vPRnceezHoDFM25/
- 8salF718trn1vZxTZVBeS9Fl0xZAjpz2XdiQQMkE4uYlb7iV3kGnMW0KKQc0ZnOtrzsNP0vhFrCm+3X/
- ljCDUYExRCJBC2ZeAIHAnuIrBwFJ/7tDGUkmEBLABEproLQBIiBnLR9A0mugha2qWfpsqppPDRbTv46W
- +T+7WZ587P3/cutO/ia/fuBPXo+lo3fi83/5Vlz4rg9iYbnGWY++P7rpDB986xuu8/e++4lPxtve9Ebc
- /R7fgerIE3ds7bnshe1W95zcDYdUDfZSRasFTZrAueZUp/cuHbX8W4cuO3DpyY+8ByaHNrBy5un4t196
- 9v/bAeBBL/wDHPz392Fw7LEnjC+98Pem6+0Tch4mgdeOUWptDr+VvHtfkIDzl2kBwX4maRCImzpJms4A
- UAXEoL3O/GuHIAMyqGD5byTkvIREYxBJAACT1P5c+/UQE0AzyRQ4gWHBpFJiEoFojJQ2ALQeQAQ7QMpI
- XACl4aXNqHsiCB85+oeejMH+PRjWNeqmwv5Jh4WK8G8v/bkbdFE87Hf/BA96/k/hPS/8HbRX70VuW1SD
- GqMTjpUQN1rAfz7/f9ci/56/+b/Yea8747JX/w3e98cvxQOe/AsnrF9yyYO5G196wgNO/cDK8CgejRbw
- uhf+7OEH1q/8NnacdjrO+/M/w44jd2zfd/mVv9ROxs9jrhZsGkTIuh6kRGVuwFjmatC8e+GIxRd++gNv
- /tTdH/oUHH3bYzDOjMnmFOtXHML0wCZyl0HoAMpIibB09DZ8/N1vxHe/5I/x9l/76Zv0vt0gTcDHPOK7
- 8fF3/CsWG/zgdGPz+dwNKsPv9wE6nbP3bGxnMNyyYRMKOccYfqV2lwZebCDyYRtbPmalAcF+dz4LkIck
- 4z7WPxt6EIDBkTmBHP6rpQgnJM5AmuhGnwGKNZCSBvq5EzgPATJ2IgAeIvMSQJU2BtMKd+n9qRmdW1/6
- FTzuDa9KD3zIfenXHnxfHq02mK5did1Hn4arL/3St/25PepP/hKPeeufYM9HL8DHfv3P8bC/fjntPe9z
- o2px0KycfGR6/y/9crc8PArb7nYWTnzwo3C7x/4AvvKOt96kC/j1H34/3vJXf403/e0/4hM/8XM4+Qk/
- uLSC5UevfvXi354c2nh2nszuM9t76EPnvvO/93SpxiUXfAqfW8+44CMfxONf+0asf/py7L7P3fDen306
- Tr7z3U44dPkVL5xNZz/FPFwUMFeth0EDySpl9Csj4Rnltj69HfN3HHPynZrREduvPPFup0xo+0KdUzXK
- bToRic5OdXWneqE+ox41Z1ajwVHLxx+xd5F3zkYDxjEn3haXfencW1YG8PpX/TV++ldfiDNOPe2565vd
- HzHH9NzSeGvGzXRjN/rbcRZP6GPwoSM8CxBZM4BaA0inMOBYiwN98BBrL8BIRgY8qkOwySg8hKRp+7JP
- A8AAU0JCK7U/NzLjT5v6bhkZlZ7xIdCwTgH0faxtaFNEqg9JL6RaesGXzn/nbz/kqc87fu8XL/2hPO2O
- rQbVBdRUHz7xp5vzLn/9FMff94F424uf8215Xg953d/ij572Irz0r16Ky972YXz/W15Db37KL5268bUr
- Hs9rW/cAc+LE4zSq37148u53Xfmm9+4/7rEPxfazT8K2E0/Acl1jz8E1NFQjg/FvP/Nj/trf9yd/iV1n
- nIQL/v7fsXX51VjYvYJPvPHVuO9vvgrvf+Fzv6XrfuKrX4vjTj8N73vp7+Bez37W6LP/921337ryyh9p
- 19a+L7fT3ZIhjlCPFt872rXyyu2nnvDhKz55wcZTXvZjSKjw8XO+gKsvuBRP+L9/mv7+sT98781LvvrC
- 2Tg/knmgs93uWrZLRJeOde0MwViY1cPqs1VTXZRzxQAPc25PzdPZiQIYkYySCBv1KL1luHPpjz/1vjed
- +6DvfQpoOsWO+z0Q//Kib8/zvMkDwK/88m/jt3/nV3CPuz/0V9bW829J7d2GG9c5Jbd/k42/Pwundp47
- 1XPv8uV1bLPT3KkeP2YEG2W9hloD0EA3Is/1GWz7ZgH65GUNVBmEFpQOQfoC22W+T5NwvRpY9JoIrCVD
- kmuhFsQJjKFGNYDQAjQF6m2fGS51H0I7O2u6NX0gMw2AQYvUnDNcGTylncy+Nt3awIVf+uZ4BA//tT/C
- f7/klTjre78H49UNAIyUOizf9USkAxkffO1v00Of/Wsn7j//osdNDux/Sh5vnE25bdio0Wm0kYb1B0Yr
- i6/bftvjPvT0173imqeVaIwzznwELjj/Xbj3U5+No+9/H5z/6n/AiY97EL74F2/BnZ/35IW1L3x5xxk/
- fJ+rP/bif8y77nUati69Eh/71zf2rvFxr3wNpi2jaRIygPFkhjZLpvf+F8gGeeSfvh6Ty/dg23HH4F+e
- /cN4xi/+8onnfuxzz17ff/BJ3TSfAE5gYg+sjCFSGuyrFpp/Wjlm52+c8843XgYAP/fudw3PfftHj9l7
- /gWPnuy57LndpD1TMtIOwMwPGmbq6UWUwyKjZLUa6FmbxjAymb2Gkc+k/5Pq+ryFlerXn/YHT/ynf3r5
- e3l9fYK7POYheN3zbtzpzw0SAB74sCdgeccRS5d96fN/Md7KT5I5/Bb6YB/buJ026JLCb8dhs1aIlN5+
- D8Au36i5CYeDg1ibi13IDrKmcOPDmn4E1rl+Dt8hDQANOG/Th5tA3IKqgxIe8g55b4b8Pk2RWFN+Kg1D
- uUb9TNQhcUZGA+IEEOsnnPjYU0aGVdRByGmw8LLTfvGRL7ni7z7OmDGOePB90bUtKgC7hjXWZi3e8es/
- f63P5UicjqMfdn9sP/H45Y39h3YRZ6qavLb6icv3H/es715aff9/fd/smqueNd3cujvnbggmECrveWQi
- IA+RUrNGo+GnUzP6aFWljSq1NMtYHSwP3jy+Zu2ye77nOXjA0d+JN/zYL+I2z3hifdHv//XZm5ft+eF2
- c3qP1DT/Nty1+HfnvvcDF9/7iY/A2pWH8LkP/gMe9qq/xOOf8wy8/od+AVe+879w6cFzAADbAJxw98fg
- TZ94O37+F1+COz36objvQ74Dr3vla/H2n38m7v34p91resVFvzpenzwyd8OKdPxawFnK0sQAjCE3C4N3
- LK00HwcSTWd8fDvbPLsbH7o9d3mR0YAwlmfEjexnbz5beRrXWj+zLCzVNmBYDGwWM9qEnFdQ1eny4bbB
- zz72nLf/03u/90eZJzMccb/74R0vvvH6AjdIADj7no9CPRgevXlwzztzN7mrsOc6PdmTn752g4xEUxqB
- eW4zz5/wPPe9FFL/GCRIH1qLw4hF1OqmLCWDjfbk1Ch3hxRjkLttcIYhC86ASQMH4AhDOd0BUJJ3Yygw
- yIIBye8xhQKBQzkh5YlAieXniDogrYLS4JJ6++4f+8JH//G9d3vsT2B8zSHsP+czGOxcwc67nYmVu98O
- 7b6DGO7cgem+A6BBg2b7Nkwu/jQyH4WFk08b7f3gR3+xXd/6PgISEn1ldMyuV+XNgw+fHbjmWbkd72Re
- ckYlE5CYVWJtCsIU8Oc3AKjRpiflajh88/DYHT8/verQFUNs4dgnPW7lyvf+95PHe6/+OZ5u3JZzAmOp
- S/XCx5vtCy+7+3O+692fe937OuQZPv0f/4jbnfgd2P3dj9g+vviSu3Trm2eCueLcblbbBu9au3Tf1Ufd
- 7QwMdyzh4Hlfxavf+0Z63uOf8eDNi7/yym48uavwLxjz418r2Ygm3sRLyTa0kbwq7UWNBbmJYXgt2+yd
- 8kriRo7rsUIpIUtWW0bPCOtSMS55BVTTJaPto595y0f+9V9++Aeewblt8ZF/ecPNOwDc7e4PRd0Mj1tf
- veZ9OXdnCJ22Dkg61tS7P+eXzW/pVO0sO8sUrPHW39QWAOrwwOLNrjTwxIZi+XuZyw/Cg9HXoBbEJVgA
- FTiPNGUHiGtkqkGYSfeftUPs4KaxppEKD2IrBJSIJI2E/gPgSkBLlAFukAlaNijUiDbkWtL2C+uVhd9Y
- OvPUd7SrG0dMDx48g7puY7B7xyeufuu/H7ztr/8o3v/rL8KfM9PvnfZQvs33PRSpuxrv/4M/xh3v/5gf
- nO3f+FNuu91AA8YA1aC9krvxLs48JJqC8wpAUxATMsm9IS6lFNEYSK2muzWINRDTkGm08rfLpx73C7vO
- PAlXf+icX57u3/f03E23gViCJlfIWABVC1fWS8Pf2Hnbna+ljtopJzQ7d20/9NkLfrNdW3sC5247UBPn
- QZcW639aOG73K3eceeJXF485suPL9u6++gvnP35r7xXP7Lbasxh12WxsoCwLt3r/Kcuz6pWJ0OlL7QdP
- 5hEIWcfCxj61U730mKSZ3KGMpOcnVaUxbbTx8r4Vyjh8gFRXX22Wl59z39961jsufNN/8BFnnI5//MUb
- pxS4QQLA3e/5QDTN4NjVgwfel3N3ZtHcS3NlAHopfRkDpjA6K7NX+ZkcfieFv6sPS/9LLyHra+UQwWV5
- JJqEUaJdHofmJBXBEKjwCMs0gJWtmNBpY68GWAIWpS3tZ/DhVct1PQquBGGoQY+RQHkIRi01LTNSWpXP
- kxYOpuHo87mdHINuehSBWtQLH6xGC3/8hU+85T/u9phnnTW5Zs8jadS87fMf/IcLzzj1Plg6eeeZW3tW
- /7ab8t0kpFRyDyzjSRMQWnBell4EpMFFvcvXfgaNNfBVmq3IfWIMumrpiDcNBuNuemjPkzh3DWMgDEnL
- tmiqm3LH3sFK9cN7z7/8XQ//y59rPvPKv3jGdH3rFeC8VMa8QzAWM9XVpdXC8AtVk9d5snFKNzl0F3Tt
- gHkJTFn7KRrQqSg4kQZz2+xSXhLY10vWzM9S9dozUckq4Ou2ZABS/xd4uvWNTHLONv4MpU9VOCmyDiuk
- tKn9hQWkavDp4fb6B0B80Wc/cuNJ0N8wAeA+D0YzrHet7t3459xNHmSddNlo6AWBeeWeEjVnAcAzf8n9
- k7zf+S8TADkRMIce5vJvFw+p+7EoiVKw5um+aGIwKZmHRfoBYPBfTgr82eoFONYNBE/5rVQlgEhS/m6b
- n2ZsOAeu5SQjzSTSuugMAKI/wCMZWWIGVINzFk484fnTPXuf3260j6a6+US9MPjHwY5tX5juv+x7242t
- H2NiIga6vFv6CzyWz5kmSDClI5FFY9VgYJ+HQzOXDkwzkU4DwDap4QSkxMBEj9ARskGf0WkPhZEwQ87b
- UA2aj+086aiXb61ddcfx3mue1eWFoymMiaEjWQFl1VqOUX8t6MlMmn4zkT7mpN/LkuVZf4f7E6DyHhUY
- +jrU6tSnoEslAJhmRYcy2bISUBvE/ncRYBYzA2tAM4CJfm9xXC80TxrvP/DWU777Ifj3P/29GyUA3CBQ
- 4IXBNpxxhzMPnfOBj3ycOT9IxnU898FN4Sf1MoPScKlRFIJikLDGDAV5rxyaM9CFZpW1NrHiCW+AH/sz
- heOZWv15hfIiy+bLi7Kw0OpCavV9Q+xQUVLWBmap7QnEigvwXT+X/pdWITIauU+aWRBl6RBwQuIE5GUw
- DaSvkAcA1eiYUKX9IGzdeXzFlX+Wp+MzASSeje8163Cvbmv/Ie66EXNNhFaaYnq6g5Q3wRVA/fGWnJ6t
- Iho14/J0vlY2ZCclk5+0mTKG8vpchXRZshhplGZQdQh5tnCvgxd/9a8Zm4Oc64Y4lHBUaUpvm6TSFD3p
- o+uQMFPwVtbgUum66PQAkOssAK0hgA4pbGYJwMbqtNKy8/Vn4LUIV++fKglFyi55NlCazpXeTwsADYBW
- G9S17otulLv6tEsvWceuC248Qli6QTKA+/0I3v+ut3eM2V9SSn8BpL39JklsnJRGoM3n+3VWEQIR7b8q
- nLwxqmaX6fIZO9v7cb/iiMQiihuw1WBgdZ9KjxEBqfUGmM3zoboCkip2oGpdTiPqzxbIr5G0MWjjIuon
- Lcwl6WARJUmYllOPgExAJgsSQ2RKyNTpybwI5LyYJ1t3AFNlSEbKALfj7cwYWo8i5yXNKJI2G3Wz8VAb
- YlMhK6GSz6qjz5LHSCBkDJAx1IAimULmJVFE4oLjKJ9B7jPr/SMao+umS7kbNmApdzIa4U1w1v5CUwhU
- /qzYEZfcY5SyN2WBDowGTLWzPxN3Gsyq0CZkLeus4Su/n5T8ZaVIX0aOw+kfuSUWAExfstEN3l/v/UyY
- QJQz8fSaY49bwHDU3LwDwNcu+giu+NrXAKQvLmy76ifruv4NUD0rnVSEWjz77F02+NC/bxu4r+EfO72x
- CThEATaSp/hE11XnsDWIw393mvr3gwVx0gU/Kz9n/6gXAXfLmtqOyymH/mVGZIBfIiNkI6E8oZnCT5O/
- L7EtwQqUS3qbNGpkVEAehUVWsi6m5Ndk9W9iyCbsFsqmURSjjMQg/AXtf2SS+p0wkywAUgoIyHOAnJeV
- eTmSjMeDW9bP1On2rEDcObw2AqMILRJmCrXVsoMlGIAbECv1yprDHDYxukLMIqN+JwDWc2gB783ItCYb
- 5JvsCmrP4DgiTEkJYp7eF2Qqc+1TLTuASoPbviKmhQIPhuxgOEipu2h59wI+/I633LwDwFvf/Eo8/+3/
- hMExO9BOTuwS0SWk3TGiTmW0SjOPbfE7Uq8LAIpa03vSdKzF4R21iOYjX+jStU3hQSKcSjL2I7Qe+Zlt
- 5o1QHiryTzeBlQTW+GHi0gzKA02ZuWzsEE1oLv7Y5TBFyXECU9bFuglTJ5IeQMgQyAhI2uziDhXW9VSX
- U5sUVs0EIDe66bhkO5D3ztQo49EuSEeQ3Mh/p02dfJBuwtJkZbJ72YYMbwKCBDA5pa2kyUhKyGKy0VqH
- pLiLHEaqpWKr5JJ0dCfdfP1HAy0fNh5mee9cA9xqdjTQhiA7XoOjaKxxQLjW7KvuHyqhNOE5vEkUqu0D
- wWJ2YI1uY5VWARafQcBX6gEubEYVnvWav7p5BwAAeO/fvhdH3OGe+J63v7VOC6PbA7OmMPi0ZuMwq/Wo
- 2GkmMH9phchjUl+HN/4qfai2kG1Bpjnyn9ay/nqtn2hySun3mbXWlDpOFrQpBY9KSqjNKmijiQX8L5j/
- wyYeVIIMHR4YODQ45XU7ZIUPy/sTiHWqwklPZgZoSzYH2/Sj86BGlmURfMOCWoA2QaxZhtXDGMiiZ62z
- NQgkHZPJ/qn8vhKEBMXWSLOgTgSmDoy2BBseaCMvl74MB+g1VyWgcIeCoKx0kwcOCJMGzpk+JxGCSejK
- c/KTHbquBqWzz+SBXzKRAhoqBjEaBCzz4kpLhTqsTw5ZKuaahNBMIT7lqQrFTjUQMEDIVOV/+Oonhldx
- l/GaZz3j5h0A7vNDP4uV3Ttwtyc/qn7/M3/hqdOt7rnMqEr0q9GH90YtQOsBGNU3zSH2uBD2DvtqyyIk
- 1hSSNYWO2UIu/T/V7qNgPmKpa1lAVeg+p7CddVOGc0fIQvrQ7UIpcgG4nLQ4vDwhwwdoVkS5EqSg/lsy
- llpPd3ig8uuyz0qt3lZDNrY265ONkraQ0jqQNhSoNNDXsOnEDGVSM3IgENIEjE6zgKCWzElOfRprnZ8V
- Wj3VBlytwaT27MyDNmXNWpL2RgCmSoINKXhHa2ju3e0O4EUpV4jCrEWvx9N1SOlCm3r/S7biJVXvYWhD
- VK/PcSHoBAKOdk65ml19KqpYlRK1Dt8bwNysyqFXfzUNmredeNcZDl6yFzfm17c9ANzrSc9Ds30Zx/7Q
- Y6p/f9FrfujQpV/9jTzbOKqc8sbJr8LNQtDyR0+uq4+4yr1MQX64m0u75nvrjS7EWXk5hffCEW7cL/v9
- aC55Oltd7QzBLTktTDTENxuVw53m2gm+RCNXIHxUimkK+QYmnsuS0pbM6Rkgzki0LteQV5DzChijcr+I
- NRPRx61ZjZxYnWoUbAJ5Adwt6ga1wlrLHmvC2kQGMQuwzEln3JxAuQr9DutdyGZk6v+uAIlqzVCyTkR1
- JNfLykoT1QoF1ukIWOtxz070XnHZpBRq8iLx1pdzAxcvCblLU9FrMH8IhHEt90eRpeM/Tz03irplQVZa
- FCQs0EybpcVxNVrEyY962I0aAL5tdOBH/safYGVrGUvH7Mbx3/vg+tyXve5Jk6uu+O08O3icrO2YKkU9
- gMjRb+ZuHPppn9f/2SnEZaPWyskPWAIuTcFIyQWZJFgdTnWBuMTa3Gp9SuE1Yc0gDWKY60DTVL6voBrQ
- 4RIkuJY/W9IPLS0cNJwm0lEvx702BllG7hQES3kAJBb1YzbkZKUZzgx9uTMNtj6yEOy7nGQKoDLas3kp
- oPPAIOAZy9paFI8GeybJ+w1yvRqEqNLRoCkpkabzlfwO5yC1on4OmMjGozBJCp3U5CWaqjcDHkwYtbI2
- KayRcqCQYQUohzXZhIOo1Z/XSZNxQVyEtmRVPQ6Jl1QVDEUoa9CagOzZE/PCdmS66jGvedo5e87dg7v+
- 8I/j/HfdOGIw3xYg0KNf8mq849eeg/t+/7Nx2wfdbeHct/zn07b2XP4ibteOLYuN3dOvT70FTBVonukX
- 6cBWGpTaqZkLFGUxsgNWpPkkM2ptSGnjhXKjWbg9+DL3BYfgkzo95e07ETREc7E0ATQB8wIIY1Ca4FoS
- gMO+ZWcqoxZTocRCNkIF0ATgoSLiZIMIHkGuPaWDWsM3KkG+XrIjHkjnnpPWndBTLvcmEsyL6HgZQEJF
- q6p7GCXXrFHWlY3njVDZeGwsSWbPHMhKD5hAimEJkmgn9JK8RnovHIOqliMKehJyVAJSlmesepGkbEXQ
- BMCsX8JpvpBRybQEkEzER8exRrf7WykSkhyL4ZmRZ5NFh7LA3OPJ36HYzLXow9QNG2Dv3YBSc/5ge/VY
- gC/83DnvCkK1N+zXtwwEetiLX4V3/NpzcObdvx+DY3dv/8w/vP+50wPX/Cx3GzsLHHI+VYp6/jPNCixI
- 5NBg0QVmpYLDNUdG9QmjMtPeGwCYaUTvSiPOVHpy7QsrPjBv5DG0UWUYflWA8WGTAXbmqidjgTm+iK/j
- 2Ld+AM+NIMlTfTmlVFIsj/S1py5+ksDSRc+14vbFvzDRqr70QMeULP0Dr3XJtQ7JQFYmpIpWcARUiFHl
- 80N/1thy0suQgGIlRi6nJ3cK9rGb0en710U6rdegtSagQJ6lzGDFApC8L7dInLUsUGCSnvByn8eIuhFS
- x5On8yXIJn+SHa+AuEMysxdApxMCGiqZj76eZ53SpE6p7Y2orcEtCUZb7pX3uTr0m9dFy5Lz8JRukm8/
- PbR+4cvafTefEuDUBzwC2xeOx9Jtjjrq4Oe/+qvTg9f8DPKhbeWUJ1fGKQ0RII78SsoVRT/rECQ6fejs
- 7r0lo6jmNqHWosakCyQifTH0ivSAJCz031RScstgKPD6bbwTN7Sm5kxJySUGBaWAREw+8oMjIJO+qv43
- L2gaq3wEq6sBUBoLOCVtabNtC4atoDQDY6Rd+RT6Cuyw4kJHMu6EbUBb1CPhY1AB3DDJ9bnSsp10xKWk
- oMLZALGUPzTTU79yrL101zsQ14jWbgWlV2mjrWgyCKyXQWi0sckKwpKAJB93rJWJ8vURrs2VolsgKDlK
- iBsFDYg2bImMZEAnHinDszhSs/YsysFUygByHoet/zq4XMVDw5rdjWa1dU1pcNl9n3+f//jCmz/Jd3/K
- 03D7R34Pznvnv/7vzgDqHYs49IXzsXTqbe7drl39dOLNxYL6Q0jVq7m03mC/ZXMKnZbRr5qjQEcVMgGE
- 1+fQXIzZdiMdaxMg4aynhtWZgU5sKb1fL3z8xwFY7DNcow5r5gEdV4kc2LjMmDvZ2MLsq3Tjq4agpqSZ
- QnpIGYlEN1AgwDWARR1BVY4zkIxFamBB1XVudy5d8UrRZ1wIOxRm0px0o0v9boAY6wmw1srUa8KarLqO
- WIkVGGSw6ATCRO+v4AGEhz/Qsl0s15kUXUisSL+kt8KypqnG1g7EDTI1nqVIxmM9GGVh8qI/Z8IURcbL
- UIhV6Layj1orOqCZVqVBzijCFZhmPvKVZz3tQdhFHrwOWAIuQLGC8UTEtTBHhmuYHrHoZXSzwZM+83/O
- f8dnPvzPHziS7sJHn30i7vmgx6HadSSOPOs0jA+u4b1/+lv/ezKAh73yrzDIGfs/+xGMRvVd2smh7wc3
- jSzEHJx45+ufOPcvPP3CripsK4+oGi39sOfI71dnXyRV5ok5t0bea8PgcwoNoeA5YCi/kMOngO8lYj+B
- nElGbcCNdT4Gs1RcTq1RGYe5KrByC6y5lsZINAMw1M/SCkuPZqCkUmk8UnbdkkqVLYGRUNFa+cxqrEI+
- uei8ZCode+2w8wiZl+W0pS0XKyVXODZcAwWYLfl16bxOswsjDjUofIjC6xCodLlGey1W6jOZDDsaAVZB
- AwWmni1ZbQ5v1JbAZv0Rh0E7L6SUmPa5SFmEpPejVxYSAAz8lC8b2qTjG78vDuq2jU05rO2YjaSyfhD1
- KxrJmHK9rZule77mr//5djtPP+6IlSO3L27ftTiibdu697zqNyYn3OluOOqYU3HFhZ+/aQPAd/7mn2Dh
- miGIMy771w/gy1/5MI4//pR7zsazxzLXddTsKw+niGzC+dtTv+GlQWg3KZIr9KEom5DI5t7kJUJhfqWC
- +PLfg9e2ZUvbgkFAtlHpHYSFS1Y66IKiQPAASbpI0WfQ0lNlCAIZiWyzzLSDPFHT0RkMZ59oS8ucRWn6
- 5UUwBB8vwhuLyLwswQG1+xMk2vDPX8qoSjcDh3LIphJ5rlEmjEjKtd677D9XgnU7F1S1uejaDSOvkamH
- sq/D68htTLDywMZ/1muodRajpZg1bJFBSYMiiYKyi7USa4AgRffVc6ewbUYThW0Rx3KFsk3+WQiltPSS
- j7gEbpsokQGoUtnI3lcxOHHlnJGS9Zr5bcxsgZQmyC2OypOt+8w2Nh4zPrT2/ev7N75n/cpDD77N6XfY
- 99F//euLTjr7njjq+DNw5UVfuOkCwM7hbTA6ZjeWTzx+MXO+x+7jzvjB6drqj+R2ehJRojje66fm1Ev5
- 5626i+pvAZgwj3xBeQPJGkwe5VGisUI8C8ySej2Xfm+V3IFYMl4K4zKtURml7lUSDGsDKmlQ43AyxRPA
- BFCYF5SFlgqenCDCGHlRWXlJpKt4pD2EmQa6gZuRwJyTCEjmRUAtKE2Q1HqMuJZxmpUmFB91Kpx8lCmK
- 9xxQATwEcePXaL0WCVQD74bLNbYOhJL7oKUV29ivC4SH0AeBpdwtgBkSxc69Aoq4QSal5pqXozP7KjVZ
- iVMg27DGnQBsXGeMULaAkZfk/lD0jYwrI/lrWtYkz7PcR0JCtJGDZ1YoTWKyTMwOv2hHN69KnRwhSDQB
- YasGz5a6lo/KM5zZTdt7HnvanS/41Hv+/qun3vcBuPTcT35bAsA3PWu4//N/DxjPcPRjH1l9+aWv+PHZ
- vj2/yt30SPC0Nr29UoVnlfsqdlxFuslOeQNIDP0ENXMQ5pEIJ9CWbgCrec1lxx6sprbcqNhEPOX14fg3
- U+AD2JC+/Jn8dOqC2VdUgp2VSQYbUIYKU46UPszQOlfHnrygozoVrOxxElpQkvQ983IPJ+4NTwSYsMN7
- M1gZjATl9OvYiX0hWx1sz6TzQMye4VhzayT6hjwEkyj/iCFKW0ap9rOolcQ0mMPBxw53QU+CGJwH2ixl
- RdTNHE/RU4fyE7P0g0SuS5iHkYuh9aAGJgtok95n44DMk/+W55AYqmlQaMOsJYIAHRcD9VuzK51KFGqz
- ZLfsGVPZWmymMBqQ5LkCfdUryxa05+MN7mJdJ6Ihi0h189nh9urJ3Yy/MNoxwCf/41snDX3TGcDtfvjp
- +MCLfwrDK8cPm15z+e/kWXsCybwq1PP5sBhTxoHxoZo+APkpEgESZQSYwmKxRn5RlyHrzHofgXyjc2j+
- e7NRitwAvEtlISGOdVY0rWuDNkCGccNlTs9zIhVwf0Cnv1ovQ+3HpYwg5bNPVTgkq9rQQD9bPEumfjIl
- bdoxcUhP4ZlJ0hRTwpYpEaKIaXi9a0Cm7JuDsQTKSz4kZV5AxkI/e1AIsjTvan9GLnhKWck9pKd1qY/J
- w1j2ssOzLU4egK2bbqWeoB7VU5E6hwgHc7eSrvt9KWjPUvYUS7mETkeKJYPMVCFRW94PtQd0z3IoZDEG
- mqKCbyAbdXqp0QWgVJyK5VD6EvogLdtHA5iZbUozcMYxnOmqCz5z/gdPuP0JuPzL37puwDcdAFZWhzj+
- rg88cXz5Jb+fJ93ZpZ5i9P36InnD5Lga7SW1AUVVa4rZhsARBahisy8agITThq2+mxVzzlCFygkdm2Nc
- lHi8LkilFNDXJE5ap2sDzaCxVr70EMOCVCOfnZf5dqlJVU5cA4Gw/pQijVGogVGgsUZ1VlhwoZ12nhEZ
- 3j4Z9FclukxPUABJYQGiaN2ZDBtrg1IysaTBxj6f8PGl6ZkCLJfDv23k1nj/xQQ6jHnHKg7iPQiudXN2
- c/6Mpu7TglLrtbSdnlIONBpETW1BA5IfAJ0/J9mkNrWxsWoHpJneZwMu6RRHMxAZWVq2aa87gPeCnMa+
- EPwerLHchCzXnlmrwCM73OzzxCmZNSvbcE+Ty4sR1QvHnX7026ark409V1x44weAI5a2YVDxGbO19edy
- xhJpikgupIHeRi7f7wt4EBU34EIM6U8LiBBS8Mox5AXOGY9czRa4Kg1BCueon/ZRIITKJrXOdAwWNntG
- AnETGGkoIh+GXKNOocfqe+jpd4UyazfQjD3soTcFYbqEBJ/TG49BLmuC5MpIEQ6LkPLae3VhTGc6dK3U
- 9w5/Jp0qkDYah9q7mKpIau1NRdkc2tRyRp9NCqTjX/Dtls5Xqi1Ano2AQlPVMznStJvC5KHArNnr+k7v
- VaNlpGn95YLWCw3D+B6Stg/1sGmd5AUjIRG0d2Ly7UMPTD7F0ZOeDAZs1+brJnsw6TevqxAMSuAsfa0q
- wNT7qNd5gVspp6vtKdGH23G+8KSz74ArL/rWHKK+aRwAp4wBbWEDiaVpMfMavq/hF3X+4slN7rhThD9i
- zWsuP7NeBuE0S7P9jmQMa1K5A/B8Y+darMD8rwxFqJgELiULm59A1pmyg0+yU4YLh14htjwICGFLsbU+
- 1XGZd8fZxChr70V4I9Rn1lU5oY3JGNJpWUqVlyZmV+5jTOqQszUgp3rqzgrN1lyKqfXGX5UJmbcBEQlo
- c3EdQ2YegnjBswz4MMwwGVsK3snB7s0+ky49w31wcnyDBBepjdkbfTMfJ7KWQGRjxISCJfDeTA7UaK3Z
- TbqMKx1VFm9GcKUNR+1hEQEwFqPZzFe9z+rjQJjICgdsSclmmBd0xLcox1talYwjZKGGfykTgjmTWlcf
- agF0K+10cM92TO9qtn3rXL5v+hWGSwvo0K6DaEuaE6KUy7wwV/ebXHKDYpowlQUc5ZQsIs8FiTIzFb65
- iy6QSnQZucjbx3Yc5gIUct79XNOII3iDCunF0uOA/OI81Bl+7XWg0FYDu4xsQTfyIBlzPIFrwQSbmahL
- WyVnxpl8NuvpntIhJBrr9rE6X01POGkKuuAnEaNTxl9C1muy10NSvT+oxgCNkZIiCtHppU60KdkWPMNh
- izIhKxXXs6401uscgHlF/j4Py3vpuJSsPveNI8xG8eIrzDqOTlA8KBkgTfSfKcCtmq9IlpmpFl5DHoR1
- QQ4KMqi19GFmAS8QiRqalWXFW+SBNxnZs8ccAmSnE6GZiokuwNSI5I5NUYhZlXo/xMZyKW1KJpWuZf0k
- +bwd3XXnafXiZE+HJ/3WtyYe+k0HgJ3HjLC0Y7CPUtrTH2Nkb9jhMIac1T4NDmMAcuHUu04AdYrICgIL
- LrqYA+df57g2PtGFDI56f0G+mVNZDM5nD4scJpihghWqj8dm0mFKwXbrcl1UhPSCOPJ7jRFGfY9CNtSY
- n6qVa+xbcGMSpl+iVVnsaRVVWtffzujP4yMVVTMCyySMV0GdkqOshs29LM3n4VQUg0QvYA2gTbCTrEpP
- I7kqkrxGonWktIqELc0uljQ7aeeC4CwIcLSqGDQMegU6HnZPydBXIAoqQIqyU2BQojEStkQ7gA0NSKKE
- 5NmEPm+2YGClg3D02QRAMSrlbJoVuK8fOqVnVYBlUgLJWHMGwiYoHdK1eUCDavHBLII48TnYyFlGpKXX
- ZX6VGcx89/H+7sTxaou/f8Hzcc/vffr1DgDfdA/gft/7ABx75o720s/tf3hu81nzPn/UU1aIjcGEOEop
- wSJ5iuPze2/q9VGDpIKSFCS/CK2O1BBS7CLtRfOKQKHclyvtRBxPR1zkEFjDeSf0hAWNtONgGSoyT6YC
- RJ3WocERhkylJiIfO5edIm5g3nGkgUj0+Gw2XkaARsO1kyJpECwliQXAMId3odVc0l9uhPzCWseH0iNy
- JYhaJJtPcx2szykg8wICj7JLcLF2ygsuQ5tpvIgCMKr7IkkO8lFBGG26xaah/Ds5lFcQlgN9LVJp9+Tl
- gsz9JzCeCfeabvN/rlUpyaYKSQVToPfJ1h78ZAdXQOpUsVrQnRlN0YKBTDGKujUXzgXlsMZnYWvaxo8g
- ohbgwUqqmtHScUd8chvtXjv5CffBrmoHLrseU4FvOgNYOulo/PkvvHVCqXsXJd6wjVgEDnNIt+c9/IA+
- 42+uyQGew55bnduILJYufl9k3s1W9B1XhYRBJVPgCIBxzLnhzpPOWeNCMBrqTNB5mtqBYsrPTlzhvKTZ
- QQhyOjsvrDjrbViQqoM8mvULWsU8GNx0ETmL8WjOy+C8DdaB9oDno9DSRELE/Pv8GyisRvhzikYXCKAe
- 2bQT/wc00YAyjdW+nrByUzpeFBRjhGz3RsKzIC6iNbKOWSngLjiabag6EmsJlgLEmt2oU4NdmoJhFnQz
- fQ0th4xcxCvooCVrXiziJJxCmRNVonQCwaTpvWWmAy+7ct6GLh8r7HF0yHk7ct7ppZN5DcjExdSAUmAc
- Yi6TnqHPHdfP4WtoI802Z89Yu2zf6wZHbb/L+a/9T3zk396D577h9Td8BnCXh94L9bhFPew+301bRs73
- BXJT4L35Wmve0tyyk7/2lNMbgL6xa+9i2ziszMdNUqsqwqHWRPNOcOfd67LYY5+AgmTP3ITCxlL2kI2q
- ipJqlpmy/EzmJR0plVSS4pwe4UQ2KXE7HXwTU5Hd8rRekH0pbQK8IJmWBRQy4lJRqnW+PxWZK+lJFEqv
- jcXsnpUTP/fxC57wdOWZQFWbzZHZMhHHVJBMBYLTkiAU2x5bsIiUzOs7WgNW9fgZfiKzP1cLVPWcwGvA
- apClzklRg1EzclCmEt5A5SIWY9foKMhpmCjp5+RB6eLzop7sE9Ut4ACjNl8FayRCR5BUylf09z/1iG8V
- os+A3BuzuuuIOzotz/IpSzsH7znyqOM3Trn3HfHRt7z1hs0AXvfzv4/x6gyzrW6yfCS9smr49VLjz67l
- ZeNIz8Z6fZw+FdhJoXRCJwu51jFbJyexSjpLGTBzswwPMqHOlnVtWnXw37HNVTQI5jq3rCeQnnaeOXBV
- lIFdQqxRAs+6vr7aZREUbRbSOJqV1NyuRxcra+NO1tyCU3Il3c+O5WNbpNp3cLyASmGxioK4GrFTlDmc
- /HqSmAZf6CMQ5iTJgCLVrr/DPHR2M0WHp6DQUKas2kn3eflAA2YTgmNgD+ioj/OKvo9lZTk06TSrCvh6
- GKiHtRRx+fSmCJB4sxmu7cdpqv0I7e9ocCVVRpYSpFG24CwEmIkKhmQxZgHQeTBUhybKCvHOQaqsZC4m
- kebMSjfDMczLPHem0iYhKUV5CqIN5Hb2kOna2qMOXbF+vXoA12uO8PnP/BfWr9zCxp52a7DQ/C6l6r/6
- YgfzXX1L8uezA8kMij0XBaDNVk8CvNBFy+gKufH3Kco6OplQzLyp5YDj9ZSUGAYSsVqMilusfE9BIC4j
- VgUHGgkwCROpkVGykCJ4ofWhwYD9HiT9HLWgAUl8B6R7P0TBBHTKkkPg8tsoSzaEAZVko8z0dBGREDO8
- KDbqTSAuVb16lE1y2z+r3TvRw2NekKYZlyqKuGwo0/9gB/esw4RaWdWGKYwE3bwlKDDJfRhrKOnctJNt
- c5ECb3qjXSu9ZhqMBsFfAiIplhtf8kwZSGOF/OpERbNOgikCsYq7SiCQv6/7pC8CqNqPlPah4pmSuBSj
- gClS2j+XyqdQ+iTPlBhFut76aXKgbAGYuAZlCRABcMcz5NlkdbiEGy8AAMBdf/R43OFhJ+PQVVsX13Xz
- WqI8PUz+uneasNpj5VAvl783H1d5rFrLe/pvNX7dE30sDz90u92FQ08OMolqCpLbXQDJ2MPU8oFZ5shW
- E3KEdsLrRRtDRSsz9not6wkxr4BkUFDD08OJQjLN0OwGZX0TN3IihsBl2gCF7xC8EtTe3MUovE/Sharv
- cL1F00JgdWVmd9lVWysDARFk2pLWQtNvBkpbwRHJRrddCEKK+fB+TOXPvPAzyHEKbFgPa7jGw0OzQts0
- ljkCEA3FsJmNGGTMScJUfAmVmwE0yFq+Fkl5FlwI9zkOzAXkUxQihuh4GZm3o8u7kXnBszmblYDEC9Ez
- Ww90uV/y2FNx0JlR4tdBtImUZMpCtFlKCqqvrmo+vxlM8aofeeqNFwD+6TfejvW9W1jcPsRgMPw8EQ4W
- HD4OO/2dEMKVNoqG2gSrQm0df6MqBg0GbcXXkdUMzjtS41foWTdxMX10DIHX/oUcxAG5Z1Zj5E61tXek
- S8q/pWIRkk6SjypTL61mrydbRGMSYzxyXvDGG2gmnf0IjeaCFfdswDQQIrrOTlNOwTBzXq02ZGG90W0u
- UxSQfn5TUx7o98ZyMlHrOP+ELRBtKU9BtRosg0KjOJHFUGJUipmvS9ZE/WKYle5svQDXY+JKWJPRk1E3
- GntplAML0SYt1ivKXtKwC58WPUpL94k6FVAxKbOqqDxxAnXbkbsjkbsdyBhJx58BymavNhKLtKiF4BlA
- V1SFA9sYYWrEGCDzSF/L/tEyT7ECgspMn6Jq8xKq8o2bAQDA/gNHY7DjSGBhaR9RurrIKmlHmsPbmD4b
- LyKzgUcGnjL1u8XxdCpL4rDN70y+rhcS2E55tnSrSDn1ZMBg9s3x7Ti8Y+hQcNKpwMQ7t+ylBTn2XurO
- QWG36QYia6AZljxYW8lb1O7BB6517FRremjZywwpHfL602DRkkXYJy8b2jcC5SAymb2j3pcEs8K+DUtD
- 8fvMQB5qebDpkwCXXEtjCX40dvyBjQrL9HTsgqlyyo9DBtOBI0kMU4idVy6NYTK0Ri0WaC5AUoUDImmJ
- M4X7I+jmN35HydAEul0+Uw5oQ7UlU95CQqtqxeZUZHqFMnGpOIvnIBvKdUk2f7fb9RntOp127YcNOc7E
- pM78cODQvORaN7+NiyvhLyX+0MbBEzf3fu76QYKvVwD4zt/8S/w8M9LyNtzvD1/eUF09gsHHyVybr2Uj
- 60bkodZvtaRdXCsFdRkZw/KzHFL565LS9dMeJT3UAtRVfIOJo4BNGnC3TVLqvKQ3u/UObyHCWH3feO1e
- WAnm2RfkoNTo0kuMQJu1BplDie01VQMPSo5yAJHTZTskBf4QGCltgNKGCmYGmW5AJxmDsOEC9sKNSmJH
- OWQD8V66B4DZm5W+jNTFJl5SeO85TF9AW6BqP5AOOZIQtImU1hR1l7wpJot75mUUeVpNfXwFjVUUNClK
- clA+m2sIwrv9RiWPJiTWW7FsqzQVDcRUOQJTTllTXGrK6DNNZEXagUMbAvKBEIZqbIHSOlBtKIWaQNVB
- AVN5kC8K1KV5azL1RlNuYH0sVyriWPdHABSvEybnNMNV3P+3Xni9AsD10h7+LWa87qg74OgnPXXn+uc+
- 98zJ3kt+Ls/GR5VPWs+l1uxusBLNZ44Dz3lZT8QNbXpUPg1GD/E2h+VnhJqTPe31M5tKd9uMHVx/gDpV
- xoXoB/CiskZt0xQ+Ait7T1ReYziqQ7yiILVl1xe0C51voL2NqLSrrrdSM49LFgGtybkS/Dg6MK/o55ih
- aC2IsEci0wNgFD8M65GUTjK8+zxPNrF6dKaTlSE4D/xE63hJwUAy8ci8JEGUWqTqSoEA8zbp8LOAohJp
- EDAZM2PbIWrwWy1bkJ6grCVRLhZlvlxNU7F2hWBfHwYqyori0zqbUOzmiYPzc5Qv1+eTTdxFHLvAqXWp
- c8I08Ag6wRHwkmg6dtslGNR7RKGJbTTdOgjMek/F7ixIlpkBjJOCGs88i9pxbJbOQGnhK81ifjgYF537
- qfdfrwDwTZOBnvDC38dbHvEUHPnwhx9z6JwPvWy2dujJnMcLxfBwMveA48aUD5MwBhK7uCa7co2ZL8BB
- OteaAegGJ29FB4ehKPLBKcyP1/XmtkrrlYia82K52YrIM64X5wGYMhKtaYe7j2+IcmKMUvc6rFibnnAU
- nFmQR4+DTiGzAdzDyRtQKW0JEIgX/P6wnUxsNfnYewTuW8BR+COKmiqtmc0irbgMC3YCWnvnMkY07hs3
- eq1ZRUOASsuXzItAtyI6hZaZpakrIZWyMGt/pk8fL1OcyoNA9nm7YQiETi1ux2WSUcZuC1rfM6haReGi
- NFpjKxowNCjddUlZllVeRNaGobylIv8wAZMgJt0dOU3AnJFQgWmEjhJqS+cpHBcsn8EnT1wVKXsfgho+
- w1C1SnpyR6GuFwAFgFTt7GZ0dDfji/783W/DTzzie274AFDvPgYfe/cbcffv+O4fnK6uPhU8a6Szb2CF
- 5vB8neAKtT6rppkorrBJZQ9A3JYa1Dr0dno6RDiVwtmstJ0LrgtJG1miPqukGzLU3gJyHHOZ+g9lzQpm
- SMngquorb5kLorWX7lXr6kcLc4cVW5SwE6oLJ5ihFXUcxQPdGF1Y2PCSgdKmBhgdVTE5LoLzEopqL2N+
- xEdzHZICQy5QbDe74EFP4MTS8sSWlw28x23fIwtMfg9L/6ec7BJABEqcCxvODgsL1iFrIv9M2qFn89XL
- YMyUigxRL3J/g5lsVB4WdKQ3aa3+D5sxNhOJgESgLPRhKfU6nSSlcjC5V6QyH5mAaj8aJhBtBtq4sgF1
- KsQeSgs+xCTGOWafngW0YZvmUMIZLLzdmYgftLXVfeQ5j/7R65UBfPOCIDnhDf/y3uPXr7rqJXnWnoyo
- lIv5Ezum75UucAoNlzLyI+qCfmDYoGRbblh49/4gLWsIABtvQjVew8uIjX0DyYNZFqAGzZRKnEBpI6DW
- SPXmk6rDsGvIEQrmwCWeCWVs6XV5EYzkKO7g6aep4DYKiQVAE+SWkTMhcwZzq/+MgdwiM9Axg7EJxhZy
- N0DOA+QuIWdGzhWYZ8gZ8hq5BfMUmRk5i+x11yVkhv4cyfcxRZdr5CzfZ2bkLIGduwq5q5E5A1gDY4zM
- QM4JmVv5XmZ0uUaXh2D7Pd4CY0veP2ttnzhoiVhmUDwBiqJPHYIpIer7kbPsLJi1YJPvIvg6sa57SmsO
- SiJT+CG+lmJYx3Omk0BNUYuC6gWoxZc8OzusVLAj0LThKtZyAMmEpEFP+ccUkntW4SZAWhXUJMfRd68U
- IuZ6//G35X/ZfdRx+fJLvnrDZgCP/43X4dzXvhy7TjvrTu2ku3M5fWmuVpkFwY/kMtHFFbiCUCRbEAYg
- JmGWURCY1G6noPGSc76hAJgi96y1mrP9OFS1jVhOoxaXXUhamjBFZhL9Oy8JKnfRkUUpqrwiUqHlhPHo
- o2eB6cKZSGfJD8Lamgc/1a5eVODKHXJmHHvcsXjKU56AQTMMs//OobM++yaDXTRxCKihaYIiNmGpt5Uq
- xq7UjCRi6WM6bCpHjqkYurKwnFjk/QsBHVkXfuQ1M2jiY09KhE9/6gK84x3/oe2ZqBjVRbRI4BKY1Fv2
- rIR6mUwq6w+NegxqPwSKxAvaehQyUkTLbndxsqboTBp8PEHHK0isKEwuKk2k917S8xpIonGYPcjb6LfM
- /70foiVj8gxHnyFHWrKVkdXcnuivLUZ1p0P7cXzu+OKX/cPf48VPfNINFwBaAJdfch623+akM5jz4rWE
- UP0ygEYH95iPCimcPFB4mkjjgvMwa2xE27DA80eQoOJSRbmbLAPg7Kw9s5QSvv0CiuJMq00hRqJW0jw2
- YVDFcNMMSBsoTMbgOGSRmksFe/i9mE/ATY229lGSvNcQnAm7jzgaT/vRH0QzaHBL+2L+J7z9396Hyg1T
- tSFJnfYUuADEIrOzZ+ihNb8fAHVPJFWMRFs1VDWxVWv4mpNwCdHRm5F6oZoB2kJFGZyXfT1HhKcPT4nl
- s1DrEyhKrVON2eTXtNlbVKTFaMX5DabbEJSfVAVI41U751HYAXl2cp7izptr44t/54k/9U0/k29qDLjM
- M+xnpnY8PgE9t40u1G5FwYeDNgArO04mqw0yhpKGYwiijR4rykQThQE4tG8W4oiO0eIcm1WlVwI8B3ut
- iYtmlvmy/GqiDVDaBKWxnladgy/6ogxB28/1DDk8mHjCd8FMgstYCn2jkRLdFX+u4Bpmxqxtb4Gbn7F3
- 716UGp76M2/gMKVk9OTWG/2vmYdUUiEO2OZwNyVB91HacpahXMO8dbz1pcwyvQcIcSk2ShvuFk3zzhIK
- 4RaNgQqJ2WXF2JGY7IGq8DhU449Vel5Pd6bSQGZOvcyxN/Eq2goLucMPn3ynY7ef/Z33x3c++ntvuACw
- gCnOOPZOTOj+nQjXyL6chdFOZF5xLxMgTJXoY5tYRCbZ6KYW+R1jXmi90PKAPSBobehjE6vBky8uDt4C
- mZeUp6+Kr9RJvZ/GAX6rDSwHqyTFXzfIvISs4iDgwFQ0SW2mgkL0ciji/YdzEtwGdbDat9Vu/qZy1m95
- X12XsX/fhuoeVEGhmAJSryrTIg4oTm2I+YY1Uo0CZBzFh0YdhIc6i7f5fw6JdX8DkTcx42FFZSGySK5X
- sA69NbsLd8K0CGTdcVC4Uktywxx4NmD9IQMCpTJhsqmFo1XJG9QlIJiJTgNmRjudfs81lxz6sR9+wRPT
- 0s5teOKr/883/Fy+qRIgg3DanY/Dzp3p37983tr/nU3TszzFCRsj3mB2C6ZKH0OreuxQEMgY87N+T+eN
- aKIQYukFmKJKKQnkN6NGvCLkCDJKoik4j5zjXxo1tVeHOliReTaJtbOdMoJgq/ynZNJQoM0UcAvs5Q6X
- aG6QUye5ZH+wbK7FsPU2ukUGgJwz9u9f1c86C8pLULlv0wRMgTwUoMmqLGwQZccWmBI0q/ehMg1F8BQh
- LNuf6TBp12hccm05grDHN7XvEfolTEFIVXtIQWFapj3wRqL0J7IT4IjYpdLswJLDsAQnZj7sNfv/VMi5
- HU63pj/7Fy96/ce29h340BV/+7YbJgN4/Yufjc31Mb7wmT3taFD/G9FsozSY0mHRFQgzca11ZExjHnST
- gAXnHkGHgy036wMuOv9l08D/ri7UTxTb5eQGFK2/F6s0FpvkFw81IxmAeRk+UqM2yFm3vaAjmzqChS1n
- NLejIIkeuA59NmJQF9YOMWdG110/XPf/7gygw4H9a5Dmb6ePu5iGlLtRLMyjiEy5Z9EPcoL+6NXWRhRD
- 6atCmwwE0eGI1eIuUPwQi6JPVw4r7yEU0o8AsFLAVVjLofWrJyQ3tUFPlq74FVpW6HJmtop61mzz67xC
- 7vLxm2v4maVTbrdyyoMehKe+/A++/QEAAD723x/E4qhGM0iXVFU+0FP+cfHNFujxvQGr/eTyZ0X4gIuy
- qtMxtdtPyKrvpnjw1Kq77ExqRCY/xUvQCCQLx5EXUVLXftMOdqKpEm8QsOJRsXhYHGLnBD7YgUsUThBl
- PIbOu9StbVmYlP0EEpTiUDdD1tqPb3EBYHNzCxtbe9xmvJcqc/F69JBKqjSkGgE+LTCiEVsTzSYXY0/e
- i2hIIWJx7Ppzf9sXHsHANSjN1afUDgOZChk02lJ+FXeREmCkrylw6mLeErdadjyLQb4lpsh7Z5v5u6ZD
- V0xHKMK4I1NRrrmb0aO29hx67Oc+cC7u8YTH3TABAAAoVUiDARc3hxSS4y5slhRusUoh6Wb0FGwOzss9
- 8T7DajdBQKEL+utFy9/x3YEHIOm1oa2S31BXb6UOSFJ3u4MLFSKJSHCZHZg2Bo1tZoy/aztHuAQ/yT62
- gDT1TERew8ZB8lMZ5hr8LTu2/6/8Wltbx9ZmgIlzGYe5opGvGYUva2/JrLwyD1VjcKxBdKDNtFwyRMk3
- 0Gvc9lEDmsobYQoqD7ak7zUsWUh0Mc5LyvewZnXnIDHKVtMX2HM5JCL8uvUDAlFAJeheJpqIkUvqAuSb
- wzjQRE37o19mAni22I5nT7nno+64/HfPfj6+/8/ecMMEABCBM2dwxe5KG8QZuGdzpFHPpahysYf2x5Ln
- 8jNVygnpnAs/GorKeeKtw36L+oyJao5RUFudcLW5iC/Iw9JubRQa8TSr8+5uadjUYaIc9fVCDelklq7o
- AjoaLi6WwtW3WX9h6t2yvlZX1zEZb/QNMqNnIZmgSfbgkI2WreduUrah8EoiLn6imaBNjII+Qk+8NJ7G
- Bp0WdqYg9WrVedAsLBKl0lQbjzp2TDOXi2ctN4viVCozfSUZuY26X0YwjGHth0ERi6bHwMPALC0aDXJ4
- BSyKZ0IZmemsjb2bJ61evg/XCaP/VgPA0uIKmqo5AFTXFAfagq931VgO/1AZo/lbW+MDRceflM0nKb7K
- ebH6zlPQZDdhUVPicQRfFU4YBCixpf+VC30ACuIIqD1TOe66HY4td043V0H/tjgBF2U98q5zFHKUBTtw
- fXyfEOShyvuZAOa8S+0tKQPYxNa47VnASYVkGYFt3OwpNTlmRO+w2qlJo1QFPkzfQWfw0lcKpUHstKsk
- upGwuu5o5LwCzqrjrxMmh62XU0kmQiQkHTPxzObdYHBjzsJ1SLNSBur1sVPgC7xacChcRG8MQchDpSpz
- GKV35T4AwVm7Q093kvOx3ZRuMzk4KdnwtzsA7Fw5Ficfd9Y1hHyebKIIdinnYvlDKgCJWCb00hiDx1pd
- xYEIoYQSU5Jh02lTiS6C24L3pHtzOd2lNpyFRFA1Akg49CLo2PkJLPiBtjD9bNMCPd1iSTvJ583kqR/g
- Wm4OHlIbK1Z7K4d61p75HC6oekvJANYwHk99VCu+CiP0O9pQPn8xcmFUPvyTJRIUiqwWzyqcQRHiG0eI
- kPQ97wDnJSGA5RWAR7rJFtDl7U5ki1qH3gUkRqINpSdXQWsyMEQc4YiQsSYXTnFzVT+1i5YEKxzaFJPK
- KFvTfs1ube2zHhyCKg2iq5xrzmhym1HRDRQAVqeE933g72ZVnT5FxN21/pAgKwInP0SEKJdtmYOm82LV
- lJTtN/VTlhzyWRc12dQFgI8SbHRSYKlmYhMDGUhSaXbQNNEUbQQyD0AzGMEMqTqgr90GVZfZXGQzPXc7
- uezkp57AZnGyTa4bJ5mFaiKq3x3xLfP0B4DVQ2uYTs2kVBeI6zFmN+WUO9Ch7xgVSkRb7Eyu1egjQ+S5
- Ei9uTxLQF7VINFOC0AZyXhH3Jdooa2Kedg5dy2jdqbkYUnHxNjAjGOZw8CXXEGCK3IZCxzalYLOlRyri
- tZmXtXSNvps8d0ZEe/WcgdxSReDc/Y/P5XoVnNROsbSyG8Om+vR0wmuMtMNPXY+YRsagvvSzgYHcNtkU
- eYpdVPENyGFzGeeeCvOOKTx8m/Hr8IQSmIbIIFT+ew0AFctUySk2qSvT8TONv7wop3raUAZjCiAnAx/Z
- LLvRRRJKnZiJmJdBXgiS2Vk58gON4lsuQ/aN1G43t68DB/cDtAlgIZyK44L0BDQVVmyFk2Ssnpe+CaU1
- ZdhJlpZ5m+yHtKFaCeNwD/v8+TihSrSBnLeD804Q7UOidfQbc0XbgXobrdFRnYGErM9jSD/VdmDToYww
- 8RyITkm1JrjM/VlQsNnHg7VqGVSgREE1M+nY0cBmFkxmADV7QO1VzXKNyTcwTr5eGcC2B9wJzWARGC6t
- U6IN78TO2XtHMeoowlCovlozkXLU3crNlHRqDagjHZXpDYaBRozYojLPqh5bOv9G3jEEX1N42MF1qKi1
- dOW2KHfAWGSm21e0BcvnZZfYTgoPJl9s1rW1h8zWj0gTnQgocIW2BAXI7S1uDJhzxoED+0pA9BOVA/tP
- nwGZu5QJYo4DlTcw7WgmgZNbUeJBnJPPj8qsHJihN5qmKSjtV6EP/SleckVhCtukSIzX+gxzjzlqjTzb
- uHxYgUAolvRdQZ/2dkntDFGbnBFtudVYf44R5fcK1JyIvjxYoouH2wbf0LO5XhnAtpNOxLmfOwdn3+u7
- 7pozH+kkDjL1X0t7ywNgNT1gDg+coBsazv9mj7oFHyCCF4Nw2keTkRnmqThyw401t6WsMBPfaDTNVxsn
- LlHflGCipLQbdLj545zrEdeSXNhUIpA1CokFAAbeIBTLLz3Vkl27lDmZM7quwy3pS0BAq9LY0zS+uOPU
- OlozDAjrTD+qKbVK1JuTiaOsCkQGozXVnVg6RFBQMB8BVM14MwijZsf19w+yWh2aZMskV16ukMnYmiZz
- LhiFRBPPJ9hETrScJDvBqdLGpTXyamf8UcyYzUcyD/pr1a5bhWGAwZjS7I17zpse/MLBj2AX/c8l5TcU
- AB7wa69CpoSqqTD+5OfwiT/4K9zvB3/8NgcvOO/J4G5AlJC5CqgpLuUAs5tIsKf00aZbAR+BDCqvoeKH
- mOlIbaKACZ2HchfGiSnMW+1GJi09ZhLhzSfOZvxBeSZi9AsdlvtZgopKsFpS+4nuXO4yWUCUg0JgRZrj
- kctBtY79Z43+MjW4Re1/4QHsX9f+TDA3cWwGl6DNTVD1VWcfI864ZNhUZ+2tcP3dbCQ6PbW9TTyvU2Ea
- gTab94MnQHHLlz4vc4zWprLLfptRqI/7sga1eBA0RWAWRT+Dg7iISbV5ZsC1WtSbiax9tg7FvzIXoZlU
- vbcazf5h16k1nvv6N317MoD7P/ZpuPMLnoP37z4Jp7z9P2v+yqVH8lm3O23ta19+Qp6N7y+bsu5BLQwD
- T7qZyBo6jKB6ozwBE/1Q9xSirq/plgfIVLkWv9foatrICDW1L4A+NZkZQZG1k/ENW31FqvYS2IVKz3Wq
- al4IkwA6TD3YCUtBj19iYFP48LQlRBXiIgeuwcLlqnOjPYJb1lfbdjhw4KCOympkHkmGRygNXNfts0lA
- DgKlg5KN6QmdzTFISVuJxsoSHYJyA6TusE0v8307bBov/bq8Q/wC0rpOtKKKUu3CqsYqlVI1q1GIpt7O
- 9SdP1wtmRH0YAecLcNS5NBcooDTBNeCQswNrFAi0ZhM80hKzQ+ZtXZXat4wPjNaa0Sre+KPfmC7A/xgA
- TjvpNnjXbW6PbQ940B0u+cVn/2ieTO+X2+507jZ2E5BYa2v0AB76/2z6c8bYmpXNyQO9Ga2fAO4UgyQ0
- Sx6CVI2HVWEl0QGfjbKSLWxk2IMCAyi1oCi8MrXIfrzWBVXm4h4VkCaafo3DyTEDHKQTUY65vK/9ncGh
- fdyj2O8MTdU0W/B59lAFUVsJdGqhdkv62tzcxMbmqi75YYGBO3uyCXBftUfHIsBt716LfkJhCZaR4AIi
- hVcQgtPw/KI2n37PLcM6rd+LZTlceUhH0nkZgh/JyCTiNcx1GBGrYhF1nqEWkxFxFooqVtL4y0UlGSji
- pM4F0B6AE6QyTIOAOXBHHEVIG9QMzm9GUzziF38cFzz949/Qs/kfm4BrVOPhv/DsivZd8cx2dc8v5PH+
- +6FdPYrQJkuPnNXVG/dFzDtQoJOdm1YUocgo+MBgr9EH4DQG0SpSWkXmkYhPomjlsbKxgL5Oik8atOGS
- jHKcF7QbD6Xfbin6S4k/eQjujkDOu9DlHZ5SGiCoZyLp3fwq9C6KGCmH6ynpm/6jTEcJbkPkbrsGlE3c
- 0qYAggKcCAbApba7AKkGkIeyqE0ay8VAakQDVyFrJXVRbgroLC8GyfUmiM6UQ6F3VxWVKnyQtfA857YF
- FyNPG1UimsPAhEJqN28tSFguIiQayMiazTZBck9N7h1apNqFZnZSuCf2OnCOiWQXeZCq+sRDV63jJU/7
- cXz3a78xp+D/MQAcSVOsXnDecLa1ejsoccHqM7e39pl+/OK5k7JYcAkIppM0Tbv/ceNS7MbbVtIxoSPr
- 3F+t8j+bDZNYgSGwuqYATZDSBpg6ZBvFmfVXXvJxoDy4IpAp2v0qC04TlEmBjXPKCeDUaB1xUhg7sSkR
- mZEHL2hQ3JJGFKB494XDhCtuCQFgPOkckWkmoXaAOADGs6u+gUuxLlPpNc0YbPpENHG2HanKjrj2koPH
- cJheUzE+cWdrIGgDWIaQQbQG8oxQT2DWcsAJPdnTfYqBxCHrKIHNxt5aRljjj4O2JZvwjbfSDTNgI+sJ
- +r4Zk1E3aZ9zwj1POfFB9/xuvP2ZT8Xj/+R/1gX4ugHgYb/6Cpz5sPvi7173p5sd03luj8UjTYdbv3BB
- KC3o3zUoVNgcBA+LIAIF9yBy6mVG3/xgrA2eJWReBtIYKW3peGTT6yW5JsNLF7964r4SLqNDMqMKakEO
- Ktos2QLNpEtPa2Lq4OOYTYcSs/YtfP5q7ER9K0L0ssvgblk579rIzAvgvF0/56T0LXiAeQO0W0YAWMNk
- PIP0VdR4M8i7mUuynLJbarc2Lpmekr9KoKiKBLvO9wUHUGmwnyLzAjJvK05EnkXIa3AeAXkk6b2RwKxN
- 51lf4xvYvCXdKjxZg9cOsKx4j0G/NKC+sCkHpSlW01j4vxt1RM49/ceea5M5RyOBMZJAhwqECfJsfP+1
- q8cvbY47+sjb3/1xeOuzn45H/vYfX/8AUB+7C3/yzJfhHo/9sROImlNjtCyIrqQWySFq+1glWDHZR2HW
- h5sLkz6WaQjS2bQlQSBNFWPToa8U27pcOM1NEVz0EsbThv+OIMK2FFtuph/T4C6rC4vGvUBmgp7+WXyi
- kT29s1KiIL2GyLwiGQhtAC5rteWNH8GiQ6TR5qSqbxkBYAPjramKuWQf35YlaKXQwMkzcj9WNRgX6reJ
- g0oWaTgMyURFOr3WZzl25ynmUVDiSQ4iYjTI+ajATIwioQM19ygS9IJnM2ObuGhrFPfl5PBwp4NHaq/J
- 1+lKYMuoyYQSU4HL05y8nJdFehC5LbwckMxM3XjzKRtf2/ebi8ft3H3GmQ/F0iknX/8AcPDAGF+54qOY
- 7bv6h7pZ9z3GSCp1im21xgE65WSvfdzFXFhu7AKIYQJgcl5MPhN3Qg9NkWgLVdqvKXg/kSsBgUMTJ/jM
- UVeEnmhWHHOMrNEbExmgIrYzi0OuAZaoJ+bQFcFJk0YLRo/FboyEL861QE4rQ55VAmRRwAvz9BaHAzh0
- aBXTWRds3FoUKzcuJ7R7K5qK9KJuBrVnxzyU1nwkqpKVkmkJVpqVZT0pFzz1Zj3AGIIDKeVI8IW0bn1e
- Et6AWYQpPFx+uipaE2hBPEVFGw7wKiM7lQtn8mBHvcZkhjSd2TMBE6Xh3lSr7Lie0Yw7HtUgjKtua+vp
- G1+7+ueOedDJ1VXvfvf1DwC7rrgaD3vazy+2awfvC+4qOJdZPhhHOXCKFFoO0XCgIp9hNKiputEmS5Ok
- yGCLQ6vywb2ksHrQsouqJ8gpHO4Upq1Wx818YRQYcXTaNU3BiNGOFuQGRY2AEvuXnSqz8m2ayeI06qoK
- kDAvqSqwaSNoJkUtknoSMLfI+ZbVBDxw4FDvv9lO8J7wago6j+bqaxTtGsa1KI0w9W5A64xPcpk3Bc3q
- lEdYeo2my3B/wBSUhksGWylEe+TO1NlHzeFw8sMBQGoDE7ZSebK2pOpub5Y0Q5ExdtYDUJqIAnITwRtW
- cRHDBNQuQFuOrFlRNWKa66FMwLPN/R/48//TzVZXv+6z+bpjwPHFF6KdTnfmNp+K3hvYv5UaidYRc+7O
- g0rRWzTX2NNTQIzm0et6xtkoN4X+G3QCoPLP3hV1y24EqabAFaAwWomzVn0g7kNoGYs7Dhf3Fu9hsEb0
- HqefFcsfnXkSxP58Eb35sy1ELKrEuDQEiRowjV1R+Zb0JShANdFUa27STFAYbQGvzkHnn2s9xSdOCooa
- /yUCZy3VFgqtlhtfI172oQknPdTWy55RVoSoyYbLCUzcSGaWNhS5R35guc4E923WiQfah1AMv0uAte51
- aJlj0mYzuY6FrjeufS2xBjnzQSTKvXEj1GBWpNbUVDSlt9bD8evucJf7o15avv4ZQLtxCO14bQzw1eVH
- u97m8Q2lcEX2+WxXILoKtuGwoYiCEIgRgqi4/TAV1pPNR/087nnDl8DEvVM7biR1XO0JlvRvAzswpQ1i
- JA0i0yraapvhqAtS0FQJGkUiyu8ZU8k0lBHoX8ot98B4C/sSENChwu5zg1RyzjyrFj57YzAYvfPQ0++e
- EaiZxPDAff6id4AZq3rzTJWXPWBwQs47dJSop3a05XKJ8hE4L6o4RxQQmRUUKdc9fT/2qUVyvgAZ7F0b
- 3eZ+LL0Ig7ab78RAGooqRyd7ZqrA2oF/D5iFPoM7VedUD/92vL/exy1j7YJzr38A+MD7346tMe1LTfUK
- orQPrv6T0UffR6kug7UOBJHlPvb9tNapkeb7R6EmREHLwUw5KWD2A3mnNO9QjB59c4X63porNn+mLhAq
- AKvj0JP2CNgEgxh72cGawUQBkoFkRVHnwIlCJvE8lnKBCzGIbV5N3PNHuMVkAAcOlXthklakWaO6HZO5
- FHlmMNF70wB5URF/kSmpfno6eYpEnF6dH0e5Pu5rgbwC7laQMJMxMBqXoica+1iZHdFfuyOQ2K0nRw3K
- 9CEL+Mgbx6Zo3eqSSuhjEuxQGWpwISk1yAxxREQmuWWeakj4v2uZiKUN3QNbPs1ComnmFnd/2a/g3I99
- 8PoHgAe85BW44jMfwmBlZUWQGoHuqrNQBAqvpC8DPbin4qijo6/i9KKddK5c5EH2d5Bp4qTiiCahVPm5
- Syou7hgAT/Vqd2BBL2WX5pyAfYq+gNWahtByUE5P7HOmvYjc4/fLbLgNAcRUf0KPwQBBecm9DIimoLSq
- XnUCThKQ0rgXqG5ZGUCLAwfW9HlXeuJaJqanu/Z4PACT9Uzqwvm3ngFZ2mzCm4TDbM7J8BddWRu8qPwB
- qffbfBRabEemrGsPyFD5LZqpr0By6q80/8hxJqSwdbOON9lyyRoHnumylqju7BMOGfmMilKFCX3UyjtR
- bAijwOi5aA1I01Ot4tXxWGnU64TpoXqBgPX1//H5fN3VNhhn3PFnXjpoN8ffw5yXS4rTHHbCOhoKjJQ2
- XLiRqOD++29naOjaoysbxNP9+Kz7Tij21ylsbqA4zGo6STEVs+DBJdPooRZz0RE0lVrvwnIpB7QZhcBX
- 7GkZmnoRFcFSdqqrXi4ETy5B4KCno/J768KVp4zD3ZVv3l8bG1vY3NzUe9HqyNZg28XDUJzmiq+eCHdM
- 9ZDQKYo7F8v3EqY6WmXXDkhpFZTWPdMi//0WrFbqmRfBvIiq2iMZgPYl5GfVAIbG8EZ3gNyaxTil9XIt
- eqA4Gcl9FVMwHrG1rbbrmu3ItU6VBGXZZKPmNVv6d8EaLLJRuRbkqgPLEkD5/Hqh+uLiEQv4RnrJX7cJ
- OL3qKnQb63U7GS8imGmUkxceZQUB1xZFF0CjO4fC3eiNrFMAPU05kiM48OkpbFhrjGRXT2Hl31MoQYoc
- WVZj0FQEF6gNDsQW/6yTWkRMvUnl3PPkxpClgUmuBU+9ppRctyxegOsOlIcyEUlRM8GTZBBV4fS/aUqA
- yWSKvXv3S+JcVajrCilV+ueElIxeTYf9mzTKxX8TEVJKOHhwFZPJBOaFKBj4SgNgpcQgS/mVqckjoXGj
- E6ENL8OSB2f2zv0MRBsqDbYUeg2GnKuU9z9Wz8eE3B0Dwgx1cxE4L6HrjgPyMqpqT0+E09aMBH7FtBgk
- 2EQ9fEwn5iBsgc4JYV3R/uXkMl+ylgwLMZvjC7BCozsUJ+Hso1JCBtPMD1ajBxMBVKUPfu6j77nmJ9/3
- H/izh37ntxYARgfX8NXPfXRztLj0Mk44ljPu3z/5ykyTXZ8cZcObrYorsujYMNd68sUkIjk+WjqyXXFE
- UfJEdAeO8tIZlaTT1GeAuQiDG3maCm8O6j6WjppS0UzHl7YAMoBpcLM1MpN1fcn/rmeESibhPAWniQpO
- RohzYTD6JMIt1m78MeAXL/gqfu3XX431tVXUdUZKFYAFpARU1QwpLaJpMuqGUVUDNE2Fuhqgqgaomwp1
- VaOuB6jrBnVNaBqgaQbYu/cAVlfXQaQOz9QWvQU/MMhr9NztkACQ1pDSwbBBptroqhF7M8QDJYOZp4Ku
- nbSpmYbx77V84BFyXkZV7ZUsIWVwN9FeQuNjN7i/Q6HcSo0P3Zxc+gJaHshgz4RlWoCsB2H4BHJsjJeS
- MN3JKQqztg0bQ3+Gh6pxWRUovtPNfdoxpWrhQ6ef8hBc8Hf//A09968bAOjkE3HfZz4An3reaz43WB6+
- ZLa5+bec6ciS9nYhzS4JObPx/HOv2uCYPvsH1Mia2nACd5g3PYiGCjZqjOMAcf6lojrc81FLvmELF5t6
- +znQEeDzYO08CwFFoMl9/n9Um+GAd8hFYlwlzUS1Jm5uY4HlOPwE8wRde+NnAePxBJd+7XIcOHBIMhI7
- cWgLPpazLjoPRCZbwTXsfRpyhWaEpZmS3Bs2WS8M9dHV2vCS2lxKge0CiOqOUhDYppZfjfo2olCqvZRr
- FF8x1UYefDws1zsMPoQLogGYDpRnl8bIPNRTPuA85kxivCntn9dYqASmgYwsmQCqhXxmNGBeAngownZq
- YMJqpS7BzaZDVEhM1MIs8KTZOZBJGtcKXtKMWzMpOeSqWarqQ1Rt4ajveADwl39y/QPAw3/zz/CeF/4k
- zj73Kdj58EccufrR/3o88+b2YsnFboLBfrp2jpUuXAFN+bRhSIEua2OSnoswl7Pbm4QGkzTV3lyFE9Pc
- VgsCMQ4ES0lRu2ovczEtLcATfVcXMVFUI3VArtwmrBBJshtHsCH6mH2hSCd5WLz+Minib4q+3lxBd5n3
- 3E0CA6KElCqkKiMlxU4wgcjGUhOYhZlnPaZT7yesgFCoF/CNLZqVTal4dhcARZkGKWGKUYPSBrr2BBBt
- IlV7YCIiRTcguYqvYPbVhCW1OsevdBTLYEpItCmv3W2XBp/+dxkP10WlCQiOPG0Qi4EqQHUawFQoBo1Q
- 35OKgxqPAKL6wwZ/Vsi3ZITFN5JcR0Kbm1QMUYWQFtarTzRayVow9Aw782DAmXZ00xqT6fQbeuzX2QQk
- Au7wyGdieNKpRxz6+MdfNFtb+7Gcm0Fx4iEV6UBR/6UIEupcvjhqu7OjlqzOhpcGnE1YEcUJ1YwYXUtd
- YZU6OmM/9QuQqPAA2h42wNRdybMDkxmvg1oLu4ehI7fSenEw9vcy5yHuN49QB5xBF076obgUI2QYwdvN
- RlY5b8f19Wv51r60i+1Er6pw62laxCwtlXbvhyZs/rKQ2QuwuueE2Ge8VT1TFigRSOr/DKQNcF5G7o4E
- d9vVTr5AZdmgw2R9KBuRpZ6Cjmz+Tn6fkjbwbN2ZVHexh4t4D4q6hTxC5hUpUWx6xNQbRXNe9FvBPNLD
- aqbAtk4xCIUKHKXqi8NPVZSj9c8iYKLYgbSKVK25EKob2TKa3OW7XXLJFt7640/F4/78W3AGOnjeF/GF
- d70Wm1887wfaQ/t/ImcMiAqd0Tr1bBGck8N8vYOephrRdCRjH0ZHgIRO0Fa5Fl91Tx2rAC22YKKXqrNy
- 7mkNzAGA3KPQDBztn+y/Sz4BMHBJMFuMeIIA0iGKtVldTnDiXunhEmc2FdCTK/VM6ZKPujgvKeZ8oUwt
- boIAIMSbrSB4OdEUsy2nvKkgK0S3uBlzmYsbas907YOZJbERvSYqhLKlzVuB8lb11cquJCdJpWoPkLYE
- uOMqwiynH6eAGWkK3p6m8rzSFJlH6LrjVHOhQ3Y3H9aJlkKKXTpc3KTLZKAC8wIyhi4Sa/BwCTLa9+Ek
- 75V3IXe7VLI8CfsTFaq06g1EolY8MpkADHvsRmEe1mUaYA1lkjIp81AOplwpRd68NKfImR5y54edfORd
- HvgDuOxf3oFHv/ovr18AmF11lSyLzb3Hcm6HZaaeSwoSHHeLO07sBxSLJFYqpINALL6qLgBTMQQxp6Ei
- 6hDVgnSxcvERKKnktGQgnA77eKVjWoRIXY5cYZtSzZA3bxgFyCNBzBhoNuu3s6TMgj07AiANRDO5KKcg
- 80hlqXdo1jFWuvPqTRQAEohrlaEy1J3hKQbaICMQaiXWLLgMt6v5mNMPN46e4x5d23pEqYin0gRE664T
- IDp/+xUBOFPI8KLOxVuZ5VsZ4ddWVIIK8k4UdTmPJIPgoWQIeZv808kmzd3Rek1Df8aUNkBpUsxHHMCj
- +g3WvefCQZX71fQkxHPe7v2iogxd2I8SWIbaQyjwdn99U0XGuLwvM4hH4LzNOQrkiMkMtLP7bV2z/uwd
- dzixqRcXcZ+ffsbXferX2QNotoREkLoJ5vHppJLMsgBar+tcaNPntjazt9pFbnDGQKm95Fp9nmYpVJKd
- V6/1JFNZYDpnjzqEPb8e83DHpKTYHogIfRtScn4/FI4sP2eQz4gWpOBhZycIufOPXPRUx1UDkbSiFuCZ
- 6gOyw6EZAzElSQf03plKUoWb6kvSzQbEueA2HOyVEfs/Uv4ptoIH4T7V4ZmpAKpDv9s+M04ZbDJqZZ0Q
- LIBoAyntR9eeoDPzBYA7cN6pzjySFRDWAYzCgcNqptHoGl0GdysQ1NwhgKZo83YQD5Hzkch5BygdREXr
- 4i/gqr619nCknCj03AnKSNLg7iZppj0I6hyRmiAaB0jZwT6eCQNFlUiRj/b8OQ/0vQphSgLtGODF4i3h
- B6WZ6LQAJnU7rp69/xNf/M/Nvav/+b6n/eT1CwCcEk69zWkA04VENGVxsNCFsOAoJuZOBTY2gzBiVTzy
- iINcGxc1XDudFS1lZcV8dx6xeUjamPK/oIDdrgLop0PkA/RtmrJqElh9Th602OfYOsbRE7HIjpvCjFqS
- oUwyTBWmvB8VEhNMPbiIX3Je8CyDfJyTgxvOjb37LUMzequd6hpA86Kw8dwJR4VVKVhY20gubaI04ZSW
- y+w4gUKggT7PVBq5NIZ1/OvmIi0nNmQT1FeKSGw+AkRTpLQPiHJeZEzTEXK3C4wlGaHlnejyIlLaRF1d
- 5qIa1Eq2mHmpAHLUhVg2VHGzLuIz4bl6tpSReQEVrSpxhyTgoAPngeBIXLoulZKRK+0HDIBch9KiVvmx
- ia9j4hQAZp0GFC19CMImtcZ41+3mST5xcnCMq7vm+pUA61++CEccfQKGTf3elPAJUghkxiJy3qYNr+yk
- imKJnLwMKOyn6BaEoLKSDuvgO7nBSCKmIgOA2CifKGd4b9yXPR11sw42TLYSRjgQiPw0Dxr0oWwpp11U
- ZbVyJ5fbx1BFpLqki9R6bQsknQ+bctI2beRcg2KqQj0blRv9i6Q+z3kZuTtC6+1t+u+BY+uLWq6OL91D
- odFU10o/ZbF5rmV6CCLQkXlJxTYHYIPM6sltmpEyAJp6lpDSAVT1Faiqr0mJ0R0RVKhEHSd3xyBPbwfw
- EoCppOFpVUu0TaR6D1I6qAhC1dPjEai6BuYb4dmO9orEsNYao6VDX3QhrP9VqRydTLZyXhEKOA+KloUe
- LjmvqNeAQYED/8VNaToVRtUDh5OiGzc186ydd2Kfn3mEJPfsto/+wC+lo7Yl3O2hj/3mMoBH/8UbcdKo
- wUWfPA+T9W7/+KP/cV7X8f2QR6rqWrj70lATAAdVa2pgYB367AKQhmVmO2G56kk1Fguo2Gjs5k519CYC
- HsN6kwAoZDQHueWqVyc6Boht7suaMhqRxx6+GlZY5PX3rYvir6EZXammKSeG/TfXoHRIFWqWNfXfKqlv
- MKJkzsi5vSkKAH2WVtIMtamXtUchBBUKbtCmsZDzYoFkG/lFM5qE1nEh1oDzGT1l3YgzmaPTWG3YGlVW
- QgBoKWaftBNeHZBUOq+ItBc1jvqkaj8ojZHb46V/wJZVdD6RYh5J/0lHhcnVoVvNSBoP5DJdaEPjuw5C
- sFaHj72HIezAgROBsjUL2azPlsEYyKFAQXVafSuigI4rA7ueRZG0p7Qqv5MXNbiStp9WMZ3iRz7843/z
- 9snBzY/uOvOobzwDeOQf/BUmnz0PV1xyNd79hy/B1te+eP8udw+zKJTUVy2lQyAao6J1bwSJ3bU2y/qZ
- HopDTnYMALtGWpATM5toFVlkrbOKXPK8gUjoA3AUc+z8ZGKundPvCjMuKGpfucx3XeMtB7BP7bRdNu1/
- 3TROGvEOt46EVATEfAPKwukwbzDqJRIzcnfTCIKQgZg8QhrLTMGmTngxFN8MiWxyMFNFI+uMd8V5OdCn
- ScEzSUVT5ORa8lTaxVOtXDOVJhqLKnS34ipTLu9WHQSlNRAmIMrIvAO5PVL8AtIBpHQQVO1DztuRu6OQ
- 8w7kvFMD0ghV2uuZgASKmfc0JKuLTkFJgEW86JwFn5yoWjGldSDNXKRWgKwjrRoGSBgjYVN7ANo4dw0A
- wR0kmkhQolY3PxVZemIwTQTeTBNI4/QAqmoffErTtSfy5uzxP38BwJPuGwsA3/mbf4or3/thjFvCd7/g
- OXSfR/9/D9rcc9lvczc9iZSTLc2LCQSDLXp9RJvaOd0q9RiEzCGuPCoKYjUwMTgp2IammrZHvb9oF9aV
- jIPjpi/qQuWkN3y61q/zoBpS2yg3Hw1mpijlAEckWOhRyAleB5MQ9tTMgpOTn3igi7kqQclSS27Qtcc4
- Hx0GXPH35pto+5MKT+T+PWGdwOSq6Bqoa43bnTnmIXvtD8sWqJNAgamOtsyJ2daRIi7zUniOxUvPFXMU
- MWiIT0kqK32Mm5LaV3tQVVfImuiWZFOnLaRqH4AKXd4Bztslc8AQVbUXqb5cdQMHjoWAs0RzMCkxZGFf
- gA7E4Lwj/AzgIDhXs1KdQR+xCu4gBlDnM+j+KWpFWpaqgKjpHea8IiNkqlxP27Ibog65zfd4w+OPWFo4
- cjue9Lo3fv0S4NF/+FfY+8GPY+mE4zC87RnD13zX937f5Jqrf62dbp5RNlYH5qx4OpMqMiedqlBsfb4e
- BD1c5cWq94KIKyeq/V3l3PEo3yUXkT11Zz/xKZz6hSkFd56piqYcQ28iA5gGFZ4q1OHa/AokIjNrkO59
- p4QmtYia8yUQI9ElB72YJDopaQQYqKCEIsJ69NXuJuwFhP4FssinqwgGIyFxB1OegeHfTc1W14ec2mtK
- 4iEkOqR9jko/51Yo9ZJLhSMvw3kaDGfSOVaDq4DOM9HXMqrkYE1HtImq/hq4WkTudqDrjtfmnI6PaYoq
- HdCNNwYwVPWfiWaMhERQgZIu5JyBqad6BOZeTejAeVmmOl4adiDE2n8KeIDRE50qFQWxwDoMXgEy8yc3
- Lkm6N6Tf5mNTWleS0zbdB2psw/Vp4z0HT5zsWz3/io995rozgAf+5p9hz39/HsOTTsSJT31Stfft7/zh
- zauv+sN2OjlDkFi7kLsdyHlJP9wIbmTIDTKvqKvqoj6aNuD0ixIPodN0pszkXc7LRnWqoxcZgdIQMQsl
- +NiwGD9YfR/qcm8Q5kCygS+WfvAxgYcCWIHNqrlynjarFRX0AQJ6yiswg7lGzksi+W2yUrSlPO5UUkma
- Sp1KW951L2VAV7TebuQMQD5vEUAxkQ5GB2KjugzDBGhUmmVpQ8E3EwfAlBInF2EOsGok6D95RRd9hyKn
- FnUZW21uLWojrw0BMpfms7PrOvcQINpCqq/RzOAA6uqrqJpLpUOf9NTFQD+H1eEZlMa+BjyT02ZdHHP2
- +Ag0FbBQXvKyztx9BUk5kYxYf95H6CHLEeDcJNw3y5D1AKExkCYAA0kDi+yFMRJa5eYY3KwD8+zYdtLd
- bv3KQ6h3bcf9f+L51x4Atr58EZZOPwkf+oMX4Eu//vJHzvZe8WJut46SWksWuDQZrKG2KHUULwuYxR/C
- VBYLmVwxuTmDpGqmDzjzUSDzQPfrGExZhUCsDKi0WZjRk3xy6Gef+1dOfgpNwzos8IDRdrCq6c358Y2+
- 4jDpPVjUzzhxGSkjsnBelsZOXgFYT/6kkuY9g5QqyIGxZ0gIvgrX07D5W/9ykdY66OhTadRR9qzIGqWC
- SDME29gtzohmIGxAcBjZT3YZyW2Dyayxa/QvhQwoex4owdzkuJIr+5CbggwUYzAtWWZeLOIhnEDcqUbA
- qgYihWzzQGG9Nt7UphtNAiMwafApzs7u/WjehL4NB2o6sw0ZC1oaz/pZJVhIVJpBGBDKTUVymitwOfgM
- kisiMQboeEnFQoCOV0QWHJFWTgB3o64d/n/bb3faSV/+/bdiNEp4wBOf1Q8A3/GCP8TgrvfGlb/1Ipz9
- mKfdY2vP136DZ6snumwzcdDnm0HIHpOiQkJASmtISgIRNdWqbGCH2LJi/Qv4w+vJrJ1yzFyv35t4psOO
- ov9viEBvlLgxaHKDBy8XrHOajZ1n6bjixZ3/nf22k/cLINdsY8W8GIRBB/ozk5I6+wix889CHhh1k8Bk
- q+FzXXZ1GVUTvomswdjo1yrVJdMc0sCmG8AnInqvOCArXeU3g9JMTlLKGvw75LxcAovjRWrXTxQcQNFs
- cEYlI2yKzgMEu7hI6exL85k9ixCjDcsGG0mn7Vlnlfjy8i6pfgCjBw8PtOXiGaEnsEJ7My+UMXVeAmU7
- GMTFWDQxFVjFjSYpXSEuIaJebcRae4CVnkDl42ZCQqIxUjqEhKyCKhSOriGIpujG0yesXXrgb7affer9
- PvxHb8BoxxLu/30/VgLAZrOI7m9ejV2P/4FT2iu/8jIeHzjbUlK/UUwgniKlVVH70WieaA1VOqQ0yIQu
- r2iEr5XAV7T8jCvgWmtEmm4ptprN2imjTI5n0tlVUI48UCWZuPZ+DkSeOuixa6plC8cNQLLWUyjjLHcs
- 0pqTM5Arv06isboE6SKiqdbqYl5SUnhSOegxDJDCCuoQZRcAaV3Tzrpni+4pr3vB3fglAHHQbqAoq670
- brQq9dYqhHez1+uRgKg1vtlycaNd+wHMRLZgNEhFW4ogJzluQ5BxTKlsnliaGViGzLjV8Ag5GG7WnjmY
- wCa768+gPG90ofRUyq/3fyZa7wfPAHDIYGW8l3hW1iwzurwTOa+UwykPnM5ONJasKi+qVJk2lpUcxMaI
- NMKTahbKu2spHRS6DYRmcHJQi+x9mdWUp+vfMT208adn3ve+9/nC69+Jwa4V3PsxT5YAcPL6lTjnEx/A
- 5IrLHtdujh/uktxmZc1tWQRcXFqhowtXRJEnJ8m7n5RwoIRt+JKWK+zVNPS8oyynT3ZWXbFTKpLd7P8r
- WyjgA8ImKtoCKCMli+V+slhzKHu1ADKQsKEWdQrikmMzFH3Aqae7ibY0rjQyAkRbfAlU9YVovUiGW4w0
- ocmebsJNkAGkTZiXIgVXnIJjt7udC8jHHHaBAMzSdm9e1vKKPWiWhiz5QFfktGc67DH9PyhHg3xzoSf6
- 0um905P7MLEaY3XOEMe+AqgxLb+Zj7FLs69yezfjAjhVWI1HPd3W9UKp0KCh6tJJdf3sgMlWHgIFt8IJ
- nBeRoRkDhHjEZjmXNkDVocI+pC1QtaYCKIvgbgdy3qbOU2tqdDqTwMoLipg8AO4O3GWyuv7Hx9799Ht8
- 9a0fwD2e+31ytdOLPo1n/vQzFni2eTZzTjnvQJePQM47JfoQ+bhH8PEsjQgSLbXMox7FM2kjzr7PISqz
- arMLo2lQUjyV4GZzDaaoMdh42uioJ0/ViwmI6cuX4Yymlt64MbHGQPCg4LfuqD2g6AlGpKCdgBPYuJJC
- vUqUZRZNE8kA0iZS2o+U1h1c47+n1GLOO4WYgsb1E5lbdN1NIw9ugcv+KzOBaB2UJn76inquMfu0eaWi
- Ia7nGO+NGqPEJN6yM6SJ/2427oU7KlXe5SGaCe4kbRZ3J1SKSyi9AVeK4jjGtXWjJiFKpUVSrX0/wGYK
- B+7KgcXqJJ312ixd90b2wIlAxVYuqbpvYPUZ2csP16HgApzhOvEpBVjrfq7UxLZWtaBOM0ctl2hVJg5c
- g7gC5QZmIy6HUIucF5Hzivw9TcHt+t03D45fvXzKsWd94IV/hXs/7HGo19fGuPLygytdO7kdMEDOy0G2
- eYRClVRVEhjH34w1p+bDIlFPlW8k5VoIPnA6I8+Ne+cxaiXJTHVcZ/WhdvN73fByzheNwb5BRMHjk+sQ
- FCy/NXE4NKbgJ5lbkpGdEL4lgnRTSHf92LTsYOy/Q9o7gQex5FkDKQbBkYAAkJfkBOAWuVsOrMcbOQNg
- 2Xg5G37BniMA5ctTTJzUqadScFVUficf18LreVlDsimdku14eIHOprSqa4pCGWoS4Cb/PS2deRee7URC
- W2tnDkhT6bFs6MXXYMwUn7JccB4+clYLO1j5Ro4nkc/Uagqu2ny8oGtyrC2DZekp6FSAkEC0qSA9w7to
- H4xEJDSlTekhWCpv95hHwjo1CjEUOJRXkGhd+hDVqvQ88pIiTDc8YBA3UoakBKI1ABPkWXOfdgOPWr9m
- fP7yETtRX/blS3D0GWec2nbNKYasQl6ATQB8pq8MsaQSRBJtpsrplxM10Uy5z02RAAcrxdWQW1sCk+RK
- 02mtF8kaaXWQ5UpFTSXITJm3oPQVEiIt1zZvgRajjBkRLJrsFKIuqLaq2oyNwrzfUNLeGJSM4kppqzRt
- nDCkKkFaerCBoCxTSmsClTa0Yt4uxBEe3STS4HWdsH37EkpnO/CZLHDqHF2e24LfWUoFXUlgTCZTbI2V
- vgsIQtQ0HdwgQ/kTqFRKTZuyeZubrEjtoDr/fvLNQGmfcuRVfhutSsJxkXQn6ZYXARlt9nIFQg3Qhjr+
- aMbjmU8Oh54Cv5KSeDAVaTMdDZKuacYiCOuiY8gzkTXzNTXRkakJk9ghMgNoAZkXQXlUSmwi33ecxiCz
- NDPlLaM584LSpDeQMEUmM7Eh/fmkQUIl7bJKndMEoMGdjr/PjsHW/um0vvhr52P5yOPP5lztlig6RqYB
- CiVPmwvePe+APAzw320uWcw8QFZmnP2OQzy9waebPs2cIy3dV5NLTt4osm5o6cpGjTaENC/Ic/s8mwO7
- qkCPe8w9DvbLrgqUSkMGJtNdoTgNc9BAUIw8sjb8okCj0ZJnmi6jwIYpKd3ZrNRmSOkguNumqjE3fg/g
- rLNOxmv/4pf75UevF8lzf557BtbBqSq8+c1vwev+z5ukd5jWtFM/ks/tlOoUTvgU2JaWMc0U+daEnog+
- g7xdpNVVLNPqdns2Aoyh4OY79SahMQtl9Mh6/5t+r8AFbiYo/nwGxmmUxJQCIaxTnILKeFf7ZCJAtW9U
- WfPrMEIaOAmUtzOMw0QaeJZNOANQg5vqH0hjfUOznGUUarIJ5yw5rsJKmq4bKGtTgi8zn75xxXghd5jW
- J5x2eywN8sVj6jaYsd3BFK5c2qKMSKTbmvMuAC1StVcVSyZgrtGhUfDDuuPhi5ab+qdzuVhT+HWChaY4
- 4kFStP6LY3DJDIA2bHxT71FnGbeHaoNIpclYmcCoLShtDPUgwSFwKB+BwvZ2VyI/obTOi5mFlg4+ZaAI
- Hw7sP4XGmtSTlEI3fgBYWBzhtNNv8215rd27j1A9QSpCosomj43CEkaKuSaUOyByV6NA4uICMsqLAC8r
- PqEt/gv+uqxw2InyE0ZO9pKl1DiqUBCEOk3g2tWARAfRbMT0kCJ21SE3rtX9UVSJrPSoC4CJ1uWa8hCU
- WBNKG3u3nnWW/ojskcyLOlrstA9Tl5JR4crMI2QQquqAGOrk7Up3j9ORAYD1sh8zlvJsWnFOSF+58PO0
- sLi4QFRlBL8yS4NJN5bN0KVuBzJF51y42mqVDmq61/gDFJBEjSK4aMy93DMYcxw4D53m6U0dp+paJoAy
- TXAXXl0E3AS02aJGeyiARDc2hVPaZtyMub6CattR3yxUfqrMZHvAIdNHNMRXvE0cG5MoqjiGiEwzUHUI
- N5U3wLfrazbrVDFJFzMP5d4bcqWn01jYfqyIOi/Fim2UrjEZiYnxzETAL3mHnMh5pNLr6DeRecHvd0pr
- oq5jxiFpE4k25QDLS4ATnTRz5ZBFmGtwHvgaFjKOKiKliZ7SHPoHW24wkmhLm3+LahCjOIJ0UBuhlaBt
- u52KrN0mKFuYa9BNSFydAACAAElEQVSiBx1pgE51hU6RaDUIt3SCfaBOAXvLSLSm98Np6wOmumJUqO/2
- nU9+xOyafS/rurwTPT67vHzOy/oQtrRmq4X8Yy4lrCkRN1JzuMKO2HHJPL0umHdKvU6zO8KkdSULTcBU
- K4tuGvTSNU0zKzA3b2hDDmD/LddlD8QceQ3H3hsBWtnBsfBNngH0Ov2BRUgONonNSNMZNHShuhW5MEpy
- pyEojpz1+uBiILhJMoBv51fOrA1FrZUpI2EVqd6js3FJ9RM3qu1Y9AOsnwQsOxGHNdsyLgmb6QYPdHxI
- of9Sy2mZxuEZzzzVl4wrwMXNKCboSBpxB8YPYCpZio19FQvi4jEuMLogJy5N9O+njqAlzTJEAr9ki4QO
- Wef8Io6qyFdSshCkr5AVfUppTbot3S4FW1l5OlAGoeg4MhNSkvF05m0gDQSZeXdqmhM44Zp6sm/fY9tJ
- dQeRHyJwbsJJp8YfWocYgCNVh3oWXTK62yof0FJtVuFGmAR3cvVgdgMN7mnESSq8iYpVLgmmDWDGIkNH
- jPXw/crRF785waY7riA4BkmzrhiYFDkyHf+wzX0Du80RaIqLd4ZgVP2J6kBFcYiiboGTZTofqRVRigac
- qyL3dDP+amfKl+ChBtBWOQMzVcqxpp+OtXTuLXcxl01j4CL9vieKTu9WkKypNFEnHXeFrxPGcOPVCB5j
- cnUe6aivwktEayRq09Gh50phJ+M7oHO7N2tes01P0qaSqBYLMpUHEpSyqUGNBDugZYz0LeqgjqVTGYxE
- gSuZlNpIHZMYmQgJA50OmKz6VFWVjQinzMmcACxJec7Ynmd0OzA+VVNua3a5arhoJimiy+WxodZWxknO
- C0J+IYGxyvgvRGIMA3qLfR5qwUAaOIPAhGtcPlnMEsZ9zXxuRLoJnQo5DPVB62bmBkgHNdKy3CRXkCVx
- DwIpUk012DmXjCDuYdaAQvNGHklHPzrSotDUNGFIZW2VLEXrWsohYJqacEZxOe5A1ET/x5vtV5dZNkNl
- gTCB81DGUYaaJIGTU16WYJ63oShKKZ4grQuQCLUDiPqDYYWDsfgIRLEW1hPRnIIEvq5sO+Qgbz50aXHZ
- wMkzOUPjkc/37dwuhwIbHoWHroNAqvkouBERFMmodB4/C/J1anNnwCiw6BwSNIO1XlYtTMy0pU3IXa7P
- AMx0dA/RIcgDKTNogswi3ZfSfiV2SWbP4FGetrsBoGZQ5yKfwcRQ0qwhKB10ZpWcvtoUpIIEo7Smp5iO
- hgJl12ad3INn1o4GY8WSu9CEA02yAjVsjm8lQKvsOyMgmcnmWNNraAARlRdrIUr9tQ1IpQEpfm7Qhxms
- wNzFOGmjr2gUsI3pgsOwL8hgMGKlDbnpp93ToLJj1Fd5evr6U3Td7OYdANpQ7hniU5mPMqIirbIsNd7S
- ocqidrdVflv1FKJBaDFxic48gyIQk0dwsBqTjKaNEEYF1yG/36iST11ovdQWQhinwtFQu25XI3Z9y8h0
- ROnWc5KRuqsONfqsNYuoDoliMTVBwJbVlbhT8t0Qhv7jvKIHj46XaU0VlIYgNuvygcj28TYQtzoqbVSd
- WPoUmqMho6rztEM9GKSr20ndArl2fh3Z+G/DrYgomeLqEhKtKgpPomDCTCW0yW23WH3OpRNrJ6XahSkB
- hx3LT6okpHUzCRWVrPvq8tHJueImn2wsr6L+a3h2U0st7q3QNImtFk9m/qngnDCGtOsphUNV/k0FAlrO
- ojgCZOdylR80PEHJhNibjm1QM7p5NwABIOeCqIRKpIGSnE6kqDQTaXVOvKXNJaOL+HsHYzm4zDahndYD
- b6bBRWAr7dK3KmWniDqdMllZ6ZoVWsayagJIc29TKL4mh8ZGMCo5iOFSWVGQhe+/oAfYQF/PRop6+qdx
- YC9WoGpTM27SIJCdi0IEFTHR0jSNIXoWQ9XWtNJoIvuVZBpX0YYbmZgICfEElJbvtOPM0bBuBvR5oukG
- c7Xdm9VMIFJZJ2503r+kkUcpngxUmYRXDbj5hamnCJFnXkpJF7gBHMzTzH6GKq3FKtffp+A2JNcFvakR
- 5EO9tNAabt5MUVNJebha49OaiFDomAfuO6CzaO3ks6naeopvRp995R5SVxey6YJTVimo/gJm6Og68zD4
- cj5Mzfjm+MXMksEo5oHSxBuC8ixY0Z+qhUBTDb4ZSKugzFrnBgFSB2bNS6YrJ4E65LyElLKmvtsKWZwN
- 7j3V69NnQ2ZUuiioQM/utOuOWvUKK/8nE4F4QSTt3dGHUHQlt/Q9VDOSh8gGe0GZfBkYLWEGVAdBLAhc
- 1o59YcAOXKZNqNamG7jl2ZEcVmKJJsrcauxK04I6pYnL0clXDeTu1K2rDi7WOdWfT+nQnpyXtrPP8W2K
- pZLVnMBYVGQR6yhBrI6S1l6+kGnac+l1iWzXuy+iGFajC0IqjtkGChwxOekcUvkKZe5aBbsuQwjOwvvY
- yA8gbBVfAZi2X9Zaa1Z+1qYGZsOsQgvy1fhmNnZW+ZqqIIOlppNQpVaeVro1ehDccEn03n26uQYAQLBE
- pF13hfVqr6eYsujJpf2f4pDblTPDIOjG3eChCmkamk4ENRMUJ59XAKrVRCSMlFV/QLbdllCTeeBqPYWb
- P9VUv9IxmowvE63JjF2Vj+EowKBmDVNECtLdSD5GlAAz0FbnBCBChwEqbMihkiqw2Y7RppYNk77/BG0q
- MnCgXIVG2bQzzbbZFbpYG6yCIRjPG+VkoH3H5z/5gQP1Ebt2XTw5tO9DXTe7LXMTutcorD9tBkoTdRus
- 656qgw5mEfjtTLMGCiKcBnrJXsL5OAXTED1N5pu8dpExzNSvx1hZJcE2IUf2Dm3xXA/pt5J6cl7R5tKW
- jvK2YAQhE+UgP+UHrujL1VQbPvDFTEwuKFJYi1ZB2Wy/mmPRQS2sycdann34vcg3i43+9TKA3E21W84C
- HdZgTq7rsKh8fuHKE01V5w+qdyfCKORYDJV3V5ZiCfDFxZmq/UBeArCgtbE2H813wdSNeFGhyMVJiF2J
- aKCThLEG5yGQV8A0kU69BvOijswAbQqIjMU1CTxT/ctZMZqhLYAImReQeYDEi2BMZdyNmWfLxUzVTv2Z
- qho3znaVzRwYiQyd82dXaiLaUDLQDoGn8UwBQdZsrD9P1fgfz7zDg5C++NmPjuumfnuibr1s2BxQSgPd
- XC2AkYoasjZ1xi59ZYYR7sHXWxUU/k1lJOiU3VwWv/5ooom+Z+qJcXLQ7ovvCaOuUjj5ufb038dOeQHc
- bS+lJW0CmAn6iwdKylkJAaS4zBbsWgopvbHBdLyE0jR0vwEvYdTTjfQzdSsq3BBcdG/uPQDmAicOmn+y
- QFVgxBY0W11bTrmSIW4VtySaIlUHZZO7ylKQnOMF6Q2kTVC1T78vJ3kitdWiDZkq0FRRmTmMXJNPCors
- t/YutLnN6kZsfS23x4McZGSZsfasSOXgZPPrmsYGEjaRfUpk164GKgwvoyUjLB6M0FSe3BK8Q00HVYtj
- FKjGQSdAy7DcHaHTkBYZgw2k7o/GW99xMXgd9e6jTkDTNF8Yj9f2I3fL7L8405NdRDoFEFQWaZU2AumF
- kJhDRzyi6jhkEtnHJlCyhWOpo8CXg3wmOgKqgg6/jdXMD23iqK0YcLin31YUiNk43ahgjrDkePHFIs9M
- M4BqlTWri2RYaPyUkVGnKWbqwYYNh8DI6BmO6lyciUvmcDOv/f3Wg9F1JdgxlD2nmH35qBMQGk2FZ/K8
- yMRHsmZglb+iWXIxL7loiWx8W6uVPvOlwDMQc1q4wchEtfpnel0KJMo1OJHYt6vEtilhuYIxGy4g94Rn
- 5YDU13cRUJ13WZZnWSAPJEBhKrU/mwpR5bZppO/t4Y0YCeOideHZojSiOYlWI+eV4juADGDkegtCM67V
- rQlIKV21uKt+/0L+DBjHoF5f3Y+lbUfcRpkFCt8FCIs61yxSWaUra5TIkW6gmafqRTgknsjWVBDgBLtz
- rKZlRHPNMDPQJI248BOdfJNJgyN3292qitJB9BWCu75YiFM+1dXI67hWGpOdKrMkGS0K/BJBqLFnVeF1
- Hwf325Lql64+mdw2m/XZwG3AxIfPGqg3cwAArAmoUxwy2fQiCks9dejOzUW83+R6gQuK0zAR1plPnmDO
- ur3Teaqp/5KyMlSxx3sBjQvaMLFvWMkKs6sYQ30eZXw7U+LPtBwiyNKwAyGlTW3IjVSbsNPeUFKcQ1cM
- RjTzkcOqAzDs3QNhuA90LcTmeEHDiDyfxKaMonxFaUtLkmh3x4FApIeemPbcppsOfmj3vU55+cal+6bp
- 8i99Fl3X3Q7I24rYYqX1r3mtFXFPe0OO+HurXxkoYp1V6DySp+q22Qs0uO2dglbXFFqqNS5MlIRdCAk0
- QzIzTtvkqpAihJHFwhvPoyJpFcdQrn2v7KnqEIwMRLTu/HT0fIyiISmcn0DUes+Doqa7st3ItOKVHCRi
- lVvBZ6BCzkDXtf+b9/j/VAEgd6wAGELX7ZZAkCYemIla1e2ze9OqClEpPYlLh51dXiyhuOMUliapoIac
- +mvFYzJb/a9ZgpaMCaZcTG657X6NMFrtyLUIesIzui6l+W3itEEB2eTKfG/o972mN9BQKB/Nrcr6YF4O
- KV1d7xlxFuFQ7sRYRCXuOWtpjlbUhXhRA2Gj41GVGeMBGBvD8fr0F676yEWP2/f5fUgP+ukXLWZu78Fo
- a1dXURKL8GRME25LyTRtOdkpYOuRixMQQWsqjUjMiKyYwtaLkFvl8esDI6dqFmEIqamUZmwWTtR6nSc3
- Vim/xCj4enOeHaJPREH4LK2rrpI3rFBEQ4PrUDFojHN+m0h0btJQmlatBEkyPMPYKceue0+tLg4C55tv
- JsDMaLuxYi9qaaKZuk8yVVs9bZMy6gx5Sq3G2a6k+UFAFDH3chRlq7Wx2H/J1GhNsjizqvNmq+FbNtXZ
- aqt30LDKvNs40BuFXNwsimdfFZpuU/30VVkHCEY1QOAE1A6Hdxl1G0H35NRIyWwjwQMgqfT+gp7+WVS3
- jOxkylraxJQKglXHo5iHEk2BPN7RTfITtp3IS/WBr3zprNyOH1Tkr2wWbxLbBeogTTd7cUHhSSdXP6Yp
- q3B2Qgz3eN9+dmtnV0U3EXT7ScFCpthDAS2HrBroYy01xlqyqDCENmdi5uBiIqw8AqNv0qQ3hTBragMG
- wbnoCspQkAXStAQtKu4xsUVIAdgpF2FoMKCMK83ApIKPX3uWYTffAJCznDZUbaBqLtR6u3FRlyLtZiVY
- LUGSNT2314o27GaxZRMmVrNRcxWiVmv7geK+iqMPcescf6ZKegkQqDHxpvaSTIlX/f1oKrwXE3PpsRNb
- YQWmsQR07xONwTQGkyEG1eRGS0iBGlvZRz4eJBMtRVP2HoKnpZLkpGFNrrFIpnlBWy5pl0x/w9iMvo/V
- wUuViLnrztw6MFmpN67Z/4iu606S6GkgmYk3bpBZsfULKmKgaCtVYoFqxs/TN1mjHaMG5xESTTwad7yC
- lA7qgrBGEXvU4lBHR3tuCkKgUEMEae4s+NyzpOqVuKeqVr0ZWBQu/wzFtFQpoJhpCaL+ARYMAIU5J11M
- 0e2YdQ5r15VCqgovX4pxpmu2x22j+AWSBXAzjgGSAWi9zgUrQcoHYe24e1pPRQ9CFKbExTeTkYms4ZeC
- bZlJihs6JCgwuV5hEmBZgPUyamWnmurOpk4olLugAqGy0bSZmDYls8hFNi7ROnJaRhQwEcRsA0rrSFgI
- 8GJrKiqBh5eQVPUYKuyZ2UoP28D9koK7FYAax7jICDrK7icQzyT4cCWIQ+bQE0jh+Xh/LnEH1Hm6dQpn
- aoQQVAemHYHSuvCJoWo2bCSHTeXJwxs3DrntfeWArjJc9QTJZZt0IURdgaj+QpVv/ZJM9UdABBtJtppN
- dAAvofNGX1XIJXSglym4d51hBSjLaNMX1EivpgnvHRst0eAzFWy4E4Cmzq9wHEVsFpLVmJoBkYGDbs4B
- AOA806BYqXAFNOhOwjSAgmiFjpIBzYZKsdgL+D4eg25cc/KtQiZl8F61hHNvPh1PU+0CtZJSjLTO3oCL
- e7r8nACNpD80DQdT7eAhorG+Vo3MI1C2snOo4DPdS3ovyG3PoGKjgpCk1Orh0hb7syw0+cyLCmU2kE+D
- hKmWUATOS8io1YlZgk+iibw/NwI55kqb2mMjMY3SYLRSE/GXiWiTOS/Cefya5tKWzBlN215TVj+JXbct
- Kt0Y9FKwzAnrQLKZ6kR7CtpUY2izqMTy0rUv9tygki5STzbbGjCqU+8p9yoqnqr90laIhPHUTUpW6cIp
- Yc7GeoJRB+TtMN0/hyn3gpCpyuRyX6gtwiMuU6ZwV6/5BqWpSqa4bI6yN+8MQHqYwoLzU9DcgWispBrt
- yZiXJJPeAz0BuVhwFRVmZddR0eWHyXuj0tO21sywVcz/ll5DyM5oFshk0pwUcFgpXXtUb58oGQBHNi17
- mTkDaABgrMO0Sjw086KO37K4KOW6fF49vQkzZQN2On0yLoQ4XHFeLqr71Gqg0h4FtwFOX7uLU4S0F+/E
- 5bIHhFhwNHLzgHq0OHgNeLY5m238StfhOGEXNT4yE5VRT+QAqvTGtv25f++r3EQTxDTH2MzLKn+UgaQb
- Us0fGYWX72NBqxcpuYLv4TuE5pD5mhUYaISjC3BM03X3EYcHnsNDCAahaX3u9xsX+hT5pwAl9uajYRzI
- +wQFnpyVxWUBqD3sPW+2ASADBTNSFYMLmES4Ot2aDJwz/SaO5S+/T96MY9deKA5FFLnT7kXReMMuWYZg
- TV2E7rzBfVHEWY1sZt4SJkNm6Y03hBXJ6s8fwjwUzT3TtRwh8cTpvuwaFgqXp5I9ukaE9bO4QSYJEokV
- d8C2Xk1n0xSMEIJfGwKeZNCZF9UG/aAGgxEY7VKeVY9MXdetfu5zH/3jxcX6JVW1sQWIhVOhHvYeLwrF
- ty05n22ksPmlJt8eACHs9QvRlgaWSBJKDv2UkU0BQxRjCe+vh/cCDmftVeF6uaAEUVRmS8ZSFG+LNx58
- o9pkQEYrjUdvtocGLohFCk1FB0BJ+itvKSkfWYBTUorUf0O97gZ8M04BWJGArCAyl/Q2ohMvqOMPeTYk
- AVYFNXmoUGDyvo88l0pm/4auA4IOn1rLkeoAuJnmxP0s2A1dVS4OQ3C3WGbxjuNW70E3DIkELZaUnTr0
- rc1GunlVVZmmgligTSk/ldeQ0pr4RJhICHWunGUQY0YjuhvVKnwaogrBmSrxoDSIOo9AWmK77kDeUfwq
- s3p35qUwxdJ7wwzO+aGpHW/iHvd8MOrhytuJ6HzRTYvqu3Mzb6AwAlHMLQvzSgQaMi9KPR2w/JJqjYOM
- UtYOagMKKbpEw4gO7HfIuVdyWCkwf63BNtz/nfwa5ZnyXPmS0Wd3jZ1hRTbWQxfGggTv1Mb3MOEJrz9z
- 3ynJGp1cOSWYA3mKb86KIMzIXavc/wV9PLOwpjiQxVLvwHDgFGfPoriX4+lmVRKQ3Dcd7Zr6sjdTUUw/
- vKuu6NKoOKQOvuhJz3MoLdBbUwJSyvCyRtGOkgUOw1pK2gDfVsbeMICbbuA8DNc68LVHbOrVRlSaFRKa
- NhtdQcmIed5HsTG4kfiEpSr+gWo0ooEtd93udO8HPRxNs4j7PfA7r6TUvJOoRVLr6n4GEOW4S0DgAJIo
- eXgnozqNthLprBYZesZg3nuOCvQz3rZDNPIwGFAkAHOJko7GI0S8vqeGfsmGuOj3LPpBAGGxTdUFaVAW
- m9XpbgrSht/twumviEeyBTNDsTozpVvresj9yTkj38yBQG1H3giFyVjxQGf0ZolVhcBonPkhMpYCnt7W
- XVGILqk+lfl+mqoRq2EspgVfARuVTXSzt6ExywHmGxuGRRPT/9vtwCqdcIw0y130TDGlgyLyWR0Epf1a
- 5s565Sd3O0Tfj2oXLvXMGKZ+NVBBGQanmYw0LdFm8gmb30MQMhZVt4AKGIiUoqxemIyBgOR4UfsJLafX
- vvo3cYczz8bb/u+buK6qTxJh4/DU//CNP/83/l8U/fLKhnKwkMkqe4e+nIBS4liVX0Q/y4kfbmTU3/ez
- Il3LdVtJkcrp7gGJ54KGbXr0MgQOJ3dJ3aZgLwVMXMJKGS0HnKbcB4YY8cM0DnyBqGQU34zHANn0ACy4
- A4pRl/sqlnBDx4ew2sKRAXoUMMVxwkLsiD/r3HPerpsvO8KyWL1NRf2XNr2hTSE7JPcG3NIGc1UOuTC6
- LIHGnp86SXGxq7PRJnSkWBSQWLPdLeeeiCCqIg/zArIfKA2y8QasV2Cio2w9hlpNWVotGal4GlKLSolM
- UjZPvWGabMROtgttz+UJpelf1ABwxdXXYHFhiLpOX5tO8yEAS3Nx/bBUKP432QYhS9Zsrr4JM8T0KXla
- k9PQmYD28KiUzj5S4zlVnWs9c0JwiGVB3HDB9POwIMbO/+6/Tgg1NNYub12CiP2cI8YKQlKaWnVYlHoK
- cVADwjCknewCGl//s95MgkBmbZDZZihKzmTlIU2CWUwOoitVSCajJHgD7naXcoJmLhsvTemBz/oJWZh/
- wTzDegKkuJXyqEsfiD0Id0F+3jgDCk5T3IkPnJhBaRqYsyP1HWhR/B8Mn5B0nG5Fq5WUI0iSrmY4PHOv
- AwbJONCYr5lUFHSqV9zp+NCy4aTZu5YGllVA+xqYSdaZqr9LTffLNQBs376CAwcWUaXq0smE9rYtHQfM
- +/LRXCCYk7Cm1EufhalFIO5g7r4yERhr7VsXKaZe/57QVyWma9kYRcyTEU7pIMzFll46yNq6+3VRag3I
- rvBE9ULC7EN93+TUUfMImDJt7gdCQ3g5kcWYkMmRlaZMq0VcGB8CN3dJcM4ZbWsNv+C5p41deUITvScT
- 5eM3bspRmriGlKRgDZeLyi+zazIwltCzaHfwi/UcJkqtbUBUgWi99K6sUUsmDsNza7qsO1m/inR1l9+g
- du2eD9LHoVCWyqsmteyaycQjTZV/MPSxcFYsC2ELot3XSLWvOhpMtUqTDXSkaofdVKd7leJnDFPROT9C
- ltsCgMGHKc1eyi0dqAHgiAFj7+IiRoNhs7a2mts2zE0P2/Dxv+Np6PG/AB3AkgGwCYhmdReqQyMnl4PY
- N3cOr2hpdcwGlNXVM/GgMAwsSkCFmYgA8Y0qQuTyYyWmpZCW53IKkN1Uw0l0gQBl/AaraU2QsvK0Umij
- yVNaW2TMVh7dNKag384vSoSsDEeBnxb6bUlbKYhf1P1gi4lKYdsGtWcna4XceKVGse02hijgUvaAQr+n
- eiJ2qrizIOuOtAHtMmPaPDQq8LwtGlGZEHH/sIhHIekokEzMVE//rOuPKItDEAEZtWAF8gCghEwA5YSO
- AOIRKmQgTZFJ/DcFZZV0UtyiYi6wet070tdQMFDaVJn0oaMtGaOvpmryAmDpYpr9pwDuL92xgsv+8YM4
- 4m73uU/btqf1P338eDEg5LmAEEBA4LkEwTbaAthAGq47EO4xcJ3ZQNGNj8IZMRAVlxkOWQJ68tvzopvU
- MwjpX3RE+1kZ02q5ULlkFTuJSfXmVMbZ3ZW4UaSxiZeoElAve9DThvJNkgHkzDjvCxfi0suuUlzXXBPV
- 7w8HgE7/MGDFqK+vHcDBA6sgSs7jB4mMfOngZ5faFoBNn38ROz3MRoFNZWOyjt/sBDZ5bS0hkqlCqatu
- EXiRjroIi255H0fe0+jsAWTmClHxOZWDURB3cppLJ36plLQAjNosd1PWD/MyMoZI3IC6FpxMsIbddq5i
- uOQXd7Xy/rND5YhnoJyUwhzXuvAfsga+lFad5yC9h8EVqWqff8F5H/rQHe5yL3TdGaif9OJX4tJPfxon
- /OBPjK767H8/puu6lbknj8Nq5sOCw3ygQBA2UOVWkwTzEZv9HPe7pMCcom6eYwFEwsx8eaAdUq/nox+f
- 3iiFNPc/C13LYp8LepQ1mqpgJc18s5dxEULtlwIqUBWVKPu4xjMW14wzsNCNHwS6rsPfv+ld+Mc3vxNV
- qtGf+LTaaBJPPs4rztyTGjwqMsuIuMsZREPkLP51lDYVYrvlG12IV1qOadNK7viKZgad9wCkNFDEHlAw
- GMkk4JKLtxrUmFzAVrUZuUZKM22mAQLBnfgMHXbKxvXOlTMWnXGnEwM2MBdtyHrLS0Gurtiiu0wekszw
- 8wjJGszUgnKFnLi4VRFJRujljdmTB6ly1bVkapENJZumKr+2BIBQ0dVQ2HsGcAmw8MWU+M933e5jb73j
- 4L4ABrjggo+jzlWFyfoacu52t9PZvfubYv6kj2ac9iE79LH8czAdj+xLEn3TrNh9cLTfjvlDUNvx9Pra
- NgaFkyQV0oV1bntoxRgEMJcdzGUEh5UCFrQmuuiTL3iohLQLh3Iq1xREGtwe7bCRpjUTk7/eTfGVO0Y7
- q8GVkk5YNxCNhZTjfY2DQjzhoeoYJlX00RRcG52s98NFLNG54xopq9O787QFAUJNAWyAebs/BKJNNbwY
- KXJP749rNISxMBcXXVca9tcx+PnIXa4I28WINh3UBCeUHBxHwmpKwja1sFJmLKrYWXUnzDHI3bHU8JVY
- ZbmGWr5Uqoy8DmAoVhXW9tSaXs5su4fKqNUSMZM1FCuR6M/L6Fg9B22SgBGYFztK6W9Tmvxuzt1Fa9ec
- PK6aLeRMOP/c/wIA1AuH1nHgsoux+7gTTgV3Rx9+0ifEBsu1pX+HZwwo8Fof/xGAEYjVLZZSH2IcNnT/
- tV1kKfQB4ow2zIa94ZSvpaFGc+kSlfLE0l7KpfHDoQfgZp/igMQBiIEgD1YILLZoImdBHiyF4sZPexsz
- 0Qy5I+TuphAGNZRkpSe+yaIVeTfprFfCzHNdO10lNFWEX3LB1pTWkHlRkX1J1XXUETodUtadKe1qvyht
- Qjwpl4JRrXpSYtLL9vy4oS25x1QpLt/u7wicl9xfAsYAtbXkVNs4rdCAZoo76jgt2Y2s40RTCUo0lawI
- jY4ct5zj4MQblR5nHgJpgpShYqMJqd5EphqcG0n5dR0SdaiqvahoXXQAuiPQ8RJqGgvW31ClaoHGREic
- YD6UpEGIsXLJcLn7ndzi/Ly5he3HfhWcK/Bsw596Pew6HDqwFzt2HnESg1cOT/kpwF6vLQDEbCF4/XK0
- f2b1iTdxDjiE2DMGIt1nRpJorZUWNr+yCK+1HOlf8eGcgfkRX1Av8dOfrj2e9d5GzR9MNclfvkK/J2FB
- oNWPXJUcx3jxLhFehSvvkPNNNAakaUE7Kp0aartVxGFnyMpdJ9c1IHHkURVguacNMq+o1HbEXBjSc6Sz
- 8y2xmaOiRUG0ikSVC2Dmbqf8roHTbKRqG5+XYChARqO6/a0ax6gXIRsST/0YeeDmMe4WTYGP4bTlWhmG
- cH1IpA1ZYXkxiMCa1HgVxEPVNYiHopmZDoGqhA47QVmxEGkGStfIMacciIoOIdE+Zd6OxXGbO6S0D8DM
- QiiYF9F2x6DIj2ufQ4VnUmrHi8ujjaoe4cA1Ged95r8Oe+R1XVXYecRuAPlLBOxl4Pj+5urm9kQAz1jH
- NG4u3wPkyr+kta/MOSe6cODzUI7R3MsKwKTCYgeADmsV2uLNiOjEax1VzgcOupYAwXHSwK5l2IM+O5Ak
- KyqLhOqpaSIZ2IJaTQICwwxZsN7IepoOFHcuikDXTqu+sXKADEqzIHAqjagKmyg+fI2e2glSfxvEN5X7
- EzwZOC+JBTdMvBKlqecei4UtWKS7R0A6IE+cOliXXjTzR15ysNpukbpXG9zbXYddgt44BLOCDTApt7RV
- 0n03EpkVNWyKWSZU2mtYRtC87AQgyRi3QGlT7mNeBvKyZjA13MzU9P2w5XZgCYdQ+h86IUjreo0HdKK0
- pDumFcEV7EFujxFXZSreirKi8zRxN01UX+vmt5WNI485HruOOvbTKdVvv5bqEP0+ABX5Zuo34STtaMJ9
- 7I8HjbNdjlZ17HGopaLqwlydrgUKXNLvICeO64LP8nVkCtwDgfRHP3MkIgfpDOZkwIK9FGrtDwwUbdWE
- jnkGMHahSPamTtGm72cSN8Xub2XT8EgYcwwg6/iIh26YIfoOJZCT6j3GoEVpTTO+iXSvFbHmsGgi9bDb
- Ds47nAviMuqsLDeWUoDNfDNv0zGekYwabaB2Dq8WzMaGbkLzz1NxGl4AQRyKBa67Ea7bDDtVa9BEQ111
- uNbjZ+rBLamStInhCK8lAXlJyx0g8xAZA2RK4G4ncrdLSDsUVHuDNTypxLw1miUDroURyI02VDeVKryg
- cuebqrFYDs+EBKJ0UZs29s/outdU+pM/eBHu/MCH4aIvnj+tmoU3gqqrr7tGLCfF/AjO1G45LyngQjv9
- doMp60mgpybHZJ3CZucADM4FQHEYHDk6nYSNfJ2lAV3Ht+Zf17Dg0YyyC0CUgHG3l1FFWvn1xsOkx1gq
- Emd9lZbaJc1dzainNXgjfnGSU8SbkQV/IRtSutiS0Y21jGlc1tvMWV18QwVfbdqTeaQQV1NhYldeyjqm
- 4x54R4VDeVGNMRfCoaFNMfO6M20BNun5RmnnQwCtqFEpe85Yd9YwFG/JFmYvLkS2FZTeV0SWCqhGejYz
- J/YQQl/B9Z05XDdLWaK4GCAj1XtcrLMsRoXq6v1nxfCDTJNjoq89FN9Oo1qnqWAIGEhM6lPQbRDh3Z99
- 3/HT1SuuvO4AAAAXffTD2HmbE7Bw1NGfSXXz0XhB/Y2T+runJ2JowppjV2XtZQEcrb8Kq4/Cdp/D013H
- Bs5zD+a6AErpOjY/zVUCcVHF4HEt5QPNUMwd+xBlF6ZU4pBUD43+eQirKeWembtxLqenUkMLeejG/kqu
- lOy0bNoKkm868qO4yE1SfepZGKETIdCsgpaU1c69OCPLXa1LFsdK0c1L4RTOICRRToa5/LBnA+ChmIpo
- 2m/ml0KRZT+pWc1g2RydkERLkBcEm++6EPCUn9Rxur+2Z+LKAxJRTl3jSdWMgaBDCACokXlZEol0SO3v
- JPAlJlAeoidb7nwWlVNnFOckRdOS6lZmlUI3rQlw441OphlS2rw6Ne1zKa2/4fSzr8Tm2uVfPwAs3fEu
- WDz6GJzz7jevN006h+ZRUB6dUnEqmetyyyawm5Rhnn4CezUbMLWBMlUXyoX3P7fx+jiAHJAB0X3n2jbr
- tYmTfB3TDeagCISQ8udree1rkwSz+2OQyw3VPzTW28D9DE1XUB7yWCO6hb0Wh0ue3YgVgFNglX2ms38J
- DIseAIvSDJR5V3uGABg7tHZoK+npC8e5h14Ol9GsKeyCCEhrRXiTkzTySDafk6h0lKg7D1AMgCgxi2dl
- OYzsHbtC/HFlpm2qtjvsufAwhsqpXyzKu0hK6NFRZ15E1uauvN+WTk+yaAzyQAE5G6J/oSc0U0LO27SU
- Qih7Aq8G0CC3DZm3+7UTJ1QqDupKybnxrAhpDEr48pF3vM2bFo48aivPCIvbjrnO514DwD//wa/iab/1
- p9j/+bujqQfnzmhrnblbLqmPWWtXQQa5ncsGqv7JZZ1+G8f5fF6jnQJgEB5P+EUl3/G1lB+HzRuuY6OW
- gFFGh10/aBCH2TzCuA8ohCXznwu9Au5Cy7KvSyALYFXT4lYeIi8oHLMD0sRPCQ6ljCy8myj9t5CbWmdh
- mjksSE1MfEQGHZ0Fz0fd3O5Y64g/CXScF4s6U/BSYDIEXO419SS9nYm6Li+o0OZG6Kt0SGkrOOYM1fSi
- AefGO//mvZjSpjpbmUuzaTHW4vvHIx3FybNM5ortdnSKRU1rMqbkYVmHKlYaxUlL2UTIPADU1ttK3EyR
- 9VoUokq2gYKXSFPXOSxZ2NQh6exO1qUXR5wzd4l23vZkfPJ9f/w/5H36deGFX0G1sgNdM/gcgEtw2Jar
- VNTTtPHiV9YmRJyvp4JRppKWMyW1eebrYB1zTxEePc8cg/smuHloT/Sj/+eoWtADdcR/W4CKGO/45xhc
- OGQJ17KBonCo01DTpjbFNrQxVt6fTFU2L7rJSqkBb/TtX+jOptDkwa7IVRm0g32sVnvTk72BWYGYkGgr
- iKUoKcrUlhHo2RHXwUln6DMXqGXFAZSLHRbtflXllWA1C2XYIoxLINz6GODNKGQsY0u27MR8KUTHkJF9
- 6EwgQUGaHD4qpLThPSrOqnSEhKzaAcRJ5vN5Gyjv0BQd+p44LMMFGuS8otMgG3lv6ecdBsGdgYrt5MIq
- 9b1Xg6ijhbrBcpXwjNf81TcWAIaUMByNsG1l19VVVX22BwVF1kXZqW5biz4Q59qkuqwE4P6m44GgrxBF
- F+nw7JeTjjXgi8qNQX3TjEoa1ON0F8ffw5mM19YM1KZfr1KY6zlwDGT98NL/2T5BSSL5VHnu+XCuv3bV
- jfOdcy7mmjfql4pcqFquAGq2ND4mT79NA0+mHbXea3Pp4XLC0qbO66MNGwUYtU1RJqF2jt6QVWAH1oWH
- D6h4ZueSYNKANTWmqQqQ1MU5mjjEfAtUJlCzoht+qs95gGKQA9UhmPkJLQ1C9pKpqg5oBpN85s8YIlOF
- TIzsoCSRQZO2U1/JyseJeRE5HwWBKZdeAmgTiTZdTkxKk13IeYcqTwnkWqjGFYB00sHL99/+3Pd8Bn/1
- rB/7xgLAv//Vy7E4WsYn3vOmCVP6UP+YK0ouRagjjuBi042d8NE7HH1TdCUVvzaKAffhneRNKdFeE+RX
- 67NWt9vi5OMqSd/05Vx9N+Hr19bczwqIy4a3ANET9uiA3nae0xj0Fwrv65Ed5URK6wIXTeuy6bi7iSTB
- gi18VMSh4JSk+nUCb91ylFzCZuBSdZ7x8GHYegQRCzXLwAhw5lyZ28spN1NfBxHbSGldtQPHfjgJonDd
- G3TwgKUBIi4z12jUGt40/MBgEl1GEesYIbGqUmi5S5gAaUs+vzoHm4CHzfFljerIVAVRiOV8z3rGJSU3
- WZDNvCRIv/YEdPloGOFK7tNE3YEW0fFiQRdWa1IWpUNI6RBAE+Sk41AeIXfViRsHx8876o7HL93n+56M
- 73rJ71znU+9Ru+7xzOdh31WXg6rqvK6dHeDc7eqnt7ZQbCOUyO7pI5KTXjwDILUHIw6KN9T7/9ITslEO
- Fwinyxnnwjhww05D8rbqD2/KMXC5J1ajE/9pb/bNR5+Q6nt/AOhpIzpUOHYioiIwgsj5PHvy8CBEhjNX
- x2NSodCbIgMoHfrsdax3XPQ0lvu+KQIceaUo06Z1rVl1Rs9DOcmoNFlFIWiocHB9PxPKgOrzW+9FJePI
- SgBWQRZN9YVlWYGwgTJbUEUf2ipcfB03GhMzO6IRUv8H/AArSMgnU8Tycdy/QUqYTGZ0OkXmbch5O4pz
- tQqZcVZuP4JmRdazJYPSqmAh8goSV4oiNN3/BU1MrdfGyvIb6Xx/QzIf1bgg2tKgJF6AmStMp/iu1csO
- 3TGPxx/d9V0P/J8zAAD41PvehWrbLqTlHZcA9b5r/7FCleU80kaLyWQVWm7RLEOZK+vpTmQBxGyd2Wef
- fbop9cQi0ZN2mkseHL1WlWv01G+APjyXv77AUEhDe8QghoCHeF6UtJfmhGuM2UA6nNTEaU708qazCBcs
- Q1boq/nhlWxHRk+ErKardvp70ZfWVel5qkCYpSKlhkGA2abi0ejw2+AgbeAbLTsslXctQZO7UnIP85Iq
- 4Q6lNvfpkiI1DQRDU+30V3qQVGqeIU67UnurgawiMwn/f3tvHnbZVdUJ/9Y659x736HeGlKVOSGEIQHC
- JIMKiNgMirO22rTSqC1222p3O6C2/aGPrX62trZtq63YtjNIi4jgwCRKGAPIEDJVQkiqkpCh5qp3usM5
- e6/vj7XW3vvc962QhKQCfrl56qlK1b33vfecvddew2+IiKiL+0dZxcjWJUVjCBbr1mW8gYhIhmIxOLiO
- BY+D+SRi3AWKun+YpmBpTTtAv3M0xytvOnLyIDRbPTR29ARUUUwfQPT5sTs7tviSO687jrv+71vuWwA4
- EoGWl9HKniNCi3fPS3/1U30b6dnYJY3vyJHA06TUCuKkRaapenlaUtGnlzRrp2QX4gIPfd751l1bYSsG
- INrNVnuye32IbMMdqor3lbmsoSgVen2GWDwnoix5aO46yjbXV06LXHzoSwDiDcMqLEB6Z9dIpxpS2wJr
- 8iK0mTziQupEZyGMKmVGEpfQU5GmCQCTAScolNcVlnu8Cknd7rLESoxRn0qY0SZjbBDchUJ70hR1ZGBe
- k14CVLbBFahFUiVn4jTGRDEJMucskQox7kIMewu6rjtb25qxsR/RRIVC/QCrj4B5ghj22TUxdmFkRQtS
- QIUxiE+Aad1Kr0lxcBAk7Cz6X6onGCnrXkbR941d/JIn/ssnNEuPf/x9KwFqCLrpGIOVs6abldweA+Z3
- RDJF6OveO1Rz0UAhm3Y6uClDV6S1bq7gSMF5Uw7vRBs/PqHLkDMPKYU/8kKRnqK+2A1T5SFxyPE2bMNc
- 4ZT0XGcBlpuU7e/ng0/IQWdbWa95anVWPSjJUbkkOvMPEdOOr8aQsGLfZ6ZzfsysZzfURcaGnENj2T0D
- cESce0b4oZDl0/rkqWEasSXHaRewdInrCFC1OmflzgY5r4rSxBlwIwMdsaX5kvkBibeBQjkIhXjt2Cq/
- YUKhJqKTNEnlWYhyA9o5CWXAJ0IgPzaC9SdOIAirdmCsEONeq/Pz+Fl4bFnRBMSnIDJEkCUND7ye9prC
- fyeFopVO5pg3TF6szoKrITxudmS2Uq/dfey+lQC/9bOIywv46Dt+o43S3FDWNDl9nufl+2iC04aRuKKL
- RepCQz9bFSe57EIEAT2KaQaW0Bb2n+ThQbnB3EM9WYHVpkIT7XRoMSfe1P9/xwOIFONAKfDgxcb27yQl
- XNiDCc/xBeYnEHM/t/fdHh4SkP50NvZZLFJeG7WSTn/ANpJKVN11bcxhmtii7nKrJBYX4wxFsLbMyhR0
- 9FqouIpmjmPD8ock/ZWDf4VssV2lYytNA9DqISSjwrsCSWqN0Jkzccz3zJ19k8sPDI3p+WmbOA+6tg3V
- 6ZMvk/KSMpMziDNVhxVNKQ0q2gChU1APTQBuU6qPyGA+joqPqIqPufkQCZjVzzLGRWUfmjKyy5JHWVJ+
- A61aBu1O1zWAuMbt5qQO4b5lAACw9ITH4Ul3vAhUDW4MXM9EukF/sZalQK51dSa6aZt3QVMTH/PARQ1i
- lgsTmcPily01QjbYyEllkmJK0lRl1z2kUiAZcTqLjGKidG4LHS5Hf0lH0Dr9Tm+lspst/bcoTpQcKEv/
- ARTfpcwK4tY48HD1ABDs5G1BtK7zZeudZLUeMhOMaDX3TN2jedOus1tRm0Q2OUBnQdNrXre6dmid/CpT
- iiUaMKgx1JtSWqMsgmktZX758xqvgMzR2hqNzMfS5xYbQVIpACqNdecbwwtUuTmY6vv+NEhLCi97BgaH
- ZoCnFryWs1olTYC4gMjRQEOsTT2WxFcQGmTGnlmPU89fwgoPWtdrbsSirHQ8Uk4CyDK0xvgCZAGOjGZM
- N9U77xyfOHgW7lMGAABhYwO0Ywip+FrB8JqcBWx3qs17BGj6p+OadTBmoBKzR0U2QAX4RjidvpKAGkia
- ApnbXxfgn3lCkAtM1hZAgmHZPXWvis+/jX+A9HHfGR24/XfNikLzJ3shDirVNj+rJDCVl9YLlIAYH4ZM
- gGbKUoyLIJ7piKk6DuLjuQNj6jzMJrIZl3SqExftNIc1z7qsH2BSXgqQWUj1fZQlm7k7BNinBwPjBNSG
- 9Vd3HU33x6amm63BSEonoQEEiylTdedqB3Blj+mY7LPIbLI0SzQCE5sfYFJ5GlhTbmhrDCZC2kIw6sOb
- 49DusjUpSSxQ+GE1y9MC1p4FZAAJeyBxJ7b0nKSyoKNBMcqSTSwG1kwNVi7nA7pSMlBgjh+54/074sJK
- c98DwEd/71ewQRtYWD386WY0+FGuq/1bT01gW339xGYa5E0Nd4eNgHQpxS/FN5LeWa/p5i6sDaj4r+/7
- Z6MZNIY7n1ij0br+voi8NvKJhdSFC8w2mzK9vy+eeSQgLNWSNN7Mn7kMmKEXzHJ2UDAP02XUQBWjPDwB
- wGplBSNlbLwaXExzum2lm5itdiIyJS9ATXMlnGVZmjWACSYNZqg7V3nyRnJx6AoZqCWBcKvklOMiHVnt
- WUyB2AhZpt/vTTIFNE2KcSRnrT0fuyXFX4W6Rxtv6oRqpGWPrUN/VLRpZ3VnS8GAQuQw6oXMOpS8Pyg5
- RpmGHwmEWnTxbKDbi2Sca9dUdQNi0tXUfkCnWVWhbC3JcSpqA5Lok1XTvnP3oyocvOnu+x4AAGAHFtE8
- 6lE4eudt7x0uLv8H4voz/ZMvQxIz/NNII3GxaG6FXE/56C3JMrl+AG15XySwT0iNJV0Is8KyzJheKL3m
- nW8wLGi5PrpxA08fKVYoZ/egeRXcOecgKScBxSiwNBspMPJlv0QwNykQ3iaryv2Wh8cakJDrcHe/UUEP
- xFHGrMdFrYNNA9/T0+QARbCUliyrGAHSmaptl+XUva+Q1HhdW2GrzHzGwi/k+2zOvtI7ENoETe7bynlG
- GFMhw+l99TuqNsFypj7HZUjclRiKJI6OiIkRSn7YpSQypDgfZIgQzkWUsxBlt6X/MA2CAI6N8giSVFmH
- KCMAw5S9uHaGIh1HSTEoyopN31prCjoDNak0RarkdYeuv/gzt3ziKjz+KRffvwBwzUfeCplN8ZhnPhcv
- +8g/vIuqpdcBdf/posgpcsshg1/CvMj6zcJ5g1HvsupGzM0gx8cP4NbiPaIOlSSfQpfAiRNJoKMU8nDK
- rau8UNGAbIrFW8qe92HQ+iVtg5bowF5GRP1THlluihJMdr6Mmn9EPHxYAMonvVQF4hOF8WRjC1bZfYnD
- YHqMitkX29gwRd3KsgbbOC4LTmNr1BmBhqYFDh8po9LLoYFdLb2c6bduiMN1azh2BjOeGTU7+wMyb6T1
- 4VJhWpIsJaafKwKTDJKLT8Qg8RCEPAfN4hpkNNzITmlXDoRwq70AABRrSFiybArqzYcKEQ0EDdiuHdMM
- gUlZggCEnM7s2oJjExypTYl4otmt+WtI3Km7h9dBPLuhGnRv2vfE2/Goy78YH/r7v71/AQAAPvTev8Ja
- DPjTL/oq1MOlPyWub8v/Wll6bj7lrntGm5aWlJsC/UUvUvTezGOdpghYSKouukGbzOP2zLmH6x6mMsDr
- oywmMSuEId22K6BnxdWD6dri8M5+afzgKduWDCj23yct1FDgIkpnYv8acy7GKTBkWPXD1QZUbMemNdtC
- 0d+oUte5tEAXl/OSysA/u8xdZ0Nhs3Bee2MjXddHdAXhjMnPpaIHzVgAblQ+XMU7LBOQhaRSRGb6qQFm
- WmSZcY5/IckcNMZl5etbFpraUYlLIukAimhU8i3hIgb5flFQvT/vJYgdLHEBHJu5sifYZ1U4M4tmDWxZ
- LUEQ407EuKjCo7RpmfWSEvF4VXsqpp9ACGBaQ5Bd6LCs656n4Ir+5oar33bwca/6egx337vK9L1a0cQI
- DC66EMtPeM71qEZvSXWuDIvT1inC4wz8mSfKCGGL533K9sXGSJ01hcSgnjE30chRYZTktJLsVhoXVkYC
- aQopbskADQtc5Wm7BU/o+m80l4ZKtXXDe28gNTHL3F2KssXSPDtFqSw9yEdU82XQw/GIpvtvtaUx4hSP
- zpbKc8rOku6iNJYZ2Pg27AFkUSm9RoV23T9KeBDXQuxS80riMqKsZPdoKQOzaGBCY+62I4MHj3LabqM3
- /Q5LkLBsafyS4emHuvmjGouSNOBoUm5lWZsCs5uKBnMeFiSDThAiBgCNwWituo1Jz9G9C7Qf4CNDvQba
- 9FzUlJ9VKCXKDjX6QAfEIWJ3QWZE0qqVAJUFvQXlw/ImQBOEuAchnAOSWjEzhGNU4W8uu/yrcPht1+OT
- V737gQeAa9/5J2jHE5x8/1sC6uG7AZ55jZRTbSrSOcyl0Cia5XNCnFTuGVE7ceoyICUJRarGuyR339K4
- Qo0mBQNL14z+aSaNWs92lqEsWCrr0FCHk26DCZhP06mQJZNCKMRZjD1p7z7d2NlzGQSTJUDy5o/YajJ1
- Jh/G/kPQ60w+FrTgSpMC8SmpXmc+abTdPMAVirbpTAPAxVVs/KeinHXB2JS+0w+iKQsXqkEGMxc7mZVM
- NEu1s17zcuLCW5e2swPjQiolUpLXW7KSyhXxLj4EjM44D55dsPWgamsiUlKXF5NVd1FVCGt9T50FFZWf
- F54hcpcMUBgug76ErrsYSsWhVALo99YJTIzLCOF8hHi2ZR8MxhQgvLdZnlw93EWY3nP4s975+rM9YfPC
- C9EcOQFwdbdwsypB9lJv7t4WSKh5lZziBE3upbZxnBwk5YWfaKpjabuU3mviW8ckpY0GSlLO2q3uiyM7
- XQcG79TxEvFGvzQpR4RF1xlzYiWqaFRoG0gJ/CFsGWtCtE4Wn1S4R3yHjAAsJw9iGgcPFwxYG3YqPjG0
- U92vk0lmS2eNvZChusRZILanFB2zqCZmBtoRO6VqGwC1hYtylUagunEGyQpMIGq/lSzZYpr5+2skcUbQ
- m9Onxq9bbZkvASMofBYEpqzIJKhzkEsioHYlhNBzMCY17tT+tpaK0YlRvgxoBg4jJQ9JoyKrfMq4FIKK
- ZghJfl0gLIUE+QBduAgcN1MpoFgE9T9w/IIjbpnWQdwd47p7zfjIcKMarOOaD737s975z+pGGcdTdIMd
- 6HjxhKA5qZG2w2nUPLDFwUcGmoolOSzk0ZmjAMuGGrUaUYmUHdc7Teehsl1R27Up2oInSbQBZkmVkWFF
- U9HT1pSeu4vtHGIvBYcK/dFhWe4UsuEFWUMfLfoiKrL1OqG0VDvTQcCI1y5SKTlLElTmA1AX98gou64d
- 0GvcGeGLNW1lF/ZwoLawps28AeIZ3ChE43GVQULcGtLOTnkwINa1FzXjiK4tIA2AQSH66doDjZV/lUmw
- OydfZ+vq65ehxFQ4VCkq0tdIg8gZGqxSaD5/0p5DJM8W9LuyEDi61JsGvSg79brQzOTBAiqxiZhlEdoc
- DEoOQgvEIULcjRB3W9NySVGBhCSTJjQFqg1Q1b5htHN85WjXFOd92TPu053/rBlAszDA4p5lSJBjmxvh
- mIg8NlsufXb1XUVMjVOHNJtM9nH50jMVEUNr5ZQ5QU0tJcwuMb6pQzFGMsVaawhKsp8qPx/lUqCg8WZm
- Wql5CDj2HUXantGMQN8XQezE5K1pPZXoP0dF5msWozxMgiA1RNhOxFmRAYWszmQuvy4IQ2KL3hpwztxU
- VLVZqBkStO+haNfbkXo+AeIN81RQ/oF39JMEeNIfdNyHZ3yLdv9hJ2Nln3OampQkhhg0Sa5sL66iIRHD
- QvsHvWNHN7pJd1O0NBwAmSqvNGCpjNZiuv4mhKpIP1PMJkbEDjCvoaOz83VNPBiYiUq0z6YGulkDw8h0
- JkpK7lJEGx1zfFtdj//79EQ1q4aMd//Ob9+nu/5ZM4D9f/DfsPOsnVhaWZ5Cmomg7hFfeyl1WQv7v1hX
- lgzVp4u97p/8Ygw/KhB5aXHFUjPFbsYMhIkJRszsZvlp3+b3TN37Uq5rTrAjpf9hmzhWdPCpbAIi4xtk
- Xh251EYI2/w8mpMbm/MggJgH35l8iGnmczrhk3lnckZmc91ZtNm4wYQTJyJmYg25FTWMX8+5tCMpmsUo
- JOYKGzkQBItpYp8DsAuUrBXBwbWogq4JmhpKr7PmcmtirbM0paHkT4ieToRSd7M9GLn/BKlGAaepBIGr
- Y6irQyCM03g0YgFRBghY1Kw39TBaRKqBOICEXYgyRMUntZSlGYSiKQeJjg8pJJ1///sMkjf/BKm1tOCT
- gav21wcLa989ndAt+2+4E9d94n33+c7fJ0P6nSvnYMfyLuuyL0Ili+Z2SynvVXa2JVo6bKcDCukkaYy0
- 4OswK8KkLN3+QCjdA+x9LHZnd9kuN6RoZmVAt02OUm7Yei6bmXcVjv0THuhJg6HIWvRRoYdWpPm6fr5B
- VVyrbZmEZyYAKLbc5bsHyMAmDQiEzlBonoYP7FcDN9zMHAi/Bj6lKbwUJCtKMTkDzv0jh0Um2JlD0HAL
- G9D1/kFjWyNVvq5S6DGQ5KmClSIklSkAEbi6G1V9p43uYPJk4yIT9HU0tnMp5D6NmGit26EBAE3A7o9g
- tOoIE/ewrFRQoZOzoMKmp1R/QZwX0KbsynNiEkIk1WUkEfVepKhlFFoQz66smvEvdbPhsZf/0BKe/bxL
- 72fedx8eJ2cNuplh8EUBFCpNbDbY0hRTgYgtfuoCq8Ots8xTq9MKNVT3EiRndtmNlYDsESgmPjlMdVif
- ZeaMwm4ujSvHelk0JFuXz2c0ZcYwjxmQQiyjnOf7v4Uirae5QFIVi9XGbDIXXHqf40w9rM6VEchEOlzH
- UEjFO8RTUZe+So3PKguKWoOUeGwZBCe1o3Kp5dHgpNjYteEPBklKXFNqax6aCYnj7+F+CzQBMLWNVFv2
- 4Sd8W4jLMYjWENmzlTZ/Nt4AyTIQhyYNRtYrEJAoBVqStbuWojHuRvKr5BaImhlEGWlzUQCO6iYlxDa2
- U0g0xxoie0HVYRC0fFFMgLtnVSAEM/uoU8kRsWzMxQDidVS8eT1z91PSDQ5v4j/jZ37gK+/3nb9PAaAa
- DSFxpp0JY3yJ1NZ4G2F7XkBRKCRIr6WbVtuktp5UeTwijHlrT/KN67ZUNnKMcUkXJU/nTno6Pbe+SPll
- ngk4b3nujMOe3HmRISRTiVBUB1w8j+aowXZtSv4AFWo4D+NDip6Mp9Y6umKjxFLBoSjUk9N9rQyUYxMX
- QcKvC6CnvW1kxXxwAahhZMEUt2JXIg+5bJeYfLizEAmppmcaJwFZTu5NLj8XkCZGJJCgVufq8OMKVS2A
- scXhBcOYxARYEnQpc1DRUaVEqxz42OTLKrD5E9Ri66ui5KlAonbhYnwA7ZcMDJuwjEgzC0CWHcUKgSPA
- YzCtI8pOQBgVJgCvgnh2Ldf4DxvHd161cv4JLGz+2AO67/epBHj0BWfjyj/4T+O6oXcRdVEvmOOULWXx
- C7fF284XjnVmyUZe0lgWEI0gkT8OJZXYmJR5khsvb9qYqS5O81Bo8JV8dppTKq63Nu22NeNwAJIkEFLm
- ANhmTeVK2Hp6S8kdmMcuFEIqyUB1S7Q74w9yoE4KbLkJmmDeNuby0V/S3XPOA3XKfCObmduYlxwJZ5OB
- FKStFHRptCwtb5+Fx0WgFcsCQgrvrhQcwy6FwsYlhLjLmHUrtu5GkLAHobsYoXsUIIuIsoTQXaRWZyTW
- RDTaL21a9hMtgOhaYpqaOE1lmH2T/IKCkpjWtATAxK6BZhiB27TxhTLBzLOUSE6SZwhTUsgCgFrGqg5E
- UWHH1AK81nE9+zNqJt++cWjflTvPPwEI48Ybr3noAsDmeIorvugbQM3wL4jr/SLOGGugcGBYY4g1hZyf
- BBhaTP9nkIBE1DML4W1SYbXPjmJdXnY/eU3JFAt+yggmpbR0ruG22oSHfMKXI6/C8CphAXrGqHM6gyh8
- D6UcZRavkdMJf0jxs4uxo7MkH5aHZy5dSgyzwqPzKaZqbJL4/u4U1Bj+fhM+UnNbdG+oRdmBGJeTJXe+
- L2yKQW0CFekm8dN2kLMzs1yDe0umf+ckFEKO2pRKjTi9B+CvT1b3omaj3fkIGCXmY5QF4w9of4J4rAAb
- zMywhEzBJxSt3ZDQf0JubKMN0gqtLXFvY9ufndQkw9RQVl8/fV1gIDIhUmOagavCfGKN68lrqkH7/ZDB
- dTsvuR0xMq77xFWf612/98frfu7lOOeKx+Paj/7lrVzz67X4GRiwwkkyvqHnuACAnZwDgwwHuBmmZgEN
- tqjmpD+SSUe5J18LxFrhqoWklpQAlEJui3q+BT4eLEeYVY/7r6CSIoMompU9bn/a1wVnAIU1ehkcejLg
- JcegkFUvWw2fVb78oaoBqoLCzcXGM9acZVwsAUwT9bqjNdUImJ+umGEm8URHwOTsOSThTve0TwIWNE3S
- 467Zp29XJ2quXu8mqQVnU1UYO5ATP8HLO6KuwIW4uq/1f6Qx0JGN6XxVycDWgpgOwEpiC2p/olhjKQjm
- xrQ6BCuDkKNeVzISGiOALaMgKcxFpUmwYRcezQrYfKhqjv2Xqjn5tTxsfzIGPi5hEe3GFNdffdXndNvr
- +/rE8fGTuPxJLwTV7R9z175EUD0fSXO/OCXFfOFMS15T9wUbIZmuvAyNVdYVC6feEjwkjlRwgcZ5Y/GG
- tQhDaiCXndlyh5pGTCbkekobm9y1RsgehuVpTaHAIZT8/nnAU5kR+GKW/Ls4gMjUhVKwon7X3zIRkQB5
- GPQAxEVQCdBBeSHxhs5stoeIWCiagTo9EBEjp0wKsYtJMtmsaGIjMeuiy67U6yGfNMTlNNHRRlwNpjGi
- IGkK5r6yWo7FuGzXPKaxXW7WeQ+C02uEMrBHUinmzUvYxIHANDV3YU4HhZYyA+MlTDMVOQmNGL3ZNAAE
- FVrWYKgd+6mVUXrIME0RZGdGwFgTUIz7wuSiJx3Aw3cuXbzxC+u3V61ExVl86qa3Pij3/T4HgA/+ze/i
- /OWnY+Xi3Xc0Q3r1bCp/LDFc4p1fr9ElrhjSyfDPaUt2YDIoLk+T5r9SQCldHFC0yDi011ndFRft9YW+
- /zYJPiXZsPlnSEYMF6SldLoTDA46n+5ziss9b4SyH9A7sEtKrwcBnwCUkxHJ2UBhNxYlIsTujAeAxNNH
- rTVsWY646IcFMZE5tWTaND+AIgBLgygNiDZNfntm3f+S8dkmzH8yTREkZZ4s+sIgGlvwUdchMbssF9hQ
- i6wq6RQq028EyCwJZVJBDhNwofkvdqscSwLj6pvNuYjBbxsLAKv682hmI8VKPQlpYnX9IsRO8AozADME
- qsBi/S1aBXgCCTvBAkSqrM7X6xmT/0Xloh/Xrh7c1daDu3DDtdc+qPed78+TL3zhc7GwexHXffIf3sc1
- /xJRnGSt9qBEHnYLozEyzVUSoisv9GX1T0/GDFMQqfS0yKj/EcXJGUUHmvrL14Eq3vzrTwL60CXtDM+S
- cpCmeqW4RBEE0EFkXplYemu9/5r5/y15E9wXEEGhiEz3Yl12RiJAAVqiMdx5V+y6u+U5pZGs+zAsGGAm
- FuVcodogQ5PqGiRwkUNomVRTT5turekIuKuPueGmSdHQehGblnw3SWeRrCGo9TOQrcq7It4O0vb34CYG
- 2Wa/P9TZhnfTUrLufSkvbvwFCjaepBzgvS9GUwAdKrQmDeZWZ1MQxmBeQwxnqQcgtWCnEftYUXzlb4LA
- G8zdLVU1BTB80G/7/QoAH3nLbyJwjcc//itQL6/sB+qJJIvjaJHclIBd1RVNBvxQf2pPhLnGXUnqMbEQ
- byiRa8she6y5jXOCiZKhwArX3W0MN5LAmMlR9VR8es/0VN4DWdHxFy4mBEUe7WaYolLZ6IFY5k5JmgdO
- PYyzQGFD8nkN7puAkzSWYJR08P06kcSsFVCAqinRxY0EldTPHKtRIbvptimj0vFbZ6dpSPqOVPhQaDlp
- 2SHNVIkHbsE+Qox7CgkxFCjHmGSzyLIaITESj5PLYkEPtq68+FrTtRplaIIfSoxicx5SiXDNpJQmzMpX
- gP6/+gIcR5AddsiRAUmViBQxAMfGxolkGgD8ZqpX3wme4YZrP/rwBgAAOHXuY9AeuxkDHj+OMFv22XkS
- ZJDaUj0CYWydXRSjPl8cGwBtJGolej5uPmLr0KfVdql0JuG5E5uSqQiKGa4HJ5pLzTMYKGJbp6GS9JPQ
- imVqv91JbWmxw5175UohG56OpZJe7GCZ6mHIAryZFosTXjeeGF+WkkQ25fFqIaTqjcCsxBOK6Y6bh/q9
- 6YB0isMmOGbsQZsgniY7MBUiNVtucwPybEXT6WCnfbAAY/58pXBsciimwnQkczKEOoBmiFB4bbRFVkKG
- 00YlczqSWr0pqVVeP4zZKoQ6GtXcmn76RhNwdUQ5EnGpyFyb5EpMNEGoOgR2QRS6p6pn/0u6XetxY/kh
- ufP1/X3Bnh0jfOLYZ7Aye+KFAq4pze5nhgg0Dz8Z5VqxVNlNp3+hACMwPcGhTdSMR26nUnIHouw/KK68
- S/PQXZ8ZO6+bs/eQjFKjyWv1aHWkwkEXjDRUwn9DceL3jT3Qz2dszQVkDEI/pCT1HG8KZpN5lNbccsZH
- gZLYktlxx+W1Jln3LxllGpyWpYAOx8ym9FSWrO6OI4MTw7r9rtYTcp+BM0FMYpNwJZTul72nI/x409R8
- zMuAx4CYsq80WVfPrMHZFIUdTKY/e2BSXwKWzhqIC6ZeFECV4d5QgUwIBdYnEDetpVbXjY8/QQpwkmBl
- sKIAmdbNuHN3yk6ZYhK3AbdgdAhS2ZqdAVzNlvbuWNs8topLfvDrcOnef40VAtbXV1EPhnjLK7/zzGcA
- KwsDPP4xzwJX9SeIsJE3SzS4Y0ngNdYSr2UBRswr4NgFs4upsmKtpUB6Q4VKPX6yZuOCXWjKtE2Q2jT7
- yCn1BvSrZq96/+nRBEOqrGMno+IELLQFqSQTbSce4hz5vJH7CkTzKUYpF8Y5C0L1QG7Lg5EEmDlpNjbV
- 7vsMVB0HV8fhTSnidZX8cqde+65iqE6RAShygeysrbm3YWM0q8njMiTuRAwriGEPouwwqu/AhElcPyEj
- 9oS0HxDtFHUJch2suKjJNB0ugkFiMUpctOeYGnDSMBhoIw9VKk90bSjd1nUCSSqLV6SlZ1zWkSevg/kI
- uD4Mbg4B1WFwdRzMx8HVYW1gyjK6uNcmHJWVLjODEIvpBFbW61I8gkS5cOPE7OeWzj/rqc3uZrneUS+e
- 9cxn1jf/+l/hLa/8TnzXH73+zGcAkzbggksvwmBheNVd47WrZxM8N28OjXqSVGFXM1fcjSfnWHVqdGDu
- rTxLWOiEmHMIpqdidoIyr1u9SMUCC7a46jzyKcd7BUeBUhefko6hjpZWLL0z/bm0YwO2agGU6T2KgOF0
- 5WrLz81dfxQMyvLvOzwc9mASVQ67qjYy5RTazyGemIpPY6O7Ngc5ngAYAbHOJ34COhmpi2cJWCVxOSvq
- pI3GmbNBneJFnDpOUz1thXssQnctUqbfuOhBRMsUpygVgjQ7VTWdgnxtRh3GMJUhYtKVqBHjjhSQidjW
- dZuKHlAE8ykQdQhxJ6IM1MDTeAyBCRzdI9H6EaXFjcOlxcstbaKydAAWIDFwuzn+xpN3VFes/drfHohA
- /DS/9uBgz+J/e9IXfdOt//Cq1575AHDeomCy5zwsnrV7Hbcfu1OMNILiolJyMRWU8Ny+7TX1nkOYJekk
- KhF3TiAiSbJLenMzTVhHM13eUzRHwe3ReIOpvtqrXWwCsMUzsxtDPTGSvnRYnm6U37t/onbmg2D6gVTI
- gVNhRZbq1HLk9jDgAJLRxIam6Sh6LBbQhVrrxoeimTbVGTdVSdfZv3+2sbJRK0/MdKM1Pv4gN4tNti33
- CIamIVCUCeIiHSEDeeKiqf5OkLQHnaTmDUjqdAgoiwngQybWiUQBJoU/GFBHu/pWTqYxdQRLQDSaL/Ea
- mFrE9lwQBiDOOpYigir4rXegGaUy1rNRchKV8RbYxt8CQZAVUGxA0+6xcdo8VjAA8xrQxQuGO4c/sPPR
- fPuli1+PW2/7qwd83+93rhkE+MSb/hK3fvyj/6ydTr+8v8mKU3DrgHybTSnWyJlpN9bqL+KxkiyQTUil
- iBlqNOFcdRQlQFbYpdTgs+BjJxclFWFGhoUW5iU0tlNNejpE/aAVt/k+1Jvn29FXjPhoS8qdfzlakSAx
- INyLl9tDtf0TGs308sjKMcgCYtiHGHYiE3bsCxDsNWayYiNgJcdoHa/CIE1GPtLUePszUwWaIjVjCw9H
- gevnGa3XFZppZuVYMNlxJS1JAdRSTUJr1DmQy5vNLgEu6uijOYObagRDnppOo2EUEmiNp8rB152gmUfc
- gZ6norkhMU+tSTiGcAvwDBWmSWJNiFJci+Su2MoXCIZJiSQIPvqzQy3GFXRT+trJqdn/bBb5wsWzazzm
- kpeeuQBwwTDi96/+Q5bp5otiqM6hVG9hLkX2bqs30eaDgdeLNdwdVsVFx3aR8oYTkaS8krvVBYqLlCct
- SeBhzuEnIf1Mxjx9rjCXbHNyyMkbfTsc/5w4SCIulVkCYwuNmOZGnilmZuqwSESMD4ckmBNVRsX3yOQf
- oUFyyMkijcr5TwYWQlbmTVPwFRdp9e+ZJiqcrmXyj3SzGKn1pGRHkjqCrrRQz1p8+hgaTbhKfyfSKFkH
- QExAs6l19Wd5fZl+JFsgioBpBmatCPGDxzasqwGLmaZG7sDwKcY6iI+B+ERStxLjDyDx/W1Dszsej4xL
- oAEvEoHRgYUQaGTZmbv+LiJM4zeOj3e/Olypzl/cN8BlT3pgQeB+BYDnfck34+BdE3z1E18coyw12qQb
- z22UUsEFp8kKnALMeWYvbHHX1WOTziyIXOyhMuHKrsc/T4sxucCWS9vMGiyddTAI9Zx/CrERWdiGwnu6
- y3U645N51+FSN2BOK6HcgymInNkAUFVa45Y6hlKId2h2UHThixSm5HI4Y1Bz6agi0s6ht40v5ikhiRHa
- 9AJEMvVAB8DgsK7F19Nm4P6lS9fYWKLiGciClRYwlCkQqSuUpshci3Tj69+r1j8j09gJLVhaaytbL4IA
- 5g1wdQRVdQhcHQFXJ02n0DJM6gzQM0W2ry8t5lUFmaL6H7AQKp9CkI3RhU04tLLJR40YF9GNZ9+ycXj6
- izSSXc1yjed828vv972/Tz2AL/7un8TZz3oiPvP6t2LlrH3NM17w3V8u0j6baAN96Cv3T/2esGY5C3es
- eWt1/2Jq8Ci10sRGEs7aR43TFGyUbVUq8gYoUqqwhQaKufVc+SFk2nHSW0DKdCuwCai2OfXvbZPOgX56
- Kj+ns0ErbcYe+hGgRMHa+hirqxu48zNHcPPNn8YN118LrsbqQJt6In1MgjfbfLSWr4CXal3i8Wv3vcm0
- LJsyILLq4Bduzg7QyUFZDOexqPdDBkkHUNBamWCNXsky5mLUcydnSlzKEybTGXRDGpFhqvmTUQlN0yHi
- mpRCOkLMXIIhlBm4mdasQtSpyFiXzYBE34etPyFmWafAoFkSVRXzDeAIE16JlmtkncqkLUiSZNVFagrT
- 7tvaU3jH9OTsddd9+K8f/ADw4lf+Z9A5e3Hdf/417HzGFRcdfM+Hvk/a1e+UcOqCpNOWovHpPO6LibjZ
- JSf0F0WjkepNqGjaT4+T1maVQTvE1kcz0hE687ODmVZOrLtMptspcwtW4ZyUHG6Kz+magik7CT1nGeTz
- cavZyfw0YLtjPmEXiv/3k18efGGQ0AWsb4xx6uQp3H777bj1wEEcuPUuHDhwCrcdPI4TJzcwmx5HiMdR
- N96gGhWAJR2bkTv0pKAZrVFIiY6dFJa5tQaaWlV5qZC/s4/txshS6TFRxEVMJRdZQ0IRikNoyWGdfqmM
- R6IZXjYeQerkE6YQJsRYo0KtzERqQVIjMquDdTRdiqRRMaf0ZFgTRoeAJsGFFZXIBRK2SjLhDlVmTCwo
- TqBn+6I1TBvDSAwyP8wxARJRVUchspwEVFKPwcRL85QmDkMbv2vpouatTz7/a04s7l7Eh9/25w9OAHjq
- S78HT37l1+CN3/pqnP3MKy7dOHz8l8P01Dcy1jnbX9E2pyPQn21z3vxoCkFH30xtb5MoLLMoIxJMtLYo
- 6PV/C4esikRzB27SItExlCsMzSHAEvWXEpe7BBK5qw/16EQoLTCw1VSkzHq2g/ZKEQQCStGN1Af4HBKA
- 2azF5uYEx44dx20HP4Nbb70bBw7ehgMHDuPOO+7E2voxjCcn0bUzAAsAlixNbcEcbNMM00lKJTBoPgja
- pIeMOiyigBcRhsQFG48FK4EGCp8VAuCmGZI8GyUuJmKYSJlNtvYzDAdPYyRUYZqmVAV4CQk96r0i8WyO
- ODFXyYBYHBkEE+Y09+hE+xLY+FFs/t8gUtSAYa6+VJiYZL4AVGLM1zYjTRAIGyBaAcwTUEiRhWzS4DGp
- A+taZT4Kiot2SE5VgyM2CUUa4w4wr0LC5Mu6dX7ZDVf/9W8//9v+9YOTATz95T+O2e134x3//n9iz2Mf
- dfHG4aP/NU5PfRPTOpWbug+OKVNczrLPFGx+Twb5bOc2TNFQk9Jdp6jz0oy/hB7bgvFTXpzRx8XpXmoC
- SCH1PHfyo0LW7i8Vb7Y/+8vTPYOO5qcf82ahjmozY4ee1FiZOHz2KDCdTrG5Ocbhw0dw4MDtOHjgTtx6
- 61HceuvduOfue7AxPoTNzTG6lgAsgVEBTCBaAbP7JJy0uXxngKmFHLRLAUx09pE6y6oMJYjOPAOMhJUc
- ncyf0SnbFHTz+0lup6am9ebyLANEzkrO2cg7as8g7MjmJSmLymjPzAFxCfMFawpno1fftBBOmn9AZ6Yf
- xckvNSKsWw8Bw4lQUwOaDUEyKWzAGmQ3X8qHk3hT0+TDMUBEBZZo1F9jXJphqQZkW4eGv6Aqy98zi2YF
- spAAbDEuoaLxME7D9zztuS/5qzgLdz4oAWDpnHMxO3wC9e7dS+MDt/44pie+lWiTSg23PipuXtQjL6TS
- OYa2zLjncfjzYpzFCUmxR/SBFIAeZBkrcnAFua8cEv22lArJJ73DiqsUxeeLBupJVNM2n7mP+tNOdtc/
- Oan/iowR6DcG52kGk8kUG+sbuOvuu3Hw4O04ePAzOHDgNhy49XYcOXIY6xvr2NzoEMICQEOQjEA0AldT
- NE0LkXWlr8rQTsZa5/lsI09Rp1+4wWl05Vw/Cp3gVJvuPdJMfd4xWtNiwwsk1d+oCrrQ95NYzPypA9Ma
- BEs5JNPMtPlqy/rs1JcRSGZmSoKUHWYIrjXzDEbsYpsx5WyUy0co517MDwFoIWTzfamRBcI74yTMTNty
- alBjse9VJX+IGHdCpEbF6ykgRFk0a/EqwYd1iuAHm4mD0cCISO7A7KhXvWfKsJ2a5+JiCgreIBWZHQyT
- 1ZMx3D9oz2mffeS6a1B/6lbMztr9AmqPfwd6mz9uk972g0HEUJsfQpZ+mXRTOk2wzSlJWfghYfy32XSJ
- w13WzAx3cE8gGykQ+YVwLeKwUJj1zWma7+Rz6ZLZxkXWsN3pnE+OTHgJ/VQ/ZTTb+Av0PmPEsWPH8MlP
- Xodbbz2IAwc+g1tu+QxuO3gAx08cwvr6OsbjgmIKgFjAHMDVGiBj2+wDiOxAFDFBTFXFoWj/hgVIrJJo
- izs+abPLSDXokuCKztX7o09tCo7sNDJpcBmAeSPBfSEjnYeb6Gs0WXkmQxc6JJcC2P0H4k77TJs6naAx
- wO7K06afk4N+a7wRVxdeLO6p8v4VhNPZyT5TNl8cGfrOp0VRdQyMts2SbcDcTYh4bEmaZQ0ULHhwWvne
- G9PrxtYktFIJHZKAKrU6HoyFj4aHK23yIU9beO6AqRI7EohrXHV/MF3fuUFy7MEJAKHrUA0Z0k7GQCd9
- Pjy2SeHLGr5CDLtB1bGs4CsrIAmgarNXDm+tnZFSr1LXJ0ttlYlGbtToYmvgoyN/H/9hIgVP3bMEsGUQ
- 3uzLJB4lDeWJhWxbBPS7ArEkABUd7a19gnlMQE56YyT89m/9PgDB6uoqptMAWCebWZF1VUVzpUKX0YPk
- 3HolPyEuG5ln0Zh1mxDprA6OkLhggKUuE1/QmWruwLr5Vu/yFFEaZGgtwLyWTVddNi0u2GkXzI8xpA6/
- nnIqxQ0n3sRFgxtnWTJKCIQ2BRuQIUW96WebXpI8vf67yMAsu6NRhRubGLkIiLn4oAFLf4StZcPE8omh
- TYSDdoPcKJSPJ5ceKghimvHUSdabEHXzU2tCuCME4tRAVt5Fi0gj5DGnEp+C7IDEAZjWwbyq6ysupZGm
- 8jZaDe4c310N1t/DdY3L/u0P4lM/cN/7ANXp/mHXRU8A6hqohvdgNn0yob3is7eo3TLa6lvKCrBEE0OJ
- 5U5+kpjulQVcRHOk9D9v3HJkVqTNAIBhZiOmMVRXhBgvHYaJ45/OeSqbT8VNdbqzor8xT2TKv0yUMqX9
- 2xGGtot8FeaBS5vjTYzHE0gEuAKYASYCkQcs5OvmjkpbgonxyVPPYZQMPIg3bFZt+vye4Qjb9bMAyVNL
- r4OZZljG4QucgqWlISnpKM/dBTCCEWoM6CIL1tDqLI02fABRphBTm0ouJJmyqvCJqJJ3hNiUxzO2KItG
- 5pJcztEUJAMF9RAVCkJVFvI034N0Aic368am19q3YMzseTZhoDbfA+tvqbNPZ+u3gkA/k94WvQdcZLVE
- 0ZSCsm8FuWeGOSirduHI3mdowXemwqUk61W1+dNhtnRNN9nEB1/3mvuVAZwWCHTre/8MVddCTp4YB4z+
- MMrCya1Pp+JtqFjIVZG2eM0e5pBymMsoaK4lUKDoiHsC3775pTyJjdMtBRdcZNFSUypchRYSsowoZlUv
- kYIAwkmd1t2Hsk2VQ4i3mqPmzV+yCU/TI0m/b0UbElUgqooA6giyyoJmKToas0pND33o6MQOrDryuXaX
- pYKVWWVQTtIzqNR2PS4Y9XacOBnOrnSzCq1ZTfbdXXeAHk1bVW4WDWS1ZFTfQc7wpEo0XP2bGj15d2ls
- hj4s9IaCBWXJpZnrEVKBMpTKjEZDMjARD7p+/xnpeqhNl5p0lvdGQEBszGOwDOTW7I4Nylm/ZqQDpbjL
- 0KzCKgOx5YDt+oXKlJwVwVhSGRnjHsTuLMS4Yuu7guIRIojD+7hZ/ft6tI6LXvwc3N/HvSIBZ11EHAjA
- 7ZVA87PA4LatScNWGXBHCDJtpPqTnBSSBvtWu5U1sNfEKX2mxJRy5lYOFKVnmn+SGRydRtSCeB0RI5RW
- XYQJiFdN6bZM4CkP71zqKW1QygEoobHm+Q+2UbcAhWibzX8vAbBX6FFaIPreXq/X2IouhDXrCpusFBwD
- iNbUegqzbPDBBfUaLdxtNglnxuUCrbeUcPScZMLbYiOYZTuvGpCrTbN8T20rPmXptZ3CZt+eyhhpgLik
- 789Oz/aTuk69CjEvgiRX7ienBQZ15Y3W6VfVX0XUWdUbB1rfC5scVw75LIRKdO7OEkHSJWEQdfg5hZqP
- m5UadIMbrRmyoJsVKogTZQE6knZ3ZUX0EbwvY0HZbNbFjhpJB1OlEwcvR3v9MGMVVkMa7r1skYYX4ILn
- PPN+B4Dq3v7xxKFPY8/ZjwaEuvrczQ9j3LxfZLAbQpcRdbz1dKPiFAuFChByvZ081+aDyGnIQ5TT/MSg
- KoE0VBpyIkmJaY0U0wIi9pGUgUiKdCIRilJdlymvNFf7g1yY5HRswLK0kDmiUpktzcffecPQaKm4N6Ky
- SClk2L+WZR0kjO1QiErumdnpaAvLkZXOukvGFcPkvKPvMcgAJspjLr3H7mc/So1URm3W3Tb2lMaCQdCU
- GFUOZOSMvJAyEr2lpufHrQF8cshlmpWkWoAILJwEPvyXBgR3I3I7E1uH3sU3KXZ2BWgq1iJF+7psTT8B
- Vyc0GDupB2wjRzKZsIhIZl8nbJoBg9y4JAteBvHNa0CBPVRwDzghYN1CzUfgiljVjGp2SZxNDp341PSq
- C170ZNzw129+8DIAAPj09e8G0wzx6FBirD/aVXt+ADx6Z44d96ZlV2MLMUiqghDiRIgFq1HrOX28Psae
- OBhhpDSD7HvzaWo4S6g0nSMvQmTRmiiDrPefYKJImUMyMCEptIDntAyLzU5FeeG/aFtGP29TGsReQKDi
- Z6WgQq1tzDplV6BOEWTbuQx70KT57ENlqYhOKsYcAEwgQw1X+kQdEbLnyRzAprHRmae2C6BEIGL71KUb
- FDK0OKX5XREcrYlnmZ8akK5pSmzisnparifGXGkoAgPrqJRXgRvxz2waCzDX3apUhLLvxM4QJf9UCidW
- 157cbxIiBNlR9JDIGoWSR4rUGf9gGQGqJyA2SnV7Mb3zQ0QM7BaKof1yo11VqroscZdo62WPSsFu0k3G
- w5UZwgMQk75PQ8NPXf8BAMDjHv1VqPmOIwv7Lvj96ermV0iMC1vZcuVpFvv1aOLf+yKrs1Gk0TGYNnqN
- uy1ZhmcVUm6q1urSLFgpLsdNlZqJeO1mEFFBDfAETGv2zgNE82oDtRZkapWz7iEHfNwjc+rDGU1Yogek
- d224+CYls7CUMSvrS8cudLbYK4Pdml8eagBlGu4ZUYW+q1F5OQOIVkEyUyqrG626EEbSYiQb1TVFTU3W
- jQ+p3HIZMYW/DkC0hjzuta65S3FRtnPXda8ee8wTyw4a44J00G54Z6c32aadWo09MFlvRc8JGBTUx1AS
- lwCI0Tvm46wSxTPTM6wQTY8PpHJgFJs08nOYM1h7HRwbHfCFfQAtg/mIrnBZMBl7NpEQMSXhTDFOvphk
- asRESQU4rdekhhxT/0SYUnklpWmL3WvmdRC3VxLW/2Jhd434AHQk7hcbcPfznoHpsRZtHO6SWDU4LRbe
- T9RFA57Md6jFNv+KzlZpwxRZSmvt7bQECH1EX0ipYAb4NKkG0+g5sybYKVTVcbtoq+DqGJhW7R31JNMy
- ZZbFJmRkxBfq6QX3tYNt9tz73NuM/YDtuQeJPFW+ri+bps83spTHbHI9RZeKDnPXqUJ/QjFPTZ6C+BSA
- DlEWEWWo70EtCJvqdQcbM9FYRTd4PdetRk91CXedLKylyQ7xxOS+/Wu0psnX2LpoFOCTLLx1szC5caiV
- A70gyV4lpxDM0JMxUpPIN5R+F+s9LViKHeBIRJ96JLi3gX/yVCqgkhYctWcQjVVaSwuJC4jhXABAJeZ6
- haHi++OCKSehUEZGcY/cJ8INR0x1OflR5saipJFrSRcnuyebIG6vY568OoblwzHuw5v/3f2DAd/vADBo
- ahw4cS24Gz8u54vzNthlOjoFejj/IjxQMEaV0Ylp1ksj+1BjbBNomrzJratK4vi6WSKoaK3c9fkGVrsS
- asS4y6CVMzA24OQUJveCq5H52g3mx3/Sy3AKBCRQaAvWvUyhHy7nr9m9NQzd19DKKsPUo9co9BQ7FGVG
- eXIwMoBmBuJNZbtJDZGdiHE3ouwyfb4lZdTFHerSFJcN7eaowgUAru23mN5P72mbFIFyiRMKApBLvk80
- QBtHQNl/jdpxWddbZGA4+EXTfvDN5Rbg2WGKpCRpOYnHriX5FCVCuFMLbyA3I43fQmLZBTipBEeqraFs
- oiTFJEgPnQYxjhQYVRSCQnlqpCCrTPnWicrQDEYHpqnY6LUWNR2NsQA8pX2jWAGuqyt/5YYPfni4q8VN
- N95/JuD9DgDMjCde/jzUlfw9sxzKae12kwFj3NFpUlHz+iOzevYOfX8jcO80lNR4izmtKn+eN50cayBl
- 7e6oKm0SxrjDaMhdEqvMY7y8ofUkM0JLXC7MJks76zlMf4IYl2PPeq4k4G3EyH3p9LEIW8sqW+xJfs1n
- xjKXn3A+/VPfs0r2VTkbGOtkhFbNyCKqWKV5OZD5Arg6L9EMXJ0C8Skwn1CwjyzYeLHW4Cyjwjrevkdi
- fwaz9DZaLaZaO9s4UMh8GdGo+KcsGWaBdEJgnA89XCgx8FyqXDU1Qu8ukUGCIynfgCIj23X6Na0MQTk0
- UFflM0L1+UMESQ0uXIPJfQxgEGXzGVB5/AaIgzQ6FZNAZ5qgog0NCK4bIFWSW9O1aFoA6Rohl1xiv3dx
- 339+1hXDMH3gTlL3KwCICJ714hfiJf/yZe9dXFp4V95QXa82yfDFAWLcBUWylTvEmjeu4+8LzBZ4kpgq
- Nof0OvKwrnVEMgpwswq/0t6AEh8hSS9N9gvLvGrcbfcPRN+mGlMlmtC6SZ+PsqtML0C590A5PQj9UsEN
- UraAiTyolQGLsT1uoPC6S829qSnnDIrr5e/EqQstbveVTqECvUczU7I5YdMB0+33CUEKPkVDETlgioN7
- 0JrklwOABobacw5BUzQvB8kgg6m1AOwZmztKtYqxFNeBiAB3uZEnhWSXnbCRPUtwxx1W6KzkIMqASnVR
- a3r/nbFV2bANo9ytZz+oZogcU/dHzW6m6d5XycQm3xsNPgWITdTAJsiy6Ra4EG6hrIygcGrHaVjwyyzH
- RicfDR245+ZHTZdWls9MAHjf7/0Mdl/2ZLz0h1/RgutTROVmrzE/1mLeMBrjSqrzYkojB8Xa9rm9YZvn
- 1HqSNLT0aalJrsrttVC49RhCzm2rnDThhBetzTqUOHz0fhqjb3JlLrm9U708tedPX6sCPdNAa0FrKy6A
- Un07JxSaUIiYkyovA5Ags+/qDBTqjSmdFl1ZA6/rB1ipshSaafUl3cTk04fEmCMvQ8ibV0MT9JhaWu76
- ij71cbDRok1xRvbnNqfDbvedMCRTq+9dfYAT4Ig8qMsCAhZ6zj/Es5R6k5junlF62aZCelK3BW7CfgLN
- wHwS6iSsKkBCXdJIFDuwNIhpA1Cdh3VjCgWwhOQErNfODhSKCVwkNoqlqONd1w7M66lOsudbFqcB3CA1
- Ytc8/YIr1ndOpw94/99/VeCPXXM9bv/Dx2My9eZEKQpSnhSabrpMuMgygDUjjjSIcQXMXre2JuhhpUSa
- LddpcWeRx2mu1RLCEOiPu6DNkqJjny5kATOmeeGRHjdfclAx0JHQVPnjaABpiylctKmDzDX6CNkxR4Dk
- MVj2N8rJQEkcCsCcBl6/aZizD31GZwppA1PbNTMW748kwREX24jFtTMkYbI7C+YG7Pc327qRn+JxmERW
- pRBg1TS2SV1ttYYbmX+AU18LnIOIYQHsnnp6HQcWaCx4JLIN588EBkc/tbNKlIhy/sWyQ1d/jiYE6hmL
- mN0cmzaBxMZOV7EpR2e9gCEiBaXxGnRZKACyCMg6Kj6p3JdYa5BgVSJGHCXVHw3BFhxpbAIrYn0c24ru
- Ht1TleofGEqtt2wO7Z7QYSRRTp2RDAAAVoYNLlgZI8aKSrfXLAVe1vh6cmiaPdGuP2qruTvV4PeLn5x3
- sm+cdpG7vCF4hn6HXHq1finmma1BY2JlOcZA5slEXjvCCW8h9RGkt5mjNQa5R+0tU2Mp0nWCWG29lumw
- ie9ewqdj4pbTFlWhiH5fQlLtmd/LO/0Z+58ag9RlWC7FXqCk+XtFIWcvNEliH1oD+/sH+4ylXVrIQVYY
- EpdMDdiQgGY0qj9pkL9PVOyHNhzdeWeoAiFFQCZhVGKDOSknKpRYc5pqh0QRFwo6oBTJ4h3UGnhmALKN
- z5a+E4KWFmCQRFTSKbJPFnVejxFElq1hV+esLezRGp3XEIhVrdrGyNFLTwEqN/wUyRwEKgVsS3hwnwGb
- NRKpd3aL8AWhXb60HY/wxKe+6MwEgDZE/OY//5JITIc1DQO2V8DpqwWRmSlqfT+wheE6fmQCHyHdJA0O
- nBatNxOFtlPppYxdT8owzvyz+ouMl56YY1tT/6zbnhuQeYw1TxYKaeH0Mwnqpfku50RznelcXli1nkZf
- mLuG8wGvbPDNNyF9k06LciDLZeuLI7aKmWVh1YRzoBagTQuidQ4+LtkG0/8zYBUMTKTTkkxV9nGlC4HC
- YNQJ4kxRN6m7BMUl0BZ8A1QkE/NcC4JwTKPbXK60RlByjT0LcjTRzemAIbH6PKrOYTlFAo0hvGnrbYZa
- WpOvRwE6i4ioEeIeVLSGik8Y+m/RQD/BYNNZml56DlOWbaUsrfQ8jOlgZT5hjMCQMkCdFuD8MJX/uHgW
- 7agXqjMTAIY18LjHfgWE6ysJdKy/QL1GGWrta0ATX2AqalCmlsE2+46509tcaimbO0ocaW0u8/JjThaS
- 1KVONGDqo+rEfQh6zD7aWg5YViEG8MhZhmHL0yk4D+Wde49tQFJucoqeb0GZ7gNlLZix/aWuHgqpLkJP
- jqpszBbdfiWWAP0eQ0+t0VLf/F3YUIiUmIf6WZPsmgzzhk/NxNKUI5hAiHENZIQYdyv0l8cARUXSeZPQ
- aMV6plhTzJGh4pmY8vUjKgQaGFBJNfsFFSLVpqBrCj4uGWbWXmTYf/UxUElv8CbAE21koqCKWymUhU11
- gzK6gj2oGU+Q3WoRVh22AFxgWkzOTkCIZoCiB2JjCj9uXzZvDEtWLi+axoFDgT37qRDb+KLN493jpqci
- vv6//85DHwA2WqBZJlA9u4pq/hHQ0icVtFDNZQJm2V3KJKFNeoDMp6w02NRELMk3k/37BpzGqjTSXDdu
- OSUFOer3/k6y/o/Mp7zIwpf2klQCSGF1hnnC0CyNfDJ8mAoAsJOH3H2o/FXO/Gep9tvql+gpuk9YYhEc
- 8yehovnowKiUipv0dVIASqd/1sfZqm3sHW6VR49mBRati54WJWpEUSsx37zetGLaBGNajGljVvuNC6qn
- j5n1OyIo1ka5dr69Oeta8M2io2JQXbMAD3uAOFLnHKunyd+blWbMaFFhggqbIG5VlYcCmE/q+sMMJK2B
- olb1BOd1nf2z6f5ZAHNmoTYWzY/QNy8qSFxACPsQUYOrozoepS7de0rqwyFRiYlOFHlgXQCEXL/CVYGy
- nXjOhivPKXYhdk9sNx+Ymuz9zhsOfvTd2Hv2owFQGN+9+cnRnoV3ibpyPBlA4yQg7QhPLQAMcxbtnWRP
- o6gF07TQkvON5UATazYVIqL9KOnvJ4U8R9GZTz9zXnSzMPIgKk5AKnwFi1rZalIqFH0kSUMhWT5RL3XP
- 5USJ8y/sLucwCmWAsBPEpMr6GUTKtbZkGH2qctbJz3gM7gUQvS9zjab0Ov9cpucolbH0VKSE0Wb+PklW
- 5eWxEV2a1NshN2dhB2TVIDT587AfDrnuT8KfJp2dORGD1NX3DCkmAlcDt4RVM1DrulMEi7L5iMeI4awM
- ZJIRRHboxuSNLB7ilOfU6zJykvVEFPRTWUi1BqIMgDgy7YsJRJbse3W2/CiVsam5jcrWeLdNVlmK2nDS
- DdD9tdlyNXsD1+0bKHRH9j7rqbjpnX/z0AYAADh66AD27bsYw32LQNsdX1yp39vOqgYizyLq6n76Gw36
- uWyLJGzPpnOKKrRHoDP5rggkkj+ycF9bgDC3OQr6JJUpL/cDR2IWFwxDmqf15IWYTtuEt3fr88oWmiDZ
- YKetjjkhkTJAeODwFD/OsQ81UNKWjjChD5aal2TNIE1dL3UOYomYJUUA2LrgyMeAZpVFqAwuXIN4oqe8
- MS/z9/AejTXIrNnmoqGg4orIwDa2BcfEhc+zclAOnpwCtJdEEREDTfmB1LhVFl6lCsXcFdh6MoLRRFGF
- 1PRGq0KtuR+N1H9PGgi31ngc2Ioxn0Ga2kQKRkAKKRsjk5CLsgiuTtnGXTKla9OfTCVUaZY7f3DMHVy2
- 9j2QMo8DV7P/XQ83f1Ric0eYNdj37CvOTAAAgCOHDuLRX/6tmN71aQQZtNVo8R8RJpdAuqfOfyFKJBAp
- JJSipqYySE2PDAQJBgyJRvDhorFWruy4bVWTVPvTPpFE/0wrPhkysGm7SVE6FOuvHDFSESESZjwiK+BE
- 9F1qOL9Xb56Qg4q4JkFKbIqbL6MUxKiYjmQkILbNDKgXeGLahFTSq3tyZlS8fzE6TQHDs6ypnc4juwUO
- GFowKG3MtGofLZIU2ZU78ZhXIE2SyIfLwGtAsIyDqIfFyMFDabMadBoQWlS8quAd940wiDObhbnqEgJR
- llJzkmKdtPeBOgF2Kxpbjb9oTkJNUhPSNL5FxJKN+Dzr0D9H8nWhaMCqWrUeV53KWz3YZkUALWHanTX8
- PAMrMjvz0eRqdczV7A/q4fjVsatPRBmgqo7iA3/6ew99CVA+7rz2/fjyf/5yPOFlr8LHf+8XZ3suvmxn
- Ox2/VEN4lfeae6rLwBZNsBpKU7D+c7ueQwwKdlTuRMde+r81XaqKEsADiElpUVb6Id+dW/AEc8q8Xpa4
- dzxlNdcciErjkvJEreYm+TT37x4MQj+Vl5L0UzZ/YlLCySev5Ou3BWKMjPoDG9NuPuUvOQ2ln1J2ByKw
- lWoeZD21nymPgKwRSRasZdEwAq7Q1BhGoTYg1gxM0RR/C6BWsuMutXgy0YuiqgkJRZAs6LWtJmC0EKnB
- sTbQDgFhJySu6HRIRkBcSJ12phmEKpM5iykoid14Nn2/BA+XYRIBZZoAYUWVhoyeraNFywTIezGspB2q
- wXwcVXXCypRYaCkMi1KLinKXgERX1+yFq9Wuqk5eSVX7M1U9+V/S1aei1Lhp/7tx9OihB7SHGZ/j442v
- +UUcueZ9eNVNhyrC9ImEbqjd8xK7HpCbgrGoq8joo8rQUr7+CH3evG0UmWfZxbmvUHbRNYBIT2TUQS4w
- fLBViklUUorN0t/A/vfbzunF698ptoiWIouN5uykwCOkRl8ZzDxwtcbf7/JzpIQL56mDn/gifUl1KtuX
- yXW36ikpUcGtoN51RfH3plJj/YToG0NcXnwD7vQUkeHOgjq1wKgwUFVKcVegFjVjiMm8w9HC5bC0QcQA
- gWrLIkb2WbVEjKiV1GQaAhDF/QtVudSjHIijjFSymyZ22ivTkKMAcQURCybf1Vg2mp8HiiYzZqQrMQMR
- Wz5iJQnzMVO5dpGaSdEX095Ybq4CDvVV5Kw3/QKYV8G8eYK5/fmqkZdBRq+XWK/FwLhp/5Wf0/79nDIA
- f5y7ay/u/tBV55+4++CPde3mhXmOWXw1+0KunBrjMogIzJt26neGcsrdTh3v9U+G/gC7bLQRSoEO8jrT
- OP79cZezyaxPb+o31Evx0Uuwc8shuwv563PmoGlvDkX9YWO/H1Cm8cWorghoVAY3sRTeVHrmwcS5pTiv
- NtRHHZLJXNMct7xfYuTPp6Ip5qxrS0ZFQT2vUXdnRXIuWFOsNgAO5oKm/xxLbxOnwj6bGWm4+o52/kk3
- ChpQbFBJhFCtCkD2PYimqv9PA/s8riHZJC1AkhqRRhAMUMWBWnTx1Fx5HE2YA5eQgHnDkI2K5GSaaMZg
- 3JGIUepJaJOPEtQYBpHWcZ+xBGls+IehUaw3C1xMuVK0gUo0BVfrG8zTD3G9+dNNc9P/jvGsdepuhKDB
- TTd95HPeuzUehMfxu27DeG31knY6fvzWbranMAExuqChZBNJGdjp5CCITlM57hBlYBe1Nenvaq7G3s6F
- x+GvytJSkop6yLu0tZSqwj5/pmBoPbbTPpipiBSCoAUhSWQO/mBknKRaU6Gc75flSqpECs/D/mfqBys4
- OnGLBiH1soG+uqGfdo5115QzWiorduLLFmqzbX433bQ5OpkRp6bebRYiJcXE62ZhCznB7puP8Pwz6xxe
- hIsJSGE0Y4acPu4UYev0u8pQlddSSqG1Bo8UUWFdRTSkNnyCIwYrBDQqFS6VwbKCSYcruUvl45ok4sFF
- aSIwHIoTnOIu1VPEDGrzpVqNmoWEnCMam1KiE9NMB8H0AHW+P5zbTR6oJyBeH1d195+4OvW6dnrBCcIY
- wBT7P3UIwKEHY+s+OAEgBMasjWMRVz+Yh7PmOllBEOtgXjOw0G47/deSRRTzGoAO3KuL/fWlJuCcoKip
- DBE52KZVTLgs2xocmTlItluSlN572RBTGuooNipBAn1p4gxWogDVP5hnCZZOydK3FqESr5D1CEEZw+9u
- JiRdsdkzwiBv3jg3BvVr1CUSj/IFioC3Req8T8XW07PTBF5MvMIYawVowpB1VgZZ70KpBy50MTUt/ybJ
- u0cKZslVGWahtQCjWUUwdWdV6RFEUqKPlw0E9dQTyxoFhMACFrUAE1FJLxYGS0SgCEGLiqYQjoo4JKXW
- MrUAZgj2XskwXmoIAqIsaaAA2aGiwYLFMRKK5WBy4FBElBGY1u0WjvQ7hYxz0T7Y4lxAz3uFeAxC/BTX
- 47+QODoxaD4NwRA3XP9RPJgPfjDeZGnnDizvWrmjqutPYU4EwzdajnorNvvsrEGyoe6usqJyUMm3bh7m
- 6ouz2SapLhfwYC6qRuMebGajyBKwY6NGsUkBJbSbnzjFyNIIPym3LTZ2Vt/1foJv2Np+uV88gHnpJsqf
- J+PAiyxHuFAhLpF2xVv0MgIpgkR5qiB9Lm9mCkoxsn7GBhPcgFS2GYwenGDS1vkXfT+G6gsS67XWvgFn
- g5ECHs3img6xmBq7ycvIOt4TCHcITIYUrE0CzK4QVWouIs5IVbkwio2p/UZ9PhkGv4cKBOD6kchdE7Yu
- v64Xg0HRJG3kKANEeLYwSMGfaaYKU7SpgZVaEJ9S5GM6CPKazofQ3PkvbOu1vYfryc9f9O0fvFsQcf31
- N+CG6z+BB/vxoASAZtc+vOetf3IkYsefCRYmTg/WRl+mrRKtA4iIcY9p0c3AvIGqOg6ik/b72typWSzy
- VDbMyWIXvzIi0TH2I0TZaTX+rNgA/Q1M5cmXLArKpmHcvuQo9S4caksRJfnGsfRioyGFtInBmmNBZjJr
- LjdCsT6IKxG5zLYg01ixDaqftmWSFdMOFPP7VCbk+XoWUtGGl6riDKwJJklXIJILYihnX8xhmKD31RuI
- uTvRpefqWFYl3aIsGyEoS7CR4UcgtSr3CBKAhs1BiDDWBiRvoOIjGiTiAiIWtR9AnEjWupkrPc3jEoQY
- AYuKasTAuAqxKFmcfs65NPXgmPgORr5K/oQM7TlFMB9DxILSnmlcqGRHg/cuY57xp9nrBERty9Xkl3/n
- ve974x2v+2LN2h6iBz0Yb/Ls538DQlzEYHHl3FN33/rnsT36PKeGptPHBBy8y+lkIBfaON1MPzegzAAy
- WSNtbvsVHFmlm6kzocmRyY9ZvSmNpavzKT0ZjTgmTbkUjOzUT+7EvckBmz35vBtQsZDIWF5UWVfYnHb9
- G0hfDixv7Ww15Sl7Wnww0VMRbJEIL3EIeU5ggcjwFzyxwFZnhaAe6MryiLhTwSzUpk3BpvAspIxHb8iJ
- DM17Ecal90Bcp8yF7dRXGa09ht9nTekrddWtMIZU6yYYo68S60lE09ZXTH55T3QTuRcESUDkQhoesBNf
- rcADRdQwgo/r8olv4rHKmwklIxMUvn+a6rspaRZeIV4H88mivC2Ro31ilza9B2l9eyOcq8mbmuHaKyVW
- JyQG3HD9hx+yAPCg9AB27TsXp46NMVxcGhFkJX/BCebFLolmqKoT1gBZgMhOS/dOnsY2PG7dUD05MCBb
- imcwUYzLEOrAKcBkafKIkQWBtkjnnX2V9evy5kEBKa4KQYyQU9e0a+c3f7b71QVq6DeqIHOy5z0ycYoF
- 5h0vS5oSJ71DS9slmg4A1EhTykajjwkldbiTzHTqdYQs3FGUXLmY8P5BtElEMBXdTmWr48ieG8yvYKqI
- OlNU1sAScwC005gAY/4F4wfUAIag6CKuqzrqi8MemjMigKuTmXwt/j2VbUgcUWHVsooRvEko6JLWfjF4
- tMAVCpUkpKxFocsBBDcyLY1ILIOjkDMD+44h7LWT30av3iAusjZlvfrrJv7eQhzeRrz+4yGMTgyXVnD1
- h/8aD+Xjcw4AX/mDv4oRZnjHG38CX/Tc73hJaDcf39+gJSzYI2Bnjb6xBYHGGiIT5AlBTM8tT2jMKa36
- a7VuGxfRdZpPOoqWXs1MF8Br0rUCdOSPOJciFSepFDRUx9wTm5ZAKGr7PIpzkoc397Rere01022qkXLG
- ZyNLCUlRN2P6KTUuy+DiCLqeAYuIZUPewPPSowJxbk4ijUul6HGKiXf6oldhT29+ZQIUcuDksYFvSlQj
- J+pvQl2TZTFQWG6kgIo2wHQKMexSdWf3FyDVz6uqQyBMU2PT3yzKCkLcbWXHRGG4NEaMe5DGatYqZZqA
- quOpYefOv9p0hJUDAuLsuETi7j1ZtMZNRx33EJN8FxdmHhHM64hxh65J8T4WirKsAvN4RlX7W0STXxIs
- 3jNbeSvk+LPxUD8+pwDwDT/2P7FyyWPw0V/7H/jSl972lOnaiR8QmY2I5DTVRSn44aKgrS1Yx4+X8Mc4
- F0iQIMWpfSEjtaJKgp7ZCcedZZPGoAFXclOyw/Y6BtJbEkYAAB8uSURBVKUtGQwt1iXlnZikpCVj3xNs
- tegbOEFFsv57MsR0Jx102WFAiuS/lBL0z5v865D17YpgUUgjFozGfP0oWVO732GduOhZxqsIYMlWO4Cj
- S1ypKi7JEJEqtcgqmpoiw8L7ocpUWIoWyKLdJf8ctWklsnb5qzXEuFtFRVin89F6BSTB7gMh2Yojw78Y
- qjRNsUIIZ6PiVTAfNs2CxoLwWA+COITEPUrPNcgt8xoiRcSw18amp0DoEONOu7ZBxVL9kBICaB1u4Kly
- Zq0R2Ry6O4b3WGIczWURyJb1hMCjHR8a3zW55+Chf8Dllz8bN954zUMeAD6nHsBrRfCzT/w6nH3ZYy89
- eduBX2s3j3+dNvrmT+1tKLw9DMC8EQhtu/nTmWya/cxjayZuoq+s0rcaU9jxCKnZZ+zDDDKaxxQUP1mc
- 0mwQZYHpzZVOPOWlvBejFMnsRDEdfqW+FhWDlxwmJJmMeeBuswX3P3kClomDKQCX/Qgp0YOchSniCMAs
- 23ulMi0WX4ONrz5KYioq9z2Dm2coK26ajCvJDUXmCVhEUPv2BkGsQRZHRtVgoFoDVSfQxnNVj9/vt2UO
- LBFUHzGUZJsyICJBCHsR4y4wbdpMfmTybxPznYjoiWzGYYJ2Qwio1sGYopMduXPCp8A0QYxnaVYifaSq
- Zg8Gh6aZbXDHD6gfI1GLEM4pXldCrp0q3aroR8NvXbpw8WWgau3j73gjzsTjAWcAX/ptP4TXfvuP4Kkv
- ed7Sp6/6wI914yNf67VMfyPqj/Fmh5+6rhjsASDDJMuNvoCscFOuo6iHqgwwrxyzHUBIUVobNseOBe5+
- O+Vd9E9NOxld2tnRiZJw4lXepDTXjJNCnMQ165KI5zR/XJqj4krCrhazevfTm2dRFgEolQ1ctCbmLMUL
- HIFv6Mx1KunTJRejg2CG7OjLJtsVLHWuDRffKuhF6iIrkBTMBAxylWCoYEdgH9kFoDqpEFxT582dCGP/
- cUDFHUJcAsUaVXXELgElMZEoO4qiaKKW3qZboD9fexCRKpA0JvzJoDiCcDBeQ1tw7mH334xiJGtciJW6
- zCfsebuy36LBr1Unga38LI1vKstOKzBPQNRFCN3RrZ6ID1Jr7j49HtB84Rkv/1HwcIgrX/srGPCeb5mu
- Hf8JyMZCf/SkG18VgNXXXGf0ZZ2UCT7aNKE5Q9GBpl/UFWVCloTSuqqzIMI5zdsmIBCKFHYuMaZtT+m+
- FHcezBVU2gQdDnO0Tuk1/1Ceyj3W37yRZ/GHpD/QD3xE895/yDRb0p9Bzg8oadJUqhC4QrKfZFY+kU9B
- CvZj4rDXGWnofQyqCqqtBUrHYLg6s4OH3F7M3pPtzxWfAPMGmDbUJEN2mpxWBcYMnGr0RseMaABD1CEu
- WbmwDMgoS6SQgMWIxs6kNIReTGagMZds1EGoUgszoy47TVtJQe4q5AeKp/EDuy8t4JOHNEVxC3pJ7lhE
- KKS+XNiUAMzAVbdWL4z+3+mJ2Q23XPsP823uz68AsPKYp6HbfwDnXf6sx02On/xvEtYek9lcnmY12fTT
- 3Hr7K1tuJZZ3EMkbiWY7iCbnO3ZAL1hM3XvvqLpjr0ZV00e3mbhaMS/kVD9d+LrgJXBG221Do80L1z9n
- 3c8MhAudAclN/y2cbvTphNshljGXKAm2ARfRnAQA5Z9baiFssQ+Y55AjnaRUli3i5i1dOvnJbo+kZiKj
- x9IzLXwVBqmtnEBPzCIjJ8msr21TSWWBqYNggE52g+JAR4yyaM3cwmHRYbWE1K8gByAJ26GiwYVMFCSy
- QZ5IezdqwEk2/tN1qJ+3Tf0YAplzsk5cuEB5ulGKrsVZAill0ZaSDt4ik92Gtsm7gvjmcHcugkRnnJIw
- BOHGT930Le990vNaHLr9ljMSAB4QEOi88/bim6/+C5qdWnsZwtozvbsuLhMlS2Ng+ThQiVs722MdhP3E
- 3c9y3X51M1r9rvVPdz8r9eJ3gYd/S9yK6gYGUxAmY0Jt2PuaOwwrlJj5FFxX0GG+SN14ToEo9wJcQWbe
- cmseTYi5P+d0WHqyX+gJYPR2q0j/7XvvWfAJtlQgVHCoq37kSCc6ZbalzCkdFdOD/JmRgmL+f6foNgbR
- bfIw0k5gKfsjyT7bJK/RmYS3GEqvKiYbpqeIxkaH0eS/kYw3NCA0tvkXlKrryswOLQYQWX82Cxlxx5Sm
- aarN3ySD5kpC83ldTAo/Ws5MEyxJpDHZrw3ATF90SrJpBCJA4o5kCJNQo+7i4xZzRmZzjQsHXJUyalmN
- 2tciw4VVlRA3u5tkfPMK3ow4nZ2xEuABNQGf9fXfBx4u7jx143V/JrNjX4nkSsMzEL2Pq+73q7q+q2vj
- FQBfqisi3AGSm4njDcvn3Hlw/Z4LhEhAy0vojs9Ay8vnyXT8cxTa7xKhSmTJ6JQzS/eXoeOS7N+HwnY6
- TxUAFJLZeVcYdRUe6ed5BBW24At6JU3E6d16ymYitilB5vwTkwVRJh+pBZUtSJhDr8OCqS10UKngEGQp
- sx4WoQwYUj4HKWiIjBDCuUZgEnB1uHBKjklXgIoRrvS0juyUltpGqjZ6lUWtayWqlLZDnONufU51wjaX
- YhuUl0DWo/Ha2sxELAOgqBgB8BoIARFDBZChNZSngFPTlM3+y7+yOggzbcDNUUQqRQjKEKBNlaXjDcS4
- iCgrYF6FxGHyqtAa3zPRaSpjyRSDc4YkNm7ukOf9JyGyu3CEKuHxUxBtRqrCe5i7nx8snXxPO67C/us+
- fsYCwAMqAc7bdzHiZGNft7HxyhjoPKt/psThV6t6/MMSRx8hxsG40X5k5Unydwt7w99t3oGreEA3E9HJ
- dnMZEoAb938IZ13yRNx99buwtOdR67Sw+AEKfDZi9RSiGTOPc2S36Js3oqdZXfGr1M7fOnmg1APYbuwn
- 22QC5abmbYIDp3HP1tf3Ey3ZIjEOJFsziCrMyEibUdTYCDMkHEMxPEefiIRiepDr+pKskyuK0v7Iehrc
- gWnNXJy8q575+G6dDhkaqEd9/9xujCBmpOqirAERi5YSB03PiU3YtbIuvfdVGnuOMwg7E/swqLI05mbk
- Ih+O6qOkTJwchIkNYuyfOo9mbcqmJUUaMysjseJTNsKL2ozjDbgicrr2IDBPbbZf21rbtMPJy1BvCE7g
- kwAYTVoDSdbDUEu6NRB1M65mv14Pu1fFbnAtVZBuE7jgCZfj0B0HPn8DwIWPeQKWzlneWD+8tk9i9VwA
- M6L217na+HmRwWo9mECqCry8gO6kSLvKUi8xqBLsv+YDOHr4Mzh29DMAgKN33IynfN9PYe39H8ZgZce4
- WRpdF9vwQkScg7SoZNtNSXOz/+0L4nLzbh8Ytr6OehmGPpq5z8AJogqa13RTeCpRiSlwMlAs3qavBKyK
- O3VKXV1aqpwbb8ndKPe80+jQXYB6vQRvQDq23c1IIrha7yHcxGTSyDQOXRNAY0+bU3ieQjDMpBjjaUg6
- 2acm/InkredFgH60ESLqVLLpJ67SxIVdWSdZkxFAY6DaNADO0IBSHvgYlbEAyVCCaTxKLk2XaT+gmcqC
- GyydeaKjPheuScK0KMqxNjVj9fcNS+8XjdsySd1+siCivYoh8vTHPgvjr4eLp35YQnN0sHgUiA323/CR
- M7b5H3AJ8Mwv/2aMT55AZN4r0/ZrRMKUMP1boFpTlNva/QYxXPHKn8TisRNYPn9vc/d7Pvb7YTZ+uaIF
- S/eU053acpoTmtINUHzCdgHgtDtrm0wByGw8zKnvkt14zoAbMyLxzSlpM0ds7fz5zH9kwhqdCkggy6j1
- X7Ndz6L47lI2IxlbextiHncDxbxnN5UkYFmahWgWYCNQWUhUaWUq1mARq6nrQgl4nEoHprHSZN1GHDW6
- uFdP/wibpCjaj5JBSczCm+IbeN2aiC4gspR0Any3R3M09galf2U3hBUTiUHCNYxTfynKKPc1AJssBdvo
- A+u91OlNtYY/klh/ym5dhnf3YZ6IDv/VADKOVLXvJmp/GNJcWzUzUNXh+qsfOsz/g5oB3HXbfuzZcxHA
- 1aYE+SQE1xHJTNO29QeEYDr88ffjJS//QfzlL/1IvOCiJz01dKtfTpjR1mYd5k7bCv259VzqLTt7E4Sc
- EdC9BIPTlQF5A1Hv3zMWXNF/SHDb3K2nJHzZYxIWGIAEt/URErfozfHnP1ZvQ89lNIWDjQuDKHa9fEmV
- TiN/rQYp6n13xQz4qTaDoGTJRVMQrkwKWyWwI2VdRnbIMnlKDIMKL6o2fwLkmGxbug6c9ZwtbWYerxLF
- UyIri4SWKl7T0Z7U5v7knHxXbc6ipC60Kqa24/0lY+BBJboaME3sJB8YE890/hJWxTr3NEsZQob7Bmzt
- DzkgaQKibkbc/mY1mP1oDIu37j3v7/HxD9+BI/fciYfj8YARBzftf9+D/mEOHz6pZ6z4bo2UxCTTiMXH
- jEMAMgOqg6BwPSE8BWgfM48g9Jvc38gR945SPN0kYH7Tzfn7oeTll5gAsUWXufzk0uUyMmVZb2w2lv5O
- kHQFRAoZdMypB8/rl0lfybi0HzPfu4QjkFICORYTk5h/N2wAY2YTDzFK74JtsInxMOx36/JXkZMOY0Sn
- NXUCTzGiLIMkmEW3deqNHWdyH2rIabU2YwbicAsx//iIwoFJCL/QdotfFVGBKUK4TXTaio9PIM0oxL32
- Nask3irkikE1FAU5g46UOyvbsmKvbmqzqEuMVFhq3yQ0J8zKLKf8+nfaHwpJ7BaQlmj2GxUf/RkJO9cH
- g2tx/O6nAHjoIb+nezA+jx4XXXABAGA4nNoGQLroMa4gxrMMWLQIgD4Nwg+B44t5JN8h9Y7vF1r4dH90
- JgZLLbXuyt1ymvQZtM3zseWUlUJjv3f69v7sp+WgkO7KzxcZIoRdiLKi/niyYPXydtBk2TZTke3aHjL/
- mSwz6SV9tM1bU388mWS+zdraGm+MToOJ24NJrUaaNs/X2bwDj0r0G1KF4opBas09nrv2tSH1bM7O9du5
- Dq+4bf9XvOn4jD+xNDz1/U218buEZj2abkDF65t1fex3q3r2nVyN/zfzZCM13FzkxaTiYtxj62mpwKtY
- /yUdGiU/xXEnlNZVtgALvdepY1Ahuyp2rNH096rq7p+NsrgukXHdNfecEbz/F0QAeNl/+T0wpvjNq040
- TOF8IHK6gArIEQF3QL0J4E1E7cvGG4/+bQC3S+TxwnXvfydXzXeBBn8OVKeyr56lqDJEX3+dsR0qR30N
- d0Jk55pg+ZDIEFtLDz8JS9uuMqhkJR/IwIQk2zkxr8ZUiScFVdbILIlGOoLITtO759PEAiqcfVAo4G73
- HUMRWEqcgqEIU3lCQCEM7nZWYkq8Ktwx1HQ6muaD1Ab00UZXmucnS4ZayTrGWGQaW7NyZGCgUcLLJ7NM
- BMX8U3uQB9NXizQffMzT/xoHb74SXWgO7Bgc/o+DZvbKut54N9XH7+Fm7dXVYP0/kFRvOHsQ/mNVbbxB
- UX4BxGuo+aQJe5r9t5jjb3QzWs0WYtxpuJMGqbRzxSGUpi7zG99n+5s9ZKgGi/iPVb35XyN2r4o0uOnG
- 93xe7Dv6vPgUAP7dL/4xPvXuN2PnuRc87pZrPv6m6Xj9itRRRn2MuHsNMQ6KxOMkm1cKhsd15MIIO84C
- RQZtbKIehqXQxi+TgJeK4IuBcDkh7tQo7tGaeuKMWT0oeRVErma/DB6+UaJ8F8nay4HJzq27j07zZxRM
- O6/ClZueGIguT0UZyOLzZU1lNT4TJtqtJgfTdL7D08hPUBqSWPregyJH9EFKvjiNJcdjZEmyyjrk/hrT
- RYhL1h9wpdwKMewCeAzmNYPjmoMSb6jghqyArHkH2/BkUOMoIwTZZVeuNZEQQZBFgEj5AbwBVBtHmGc/
- dM6O973+6MYzJAad/CxiHwLNsD7dh+GuY/vaiVxS190nETBrMNDqkMOzZrOlv2rDnnMV1ruhEuKybMpD
- NdQBuVBDSo1jhzd3RVbSZmHQJEtO5t67adRjwMuJzENp72Aef1+Mu9/a1P+IG2645/Nl26H6fPgQL/7x
- X8PFlzwOr/3v/wnnnXvBN68eP/aKGAeVbn46QTz7f+rhJ38lzC76GIT3E4WxxCUQNnDj/qtx7M5bcN45
- ++x+SBu77tOTU7veXi/FvyKht9c1jkahy0QGi3lMZwsgCTl4sBEQxU9WdfsqAe9fPGfXO9tNEUj4MkKo
- tk/Dee5wLpSLACTFHW8QyTJEFqbA4C5ifjsIlcThPthIzQ7Ajih2TBtVMppIBitlow6g7WI5lRnJ3L97
- HCDDJ1C23VaobL9voCl7lT0KKCjmi6dgWgPQIHbna+ecp3ZNZ6BoWZcZaCircGCip4tJclvr8kHWGzTt
- RuKNwNX0VxYuvv231k5eLpAK+/d/DEePHsLdRw/gvEc/Cpc/9gCOndqzGUJ9FyMEYsL1170Xl15yKZYW
- upMbk+WnShxeDjBr938CZsVYaFNxPc36TYjT1gEKkw4DDSVoePZyVK/B6WHm8Bd11f5lVW++h2lyE/F0
- RhSPEMK7qmr8i3vO/cDbZpMRJC49YBOPf7IZwPf+4h/ino++G+ddeMEFH//gB1+7dmryAkvZbyNuf5qr
- Q6+LcVcAGDft/+yjkic88Wkgigi0AukIvPcSlhN3fiNC+1MQejQgItIMgLDYOzWhoiHE8edP3T3+qfMu
- W8J4sgzwYIdM134TceMVIlJowJmJKYbHmTeuYpLLYoyXAuCs/wdL8U1VlttPkAzeHCV+gqru5mbY3dp2
- O54kHX5eYngxpGqIw6eA7jeIuYVMfhyQSwFpCbJBJJBIy5pzx0KFiLAtJqI3DuwTpBycQqnh6KcgUE5K
- xOSyGZPM909uQNrhj3Gn6TIEm4lPLHNYRnRzTFEyGFOHIDsA0/+TBN01oowMAF4D8+aV9XDjX8bI90Tp
- 8KkbPnSf19RTLnkiNuQiLCzOLuzC8NnM4Xmd8HMlDp4g0iwAXCe3at48wcB+yMJjgzRnx5jVejVDbM2h
- dxFqRKKNTFUumr2HaPpTXB3/0HT8hJZoE7fc8jd44tOfu0+CNBw+fahtnxzqwTGI1Nh//cc+bzb/500A
- +KYf/WU87ZtfUV35M9/3qkN3HvmFth0xUfePzJOfOHH8Re/efdbbIaju0+aff1z2lBeCGNi4SbD0mPAo
- xLgXAhHQLgi9SEReos7GMjDTjXuqZvYNsZOPDJcazDbVkZWHC5d24/Ufk4izgRBz3TckYvztYLD5f5u6
- vmjWhm9qO/5XiLicqKsss+iA6iCh/Vuup7/Rbl54CzWnwPU6qqbFbLqMehT3xhl9JQmuIEz+bNxdevX0
- 07dj55PoixHxjZDuk8x0c8WtxIgXSMSrBO15Wzb+Flmy4shH3z/J4NtbFWqlsCsTFOzNaVLEke5sg9xG
- cHXY/BwcpWdYeXRJbAM0A+ISXKY8YAGaxZloiHXfnfnH1fGjVR1e0U7qt+268AQ+9t77Z4Lx0v/x2/jA
- T1yNiy+9GZvtXhw6/iO45OIfPCdMB4+OcfniqqbHRQmPAmb3SOR3Pnqlu+eutT1/tNkuPEc3uJq++ojZ
- NSiShgMiqmptjQezb4+z+m+4Pq5YhSpCYgtudkJigLRrADFu3P/Jz6uN/3kVAL74Rd8GDIZnbdx550/P
- Ju0+IvkAMHu7yJ5bquouAA323/DAI+eTvuSF4FGF9ugUiFprSmwwOXUOFs76zHkSm6+QiK8hCieB8A7i
- 6TsAnt54w0dwxfO+DZ95/0dwzpOuAGZHQfUa6uoWVNUEzMDG2gsBGmIwOoqmJhz81GGcc8mjL0UMzwe6
- 50mkIcB/Rzz9IAa3H8Ds0tAMPoV2ej5uvFEXxSWXPh/DZUa3OYTMltEsHEbFh0BL56LdjAibNephBFcd
- mFtcf905eMpTjn1tCNPfDCE8Kp/YgtOm/Wn751ufa90ZepgGKTat1AnApOYqaocV4zlwgUzFyqsLLtO6
- kWrckKS1Zp97Hc6MNLYLESMFAYm5K/PMev4TUN3+8eJZJ/9NO16YMkdc+9H3P+D7f/nlT4HEFtVoJ+Ks
- wmz2KGysXwru7sTyzhsxWljBP38cD998M/3u+qz5V9nDsiomSE43174A8wa4mr5+sLT+b0QG6zRgXPuh
- Kz8vN/nnfQC47LKngaqKJWLYLK1PJycvi1VzBDV9AkEe/5CMSp7wpKeDcRyBLkI3XsbC2bfz737whviv
- LvsqVI1G8xvvR8oJAFc87UtRN2NMNs9Cu9ngyS97Fm5+15u5PX5xrAbHIFgHpEob/4E8rnjSs3HuuXtx
- 6aUXL378E9e8YX1942v60tKDjqm9BYTzRGTl9ChKZwNydvmVyjrbpX+hA3TM004qgGbKw7d3YV5NUxai
- sTYEbZKR+yNusqKgoRjOKToY7hkZjZiz2laD+Mp2bfrH+55xPq56058/pOvvJ7/6y/E71zR4zK740lPT
- hddHoZ2uIyhSqhq5bPfmlKrpH3M1+TmihTse9RXfh7f/xrd+wW1+4ExKj9zLo6oZgERqeCzdLgxwE+oX
- /Atc85qr8FCBJPabycJTvuF5WHvL6zDY+aXxe77ky1AvHMP+T/7jA3rP666+CgDwvb/zOvzuv/0O7PlI
- BcwW4nD3SVz70Q89KJ/7uus/ggsu/AYcP7FOIpIhgqqlEMDVH+47e+f/OHny5G/MZrN/dvq4TwVj2R2R
- C+t2IoMKs83qO8PyazbA1VFkpKBLn7fKDaCgkt2oEY0Fx9JoV5/GoLjDWhOtkoxQKioRQDzmqjs03FVj
- 9Y6HvmPOTYOn7QsQie/ZaNtf66R6JbBxQerxuBsRhU3izU8Qxz+ph7PXhVm9vnl8Bbe/55e+IDd/vvOP
- PL6gHs9/wUvxxre9GS95zgv+/WTc/qpIU4ssnmJuf1Oaya/8+W/96vrLv/+H/mrWzl66/W3OYiF66pcl
- AJCbfyMrAeAbIIucovQ6iEBcVFyDNEkjT1/FZgtOiWkXZSdi2KXoSP95YgGINkDc3VOPNr8RwIf3X3Nm
- 5uUvuPzr0FYTLO64vTq0ueuL2igvFeFdSCQNngHVh3kQ3j++a/nownmbkNDhkn/9vXjbj7zyC3YtfV5k
- AI887t9jNl7DS1/49eCFXa/DbO18hOrRxN2b68W1v+C41D75ec8lZv5zIn6aiJx3r9oEp30UNmHGEFTr
- raml9yYZboKg6guwkMBRCWcBMvJPZcGkBuJCslnLctvaw2DqwNy+oR5Nrg6z4Rm7pk97/AjvP3gXBrI3
- hHbjH0/uv/ofL/zu76FBvYK19fPwL/50l/zR4/4EPCB0h/8O+77j/8HRd7/rC3rzA49kAF+Qj5d8zctw
- /DN3QSIwWWam2XFevfMJ3fLZt2BxtISVhRH27d3L+2+++QVd1/5SjPLM7RuDbkflZCAfA2ZZK+18w4Qw
- zLDTJNfFwESuBah4hYmOywywJFKbMejATDRYswVZSLoA2dR1A1V18jgPwjcB4b0yZdx085Vn9No+5/kv
- RhTB2toEUczWTABIADUVwqlTWHjyU3H1m1/7T2ItPRIAvkAfT3/JtwAETO4+BAkBxIIYBN/zLV+Lt175
- PoAYd911GxaXVr5pOp3+iShvdu6205yCjf9byVUYqCsRQmG3XReIuCFAE9POg8GWjfQUF9XrUQbJrgvG
- SFS8/KBnCkqYgetTd1eD6dcSycd3PP5ifPiNr3vkZj8SAB553N/Hc5//1ahlhtFodOFd99zz123bPm3+
- 1osp9pYaBWK24PowyKsQoiybFr/Px2GovimY1w1JuZgwA7m3gEIS21l1jcGeFRyl79OCeANcjd8wWtz8
- 3ij16nWfeP8/9dv0sD8+r9iAjzwevMcH3vtW7DvvIlzx9C+5h0CfQCFsruM6PsVMh4n4CBEfJqLVRMDp
- UZmzmrChHhMoRkzeSqRCDHsBMXScNQHFCEQiA9PaJWjJEJLsNhDVULM61TJP/4F59gvTzWZ1c/WR9tSZ
- eDxylf8JP674slfgj37lu7vde879tSgSu8BfA5FFInnHaKH5/aquT81aYNg00rbhnHY6e3WI4Znle2RL
- 9mBW2wrVETDYxUCkAUgQZRkcYSamOwxn36lRKwhE62BjyYWwVzc+TY6DcDUxXs/N9C3d5LFHFne+B4Nw
- /iM38JEA8Mjjc3kcuObvcOC2g1jcsfeaHbt2/8Cp1en/Ma/vD0uMJ/MMgLC+vorl5Z2HZDp7TYzdU1Ma
- z81VTN31Qu3zBLyHQDsgaMR4E8qy6wA+RTEuVyLLiAIQjeGSblXlpq0RQL0uUh3n+uQBgN9NFf8D0fST
- 46PnrC7uO4qq/jhm473Yf90HH7mBZ+DxSA/gn/jjhS/6WrzrT34az/i6H8V4BiAKIB2+6vsHeNf/aXHt
- J67Cc577ElRLy/jMx67G0kUXPTfMpj8r0p0LNFPQ4NU7zsI714/LWdRUF4fAl1AMS+QS7OKgHwyiNC8M
- YfElEge71BcvbBJ1txPFDiTHILiS6tHHYuQbIw0O3X3dv189/0m/DpIO1VB5B2Gy/rCLZDwSAB55/P/u
- 8Ywv+yrUS4v48NvfhCc95fm7Y+iGIIoicryqqIsd6RgsVKAYkwy7SASjQwyC4cruHe3m5lfGUL8ionoK
- EF/DPHsdIc6Yqb3u2o8ff+IVz0CMjIgGVLVAs4ybPv6OR27Aw/T4/wBWnHheq8GaCgAAAABJRU5ErkJg
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Forms/UpdateModeSettings.Designer.cs b/FModel/Forms/UpdateModeSettings.Designer.cs
deleted file mode 100644
index ea0461b2..00000000
--- a/FModel/Forms/UpdateModeSettings.Designer.cs
+++ /dev/null
@@ -1,375 +0,0 @@
-namespace FModel.Forms
-{
- partial class UpdateModeSettings
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateModeSettings));
- this.label2 = new System.Windows.Forms.Label();
- this.label1 = new System.Windows.Forms.Label();
- this.optionsOKButton = new System.Windows.Forms.Button();
- this.checkedListBox1 = new System.Windows.Forms.CheckedListBox();
- this.checkedListBox2 = new System.Windows.Forms.CheckedListBox();
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.groupBox4 = new System.Windows.Forms.GroupBox();
- this.comboBox2 = new System.Windows.Forms.ComboBox();
- this.label3 = new System.Windows.Forms.Label();
- this.comboBox1 = new System.Windows.Forms.ComboBox();
- this.label10 = new System.Windows.Forms.Label();
- this.checkBox8 = new System.Windows.Forms.CheckBox();
- this.checkBox7 = new System.Windows.Forms.CheckBox();
- this.filenameLabel = new System.Windows.Forms.Label();
- this.trackBar1 = new System.Windows.Forms.TrackBar();
- this.label9 = new System.Windows.Forms.Label();
- this.trackBar2 = new System.Windows.Forms.TrackBar();
- this.label8 = new System.Windows.Forms.Label();
- this.button1 = new System.Windows.Forms.Button();
- this.wPictureBox = new System.Windows.Forms.PictureBox();
- this.groupBox1.SuspendLayout();
- this.groupBox4.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.wPictureBox)).BeginInit();
- this.SuspendLayout();
- //
- // label2
- //
- this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.label2.AutoSize = true;
- this.label2.ForeColor = System.Drawing.Color.Red;
- this.label2.Location = new System.Drawing.Point(149, 436);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(320, 13);
- this.label2.TabIndex = 20;
- this.label2.Text = "The more Assets you choose, the more time it will take to complete";
- //
- // label1
- //
- this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.label1.AutoSize = true;
- this.label1.ForeColor = System.Drawing.Color.Red;
- this.label1.Location = new System.Drawing.Point(133, 435);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(19, 13);
- this.label1.TabIndex = 19;
- this.label1.Text = "⚠️";
- //
- // optionsOKButton
- //
- this.optionsOKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.optionsOKButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.optionsOKButton.Location = new System.Drawing.Point(475, 432);
- this.optionsOKButton.Name = "optionsOKButton";
- this.optionsOKButton.Size = new System.Drawing.Size(97, 21);
- this.optionsOKButton.TabIndex = 18;
- this.optionsOKButton.Text = "OK";
- this.optionsOKButton.UseVisualStyleBackColor = true;
- this.optionsOKButton.Click += new System.EventHandler(this.optionsOKButton_Click);
- //
- // checkedListBox1
- //
- this.checkedListBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.checkedListBox1.CheckOnClick = true;
- this.checkedListBox1.FormattingEnabled = true;
- this.checkedListBox1.Items.AddRange(new object[] {
- "[BR] Cosmetics",
- "[BR] Cosmetics Variants",
- "[BR] Banners",
- "[BR] Challenges",
- "[BR] Consumables",
- "[BR] Gadgets",
- "[BR] Traps",
- "[BR] Weapons",
- "[STW] Heroes",
- "[STW] Defenders",
- "[STW] Workers",
- "[STW] Schematics",
- "[STW] Traps",
- "[STW] Weapons",
- "[STW] Ingredients",
- "[STW] Persistent Resources",
- "[STW] CardPacks",
- "Tokens"});
- this.checkedListBox1.Location = new System.Drawing.Point(6, 22);
- this.checkedListBox1.Name = "checkedListBox1";
- this.checkedListBox1.Size = new System.Drawing.Size(270, 184);
- this.checkedListBox1.TabIndex = 22;
- //
- // checkedListBox2
- //
- this.checkedListBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.checkedListBox2.CheckOnClick = true;
- this.checkedListBox2.FormattingEnabled = true;
- this.checkedListBox2.Items.AddRange(new object[] {
- "[BR] 2D Assets",
- "[BR] Featured Images",
- "Icons",
- "Additional Banners",
- "Additional Loading Screens"});
- this.checkedListBox2.Location = new System.Drawing.Point(284, 22);
- this.checkedListBox2.Name = "checkedListBox2";
- this.checkedListBox2.Size = new System.Drawing.Size(270, 184);
- this.checkedListBox2.TabIndex = 23;
- //
- // groupBox1
- //
- this.groupBox1.Controls.Add(this.checkedListBox2);
- this.groupBox1.Controls.Add(this.checkedListBox1);
- this.groupBox1.Location = new System.Drawing.Point(12, 12);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(560, 214);
- this.groupBox1.TabIndex = 24;
- this.groupBox1.TabStop = false;
- this.groupBox1.Text = "Icon Creation " +
- " Texture";
- //
- // groupBox4
- //
- this.groupBox4.Controls.Add(this.comboBox2);
- this.groupBox4.Controls.Add(this.label3);
- this.groupBox4.Controls.Add(this.comboBox1);
- this.groupBox4.Controls.Add(this.label10);
- this.groupBox4.Controls.Add(this.checkBox8);
- this.groupBox4.Controls.Add(this.checkBox7);
- this.groupBox4.Controls.Add(this.filenameLabel);
- this.groupBox4.Controls.Add(this.trackBar1);
- this.groupBox4.Controls.Add(this.label9);
- this.groupBox4.Controls.Add(this.trackBar2);
- this.groupBox4.Controls.Add(this.label8);
- this.groupBox4.Controls.Add(this.button1);
- this.groupBox4.Controls.Add(this.wPictureBox);
- this.groupBox4.Location = new System.Drawing.Point(12, 232);
- this.groupBox4.Name = "groupBox4";
- this.groupBox4.Size = new System.Drawing.Size(560, 190);
- this.groupBox4.TabIndex = 25;
- this.groupBox4.TabStop = false;
- this.groupBox4.Text = "Icon Creation";
- //
- // comboBox2
- //
- this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.comboBox2.FormattingEnabled = true;
- this.comboBox2.Items.AddRange(new object[] {
- "Default",
- "Flat",
- "Minimalist"});
- this.comboBox2.Location = new System.Drawing.Point(85, 48);
- this.comboBox2.Name = "comboBox2";
- this.comboBox2.Size = new System.Drawing.Size(294, 21);
- this.comboBox2.TabIndex = 31;
- this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.ComboBox2_SelectedIndexChanged);
- //
- // label3
- //
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(6, 51);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(73, 13);
- this.label3.TabIndex = 30;
- this.label3.Text = "Rarity Design:";
- //
- // comboBox1
- //
- this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.comboBox1.FormattingEnabled = true;
- this.comboBox1.Items.AddRange(new object[] {
- "English",
- "French",
- "German",
- "Italian",
- "Spanish",
- "Spanish (LA)",
- "Arabic",
- "Japanese",
- "Korean",
- "Polish",
- "Portuguese (Brazil)",
- "Russian",
- "Turkish",
- "Chinese (S)",
- "Traditional Chinese"});
- this.comboBox1.Location = new System.Drawing.Point(70, 19);
- this.comboBox1.Name = "comboBox1";
- this.comboBox1.Size = new System.Drawing.Size(309, 21);
- this.comboBox1.TabIndex = 29;
- //
- // label10
- //
- this.label10.AutoSize = true;
- this.label10.Location = new System.Drawing.Point(6, 22);
- this.label10.Name = "label10";
- this.label10.Size = new System.Drawing.Size(58, 13);
- this.label10.TabIndex = 28;
- this.label10.Text = "Language:";
- //
- // checkBox8
- //
- this.checkBox8.AutoSize = true;
- this.checkBox8.Location = new System.Drawing.Point(206, 167);
- this.checkBox8.Name = "checkBox8";
- this.checkBox8.Size = new System.Drawing.Size(177, 17);
- this.checkBox8.TabIndex = 26;
- this.checkBox8.Text = "Use Featured Image If Available";
- this.checkBox8.UseVisualStyleBackColor = true;
- this.checkBox8.CheckedChanged += new System.EventHandler(this.checkBox8_CheckedChanged);
- //
- // checkBox7
- //
- this.checkBox7.AutoSize = true;
- this.checkBox7.Location = new System.Drawing.Point(6, 87);
- this.checkBox7.Name = "checkBox7";
- this.checkBox7.Size = new System.Drawing.Size(15, 14);
- this.checkBox7.TabIndex = 25;
- this.checkBox7.UseVisualStyleBackColor = true;
- this.checkBox7.CheckedChanged += new System.EventHandler(this.checkBox7_CheckedChanged);
- //
- // filenameLabel
- //
- this.filenameLabel.AutoEllipsis = true;
- this.filenameLabel.AutoSize = true;
- this.filenameLabel.Location = new System.Drawing.Point(115, 88);
- this.filenameLabel.MaximumSize = new System.Drawing.Size(260, 13);
- this.filenameLabel.Name = "filenameLabel";
- this.filenameLabel.Size = new System.Drawing.Size(60, 13);
- this.filenameLabel.TabIndex = 24;
- this.filenameLabel.Text = "File Name: ";
- //
- // trackBar1
- //
- this.trackBar1.Location = new System.Drawing.Point(58, 141);
- this.trackBar1.Maximum = 100;
- this.trackBar1.Name = "trackBar1";
- this.trackBar1.Size = new System.Drawing.Size(325, 45);
- this.trackBar1.TabIndex = 20;
- this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.None;
- this.trackBar1.ValueChanged += new System.EventHandler(this.trackBar1_ValueChanged);
- //
- // label9
- //
- this.label9.AutoSize = true;
- this.label9.Location = new System.Drawing.Point(22, 112);
- this.label9.Name = "label9";
- this.label9.Size = new System.Drawing.Size(30, 13);
- this.label9.TabIndex = 23;
- this.label9.Text = "Size:";
- //
- // trackBar2
- //
- this.trackBar2.Location = new System.Drawing.Point(58, 112);
- this.trackBar2.Maximum = 1000;
- this.trackBar2.Minimum = 1;
- this.trackBar2.Name = "trackBar2";
- this.trackBar2.Size = new System.Drawing.Size(325, 45);
- this.trackBar2.TabIndex = 22;
- this.trackBar2.TickFrequency = 25;
- this.trackBar2.TickStyle = System.Windows.Forms.TickStyle.None;
- this.trackBar2.Value = 1;
- this.trackBar2.ValueChanged += new System.EventHandler(this.trackBar2_ValueChanged);
- //
- // label8
- //
- this.label8.AutoSize = true;
- this.label8.Location = new System.Drawing.Point(6, 144);
- this.label8.Name = "label8";
- this.label8.Size = new System.Drawing.Size(46, 13);
- this.label8.TabIndex = 21;
- this.label8.Text = "Opacity:";
- //
- // button1
- //
- this.button1.Location = new System.Drawing.Point(27, 81);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(82, 24);
- this.button1.TabIndex = 19;
- this.button1.Text = "Watermark";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // wPictureBox
- //
- this.wPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
- this.wPictureBox.Image = global::FModel.Properties.Resources.Template_D_N;
- this.wPictureBox.Location = new System.Drawing.Point(389, 19);
- this.wPictureBox.Name = "wPictureBox";
- this.wPictureBox.Size = new System.Drawing.Size(165, 165);
- this.wPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.wPictureBox.TabIndex = 18;
- this.wPictureBox.TabStop = false;
- //
- // UpdateModeSettings
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(584, 465);
- this.Controls.Add(this.groupBox4);
- this.Controls.Add(this.label2);
- this.Controls.Add(this.label1);
- this.Controls.Add(this.optionsOKButton);
- this.Controls.Add(this.groupBox1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "UpdateModeSettings";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "Update Mode Settings";
- this.groupBox1.ResumeLayout(false);
- this.groupBox4.ResumeLayout(false);
- this.groupBox4.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.wPictureBox)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Button optionsOKButton;
- private System.Windows.Forms.CheckedListBox checkedListBox1;
- private System.Windows.Forms.CheckedListBox checkedListBox2;
- private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.GroupBox groupBox4;
- private System.Windows.Forms.ComboBox comboBox2;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.ComboBox comboBox1;
- private System.Windows.Forms.Label label10;
- private System.Windows.Forms.CheckBox checkBox8;
- private System.Windows.Forms.CheckBox checkBox7;
- private System.Windows.Forms.Label filenameLabel;
- private System.Windows.Forms.TrackBar trackBar1;
- private System.Windows.Forms.Label label9;
- private System.Windows.Forms.TrackBar trackBar2;
- private System.Windows.Forms.Label label8;
- private System.Windows.Forms.Button button1;
- private System.Windows.Forms.PictureBox wPictureBox;
- }
-}
diff --git a/FModel/Forms/UpdateModeSettings.cs b/FModel/Forms/UpdateModeSettings.cs
deleted file mode 100644
index 3691fa5f..00000000
--- a/FModel/Forms/UpdateModeSettings.cs
+++ /dev/null
@@ -1,346 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.IO;
-using System.Text;
-using System.Windows.Forms;
-using FModel.Properties;
-
-namespace FModel.Forms
-{
- public partial class UpdateModeSettings : Form
- {
- private static string _oldLanguage;
- private static string[] parameters { get; set; }
-
- public UpdateModeSettings()
- {
- InitializeComponent();
-
- // Check if watermark exists
- Utilities.CheckWatermark();
-
- if (!string.IsNullOrEmpty(Properties.Settings.Default.UMParameters))
- {
- parameters = Properties.Settings.Default.UMParameters.Split(',');
- setCheckListBoxItemChecked(parameters);
- }
-
- comboBox2.SelectedIndex = comboBox2.FindStringExact(Properties.Settings.Default.rarityDesign);
-
- //WATERMARK
- button1.Enabled = Properties.Settings.Default.UMWatermark;
- checkBox7.Checked = Properties.Settings.Default.UMWatermark;
- trackBar1.Enabled = Properties.Settings.Default.UMWatermark;
- trackBar2.Enabled = Properties.Settings.Default.UMWatermark;
- trackBar1.Value = Properties.Settings.Default.UMOpacity;
- trackBar2.Value = Properties.Settings.Default.UMSize;
-
- //FEATURED
- checkBox8.Checked = Properties.Settings.Default.UMFeatured;
- if (File.Exists(Properties.Settings.Default.UMFilename))
- {
- filenameLabel.Text = @"File Name: " + Path.GetFileName(Properties.Settings.Default.UMFilename);
-
- Bitmap bmp = null;
- if (Properties.Settings.Default.UMFeatured)
- {
- bmp = new Bitmap(string.Equals(Properties.Settings.Default.rarityDesign, "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(Properties.Settings.Default.rarityDesign, "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(Properties.Settings.Default.rarityDesign, "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(Properties.Settings.Default.rarityDesign, "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
-
- wPictureBox.Image = bmp;
- }
-
- _oldLanguage = Properties.Settings.Default.IconLanguage;
- comboBox1.SelectedIndex = comboBox1.FindStringExact(Properties.Settings.Default.IconLanguage);
- }
-
- private void optionsOKButton_Click(object sender, EventArgs e)
- {
- StringBuilder sb = new StringBuilder();
- RegisterSettings.updateModeListParameters = new List();
-
- Properties.Settings.Default.UMFeatured = checkBox8.Checked;
- Properties.Settings.Default.UMWatermark = checkBox7.Checked;
- Properties.Settings.Default.rarityDesign = comboBox2.SelectedItem.ToString();
-
- Properties.Settings.Default.UMSize = trackBar2.Value;
- Properties.Settings.Default.UMOpacity = trackBar1.Value;
-
- //PARAMETERS
- if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked) { sb.Append("BRCosmetics,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/Cosmetics/"); }
- if (checkedListBox1.GetItemCheckState(1) == CheckState.Checked) { sb.Append("BRVariants,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/CosmeticVariantTokens/"); }
- if (checkedListBox1.GetItemCheckState(2) == CheckState.Checked) { sb.Append("BRBanners,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/BannerToken/"); }
- if (checkedListBox1.GetItemCheckState(3) == CheckState.Checked) { sb.Append("BRChallenges,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/ChallengeBundles/"); }
- if (checkedListBox1.GetItemCheckState(4) == CheckState.Checked) { sb.Append("BRConsumables,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/Consumables/"); }
- if (checkedListBox1.GetItemCheckState(5) == CheckState.Checked) { sb.Append("BRGadgets,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/Gameplay/"); }
- if (checkedListBox1.GetItemCheckState(6) == CheckState.Checked) { sb.Append("BRTraps,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/Traps/"); }
- if (checkedListBox1.GetItemCheckState(7) == CheckState.Checked) { sb.Append("BRWeapons,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Athena/Items/Weapons/"); }
- if (checkedListBox1.GetItemCheckState(8) == CheckState.Checked) { sb.Append("STWHeros,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Heroes/"); }
- if (checkedListBox1.GetItemCheckState(9) == CheckState.Checked) { sb.Append("STWDefenders,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Defenders/"); }
- if (checkedListBox1.GetItemCheckState(10) == CheckState.Checked) { sb.Append("STWWorkers,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Workers/"); }
- if (checkedListBox1.GetItemCheckState(11) == CheckState.Checked) { sb.Append("STWSchematics,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Schematics/"); }
- if (checkedListBox1.GetItemCheckState(12) == CheckState.Checked) { sb.Append("STWTraps,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Traps/"); }
- if (checkedListBox1.GetItemCheckState(13) == CheckState.Checked) { sb.Append("STWWeapons,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Weapons/"); }
- if (checkedListBox1.GetItemCheckState(14) == CheckState.Checked) { sb.Append("STWIngredients,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Ingredients/"); }
- if (checkedListBox1.GetItemCheckState(15) == CheckState.Checked) { sb.Append("STWResources,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/PersistentResources/"); }
- if (checkedListBox1.GetItemCheckState(16) == CheckState.Checked) { sb.Append("STWCardpacks,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/CardPacks/"); }
- if (checkedListBox1.GetItemCheckState(17) == CheckState.Checked) { sb.Append("Tokens,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/Items/Tokens/"); }
-
- if (checkedListBox2.GetItemCheckState(0) == CheckState.Checked) { sb.Append("T2DAssets,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/2dAssets/"); }
- if (checkedListBox2.GetItemCheckState(1) == CheckState.Checked) { sb.Append("TFeatured,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/UI/Foundation/Textures/BattleRoyale/FeaturedItems/"); }
- if (checkedListBox2.GetItemCheckState(2) == CheckState.Checked) { sb.Append("TIcons,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/UI/Foundation/Textures/Icons/"); }
- if (checkedListBox2.GetItemCheckState(3) == CheckState.Checked) { sb.Append("TBanners,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/UI/Foundation/Textures/Banner/"); }
- if (checkedListBox2.GetItemCheckState(4) == CheckState.Checked) { sb.Append("TLoadingScreens,"); RegisterSettings.updateModeListParameters.Add("FortniteGame/Content/UI/Foundation/Textures/LoadingScreens/"); }
-
- Properties.Settings.Default.UMParameters = sb.ToString();
-
- //LOCRES
- Properties.Settings.Default.IconLanguage = comboBox1.SelectedItem.ToString();
- if (comboBox1.SelectedItem.ToString() != _oldLanguage)
- {
- LoadLocRes.LoadMySelectedLocRes(Properties.Settings.Default.IconLanguage);
- }
-
- Properties.Settings.Default.Save();
- Close();
- }
-
- private void setCheckListBoxItemChecked(string[] parameters)
- {
- for (int i = 0; i < parameters.Length; i++)
- {
- switch (parameters[i])
- {
- case "BRCosmetics":
- checkedListBox1.SetItemChecked(0, true);
- break;
- case "BRVariants":
- checkedListBox1.SetItemChecked(1, true);
- break;
- case "BRBanners":
- checkedListBox1.SetItemChecked(2, true);
- break;
- case "BRChallenges":
- checkedListBox1.SetItemChecked(3, true);
- break;
- case "BRConsumables":
- checkedListBox1.SetItemChecked(4, true);
- break;
- case "BRGadgets":
- checkedListBox1.SetItemChecked(5, true);
- break;
- case "BRTraps":
- checkedListBox1.SetItemChecked(6, true);
- break;
- case "BRWeapons":
- checkedListBox1.SetItemChecked(7, true);
- break;
- case "STWHeros":
- checkedListBox1.SetItemChecked(8, true);
- break;
- case "STWDefenders":
- checkedListBox1.SetItemChecked(9, true);
- break;
- case "STWWorkers":
- checkedListBox1.SetItemChecked(10, true);
- break;
- case "STWSchematics":
- checkedListBox1.SetItemChecked(11, true);
- break;
- case "STWTraps":
- checkedListBox1.SetItemChecked(12, true);
- break;
- case "STWWeapons":
- checkedListBox1.SetItemChecked(13, true);
- break;
- case "STWIngredients":
- checkedListBox1.SetItemChecked(14, true);
- break;
- case "STWResources":
- checkedListBox1.SetItemChecked(15, true);
- break;
- case "STWCardpacks":
- checkedListBox1.SetItemChecked(16, true);
- break;
- case "Tokens":
- checkedListBox1.SetItemChecked(17, true);
- break;
- case "T2DAssets":
- checkedListBox2.SetItemChecked(0, true);
- break;
- case "TFeatured":
- checkedListBox2.SetItemChecked(1, true);
- break;
- case "TIcons":
- checkedListBox2.SetItemChecked(2, true);
- break;
- case "TBanners":
- checkedListBox2.SetItemChecked(3, true);
- break;
- case "TLoadingScreens":
- checkedListBox2.SetItemChecked(4, true);
- break;
- default:
- break;
- }
- }
- }
-
- #region SELECT WATERMARK
- private void button1_Click(object sender, EventArgs e)
- {
- OpenFileDialog theDialog = new OpenFileDialog();
- theDialog.Title = @"Choose your watermark";
- theDialog.Multiselect = false;
- theDialog.Filter = @"PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|DDS Files (*.dds)|*.dds|All Files (*.*)|*.*";
-
- if (theDialog.ShowDialog() == DialogResult.OK)
- {
- Properties.Settings.Default.UMFilename = theDialog.FileName;
- Properties.Settings.Default.Save();
- filenameLabel.Text = @"File Name: " + Path.GetFileName(Properties.Settings.Default.UMFilename);
-
- if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
- {
- Bitmap bmp = null;
- if (Properties.Settings.Default.loadFeaturedImage)
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
-
- wPictureBox.Image = bmp;
- }
- }
- }
- #endregion
-
- #region RESIZE WATERMARK
- private void trackBar2_ValueChanged(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
- {
- Bitmap bmp = null;
- if (checkBox8.Checked)
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
-
- wPictureBox.Image = bmp;
- wPictureBox.Refresh();
- }
- }
- private void trackBar1_ValueChanged(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
- {
- Bitmap bmp = null;
- if (checkBox8.Checked)
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F));
- }
- else
- {
- bmp = new Bitmap(string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N));
- }
- Graphics g = Graphics.FromImage(bmp);
-
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
-
- wPictureBox.Image = bmp;
- wPictureBox.Refresh();
- }
- }
- #endregion
-
- private void checkBox7_CheckedChanged(object sender, EventArgs e)
- {
- button1.Enabled = checkBox7.Checked;
- trackBar1.Enabled = checkBox7.Checked;
- trackBar2.Enabled = checkBox7.Checked;
- }
-
- private void checkBox8_CheckedChanged(object sender, EventArgs e)
- {
- if (!checkBox8.Checked)
- {
- Bitmap bmp = string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_N) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_N) : new Bitmap(Resources.Template_D_N);
- Graphics g = Graphics.FromImage(bmp);
- if (File.Exists(Properties.Settings.Default.UMFilename))
- {
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
- }
- wPictureBox.Image = bmp;
- }
- if (checkBox8.Checked)
- {
- Bitmap bmp = string.Equals(comboBox2.SelectedItem.ToString(), "Flat") ? new Bitmap(Resources.Template_F_F) : string.Equals(comboBox2.SelectedItem.ToString(), "Minimalist") ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_D_F);
- Graphics g = Graphics.FromImage(bmp);
- if (File.Exists(Properties.Settings.Default.UMFilename))
- {
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
- }
- wPictureBox.Image = bmp;
- }
- }
-
- private void ComboBox2_SelectedIndexChanged(object sender, EventArgs e)
- {
- Bitmap bmp = null;
- switch (comboBox2.SelectedItem.ToString())
- {
- case "Default":
- bmp = checkBox8.Checked ? new Bitmap(Resources.Template_D_F) : new Bitmap(Resources.Template_D_N);
- break;
- case "Flat":
- bmp = checkBox8.Checked ? new Bitmap(Resources.Template_F_F) : new Bitmap(Resources.Template_F_N);
- break;
- case "Minimalist":
- bmp = checkBox8.Checked ? new Bitmap(Resources.Template_M_F) : new Bitmap(Resources.Template_M_N);
- break;
- }
-
- Graphics g = Graphics.FromImage(bmp);
- if (File.Exists(Properties.Settings.Default.UMFilename))
- {
- Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
- var opacityImage = ImageUtilities.SetImageOpacity(watermark, (float)trackBar1.Value / 100);
- g.DrawImage(ImageUtilities.ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
- }
- wPictureBox.Image = bmp;
- }
- }
-}
diff --git a/FModel/Forms/UpdateModeSettings.resx b/FModel/Forms/UpdateModeSettings.resx
deleted file mode 100644
index a12630e6..00000000
--- a/FModel/Forms/UpdateModeSettings.resx
+++ /dev/null
@@ -1,1353 +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
-
-
-
-
- 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
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Logo.ico b/FModel/Logo.ico
new file mode 100644
index 00000000..8d008d08
Binary files /dev/null and b/FModel/Logo.ico differ
diff --git a/FModel/MainWindow.Designer.cs b/FModel/MainWindow.Designer.cs
deleted file mode 100644
index 221d986c..00000000
--- a/FModel/MainWindow.Designer.cs
+++ /dev/null
@@ -1,712 +0,0 @@
-namespace FModel
-{
- partial class MainWindow
- {
- ///
- /// Variable nécessaire au concepteur.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Nettoyage des ressources utilisées.
- ///
- /// true si les ressources managées doivent être supprimées ; sinon, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Code généré par le Concepteur Windows Form
-
- ///
- /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
- /// le contenu de cette méthode avec l'éditeur de code.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow));
- this.statusStrip1 = new System.Windows.Forms.StatusStrip();
- this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
- this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel();
- this.menuStrip1 = new System.Windows.Forms.MenuStrip();
- this.loadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.loadOneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.loadAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
- this.downloadBackupsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.backupPAKsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
- this.differenceModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.updateModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
- this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.filesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
- this.saveAsJSONToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.autoSaveAsJSONToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
- this.openExtractionFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.imageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.saveImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.autoSaveImagesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
- this.mergeImagesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.aboutFModelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.panel1 = new System.Windows.Forms.Panel();
- this.AESManagerButton = new System.Windows.Forms.Button();
- this.StopButton = new System.Windows.Forms.Button();
- this.OpenImageButton = new System.Windows.Forms.Button();
- this.label2 = new System.Windows.Forms.Label();
- this.FilterTextBox = new System.Windows.Forms.TextBox();
- this.ExtractButton = new System.Windows.Forms.Button();
- this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
- this.treeView1 = new System.Windows.Forms.TreeView();
- this.imageList1 = new System.Windows.Forms.ImageList(this.components);
- this.listBox1 = new System.Windows.Forms.ListBox();
- this.richTextBox1 = new System.Windows.Forms.RichTextBox();
- this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
- this.scintilla1 = new ScintillaNET.Scintilla();
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
- this.backgroundWorker2 = new System.ComponentModel.BackgroundWorker();
- this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.extractToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFileNameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFilePathWithoutExtensionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.copyFileNameWithoutExtensionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.saveAsJSONToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
- this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components);
- this.extractFolderContentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.statusStrip1.SuspendLayout();
- this.menuStrip1.SuspendLayout();
- this.panel1.SuspendLayout();
- this.tableLayoutPanel1.SuspendLayout();
- this.tableLayoutPanel2.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.contextMenuStrip1.SuspendLayout();
- this.contextMenuStrip2.SuspendLayout();
- this.SuspendLayout();
- //
- // statusStrip1
- //
- this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.toolStripStatusLabel1,
- this.toolStripStatusLabel2,
- this.toolStripStatusLabel3});
- this.statusStrip1.Location = new System.Drawing.Point(0, 683);
- this.statusStrip1.Name = "statusStrip1";
- this.statusStrip1.Size = new System.Drawing.Size(1191, 22);
- this.statusStrip1.SizingGrip = false;
- this.statusStrip1.TabIndex = 0;
- this.statusStrip1.Text = "statusStrip1";
- //
- // toolStripStatusLabel1
- //
- this.toolStripStatusLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
- this.toolStripStatusLabel1.Margin = new System.Windows.Forms.Padding(1, 3, 50, 2);
- this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
- this.toolStripStatusLabel1.Size = new System.Drawing.Size(47, 17);
- this.toolStripStatusLabel1.Text = "FModel";
- //
- // toolStripStatusLabel2
- //
- this.toolStripStatusLabel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
- this.toolStripStatusLabel2.Margin = new System.Windows.Forms.Padding(0, 3, 50, 2);
- this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
- this.toolStripStatusLabel2.Size = new System.Drawing.Size(994, 17);
- this.toolStripStatusLabel2.Spring = true;
- //
- // toolStripStatusLabel3
- //
- this.toolStripStatusLabel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
- this.toolStripStatusLabel3.Margin = new System.Windows.Forms.Padding(0, 3, 1, 2);
- this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
- this.toolStripStatusLabel3.Size = new System.Drawing.Size(33, 17);
- this.toolStripStatusLabel3.Text = "State";
- //
- // menuStrip1
- //
- this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.loadToolStripMenuItem,
- this.filesToolStripMenuItem,
- this.imageToolStripMenuItem,
- this.helpToolStripMenuItem});
- this.menuStrip1.Location = new System.Drawing.Point(0, 0);
- this.menuStrip1.Name = "menuStrip1";
- this.menuStrip1.Size = new System.Drawing.Size(1191, 24);
- this.menuStrip1.TabIndex = 1;
- this.menuStrip1.Text = "menuStrip1";
- //
- // loadToolStripMenuItem
- //
- this.loadToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.loadOneToolStripMenuItem,
- this.loadAllToolStripMenuItem,
- this.toolStripSeparator1,
- this.downloadBackupsToolStripMenuItem,
- this.backupPAKsToolStripMenuItem,
- this.toolStripSeparator8,
- this.differenceModeToolStripMenuItem,
- this.updateModeToolStripMenuItem,
- this.toolStripSeparator2,
- this.settingsToolStripMenuItem});
- this.loadToolStripMenuItem.Name = "loadToolStripMenuItem";
- this.loadToolStripMenuItem.Size = new System.Drawing.Size(45, 20);
- this.loadToolStripMenuItem.Text = "Load";
- //
- // loadOneToolStripMenuItem
- //
- this.loadOneToolStripMenuItem.Name = "loadOneToolStripMenuItem";
- this.loadOneToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.loadOneToolStripMenuItem.Text = "Load One PAK";
- this.loadOneToolStripMenuItem.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.loadOneToolStripMenuItem_DropDownItemClicked);
- //
- // loadAllToolStripMenuItem
- //
- this.loadAllToolStripMenuItem.Name = "loadAllToolStripMenuItem";
- this.loadAllToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.loadAllToolStripMenuItem.Text = "Load All PAKs";
- this.loadAllToolStripMenuItem.Click += new System.EventHandler(this.loadAllToolStripMenuItem_Click);
- //
- // toolStripSeparator1
- //
- this.toolStripSeparator1.Name = "toolStripSeparator1";
- this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6);
- //
- // downloadBackupsToolStripMenuItem
- //
- this.downloadBackupsToolStripMenuItem.Name = "downloadBackupsToolStripMenuItem";
- this.downloadBackupsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.downloadBackupsToolStripMenuItem.Text = "Download Backups";
- this.downloadBackupsToolStripMenuItem.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.DownloadBackupsToolStripMenuItem_DropDownItemClicked);
- //
- // backupPAKsToolStripMenuItem
- //
- this.backupPAKsToolStripMenuItem.Name = "backupPAKsToolStripMenuItem";
- this.backupPAKsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.backupPAKsToolStripMenuItem.Text = "Backup PAKs";
- this.backupPAKsToolStripMenuItem.Click += new System.EventHandler(this.backupPAKsToolStripMenuItem_Click);
- //
- // toolStripSeparator8
- //
- this.toolStripSeparator8.Name = "toolStripSeparator8";
- this.toolStripSeparator8.Size = new System.Drawing.Size(177, 6);
- //
- // differenceModeToolStripMenuItem
- //
- this.differenceModeToolStripMenuItem.CheckOnClick = true;
- this.differenceModeToolStripMenuItem.Name = "differenceModeToolStripMenuItem";
- this.differenceModeToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.differenceModeToolStripMenuItem.Text = "Difference Mode";
- this.differenceModeToolStripMenuItem.CheckedChanged += new System.EventHandler(this.differenceModeToolStripMenuItem_CheckedChanged);
- //
- // updateModeToolStripMenuItem
- //
- this.updateModeToolStripMenuItem.CheckOnClick = true;
- this.updateModeToolStripMenuItem.Enabled = false;
- this.updateModeToolStripMenuItem.Name = "updateModeToolStripMenuItem";
- this.updateModeToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.updateModeToolStripMenuItem.Text = "Update Mode";
- this.updateModeToolStripMenuItem.CheckedChanged += new System.EventHandler(this.updateModeToolStripMenuItem_CheckedChanged);
- //
- // toolStripSeparator2
- //
- this.toolStripSeparator2.Name = "toolStripSeparator2";
- this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6);
- //
- // settingsToolStripMenuItem
- //
- this.settingsToolStripMenuItem.Image = global::FModel.Properties.Resources.properties_16xLG;
- this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
- this.settingsToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1;
- this.settingsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.settingsToolStripMenuItem.Text = "Settings";
- this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);
- //
- // filesToolStripMenuItem
- //
- this.filesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.searchToolStripMenuItem,
- this.toolStripSeparator7,
- this.saveAsJSONToolStripMenuItem,
- this.autoSaveAsJSONToolStripMenuItem,
- this.toolStripSeparator5,
- this.openExtractionFolderToolStripMenuItem});
- this.filesToolStripMenuItem.Name = "filesToolStripMenuItem";
- this.filesToolStripMenuItem.Size = new System.Drawing.Size(42, 20);
- this.filesToolStripMenuItem.Text = "Files";
- //
- // searchToolStripMenuItem
- //
- this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
- this.searchToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F2;
- this.searchToolStripMenuItem.Size = new System.Drawing.Size(194, 22);
- this.searchToolStripMenuItem.Text = "Search";
- this.searchToolStripMenuItem.Click += new System.EventHandler(this.searchToolStripMenuItem_Click);
- //
- // toolStripSeparator7
- //
- this.toolStripSeparator7.Name = "toolStripSeparator7";
- this.toolStripSeparator7.Size = new System.Drawing.Size(191, 6);
- //
- // saveAsJSONToolStripMenuItem
- //
- this.saveAsJSONToolStripMenuItem.Name = "saveAsJSONToolStripMenuItem";
- this.saveAsJSONToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3;
- this.saveAsJSONToolStripMenuItem.Size = new System.Drawing.Size(194, 22);
- this.saveAsJSONToolStripMenuItem.Text = "Save as JSON";
- this.saveAsJSONToolStripMenuItem.Click += new System.EventHandler(this.SaveAsJSONToolStripMenuItem_Click);
- //
- // autoSaveAsJSONToolStripMenuItem
- //
- this.autoSaveAsJSONToolStripMenuItem.CheckOnClick = true;
- this.autoSaveAsJSONToolStripMenuItem.Name = "autoSaveAsJSONToolStripMenuItem";
- this.autoSaveAsJSONToolStripMenuItem.Size = new System.Drawing.Size(194, 22);
- this.autoSaveAsJSONToolStripMenuItem.Text = "Auto Save as JSON";
- //
- // toolStripSeparator5
- //
- this.toolStripSeparator5.Name = "toolStripSeparator5";
- this.toolStripSeparator5.Size = new System.Drawing.Size(191, 6);
- //
- // openExtractionFolderToolStripMenuItem
- //
- this.openExtractionFolderToolStripMenuItem.Image = global::FModel.Properties.Resources.folder_16x;
- this.openExtractionFolderToolStripMenuItem.Name = "openExtractionFolderToolStripMenuItem";
- this.openExtractionFolderToolStripMenuItem.Size = new System.Drawing.Size(194, 22);
- this.openExtractionFolderToolStripMenuItem.Text = "Open Extraction Folder";
- this.openExtractionFolderToolStripMenuItem.Click += new System.EventHandler(this.openExtractionFolderToolStripMenuItem_Click);
- //
- // imageToolStripMenuItem
- //
- this.imageToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.saveImageToolStripMenuItem,
- this.autoSaveImagesToolStripMenuItem,
- this.toolStripSeparator3,
- this.mergeImagesToolStripMenuItem});
- this.imageToolStripMenuItem.Name = "imageToolStripMenuItem";
- this.imageToolStripMenuItem.Size = new System.Drawing.Size(52, 20);
- this.imageToolStripMenuItem.Text = "Image";
- //
- // saveImageToolStripMenuItem
- //
- this.saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem";
- this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.saveImageToolStripMenuItem.Text = "Save Image";
- this.saveImageToolStripMenuItem.Click += new System.EventHandler(this.saveImageToolStripMenuItem_Click);
- //
- // autoSaveImagesToolStripMenuItem
- //
- this.autoSaveImagesToolStripMenuItem.CheckOnClick = true;
- this.autoSaveImagesToolStripMenuItem.Name = "autoSaveImagesToolStripMenuItem";
- this.autoSaveImagesToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.autoSaveImagesToolStripMenuItem.Text = "Auto Save Images";
- //
- // toolStripSeparator3
- //
- this.toolStripSeparator3.Name = "toolStripSeparator3";
- this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6);
- //
- // mergeImagesToolStripMenuItem
- //
- this.mergeImagesToolStripMenuItem.Name = "mergeImagesToolStripMenuItem";
- this.mergeImagesToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.mergeImagesToolStripMenuItem.Text = "Merge Images";
- this.mergeImagesToolStripMenuItem.Click += new System.EventHandler(this.mergeImagesToolStripMenuItem_Click);
- //
- // helpToolStripMenuItem
- //
- this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.aboutFModelToolStripMenuItem});
- this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
- this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
- this.helpToolStripMenuItem.Text = "Help";
- //
- // aboutFModelToolStripMenuItem
- //
- this.aboutFModelToolStripMenuItem.Image = global::FModel.Properties.Resources.StatusAnnotations_Information_16xLG_color;
- this.aboutFModelToolStripMenuItem.Name = "aboutFModelToolStripMenuItem";
- this.aboutFModelToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.aboutFModelToolStripMenuItem.Text = "About FModel";
- this.aboutFModelToolStripMenuItem.Click += new System.EventHandler(this.aboutFModelToolStripMenuItem_Click);
- //
- // panel1
- //
- this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244)))));
- this.panel1.Controls.Add(this.AESManagerButton);
- this.panel1.Controls.Add(this.StopButton);
- this.panel1.Controls.Add(this.OpenImageButton);
- this.panel1.Controls.Add(this.label2);
- this.panel1.Controls.Add(this.FilterTextBox);
- this.panel1.Controls.Add(this.ExtractButton);
- this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
- this.panel1.Location = new System.Drawing.Point(0, 657);
- this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(1191, 26);
- this.panel1.TabIndex = 2;
- //
- // AESManagerButton
- //
- this.AESManagerButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.AESManagerButton.Location = new System.Drawing.Point(709, 3);
- this.AESManagerButton.Margin = new System.Windows.Forms.Padding(0);
- this.AESManagerButton.Name = "AESManagerButton";
- this.AESManagerButton.Size = new System.Drawing.Size(191, 21);
- this.AESManagerButton.TabIndex = 8;
- this.AESManagerButton.Text = "AES &Manager";
- this.AESManagerButton.UseVisualStyleBackColor = true;
- this.AESManagerButton.Click += new System.EventHandler(this.AESManagerButton_Click);
- //
- // StopButton
- //
- this.StopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.StopButton.Enabled = false;
- this.StopButton.ForeColor = System.Drawing.Color.Red;
- this.StopButton.Location = new System.Drawing.Point(1029, 3);
- this.StopButton.Name = "StopButton";
- this.StopButton.Size = new System.Drawing.Size(75, 21);
- this.StopButton.TabIndex = 6;
- this.StopButton.Text = "&Stop";
- this.StopButton.UseVisualStyleBackColor = true;
- this.StopButton.Click += new System.EventHandler(this.StopButton_Click);
- //
- // OpenImageButton
- //
- this.OpenImageButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.OpenImageButton.Enabled = false;
- this.OpenImageButton.Location = new System.Drawing.Point(947, 3);
- this.OpenImageButton.Margin = new System.Windows.Forms.Padding(0);
- this.OpenImageButton.Name = "OpenImageButton";
- this.OpenImageButton.Size = new System.Drawing.Size(75, 21);
- this.OpenImageButton.TabIndex = 5;
- this.OpenImageButton.Text = "&Open Image";
- this.OpenImageButton.UseVisualStyleBackColor = true;
- this.OpenImageButton.Click += new System.EventHandler(this.OpenImageButton_Click);
- //
- // label2
- //
- this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(3, 7);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(32, 13);
- this.label2.TabIndex = 4;
- this.label2.Text = "Filter:";
- //
- // FilterTextBox
- //
- this.FilterTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.FilterTextBox.Location = new System.Drawing.Point(41, 4);
- this.FilterTextBox.Name = "FilterTextBox";
- this.FilterTextBox.Size = new System.Drawing.Size(362, 20);
- this.FilterTextBox.TabIndex = 3;
- this.FilterTextBox.TextChanged += new System.EventHandler(this.FilterTextBox_TextChanged);
- //
- // ExtractButton
- //
- this.ExtractButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.ExtractButton.Enabled = false;
- this.ExtractButton.Location = new System.Drawing.Point(1110, 3);
- this.ExtractButton.Name = "ExtractButton";
- this.ExtractButton.Size = new System.Drawing.Size(75, 21);
- this.ExtractButton.TabIndex = 0;
- this.ExtractButton.Text = "&Extract";
- this.ExtractButton.UseVisualStyleBackColor = true;
- this.ExtractButton.Click += new System.EventHandler(this.ExtractButton_Click);
- //
- // tableLayoutPanel1
- //
- this.tableLayoutPanel1.ColumnCount = 2;
- this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 29.555F));
- this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 70.44501F));
- this.tableLayoutPanel1.Controls.Add(this.treeView1, 0, 0);
- this.tableLayoutPanel1.Controls.Add(this.listBox1, 0, 1);
- this.tableLayoutPanel1.Controls.Add(this.richTextBox1, 1, 1);
- this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 0);
- this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 24);
- this.tableLayoutPanel1.Name = "tableLayoutPanel1";
- this.tableLayoutPanel1.RowCount = 2;
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
- this.tableLayoutPanel1.Size = new System.Drawing.Size(1191, 633);
- this.tableLayoutPanel1.TabIndex = 3;
- //
- // treeView1
- //
- this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.treeView1.ImageIndex = 1;
- this.treeView1.ImageList = this.imageList1;
- this.treeView1.Location = new System.Drawing.Point(3, 3);
- this.treeView1.Name = "treeView1";
- this.treeView1.SelectedImageIndex = 0;
- this.treeView1.Size = new System.Drawing.Size(346, 310);
- this.treeView1.TabIndex = 0;
- this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);
- //
- // imageList1
- //
- this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
- this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
- this.imageList1.Images.SetKeyName(0, "folder_16x.png");
- this.imageList1.Images.SetKeyName(1, "folder_Closed_16xLG.png");
- //
- // listBox1
- //
- this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.listBox1.FormattingEnabled = true;
- this.listBox1.Location = new System.Drawing.Point(3, 319);
- this.listBox1.Name = "listBox1";
- this.listBox1.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
- this.listBox1.Size = new System.Drawing.Size(346, 311);
- this.listBox1.Sorted = true;
- this.listBox1.TabIndex = 1;
- this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
- this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListBox1_MouseDoubleClick);
- this.listBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDown);
- //
- // richTextBox1
- //
- this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
- this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.richTextBox1.Location = new System.Drawing.Point(355, 319);
- this.richTextBox1.Name = "richTextBox1";
- this.richTextBox1.ReadOnly = true;
- this.richTextBox1.Size = new System.Drawing.Size(833, 311);
- this.richTextBox1.TabIndex = 2;
- this.richTextBox1.Text = "";
- //
- // tableLayoutPanel2
- //
- this.tableLayoutPanel2.ColumnCount = 2;
- this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 62.86398F));
- this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 37.13602F));
- this.tableLayoutPanel2.Controls.Add(this.scintilla1, 0, 0);
- this.tableLayoutPanel2.Controls.Add(this.pictureBox1, 1, 0);
- this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel2.Location = new System.Drawing.Point(355, 3);
- this.tableLayoutPanel2.Name = "tableLayoutPanel2";
- this.tableLayoutPanel2.RowCount = 1;
- this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel2.Size = new System.Drawing.Size(833, 310);
- this.tableLayoutPanel2.TabIndex = 3;
- //
- // scintilla1
- //
- this.scintilla1.AutomaticFold = ((ScintillaNET.AutomaticFold)(((ScintillaNET.AutomaticFold.Show | ScintillaNET.AutomaticFold.Click)
- | ScintillaNET.AutomaticFold.Change)));
- this.scintilla1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.scintilla1.CaretPeriod = 400;
- this.scintilla1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.scintilla1.IndentationGuides = ScintillaNET.IndentView.Real;
- this.scintilla1.Lexer = ScintillaNET.Lexer.Json;
- this.scintilla1.Location = new System.Drawing.Point(3, 3);
- this.scintilla1.Name = "scintilla1";
- this.scintilla1.ScrollWidth = 496;
- this.scintilla1.Size = new System.Drawing.Size(517, 304);
- this.scintilla1.TabIndex = 0;
- //
- // pictureBox1
- //
- this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.pictureBox1.Location = new System.Drawing.Point(526, 3);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(304, 304);
- this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.pictureBox1.TabIndex = 1;
- this.pictureBox1.TabStop = false;
- //
- // backgroundWorker1
- //
- this.backgroundWorker1.WorkerSupportsCancellation = true;
- this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
- this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
- //
- // backgroundWorker2
- //
- this.backgroundWorker2.WorkerSupportsCancellation = true;
- this.backgroundWorker2.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker2_DoWork);
- this.backgroundWorker2.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker2_RunWorkerCompleted);
- //
- // contextMenuStrip1
- //
- this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.extractToolStripMenuItem,
- this.copyFilesToolStripMenuItem,
- this.saveAsJSONToolStripMenuItem1});
- this.contextMenuStrip1.Name = "contextMenuStrip1";
- this.contextMenuStrip1.Size = new System.Drawing.Size(144, 70);
- //
- // extractToolStripMenuItem
- //
- this.extractToolStripMenuItem.Name = "extractToolStripMenuItem";
- this.extractToolStripMenuItem.Size = new System.Drawing.Size(143, 22);
- this.extractToolStripMenuItem.Text = "Extract";
- this.extractToolStripMenuItem.Click += new System.EventHandler(this.extractToolStripMenuItem_Click);
- //
- // copyFilesToolStripMenuItem
- //
- this.copyFilesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.copyFileToolStripMenuItem,
- this.copyFileNameToolStripMenuItem,
- this.copyFilePathWithoutExtensionToolStripMenuItem,
- this.copyFileNameWithoutExtensionToolStripMenuItem});
- this.copyFilesToolStripMenuItem.Name = "copyFilesToolStripMenuItem";
- this.copyFilesToolStripMenuItem.Size = new System.Drawing.Size(143, 22);
- this.copyFilesToolStripMenuItem.Text = "Copy File";
- //
- // copyFileToolStripMenuItem
- //
- this.copyFileToolStripMenuItem.Name = "copyFileToolStripMenuItem";
- this.copyFileToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFileToolStripMenuItem.Text = "Copy File Path";
- this.copyFileToolStripMenuItem.Click += new System.EventHandler(this.copyFileToolStripMenuItem_Click);
- //
- // copyFileNameToolStripMenuItem
- //
- this.copyFileNameToolStripMenuItem.Name = "copyFileNameToolStripMenuItem";
- this.copyFileNameToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFileNameToolStripMenuItem.Text = "Copy File Name";
- this.copyFileNameToolStripMenuItem.Click += new System.EventHandler(this.copyFileNameToolStripMenuItem_Click);
- //
- // copyFilePathWithoutExtensionToolStripMenuItem
- //
- this.copyFilePathWithoutExtensionToolStripMenuItem.Name = "copyFilePathWithoutExtensionToolStripMenuItem";
- this.copyFilePathWithoutExtensionToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFilePathWithoutExtensionToolStripMenuItem.Text = "Copy File Path without Extension";
- this.copyFilePathWithoutExtensionToolStripMenuItem.Click += new System.EventHandler(this.copyFilePathWithoutExtensionToolStripMenuItem_Click);
- //
- // copyFileNameWithoutExtensionToolStripMenuItem
- //
- this.copyFileNameWithoutExtensionToolStripMenuItem.Name = "copyFileNameWithoutExtensionToolStripMenuItem";
- this.copyFileNameWithoutExtensionToolStripMenuItem.Size = new System.Drawing.Size(255, 22);
- this.copyFileNameWithoutExtensionToolStripMenuItem.Text = "Copy File Name without Extension";
- this.copyFileNameWithoutExtensionToolStripMenuItem.Click += new System.EventHandler(this.copyFileNameWithoutExtensionToolStripMenuItem_Click);
- //
- // saveAsJSONToolStripMenuItem1
- //
- this.saveAsJSONToolStripMenuItem1.Name = "saveAsJSONToolStripMenuItem1";
- this.saveAsJSONToolStripMenuItem1.Size = new System.Drawing.Size(143, 22);
- this.saveAsJSONToolStripMenuItem1.Text = "Save as JSON";
- this.saveAsJSONToolStripMenuItem1.Click += new System.EventHandler(this.saveAsJSONToolStripMenuItem1_Click);
- //
- // contextMenuStrip2
- //
- this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.extractFolderContentsToolStripMenuItem});
- this.contextMenuStrip2.Name = "contextMenuStrip2";
- this.contextMenuStrip2.Size = new System.Drawing.Size(197, 26);
- //
- // extractFolderContentsToolStripMenuItem
- //
- this.extractFolderContentsToolStripMenuItem.Name = "extractFolderContentsToolStripMenuItem";
- this.extractFolderContentsToolStripMenuItem.Size = new System.Drawing.Size(196, 22);
- this.extractFolderContentsToolStripMenuItem.Text = "Extract Folder Contents";
- this.extractFolderContentsToolStripMenuItem.Click += new System.EventHandler(this.ExtractFolderContentsToolStripMenuItem_Click);
- //
- // MainWindow
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(1191, 705);
- this.Controls.Add(this.tableLayoutPanel1);
- this.Controls.Add(this.panel1);
- this.Controls.Add(this.statusStrip1);
- this.Controls.Add(this.menuStrip1);
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MainMenuStrip = this.menuStrip1;
- this.MinimumSize = new System.Drawing.Size(1207, 744);
- this.Name = "MainWindow";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "FModel";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainWindow_FormClosing);
- this.Load += new System.EventHandler(this.MainWindow_Load);
- this.statusStrip1.ResumeLayout(false);
- this.statusStrip1.PerformLayout();
- this.menuStrip1.ResumeLayout(false);
- this.menuStrip1.PerformLayout();
- this.panel1.ResumeLayout(false);
- this.panel1.PerformLayout();
- this.tableLayoutPanel1.ResumeLayout(false);
- this.tableLayoutPanel2.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.contextMenuStrip1.ResumeLayout(false);
- this.contextMenuStrip2.ResumeLayout(false);
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.StatusStrip statusStrip1;
- private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
- private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
- private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3;
- private System.Windows.Forms.MenuStrip menuStrip1;
- private System.Windows.Forms.ToolStripMenuItem loadToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem loadOneToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem loadAllToolStripMenuItem;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
- private System.Windows.Forms.ToolStripMenuItem backupPAKsToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem differenceModeToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem updateModeToolStripMenuItem;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
- private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem imageToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem aboutFModelToolStripMenuItem;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.Button ExtractButton;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox FilterTextBox;
- private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
- private System.Windows.Forms.TreeView treeView1;
- private System.Windows.Forms.ListBox listBox1;
- private System.Windows.Forms.Button OpenImageButton;
- private System.Windows.Forms.ImageList imageList1;
- private System.Windows.Forms.RichTextBox richTextBox1;
- private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
- private ScintillaNET.Scintilla scintilla1;
- private System.Windows.Forms.PictureBox pictureBox1;
- private System.Windows.Forms.ToolStripMenuItem saveImageToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem autoSaveImagesToolStripMenuItem;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
- private System.Windows.Forms.ToolStripMenuItem mergeImagesToolStripMenuItem;
- private System.Windows.Forms.Button StopButton;
- private System.ComponentModel.BackgroundWorker backgroundWorker1;
- private System.ComponentModel.BackgroundWorker backgroundWorker2;
- private System.Windows.Forms.ToolStripMenuItem filesToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem;
- private System.Windows.Forms.Button AESManagerButton;
- private System.Windows.Forms.ToolStripMenuItem saveAsJSONToolStripMenuItem;
- private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
- private System.Windows.Forms.ToolStripMenuItem extractToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFilesToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFileToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFileNameToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFilePathWithoutExtensionToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem copyFileNameWithoutExtensionToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem saveAsJSONToolStripMenuItem1;
- private System.Windows.Forms.ContextMenuStrip contextMenuStrip2;
- private System.Windows.Forms.ToolStripMenuItem extractFolderContentsToolStripMenuItem;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
- private System.Windows.Forms.ToolStripMenuItem openExtractionFolderToolStripMenuItem;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
- private System.Windows.Forms.ToolStripMenuItem autoSaveAsJSONToolStripMenuItem;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
- private System.Windows.Forms.ToolStripMenuItem downloadBackupsToolStripMenuItem;
- }
-}
-
diff --git a/FModel/MainWindow.cs b/FModel/MainWindow.cs
deleted file mode 100644
index 793ca638..00000000
--- a/FModel/MainWindow.cs
+++ /dev/null
@@ -1,1640 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.Drawing.Imaging;
-using System.Drawing.Text;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using AutoUpdaterDotNET;
-using csharp_wick;
-using FModel.Converter;
-using FModel.Forms;
-using FModel.Properties;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using RestSharp;
-using Image = System.Drawing.Image;
-using Settings = FModel.Properties.Settings;
-
-namespace FModel
-{
- public partial class MainWindow : Form
- {
- private static Stopwatch _stopWatch { get; set; }
- private static List _itemsToDisplay { get; set; }
- private static string[] _selectedItemsArray { get; set; }
-
- public MainWindow()
- {
- InitializeComponent();
- App.MainFormToUse = this;
-
- // Check if watermark exists
- Utilities.CheckWatermark();
-
- //FModel version
- toolStripStatusLabel1.Text += @" " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5);
-
- treeView1.Sort();
-
- //Remove space caused by SizingGrip
- statusStrip1.Padding = new Padding(statusStrip1.Padding.Left, statusStrip1.Padding.Top, statusStrip1.Padding.Left, statusStrip1.Padding.Bottom);
-
- MyScintilla.ScintillaInstance(scintilla1);
- }
-
- public void UpdateProcessState(string textToDisplay, string seText)
- {
- if (InvokeRequired)
- {
- BeginInvoke(new Action(UpdateProcessState), textToDisplay, seText);
- return;
- }
-
- toolStripStatusLabel2.Text = textToDisplay;
- switch(seText)
- {
- case "Error":
- toolStripStatusLabel3.BackColor = Color.FromArgb(255, 244, 66, 66);
- break;
- case "Waiting":
- case "Loading":
- case "Processing":
- toolStripStatusLabel3.BackColor = Color.FromArgb(255, 244, 132, 66);
- break;
- case "Success":
- toolStripStatusLabel3.BackColor = Color.FromArgb(255, 66, 244, 66);
- break;
- }
- toolStripStatusLabel3.Text = seText;
- }
- public void AppendTextToConsole(string text, Color color, bool addNewLine = false, HorizontalAlignment align = HorizontalAlignment.Left)
- {
- if (InvokeRequired)
- {
- BeginInvoke(new Action(AppendTextToConsole), text, color, addNewLine, align);
- return;
- }
- richTextBox1.SuspendLayout();
- richTextBox1.SelectionColor = color;
- richTextBox1.SelectionAlignment = align;
- richTextBox1.AppendText(addNewLine
- ? $"{text}{Environment.NewLine}"
- : text);
- richTextBox1.ScrollToCaret();
- richTextBox1.ResumeLayout();
- }
-
- #region LOAD & LEAVE
- ///
- /// add all paks found to the toolstripmenu as an item
- ///
- ///
- ///
- private void AddPaKs(string thePak)
- {
- Invoke(new Action(() =>
- {
- loadOneToolStripMenuItem.DropDownItems.Add(thePak);
- }));
- }
- private void AddBackupFiles()
- {
- if (CreateBackup.backupFilesList != null && CreateBackup.backupFilesList.Count > 0)
- {
- foreach (var item in CreateBackup.backupFilesList)
- {
- Invoke(new Action(() =>
- {
- downloadBackupsToolStripMenuItem.DropDownItems.Add(item.bFileName);
- }));
- }
- }
- }
-
- ///
- /// check if path exists
- /// get all files with extension .pak, add them to the toolstripmenu, read the guid and add them to the right list
- ///
- private void FillWithPaKs()
- {
- if (!Directory.Exists(Settings.Default.PAKsPath))
- {
- loadOneToolStripMenuItem.Enabled = false;
- loadAllToolStripMenuItem.Enabled = false;
- backupPAKsToolStripMenuItem.Enabled = false;
-
- new UpdateMyState(".PAK Files Path is missing", "Error").ChangeProcessState();
- }
- else
- {
- IEnumerable yourPaKs = Directory.GetFiles(Settings.Default.PAKsPath).Where(x => x.EndsWith(".pak"));
- for (int i = 0; i < yourPaKs.Count(); i++)
- {
- string arCurrentUsedPak = yourPaKs.ElementAt(i); //SET CURRENT PAK
-
- if (!Utilities.IsFileLocked(new System.IO.FileInfo(arCurrentUsedPak)))
- {
- string arCurrentUsedPakGuid = ThePak.ReadPakGuid(Settings.Default.PAKsPath + "\\" + Path.GetFileName(arCurrentUsedPak)); //SET CURRENT PAK GUID
-
- if (arCurrentUsedPakGuid == "0-0-0-0")
- {
- ThePak.mainPaksList.Add(new PaksEntry(Path.GetFileName(arCurrentUsedPak), arCurrentUsedPakGuid));
- AddPaKs(Path.GetFileName(arCurrentUsedPak)); //add to toolstrip
- }
- if (arCurrentUsedPakGuid != "0-0-0-0")
- {
- ThePak.dynamicPaksList.Add(new PaksEntry(Path.GetFileName(arCurrentUsedPak), arCurrentUsedPakGuid));
- AddPaKs(Path.GetFileName(arCurrentUsedPak)); //add to toolstrip
- }
- }
- else
- {
- new UpdateMyConsole(Path.GetFileName(arCurrentUsedPak), Color.CornflowerBlue).AppendToConsole();
- new UpdateMyConsole(" is locked by another process.", Color.Black, true).AppendToConsole();
- }
- }
- }
- }
-
- //EVENTS
- private async void MainWindow_Load(object sender, EventArgs e)
- {
- AutoUpdater.CheckForUpdateEvent += Utilities.AutoUpdaterOnCheckForUpdateEvent;
- AutoUpdater.Start("https://dl.dropbox.com/s/3kv2pukqu6tj1r0/FModel.xml?dl=0");
-
- DLLImport.SetTreeViewTheme(treeView1.Handle);
-
- Checking.BackupFileName = "\\FortniteGame_" + DateTime.Now.ToString("MMddyyyy") + ".txt";
- ThePak.dynamicPaksList = new List();
- ThePak.mainPaksList = new List();
-
- // Copy user settings from previous application version if necessary
- if (Settings.Default.UpdateSettings)
- {
- Settings.Default.Upgrade();
- Settings.Default.UpdateSettings = false;
- Settings.Default.Save();
- }
-
- await Task.Run(() => {
- FontUtilities.SetFont();
- Utilities.SetOutputFolder();
- FillWithPaKs();
- AddToUI.checkAndAddDynamicKeys();
- Utilities.colorMyPaks(loadOneToolStripMenuItem);
- CreateBackup.GetFilesFromDropbox();
- AddBackupFiles();
- Utilities.SetFolderPermission(App.DefaultOutputPath);
- Utilities.CreateDefaultFolders();
- Methods.Serializer.LocRes.HotfixedStrings.setHotfixedStrings();
- });
-
- MyScintilla.SetScintillaStyle(scintilla1);
- }
- private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
- {
- Environment.Exit(Environment.ExitCode);
- }
- private void differenceModeToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
- {
- if (differenceModeToolStripMenuItem.Checked)
- {
- loadAllToolStripMenuItem.Text = @"Load Difference";
- loadOneToolStripMenuItem.Enabled = false;
- updateModeToolStripMenuItem.Enabled = true;
- }
- if (differenceModeToolStripMenuItem.Checked == false)
- {
- loadAllToolStripMenuItem.Text = @"Load All PAKs";
- loadOneToolStripMenuItem.Enabled = true;
- updateModeToolStripMenuItem.Enabled = false;
- if (updateModeToolStripMenuItem.Checked)
- updateModeToolStripMenuItem.Checked = false;
- }
- if (updateModeToolStripMenuItem.Checked == false && differenceModeToolStripMenuItem.Checked == false)
- {
- loadAllToolStripMenuItem.Text = @"Load All PAKs";
- }
- }
- private void updateModeToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
- {
- if (updateModeToolStripMenuItem.Checked)
- {
- loadAllToolStripMenuItem.Text = @"Load And Extract Difference";
- var updateModeForm = new UpdateModeSettings();
- if (Application.OpenForms[updateModeForm.Name] == null)
- {
- updateModeForm.Show();
- }
- else
- {
- Application.OpenForms[updateModeForm.Name].Focus();
- }
- }
- if (updateModeToolStripMenuItem.Checked == false)
- {
- loadAllToolStripMenuItem.Text = @"Load Difference";
- }
- }
-
- //FORMS
- private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
- {
- var settingsForm = new Forms.Settings();
- if (Application.OpenForms[settingsForm.Name] == null)
- {
- settingsForm.Show();
- }
- else
- {
- Application.OpenForms[settingsForm.Name].Focus();
- }
- }
- private void aboutFModelToolStripMenuItem_Click(object sender, EventArgs e)
- {
- var aboutForm = new About();
- if (Application.OpenForms[aboutForm.Name] == null)
- {
- aboutForm.Show();
- }
- else
- {
- Application.OpenForms[aboutForm.Name].Focus();
- }
- }
- private void AESManagerButton_Click(object sender, EventArgs e)
- {
- var aesForms = new AESManager();
- if (Application.OpenForms[aesForms.Name] == null)
- {
- aesForms.Show();
- }
- else
- {
- Application.OpenForms[aesForms.Name].Focus();
- }
- aesForms.FormClosing += (o, c) =>
- {
- if (AESManager.isClosed)
- {
- Utilities.colorMyPaks(loadOneToolStripMenuItem);
- }
- };
- }
- #endregion
-
- #region PAKLIST & FILL TREE
- //METHODS
- private void TreeParsePath(TreeNodeCollection nodeList, string path)
- {
- TreeNode node;
- string folder;
- int p = path.IndexOf('/');
-
- if (p == -1)
- {
- folder = path;
- path = "";
- }
- else
- {
- folder = path.Substring(0, p);
- path = path.Substring(p + 1, path.Length - (p + 1));
- }
-
- node = null;
- foreach (TreeNode item in nodeList)
- {
- if (item.Text == folder)
- {
- node = item;
- }
- }
- if (node == null)
- {
- node = new TreeNode(folder);
- Invoke(new Action(() =>
- {
- nodeList.Add(node);
- }));
- }
- if (path != "")
- {
- TreeParsePath(node.Nodes, path);
- }
- }
- private void ComparePaKs()
- {
- PakHelper.PakAsTxt = File.ReadAllLines(App.DefaultOutputPath + "\\FortnitePAKs.txt");
- File.Delete(App.DefaultOutputPath + "\\FortnitePAKs.txt");
-
- //ASK DIFFERENCE FILE AND COMPARE
- OpenFileDialog theDialog = new OpenFileDialog();
- theDialog.Title = @"Choose your Backup PAK File";
- theDialog.InitialDirectory = App.DefaultOutputPath + "\\Backup";
- theDialog.Multiselect = false;
- theDialog.Filter = @"TXT Files (*.txt)|*.txt|All Files (*.*)|*.*";
- Invoke(new Action(() =>
- {
- if (theDialog.ShowDialog() == DialogResult.OK)
- {
- String[] linesA = File.ReadAllLines(theDialog.FileName);
- for (int i = 0; i < linesA.Length; i++)
- if (linesA[i].StartsWith("../"))
- linesA[i] = linesA[i].Substring(3);
-
- IEnumerable onlyB = PakHelper.PakAsTxt.Except(linesA);
- IEnumerable removed = linesA.Except(PakHelper.PakAsTxt);
-
- File.WriteAllLines(App.DefaultOutputPath + "\\Result.txt", onlyB);
- File.WriteAllLines(App.DefaultOutputPath + "\\Removed.txt", removed);
- }
- }));
-
- //GET REMOVED FILES
- if (File.Exists(App.DefaultOutputPath + "\\Removed.txt"))
- {
- var removedTxt = File.ReadAllLines(App.DefaultOutputPath + "\\Removed.txt");
- File.Delete(App.DefaultOutputPath + "\\Removed.txt");
-
- List removedItems = new List();
- for (int i = 0; i < removedTxt.Length; i++)
- {
- if (removedTxt[i].Contains("FortniteGame/Content/Athena/Items/Cosmetics/"))
- removedItems.Add(removedTxt[i].Substring(0, removedTxt[i].LastIndexOf(".", StringComparison.Ordinal)));
- }
- if (removedItems.Count != 0)
- {
- Invoke(new Action(() =>
- {
- new UpdateMyConsole("Items Removed/Renamed:", Color.Crimson, true).AppendToConsole();
- removedItems = removedItems.Distinct().ToList();
- for (int ii = 0; ii < removedItems.Count; ii++)
- new UpdateMyConsole(" - " + removedItems[ii], Color.Black, true).AppendToConsole();
- }));
- }
- }
- else
- {
- new UpdateMyConsole("Canceled! ", Color.Crimson).AppendToConsole();
- new UpdateMyConsole("All pak files loaded...", Color.Black, true).AppendToConsole();
- return;
- }
-
- if (File.Exists(App.DefaultOutputPath + "\\Result.txt"))
- {
- PakHelper.PakAsTxt = File.ReadAllLines(App.DefaultOutputPath + "\\Result.txt");
- File.Delete(App.DefaultOutputPath + "\\Result.txt");
- Checking.DifferenceFileExists = true;
- }
- }
- private void CreatePakList(ToolStripItemClickedEventArgs selectedPak = null, bool loadAllPaKs = false, bool getDiff = false, bool updateMode = false)
- {
- ThePak.AllpaksDictionary = new Dictionary();
- ThePak.PaksExtractorDictionary = new Dictionary();
- ThePak.PaksFileArrayDictionary = new Dictionary();
- RegisterSettings.updateModeDictionary = new Dictionary();
- PakHelper.PakAsTxt = null;
-
- if (selectedPak != null)
- {
- new UpdateMyState(Settings.Default.PAKsPath + "\\" + selectedPak.ClickedItem.Text, "Loading").ChangeProcessState();
-
- //ADD TO DICTIONNARY
- PakHelper.RegisterPaKsinDict(selectedPak);
-
- if (PakHelper.PakAsTxt != null)
- {
- Invoke(new Action(() =>
- {
- treeView1.BeginUpdate();
- for (int i = 0; i < PakHelper.PakAsTxt.Length; i++)
- {
- TreeParsePath(treeView1.Nodes, PakHelper.PakAsTxt[i].Replace(PakHelper.PakAsTxt[i].Split('/').Last(), ""));
- }
- Utilities.ExpandToLevel(treeView1.Nodes, 1);
- treeView1.EndUpdate();
- }));
- new UpdateMyState(Settings.Default.PAKsPath + "\\" + selectedPak.ClickedItem.Text, "Success").ChangeProcessState();
- }
- else
- new UpdateMyState("Please, provide a working key in the AES Manager for " + selectedPak.ClickedItem.Text, "Error").ChangeProcessState();
- }
- if (loadAllPaKs)
- {
- //ADD TO DICTIONNARY
- PakHelper.RegisterPaKsinDict(null, true);
-
- if (!File.Exists(App.DefaultOutputPath + "\\FortnitePAKs.txt"))
- {
- new UpdateMyState("Error while registering pak files in the dictionary", "Error").ChangeProcessState();
- }
- else if (new System.IO.FileInfo(App.DefaultOutputPath + "\\FortnitePAKs.txt").Length <= 0) //File will always exist so we check the file size instead
- {
- File.Delete(App.DefaultOutputPath + "\\FortnitePAKs.txt");
- new UpdateMyState("Can't read .PAK files with this key", "Error").ChangeProcessState();
- }
- else
- {
- PakHelper.PakAsTxt = File.ReadAllLines(App.DefaultOutputPath + "\\FortnitePAKs.txt");
- File.Delete(App.DefaultOutputPath + "\\FortnitePAKs.txt");
-
- Invoke(new Action(() =>
- {
- treeView1.BeginUpdate();
- for (int i = 0; i < PakHelper.PakAsTxt.Length; i++)
- {
- TreeParsePath(treeView1.Nodes, PakHelper.PakAsTxt[i].Replace(PakHelper.PakAsTxt[i].Split('/').Last(), ""));
- }
- Utilities.ExpandToLevel(treeView1.Nodes, 1);
- treeView1.EndUpdate();
- }));
- new UpdateMyState(Settings.Default.PAKsPath, "Success").ChangeProcessState();
- }
- }
- if (getDiff)
- {
- //ADD TO DICTIONNARY
- PakHelper.RegisterPaKsinDict(null, true);
-
- if (!File.Exists(App.DefaultOutputPath + "\\FortnitePAKs.txt"))
- {
- new UpdateMyState("Error while registering pak files in the dictionary", "Error").ChangeProcessState();
- }
- else if (new System.IO.FileInfo(App.DefaultOutputPath + "\\FortnitePAKs.txt").Length <= 0)
- {
- new UpdateMyState("Can't read .PAK files with this key", "Error").ChangeProcessState();
- }
- else
- {
- new UpdateMyState("Comparing files...", "Loading").ChangeProcessState();
- ComparePaKs();
- if (updateMode && Checking.DifferenceFileExists)
- {
- RegisterSettings.UpdateModeAddToDict(PakHelper.PakAsTxt);
- Checking.UmWorking = true;
- }
-
- Invoke(new Action(() =>
- {
- treeView1.BeginUpdate();
- for (int i = 0; i < PakHelper.PakAsTxt.Length; i++)
- {
- TreeParsePath(treeView1.Nodes, PakHelper.PakAsTxt[i].Replace(PakHelper.PakAsTxt[i].Split('/').Last(), ""));
- }
- Utilities.ExpandToLevel(treeView1.Nodes, 1);
- treeView1.EndUpdate();
- }));
-
- Checking.DifferenceFileExists = false;
- new UpdateMyState("Files compared", "Success").ChangeProcessState();
- }
- }
- }
- private void UpdateModeHereWeGooooo()
- {
- // Check if watermark exists
- Utilities.CheckWatermark();
-
- CreatePakList(null, false, true, true);
-
- Invoke(new Action(() =>
- {
- ExtractButton.Enabled = false;
- OpenImageButton.Enabled = false;
- StopButton.Enabled = true;
- }));
- if (backgroundWorker2.IsBusy != true)
- {
- backgroundWorker2.RunWorkerAsync();
- }
- }
-
- //EVENTS
- private async void loadOneToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
- {
- await Task.Run(() => {
- Invoke(new Action(() =>
- {
- scintilla1.Text = "";
- pictureBox1.Image = null;
- loadOneToolStripMenuItem.Enabled = false;
- loadAllToolStripMenuItem.Enabled = false;
-
- treeView1.Nodes.Clear(); //SMH HERE IT DOESN'T LAG
- listBox1.Items.Clear();
- }));
-
- CreatePakList(e);
-
- Invoke(new Action(() =>
- {
- loadOneToolStripMenuItem.Enabled = true;
- loadAllToolStripMenuItem.Enabled = true;
- }));
- });
- }
- private async void loadAllToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Invoke(new Action(() =>
- {
- scintilla1.Text = "";
- pictureBox1.Image = null;
- loadOneToolStripMenuItem.Enabled = false;
- loadAllToolStripMenuItem.Enabled = false;
-
- treeView1.Nodes.Clear(); //SMH HERE IT DOESN'T LAG
- listBox1.Items.Clear();
- }));
-
- if (!differenceModeToolStripMenuItem.Checked)
- {
- await Task.Run(() => {
- CreatePakList(null, true);
- });
- }
- if (differenceModeToolStripMenuItem.Checked && !updateModeToolStripMenuItem.Checked)
- {
- await Task.Run(() => {
- CreatePakList(null, false, true);
- });
- }
- if (differenceModeToolStripMenuItem.Checked && updateModeToolStripMenuItem.Checked)
- {
- await Task.Run(() => {
- UpdateModeHereWeGooooo();
- });
- }
-
- Invoke(new Action(() =>
- {
- loadOneToolStripMenuItem.Enabled = true;
- loadAllToolStripMenuItem.Enabled = true;
- }));
- }
- private async void backupPAKsToolStripMenuItem_Click(object sender, EventArgs e)
- {
- await Task.Run(() => {
- CreateBackup.CreateBackupList();
- });
- }
- private async void DownloadBackupsToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
- {
- await Task.Run(() => {
- if (CreateBackup.backupFilesList != null && CreateBackup.backupFilesList.Count > 0)
- {
- string filename = CreateBackup.backupFilesList.Where(x => string.Equals(x.bFileName, e.ClickedItem.Text)).Select(x => x.bFileName).FirstOrDefault();
- string downloadLink = CreateBackup.backupFilesList.Where(x => string.Equals(x.bFileName, e.ClickedItem.Text)).Select(x => x.bFileDownload).FirstOrDefault();
- if (!string.IsNullOrEmpty(downloadLink))
- {
- new UpdateMyState("Downloading " + filename, "Waiting").ChangeProcessState();
-
- RestClient EndpointClient = new RestClient(downloadLink);
- RestRequest EndpointRequest = new RestRequest(Method.GET);
- string content = EndpointClient.Execute(EndpointRequest).Content;
-
- File.WriteAllText(App.DefaultOutputPath + "\\Backup\\" + filename, content);
- if (new System.IO.FileInfo(App.DefaultOutputPath + "\\Backup\\" + filename).Length > 0)
- {
- new UpdateMyState("\\Backup\\" + filename + " successfully downloaded", "Success").ChangeProcessState();
- }
- else
- {
- File.Delete(App.DefaultOutputPath + "\\Backup\\" + filename);
- new UpdateMyState("Can't download " + filename, "Error").ChangeProcessState();
- }
- }
- }
- });
- }
-
- //UPDATE MODE
- private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
- {
- _stopWatch = new Stopwatch();
- _stopWatch.Start();
- Utilities.CreateDefaultFolders();
- RegisterInArray(e, true);
- }
- private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- _stopWatch.Stop();
- if (e.Cancelled)
- {
- new UpdateMyState("Canceled!", "Error").ChangeProcessState();
- }
- else if (e.Error != null)
- {
- new UpdateMyState(e.Error.Message, "Error").ChangeProcessState();
- }
- else if (Checking.UmWorking == false)
- {
- new UpdateMyState("Can't read .PAK files with this key", "Error").ChangeProcessState();
- }
- else
- {
- TimeSpan ts = _stopWatch.Elapsed;
- string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
- new UpdateMyState("Time elapsed: " + elapsedTime, "Success").ChangeProcessState();
- }
-
- _selectedItemsArray = null;
- backgroundWorker2.Dispose();
- Checking.UmWorking = false;
- GC.Collect();
- Invoke(new Action(() =>
- {
- updateModeToolStripMenuItem.Checked = false;
- StopButton.Enabled = false;
- OpenImageButton.Enabled = true;
- ExtractButton.Enabled = true;
- }));
- }
- #endregion
-
- #region FILL LISTBOX & FILTER
- //METHODS
- private void GetFilesAndFill(TreeNodeMouseClickEventArgs selectedNode)
- {
- List itemsNotToDisplay = new List();
- _itemsToDisplay = new List();
-
- Invoke(new Action(() =>
- {
- listBox1.Items.Clear();
- FilterTextBox.Text = string.Empty;
- }));
-
- var all = Utilities.GetAncestors(selectedNode.Node, x => x.Parent).ToList();
- all.Reverse();
- var full = string.Join("/", all.Select(x => x.Text)) + "/" + selectedNode.Node.Text + "/";
- if (string.IsNullOrEmpty(full))
- {
- return;
- }
-
- var dirfiles = PakHelper.PakAsTxt.Where(x => x.StartsWith(full) && !x.Replace(full, "").Contains("/"));
- var enumerable = dirfiles as string[] ?? dirfiles.ToArray();
- if (!enumerable.Any())
- {
- return;
- }
-
- foreach (var i in enumerable)
- {
- string v;
- if (i.Contains(".uasset") || i.Contains(".uexp") || i.Contains(".ubulk"))
- {
- v = i.Substring(0, i.LastIndexOf('.'));
- }
- else
- {
- v = i.Replace(full, "");
- }
- itemsNotToDisplay.Add(v.Replace(full, ""));
- }
- _itemsToDisplay = itemsNotToDisplay.Distinct().ToList(); //NO DUPLICATION + NO EXTENSION = EASY TO FIND WHAT WE WANT
- Invoke(new Action(() =>
- {
- for (int i = 0; i < _itemsToDisplay.Count; i++)
- {
- listBox1.Items.Add(_itemsToDisplay[i]);
- }
- ExtractButton.Enabled = listBox1.SelectedIndex >= 0; //DISABLE EXTRACT BUTTON IF NOTHING IS SELECTED IN LISTBOX
- }));
- }
- private void FilterItems()
- {
- if (listBox1.InvokeRequired)
- {
- listBox1.Invoke(new Action(FilterItems));
- return;
- }
-
- listBox1.BeginUpdate();
- listBox1.Items.Clear();
-
- if (_itemsToDisplay != null)
- {
- if (!string.IsNullOrEmpty(FilterTextBox.Text))
- {
- for (int i = 0; i < _itemsToDisplay.Count; i++)
- {
- if (Utilities.CaseInsensitiveContains(_itemsToDisplay[i], FilterTextBox.Text))
- {
- listBox1.Items.Add(_itemsToDisplay[i]);
- }
- }
- }
- else
- {
- for (int i = 0; i < _itemsToDisplay.Count; i++)
- {
- listBox1.Items.Add(_itemsToDisplay[i]);
- }
- }
- }
-
- listBox1.EndUpdate();
- }
-
- //EVENTS
- private async void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
- {
- Checking.currentSelectedNodePartialPath = e.Node.FullPath + "\\";
- if (e.Node != null && e.Button == MouseButtons.Right)
- {
- extractFolderContentsToolStripMenuItem.Text = "Extract " + e.Node.Text + " Folder Contents";
- contextMenuStrip2.Show(Cursor.Position);
- }
- else
- {
- await Task.Run(() => {
- GetFilesAndFill(e);
- });
- }
- }
- private async void FilterTextBox_TextChanged(object sender, EventArgs e)
- {
- await Task.Run(() => {
- FilterItems();
- });
- }
- private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (listBox1.SelectedItem != null && _selectedItemsArray == null)
- {
- ExtractButton.Enabled = true;
- }
- }
-
- private void listBox1_MouseDown(object sender, MouseEventArgs e)
- {
- if (listBox1.SelectedIndex != -1 && e.Button == MouseButtons.Right)
- {
- bool isActive = !string.IsNullOrEmpty(scintilla1.Text);
- saveAsJSONToolStripMenuItem1.Enabled = isActive;
- saveAsJSONToolStripMenuItem1.ToolTipText = !isActive ? "Need extract a file" : "";
-
- contextMenuStrip1.Show(Cursor.Position);
- }
- }
- #endregion
-
- #region EXTRACT BUTTON
- //METHODS
- private void RegisterInArray(DoWorkEventArgs e, bool updateMode = false)
- {
- if (updateMode)
- {
- Invoke(new Action(() =>
- {
- _selectedItemsArray = new string[RegisterSettings.updateModeDictionary.Count];
- for (int i = 0; i < RegisterSettings.updateModeDictionary.Count; i++) //ADD DICT ITEM TO ARRAY
- {
- _selectedItemsArray[i] = RegisterSettings.updateModeDictionary.Keys.ElementAt(i);
- }
- }));
- }
- else
- {
- Invoke(new Action(() =>
- {
- _selectedItemsArray = new string[listBox1.SelectedItems.Count];
- for (int i = 0; i < listBox1.SelectedItems.Count; i++) //ADD SELECTED ITEM TO ARRAY
- {
- _selectedItemsArray[i] = listBox1.SelectedItems[i].ToString();
- }
- }));
- }
-
- ExtractAndSerializeItems(e);
- }
- private void ExtractAndSerializeItems(DoWorkEventArgs e)
- {
- for (int i = 0; i < _selectedItemsArray.Length; i++)
- {
- if (backgroundWorker1.CancellationPending && backgroundWorker1.IsBusy)
- {
- e.Cancel = true;
- return;
- }
- if (backgroundWorker2.CancellationPending && backgroundWorker2.IsBusy)
- {
- e.Cancel = true;
- return;
- }
-
- ThePak.CurrentUsedItem = _selectedItemsArray[i];
-
- Checking.ExtractedFilePath = JohnWick.ExtractAsset(ThePak.AllpaksDictionary[ThePak.CurrentUsedItem], ThePak.CurrentUsedItem);
-
- if (Checking.ExtractedFilePath != null)
- {
- new UpdateMyState(ThePak.CurrentUsedItem + " successfully extracted", "Success").ChangeProcessState();
- if (Checking.ExtractedFilePath.Contains(".uasset") || Checking.ExtractedFilePath.Contains(".uexp") || Checking.ExtractedFilePath.Contains(".ubulk"))
- {
- JohnWick.MyAsset = new PakAsset(Checking.ExtractedFilePath.Substring(0, Checking.ExtractedFilePath.LastIndexOf('.')));
- JsonParseFile();
- }
- if (Checking.ExtractedFilePath.Contains(".ufont"))
- FontUtilities.ConvertToTtf(Checking.ExtractedFilePath);
- if (Checking.ExtractedFilePath.Contains(".ini"))
- {
- Invoke(new Action(() =>
- {
- scintilla1.Text = File.ReadAllText(Checking.ExtractedFilePath);
- }));
- }
- if (Checking.ExtractedFilePath.Contains(".locres") && !Checking.ExtractedFilePath.Contains("EngineOverrides"))
- SerializeLocRes();
- if (Checking.ExtractedFilePath.Contains(".uplugin") || Checking.ExtractedFilePath.Contains(".uproject"))
- uPluginConvertToJson(Checking.ExtractedFilePath);
- }
- else { throw new ArgumentException("Error while extracting " + ThePak.CurrentUsedItem); }
- }
- }
- private void JsonParseFile()
- {
- if (JohnWick.MyAsset.GetSerialized() != null)
- {
- new UpdateMyState(ThePak.CurrentUsedItem + " successfully serialized", "Success").ChangeProcessState();
-
- try
- {
- string parsedData = JToken.Parse(JohnWick.MyAsset.GetSerialized()).ToString();
- Invoke(new Action(() =>
- {
- scintilla1.Text = parsedData;
- }));
- }
- catch (JsonReaderException)
- {
- new UpdateMyConsole(ThePak.CurrentUsedItem + " ", Color.Crimson).AppendToConsole();
- new UpdateMyConsole(".JSON file can't be displayed", Color.Black, true).AppendToConsole();
- }
- finally
- {
- AutoSaveAsJSON();
- NavigateThroughJson(JohnWick.MyAsset, Checking.ExtractedFilePath);
- }
- }
- else { throw new ArgumentException("Can't serialize this file"); }
- }
- private void NavigateThroughJson(PakAsset theAsset, string theAssetExtractedPath = null)
- {
- try
- {
- dynamic AssetData = JsonConvert.DeserializeObject(theAsset.GetSerialized());
- JArray AssetArray = JArray.FromObject(AssetData);
-
- new UpdateMyState("Parsing " + ThePak.CurrentUsedItem + "...", "Waiting").ChangeProcessState();
- JToken exportToken = AssetArray[0]["export_type"];
- switch (exportToken != null ? exportToken.Value() : "")
- {
- case "AthenaBackpackItemDefinition":
- case "AthenaBattleBusItemDefinition":
- case "AthenaCharacterItemDefinition":
- case "AthenaConsumableEmoteItemDefinition":
- case "AthenaSkyDiveContrailItemDefinition":
- case "AthenaDanceItemDefinition":
- case "AthenaEmojiItemDefinition":
- case "AthenaGliderItemDefinition":
- case "AthenaItemWrapDefinition":
- case "AthenaLoadingScreenItemDefinition":
- case "AthenaMusicPackItemDefinition":
- case "AthenaPetCarrierItemDefinition":
- case "AthenaPickaxeItemDefinition":
- case "AthenaSprayItemDefinition":
- case "AthenaToyItemDefinition":
- case "AthenaVictoryPoseItemDefinition":
- case "FortBannerTokenType":
- case "AthenaGadgetItemDefinition":
- CreateItemIcon(AssetArray[0], "athIteDef");
- break;
- case "FortWeaponRangedItemDefinition":
- case "FortWeaponMeleeItemDefinition":
- case "FortIngredientItemDefinition":
- CreateItemIcon(AssetArray[0], "consAndWeap");
- break;
- case "FortVariantTokenType":
- CreateItemIcon(AssetArray[0], "variant");
- break;
- case "FortAmmoItemDefinition":
- CreateItemIcon(AssetArray[0], "ammo");
- break;
- case "FortHeroType":
- CreateItemIcon(AssetArray[0], "stwHeroes");
- break;
- case "FortDefenderItemDefinition":
- CreateItemIcon(AssetArray[0], "stwDefenders");
- break;
- case "FortContextTrapItemDefinition":
- case "FortTrapItemDefinition":
- case "FortCardPackItemDefinition":
- case "FortPlaysetGrenadeItemDefinition":
- case "FortConsumableAccountItemDefinition":
- case "FortBadgeItemDefinition":
- case "FortCurrencyItemDefinition":
- case "FortConversionControlItemDefinition":
- case "FortHomebaseNodeItemDefinition":
- case "FortPersonalVehicleItemDefinition":
- case "FortCampaignHeroLoadoutItemDefinition":
- case "FortNeverPersistItemDefinition":
- case "FortPersistentResourceItemDefinition":
- case "FortResourceItemDefinition":
- case "FortGadgetItemDefinition":
- case "FortStatItemDefinition":
- case "FortTokenType":
- case "FortDailyRewardScheduleTokenDefinition":
- case "FortWorkerType":
- case "FortConditionalResourceItemDefinition":
- case "FortAwardItemDefinition":
- case "FortChallengeBundleScheduleDefinition":
- case "FortAbilityKit":
- CreateItemIcon(AssetArray[0]);
- break;
- case "FortChallengeBundleItemDefinition":
- CreateBundleChallengesIcon(AssetArray[0], theAssetExtractedPath);
- break;
- case "FortSchematicItemDefinition":
- CreateSchematicIcon(AssetArray[0]);
- break;
- case "Texture2D":
- ConvertTexture2D();
- break;
- case "SoundWave":
- ConvertSoundWave();
- break;
- default:
- break;
- }
- }
- catch (Exception ex)
- {
- if (Checking.UmWorking)
- {
- new UpdateMyConsole(ex.Message, Color.Crimson, true).AppendToConsole();
- }
- else
- {
- throw new ArgumentException(ex.Message);
- }
- }
- }
- private void CreateItemIcon(JToken theItem, string specialMode = null)
- {
- new UpdateMyState(ThePak.CurrentUsedItem + " is an Item Definition", "Success").ChangeProcessState();
-
- Bitmap bmp = new Bitmap(522, 522);
- Graphics g = Graphics.FromImage(bmp);
- g.TextRenderingHint = TextRenderingHint.AntiAlias;
- g.SmoothingMode = SmoothingMode.HighQuality;
-
- Rarity.DrawRarity(theItem, g, specialMode);
-
- ItemIcon.ItemIconPath = string.Empty;
- ItemIcon.GetItemIcon(theItem, Settings.Default.loadFeaturedImage);
- if (File.Exists(ItemIcon.ItemIconPath))
- {
- Image itemIcon;
- using (var bmpTemp = new Bitmap(ItemIcon.ItemIconPath))
- {
- itemIcon = new Bitmap(bmpTemp);
- }
- g.DrawImage(ImageUtilities.ResizeImage(itemIcon, 512, 512), new Point(5, 5));
- }
- else
- {
- Image itemIcon = Resources.unknown512;
- g.DrawImage(itemIcon, new Point(0, 0));
- }
-
- ItemIcon.DrawWatermark(g);
-
- if (string.Equals(Settings.Default.rarityDesign, "Flat"))
- {
- GraphicsPath p = new GraphicsPath();
- p.StartFigure();
- p.AddLine(4, 438, 517, 383);
- p.AddLine(517, 383, 517, 383 + 134);
- p.AddLine(4, 383 + 134, 4, 383 + 134);
- p.AddLine(4, 383 + 134, 4, 438);
- p.CloseFigure();
- g.FillPath(new SolidBrush(Color.FromArgb(70, 0, 0, 50)), p);
- }
- else { g.FillRectangle(new SolidBrush(Color.FromArgb(70, 0, 0, 50)), new Rectangle(5, string.Equals(Settings.Default.rarityDesign, "Minimalist") ? 393 : 383, 512, string.Equals(Settings.Default.rarityDesign, "Minimalist") ? 124 : 134)); }
-
- DrawText.DrawTexts(theItem, g, specialMode);
-
- pictureBox1.Image = bmp;
-
- AutoSaveImage();
- g.Dispose();
- }
-
-
- ///
- /// this is the main method that draw the bundle of challenges
- ///
- /// needed for the DisplayName
- /// to parse from this instead of calling MyAsset.GetSerialized() again
- /// needed for the LastFolder
- /// the bundle image ready to be displayed in pictureBox1
- private void CreateBundleChallengesIcon(JToken theItem, string extractedBundlePath)
- {
- BundleInfos.getBundleData(theItem);
- if (!BundleInfos.BundleData.Any()) { throw new ArgumentException("Not even one quest could be extracted, can't generate more about this bundle"); }
- bool isFortbyte = false;
-
- Bitmap bmp = new Bitmap(1024, 10000);
- BundleDesign.BundlePath = extractedBundlePath;
- BundleDesign.theY = 200;
- BundleDesign.toDrawOn = Graphics.FromImage(bmp);
- BundleDesign.toDrawOn.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
- BundleDesign.toDrawOn.SmoothingMode = SmoothingMode.HighQuality;
- BundleDesign.myItem = theItem;
- BundleDesign.isBundleLevelup = false;
- BundleDesign.isGrantWithBundle = false;
- BundleDesign.isRequiresBattlePass = false;
-
- BundleDesign.drawBackground(bmp, theItem);
-
- if (BundleInfos.BundleData[0].rewardItemId != null && string.Equals(BundleInfos.BundleData[0].rewardItemId, "AthenaFortbyte", StringComparison.CurrentCultureIgnoreCase))
- isFortbyte = true;
-
- // Fortbytes: Sort by number
- if (isFortbyte)
- {
- BundleInfos.BundleData.Sort(delegate (BundleInfoEntry a, BundleInfoEntry b)
- {
- return Int32.Parse(a.rewardItemQuantity).CompareTo(Int32.Parse(b.rewardItemQuantity));
- });
- }
-
- for (int i = 0; i < BundleInfos.BundleData.Count; i++)
- {
- new UpdateMyConsole(BundleInfos.BundleData[i].questDescr, Color.RoyalBlue).AppendToConsole();
- new UpdateMyConsole("\t\tCount: " + BundleInfos.BundleData[i].questCount, Color.Goldenrod).AppendToConsole();
- new UpdateMyConsole("\t\t" + BundleInfos.BundleData[i].rewardItemId + ":" + BundleInfos.BundleData[i].rewardItemQuantity, Color.Crimson, true).AppendToConsole();
-
- BundleDesign.theY += 90;
-
- if (!string.IsNullOrEmpty(BundleInfos.BundleData[i].questUnlockType))
- {
- BundleDesign.drawSeparator(BundleInfos.BundleData[i].questUnlockType);
- }
-
- //draw quest description
- BundleDesign.drawQuestBackground(bmp);
- Font goodFont = FontUtilities.FindFont(BundleDesign.toDrawOn, BundleInfos.BundleData[i].questDescr, new Rectangle(57, BundleDesign.theY + 7, bmp.Width - 227, 38).Size, new Font(Settings.Default.IconLanguage == "Japanese" ? FontUtilities.pfc.Families[2] : FontUtilities.pfc.Families[1], 30)); //size in "new Font()" is never check
- BundleDesign.toDrawOn.DrawString(BundleInfos.BundleData[i].questDescr, goodFont, new SolidBrush(Color.White), new Point(55, BundleDesign.theY + 10));
-
- //draw quest count
- BundleDesign.toDrawOn.DrawString("0 /", new Font(FontUtilities.pfc.Families[1], 12), new SolidBrush(Color.FromArgb(255, 255, 255, 255)), new Point(565, BundleDesign.theY + 42));
- BundleDesign.toDrawOn.DrawString(BundleInfos.BundleData[i].questCount.ToString(), new Font(FontUtilities.pfc.Families[1], 12), new SolidBrush(Color.FromArgb(200, 255, 255, 255)), new Point(587, BundleDesign.theY + 42));
-
- //draw quest reward
- DrawingRewards.getRewards(BundleInfos.BundleData[i].rewardItemId, BundleInfos.BundleData[i].rewardItemQuantity);
- }
- new UpdateMyConsole("", Color.Black, true).AppendToConsole();
-
- BundleDesign.drawCompletionReward(bmp, theItem);
- BundleDesign.drawWatermark(bmp);
-
- //cut if too long and return the bitmap
- using (Bitmap bmp2 = bmp)
- {
- var newImg = bmp2.Clone(
- new Rectangle { X = 0, Y = 0, Width = bmp.Width, Height = BundleDesign.theY + 105 },
- bmp2.PixelFormat);
-
- pictureBox1.Image = newImg;
- }
-
- AutoSaveImage();
- BundleDesign.toDrawOn.Dispose(); //actually this is the most useful thing in this method
- }
-
- private void CreateSchematicIcon(JToken theItem)
- {
- SchematicIconDesign.createItemDefinitionIcon(theItem);
- SchematicIconDesign.createIngredientIcon();
-
- pictureBox1.Image = SchematicIconDesign.schematicBitmap;
-
- AutoSaveImage();
- SchematicIconDesign.toDrawOn.Dispose();
- }
-
- ///
- /// because the filename is usually the same for each language, John Wick extract all of them
- /// but then i have to manually get the right path from the treeview
- /// TODO: find bug for EngineOverrides
- ///
- private void SerializeLocRes()
- {
- Invoke(new Action(() =>
- {
- string treeviewPath = treeView1.SelectedNode.FullPath;
- if (treeviewPath.StartsWith("..\\")) { treeviewPath = treeviewPath.Substring(3); } //if loading all paks
-
- string filePath = App.DefaultOutputPath + "\\Extracted\\" + treeviewPath + "\\" + listBox1.SelectedItem;
- if (File.Exists(filePath))
- {
- LocResSerializer.setLocRes(filePath);
- scintilla1.Text = JsonConvert.SerializeObject(LocResSerializer.LocResDict, Formatting.Indented);
- }
- else { throw new FileNotFoundException("Error while searching " + listBox1.SelectedItem); }
- }));
- }
-
- private void ConvertTexture2D()
- {
- new UpdateMyState(ThePak.CurrentUsedItem + " is a Texture2D", "Success").ChangeProcessState();
-
- JohnWick.MyAsset = new PakAsset(Checking.ExtractedFilePath.Substring(0, Checking.ExtractedFilePath.LastIndexOf(".", StringComparison.Ordinal)));
- JohnWick.MyAsset.SaveTexture(Checking.ExtractedFilePath.Substring(0, Checking.ExtractedFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png");
- string imgPath = Checking.ExtractedFilePath.Substring(0, Checking.ExtractedFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png";
-
- if (File.Exists(imgPath))
- {
- Image img;
- using (var bmpTemp = new Bitmap(imgPath))
- {
- img = new Bitmap(bmpTemp);
- }
- pictureBox1.Image = img;
- }
-
- if (autoSaveImagesToolStripMenuItem.Checked || updateModeToolStripMenuItem.Checked)
- {
- Invoke(new Action(() =>
- {
- pictureBox1.Image.Save(App.DefaultOutputPath + "\\Icons\\" + ThePak.CurrentUsedItem + ".png", ImageFormat.Png);
- }));
- new UpdateMyConsole(ThePak.CurrentUsedItem, Color.Crimson).AppendToConsole();
- new UpdateMyConsole(" successfully saved", Color.Black, true).AppendToConsole();
- }
- }
- private void ConvertSoundWave()
- {
- new UpdateMyState(ThePak.CurrentUsedItem + " is a Sound", "Success").ChangeProcessState();
-
- string soundPathToConvert = Checking.ExtractedFilePath.Substring(0, Checking.ExtractedFilePath.LastIndexOf('\\')) + "\\" + ThePak.CurrentUsedItem + ".uexp";
- new UpdateMyState("Converting " + ThePak.CurrentUsedItem, "Processing").ChangeProcessState();
- string soundPathConverted = UnrealEngineDataToOgg.ConvertToOgg(soundPathToConvert);
-
- if (File.Exists(soundPathConverted))
- {
- if (Settings.Default.openSound)
- {
- new UpdateMyState("Opening " + ThePak.CurrentUsedItem + ".ogg", "Success").ChangeProcessState();
- Utilities.OpenWithDefaultProgramAndNoFocus(soundPathConverted);
- }
- }
- else
- new UpdateMyState("Couldn't convert " + ThePak.CurrentUsedItem, "Error").ChangeProcessState();
- }
-
- private void uPluginConvertToJson(string file)
- {
- if (File.Exists(Path.ChangeExtension(file, ".json"))) File.Delete(Path.ChangeExtension(file, ".json"));
-
- File.Move(file, Path.ChangeExtension(file, ".json"));
- Invoke(new Action(() =>
- {
- scintilla1.Text = File.ReadAllText(Path.ChangeExtension(file, ".json"));
- }));
- new UpdateMyState(ThePak.CurrentUsedItem + " successfully converter to JSON", "Success").ChangeProcessState();
- }
-
- //EVENTS
- private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
- {
- _stopWatch = new Stopwatch();
- _stopWatch.Start();
- Utilities.CreateDefaultFolders();
- RegisterInArray(e);
- }
- private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- _stopWatch.Stop();
- if (e.Cancelled)
- {
- new UpdateMyState("Canceled!", "Error").ChangeProcessState();
- }
- else if (e.Error != null)
- {
- new UpdateMyState(e.Error.Message, "Error").ChangeProcessState();
- }
- else
- {
- TimeSpan ts = _stopWatch.Elapsed;
- string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
- new UpdateMyState("Time elapsed: " + elapsedTime, "Success").ChangeProcessState();
- }
-
- _selectedItemsArray = null;
- backgroundWorker1.Dispose();
- GC.Collect();
- Invoke(new Action(() =>
- {
- StopButton.Enabled = false;
- OpenImageButton.Enabled = true;
- ExtractButton.Enabled = true;
- }));
- }
-
- private void ExtractButton_Click(object sender, EventArgs e)
- {
- ExtractProcess();
- }
- private void ListBox1_MouseDoubleClick(object sender, MouseEventArgs e)
- {
- if (listBox1.SelectedItem != null && _selectedItemsArray == null)
- {
- ExtractProcess();
- }
- }
-
- private void ExtractProcess()
- {
- // Check if watermark exists
- Utilities.CheckWatermark();
-
- scintilla1.Text = "";
- pictureBox1.Image = null;
- ExtractButton.Enabled = false;
- OpenImageButton.Enabled = false;
- StopButton.Enabled = true;
-
- if (backgroundWorker1.IsBusy != true)
- {
- backgroundWorker1.RunWorkerAsync();
- }
- }
-
- private void StopButton_Click(object sender, EventArgs e)
- {
- if (backgroundWorker1.WorkerSupportsCancellation)
- {
- backgroundWorker1.CancelAsync();
- }
- if (backgroundWorker2.WorkerSupportsCancellation)
- {
- backgroundWorker2.CancelAsync();
- }
- }
- #endregion
-
- #region IMAGES TOOLSTRIP AND OPEN
- //EVENTS
- private void OpenImageButton_Click(object sender, EventArgs e)
- {
- if (pictureBox1.Image != null)
- {
- var newForm = new Form();
-
- PictureBox pb = new PictureBox();
- pb.Dock = DockStyle.Fill;
- pb.Image = pictureBox1.Image;
- pb.SizeMode = PictureBoxSizeMode.Zoom;
-
- newForm.Size = pictureBox1.Image.Size;
- newForm.Icon = Resources.FModel;
- newForm.Text = ThePak.CurrentUsedItem;
- newForm.StartPosition = FormStartPosition.CenterScreen;
- newForm.Controls.Add(pb);
- newForm.Show();
- }
- }
- private void saveImageToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (pictureBox1.Image != null)
- {
- SaveFileDialog saveTheDialog = new SaveFileDialog();
- saveTheDialog.Title = @"Save Icon";
- saveTheDialog.Filter = @"PNG Files (*.png)|*.png";
- saveTheDialog.InitialDirectory = App.DefaultOutputPath + "\\Icons\\";
- saveTheDialog.FileName = ThePak.CurrentUsedItem;
- if (saveTheDialog.ShowDialog() == DialogResult.OK)
- {
- pictureBox1.Image.Save(saveTheDialog.FileName, ImageFormat.Png);
- new UpdateMyConsole(Path.GetFileNameWithoutExtension(saveTheDialog.FileName), Color.Crimson).AppendToConsole();
- new UpdateMyConsole(" successfully saved", Color.Black, true).AppendToConsole();
- }
- }
- }
- private void mergeImagesToolStripMenuItem_Click(object sender, EventArgs e)
- {
- MergeImages mergeImagesForm = new MergeImages();
- if (Application.OpenForms[mergeImagesForm.Name] == null)
- {
- mergeImagesForm.Show();
- }
- else
- Application.OpenForms[mergeImagesForm.Name].Focus();
- }
- #endregion
-
- #region FILES TOOLSTRIP
- //METHODS
- private void OpenMe()
- {
- if (SearchFiles.IsClosed)
- {
- treeView1.CollapseAll();
-
- List pathList = SearchFiles.SfPath.Split('/').ToList();
-
- foreach (TreeNode node in treeView1.Nodes)
- {
- if (node.Text == pathList[0])
- {
- ExpandMyLitleBoys(node, pathList);
- }
- }
- }
- else if (SearchFiles.FilesToSearch)
- {
- AddAndSelectAllItems(SearchFiles.myItems);
- }
- }
- private async void ExpandMyLitleBoys(TreeNode node, List path)
- {
- path.RemoveAt(0);
- node.Expand();
-
- if (path.Count == 0)
- return;
-
- if (path.Count == 1)
- {
- treeView1.SelectedNode = node;
- await Task.Run(() => {
- List itemsNotToDisplay = new List();
- _itemsToDisplay = new List();
-
- Invoke(new Action(() =>
- {
- listBox1.Items.Clear();
- FilterTextBox.Text = string.Empty;
- }));
-
- var all = Utilities.GetAncestors(node, x => x.Parent).ToList();
- all.Reverse();
- var full = string.Join("/", all.Select(x => x.Text)) + "/" + node.Text + "/";
- if (string.IsNullOrEmpty(full))
- {
- return;
- }
-
- var dirfiles = PakHelper.PakAsTxt.Where(x => x.StartsWith(full) && !x.Replace(full, "").Contains("/"));
- var enumerable = dirfiles as string[] ?? dirfiles.ToArray();
- if (!enumerable.Any())
- {
- return;
- }
-
- foreach (var i in enumerable)
- {
- string v;
- if (i.Contains(".uasset") || i.Contains(".uexp") || i.Contains(".ubulk"))
- {
- v = i.Substring(0, i.LastIndexOf('.'));
- }
- else
- {
- v = i.Replace(full, "");
- }
- itemsNotToDisplay.Add(v.Replace(full, ""));
- }
- _itemsToDisplay = itemsNotToDisplay.Distinct().ToList(); //NO DUPLICATION + NO EXTENSION = EASY TO FIND WHAT WE WANT
- Invoke(new Action(() =>
- {
- for (int i = 0; i < _itemsToDisplay.Count; i++)
- {
- listBox1.Items.Add(_itemsToDisplay[i]);
- }
- ExtractButton.Enabled = listBox1.SelectedIndex >= 0; //DISABLE EXTRACT BUTTON IF NOTHING IS SELECTED IN LISTBOX
- }));
- });
- for (int i = 0; i < listBox1.Items.Count; i++)
- {
- if (listBox1.Items[i].ToString() == SearchFiles.SfPath.Substring(SearchFiles.SfPath.LastIndexOf("/", StringComparison.Ordinal) + 1))
- {
- listBox1.SelectedItem = listBox1.Items[i];
- }
- }
- }
-
- foreach (TreeNode mynode in node.Nodes)
- if (mynode.Text == path[0])
- {
- ExpandMyLitleBoys(mynode, path); //recursive call
- break;
- }
- }
- private void AddAndSelectAllItems(string[] myItemsToAdd)
- {
- listBox1.BeginUpdate();
- listBox1.Items.Clear();
- for (int i = 0; i < myItemsToAdd.Length; i++)
- {
- listBox1.Items.Add(myItemsToAdd[i]);
- }
- for (int i = 0; i < listBox1.Items.Count; i++) { listBox1.SetSelected(i, true); }
- listBox1.EndUpdate();
-
- //same as click on extract button
- scintilla1.Text = "";
- pictureBox1.Image = null;
- ExtractButton.Enabled = false;
- OpenImageButton.Enabled = false;
- StopButton.Enabled = true;
-
- if (backgroundWorker1.IsBusy != true)
- {
- backgroundWorker1.RunWorkerAsync();
- }
- }
-
- //EVENTS
- private void searchToolStripMenuItem_Click(object sender, EventArgs e)
- {
- var searchForm = new SearchFiles();
- if (Application.OpenForms[searchForm.Name] == null)
- {
- searchForm.Show();
- }
- else
- {
- Application.OpenForms[searchForm.Name].Focus();
- }
- searchForm.FormClosing += (o, c) =>
- {
- OpenMe();
- };
- }
- private void CopySelectedFile(bool isName = false, bool withExtension = true)
- {
- if (listBox1.SelectedItem != null)
- {
- string treeviewPath = treeView1.SelectedNode.FullPath;
- // if loading all paks
- if (treeviewPath.StartsWith("..\\"))
- treeviewPath = treeviewPath.Substring(3);
-
- string path = treeviewPath + "\\" + listBox1.SelectedItem;
- // if file uasset/uexp/ubulk
- path = !path.Contains(".") ? (path.Replace("\\", "/") + ".uasset") : path.Replace("\\", "/");
- if (isName)
- path = Path.GetFileName(path);
-
- if (!withExtension)
- path = isName ? Path.GetFileNameWithoutExtension(path) : Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path));
-
- Clipboard.SetText(path);
- new UpdateMyConsole(path, Color.CornflowerBlue).AppendToConsole();
- new UpdateMyConsole(" Copied!", Color.Black, true).AppendToConsole();
- }
- }
-
- private void SaveAsJSONToolStripMenuItem_Click(object sender, EventArgs e)
- {
- SaveAsJSON();
- }
- private void SaveAsJSON()
- {
- if (!string.IsNullOrEmpty(scintilla1.Text))
- {
- SaveFileDialog saveTheDialog = new SaveFileDialog();
- saveTheDialog.Title = @"Save Serialized File";
- saveTheDialog.Filter = @"JSON Files (*.json)|*.json";
- saveTheDialog.InitialDirectory = App.DefaultOutputPath + "\\Saved_JSON\\";
- saveTheDialog.FileName = ThePak.CurrentUsedItem.Contains('.') ? ThePak.CurrentUsedItem.Substring(0, ThePak.CurrentUsedItem.LastIndexOf('.')) : ThePak.CurrentUsedItem;
- if (saveTheDialog.ShowDialog() == DialogResult.OK)
- {
- File.WriteAllText(saveTheDialog.FileName, scintilla1.Text);
- if (File.Exists(saveTheDialog.FileName))
- {
- new UpdateMyConsole(ThePak.CurrentUsedItem, Color.Crimson).AppendToConsole();
- new UpdateMyConsole(" successfully saved", Color.Black, true).AppendToConsole();
- }
- }
- }
- }
- private void AutoSaveAsJSON()
- {
- if (autoSaveAsJSONToolStripMenuItem.Checked)
- {
- string text = string.Empty;
- Invoke(new Action(() =>
- {
- text = scintilla1.Text;
- }));
-
- if (!string.IsNullOrEmpty(text))
- {
- string filename = ThePak.CurrentUsedItem.Contains('.') ? ThePak.CurrentUsedItem.Substring(0, ThePak.CurrentUsedItem.LastIndexOf('.')) : ThePak.CurrentUsedItem;
- File.WriteAllText(App.DefaultOutputPath + "\\Saved_JSON\\" + filename + ".json", text);
-
- if (File.Exists(App.DefaultOutputPath + "\\Saved_JSON\\" + filename + ".json"))
- {
- new UpdateMyConsole(ThePak.CurrentUsedItem, Color.Crimson).AppendToConsole();
- new UpdateMyConsole("'s properties successfully saved", Color.Black, true).AppendToConsole();
- }
- }
- }
- }
- private void AutoSaveImage()
- {
- if (autoSaveImagesToolStripMenuItem.Checked || Checking.UmWorking)
- {
- Invoke(new Action(() =>
- {
- pictureBox1.Image.Save(App.DefaultOutputPath + "\\Icons\\" + ThePak.CurrentUsedItem + ".png", ImageFormat.Png);
- }));
-
- if (File.Exists(App.DefaultOutputPath + "\\Icons\\" + ThePak.CurrentUsedItem + ".png"))
- {
- new UpdateMyConsole(ThePak.CurrentUsedItem, Color.Crimson).AppendToConsole();
- new UpdateMyConsole("'s image successfully saved", Color.Black, true).AppendToConsole();
- }
- }
- }
-
- private void openExtractionFolderToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(Settings.Default.ExtractOutput))
- Process.Start(@"" + Settings.Default.ExtractOutput);
- }
- #endregion
-
- #region RIGHT CLICK
- private void copyFileToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile();
- }
- private void copyFileNameToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile(true);
- }
- private void copyFilePathWithoutExtensionToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile(false, false);
- }
- private void copyFileNameWithoutExtensionToolStripMenuItem_Click(object sender, EventArgs e)
- {
- CopySelectedFile(true, false);
- }
-
- private void extractToolStripMenuItem_Click(object sender, EventArgs e)
- {
- ExtractProcess();
- }
-
- private void saveAsJSONToolStripMenuItem1_Click(object sender, EventArgs e)
- {
- SaveAsJSON();
- }
-
- private void ExtractFolderContentsToolStripMenuItem_Click(object sender, EventArgs e)
- {
- RegisterSettings.updateModeDictionary = new Dictionary();
-
- for (int i = 0; i < PakHelper.PakAsTxt.Length; i++)
- {
- if (PakHelper.PakAsTxt[i].Contains(Checking.currentSelectedNodePartialPath.Replace("\\", "/")))
- {
- string filename = Path.GetFileName(PakHelper.PakAsTxt[i]);
- if (filename.Contains(".uasset") || filename.Contains(".uexp") || filename.Contains(".ubulk"))
- {
- if (!RegisterSettings.updateModeDictionary.ContainsKey(filename.Substring(0, filename.LastIndexOf(".", StringComparison.Ordinal))))
- RegisterSettings.updateModeDictionary.Add(filename.Substring(0, filename.LastIndexOf(".", StringComparison.Ordinal)), PakHelper.PakAsTxt[i]);
- }
- }
- }
- Checking.UmWorking = true;
-
- Invoke(new Action(() =>
- {
- ExtractButton.Enabled = false;
- OpenImageButton.Enabled = false;
- StopButton.Enabled = true;
- }));
- if (backgroundWorker2.IsBusy != true)
- {
- backgroundWorker2.RunWorkerAsync();
- }
- }
- #endregion
- }
-}
diff --git a/FModel/MainWindow.resx b/FModel/MainWindow.resx
deleted file mode 100644
index 662cfaaf..00000000
--- a/FModel/MainWindow.resx
+++ /dev/null
@@ -1,1420 +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
-
-
- 17, 17
-
-
- 133, 17
-
-
- 248, 17
-
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
- LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABa
- CAAAAk1TRnQBSQFMAgEBAgEAAVABAgFQAQIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
- AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
- AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
- AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
- AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
- AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
- AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
- ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
- AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
- AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
- AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
- AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
- AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
- AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
- AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
- AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
- ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
- Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
- AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
- AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
- AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
- ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
- Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
- AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
- AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
- AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
- AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
- AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
- AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/0MAAf8N9DEAAf8O9AEA
- D/QhAAH0ARoKeQEaAXkB9AEAAfQNeQH0IQAB9AGZCXkBmQH0AXkB9AEAAfQNeQH0IAAB9AEbCnkBGwH0
- AXkB9AEAAfQNeQH0IAAB9AEaCXkBmQL0AXkB9AEAAfQNeQH0IAAB9AGZCXkB8wL0AXkB9AEAAfQNeQH0
- IAAC9AF5C/QBeQH0AQAB9A15AfQhAAH0AXkL9AF5AfQBAAH0DXkB9CEAAfQBeQv0AXkB9AEAAfQNeQH0
- IQAB9AR5AfMH9AF5AfQBAAH0DXkB9CEABPQCmQf0AXkB9AEABfQCmQb0AXkB9CQAAfQBGgl5AfQFAAH0
- ARoIeQH0JAAM9AUAAf8K9GAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAT/
- BAABwAEAAv8EAAGAAQABgAUAAYABAAGABQABgAEAAYAHAAGABwABgAcAAYAHAAGABQABgAEAAYAFAAGA
- AQABgAUAAYABAAGABQABgAEAAYAFAAHwAQAB+AUAAfABAAH4BQAE/wQACw==
-
-
-
- 358, 17
-
-
- 522, 17
-
-
- 686, 17
-
-
- 841, 17
-
-
- 63
-
-
-
-
- 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
- gg==
-
-
-
\ No newline at end of file
diff --git a/FModel/Methods/AESManager/DynamicKeys/AddToUI.cs b/FModel/Methods/AESManager/DynamicKeys/AddToUI.cs
deleted file mode 100644
index decd175c..00000000
--- a/FModel/Methods/AESManager/DynamicKeys/AddToUI.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.IO;
-using System.Linq;
-
-namespace FModel
-{
- static class AddToUI
- {
- private static List _oldKeysList = null;
-
- ///
- /// ask the keychain api for all dynamic keys
- /// if an API pak name match a local pak name, the key is saved and the pak can be opened with this key
- ///
- public static void checkAndAddDynamicKeys()
- {
- if (!File.Exists(DynamicKeysManager.path))
- {
- DynamicKeysManager.AESEntries = new List();
- DynamicKeysManager.serialize("", "");
- }
- else
- {
- DynamicKeysManager.deserialize();
- _oldKeysList = DynamicKeysManager.AESEntries;
- }
-
- string data = GetKeysFromKeychain();
- if (!string.IsNullOrEmpty(data))
- {
- JObject myObject = JObject.Parse(data);
- if (myObject != null)
- {
- DynamicKeysManager.AESEntries = new List();
- foreach (PaksEntry item in ThePak.dynamicPaksList)
- {
- if (myObject.ToString().Contains(item.thePak))
- {
- JToken token = myObject.FindTokens(item.thePak).FirstOrDefault();
-
- DynamicKeysManager.serialize(token.ToString().ToUpper().Substring(2), item.thePak);
-
- displayNewPaks(token.ToString().ToUpper().Substring(2), item.thePak);
- }
- else
- {
- DynamicKeysManager.serialize("", item.thePak);
- }
- }
- }
- }
-
- DynamicKeysManager.deserialize();
- }
-
- ///
- /// return the dynamic keys part from Ben API
- ///
- ///
- private static string GetKeysFromKeychain()
- {
- try
- {
- if (DLLImport.IsInternetAvailable())
- {
- string data = Keychain.GetEndpoint("http://benbotfn.tk:8080/api/aes");
- if (string.IsNullOrEmpty(data)) { new UpdateMyConsole("API Down or Rate Limit Exceeded", Color.CornflowerBlue, true).AppendToConsole(); return null; }
-
- JToken dynamicPaks = JObject.Parse(data).FindTokens("additionalKeys").FirstOrDefault();
- return JToken.Parse(dynamicPaks.ToString()).ToString().TrimStart('[').TrimEnd(']');
- }
- else
- {
- new UpdateMyConsole("Your internet connection is currently unavailable, can't check for dynamic keys at the moment.", Color.CornflowerBlue, true).AppendToConsole();
- return null;
- }
- }
- catch (Exception)
- {
- new UpdateMyConsole("Error while checking for dynamic keys", Color.Crimson, true).AppendToConsole();
- return null;
- }
- }
-
- ///
- /// check if an old list of keys exist, if so, search for the pakname
- /// if pakname not found that means the key is brand new and has to be added but in this case we just "print" it as a FYI to the user
- ///
- /// the pak name
- private static void displayNewPaks(string pakKey, string pakName)
- {
- if (_oldKeysList != null)
- {
- //display new paks that can be opened
- bool wasThereBeforeStartup = _oldKeysList.Where(i => i.theKey == pakKey).Any();
- if (!wasThereBeforeStartup)
- {
- new UpdateMyConsole(pakName, Color.CornflowerBlue).AppendToConsole();
- new UpdateMyConsole(" can now be opened.", Color.Black, true).AppendToConsole();
- }
- }
- else
- {
- //display all paks that can be opened
- new UpdateMyConsole(pakName, Color.CornflowerBlue).AppendToConsole();
- new UpdateMyConsole(" can be opened.", Color.Black, true).AppendToConsole();
- }
- }
- }
-}
diff --git a/FModel/Methods/AESManager/DynamicKeys/Keychain.cs b/FModel/Methods/AESManager/DynamicKeys/Keychain.cs
deleted file mode 100644
index 6b484102..00000000
--- a/FModel/Methods/AESManager/DynamicKeys/Keychain.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using RestSharp;
-using Newtonsoft.Json.Linq;
-
-namespace FModel
-{
- static class Keychain
- {
- ///
- /// get url content as string with authentication
- ///
- ///
- ///
- /// url content
- public static string GetEndpoint(string url)
- {
- RestClient EndpointClient = new RestClient(url);
- RestRequest EndpointRequest = new RestRequest(Method.GET);
-
- string response = EndpointClient.Execute(EndpointRequest).Content;
-
- return response;
- }
- }
-}
diff --git a/FModel/Methods/AESManager/DynamicKeysChecker.cs b/FModel/Methods/AESManager/DynamicKeysChecker.cs
new file mode 100644
index 00000000..9ae260c6
--- /dev/null
+++ b/FModel/Methods/AESManager/DynamicKeysChecker.cs
@@ -0,0 +1,82 @@
+using FModel.Methods.Utilities;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Methods.AESManager
+{
+ static class DynamicKeysChecker
+ {
+ private static readonly string AESManager_PATH = FProp.Default.FOutput_Path + "\\FAESManager.xml";
+ private static List _oldAESEntriesList;
+
+ public static void SetDynamicKeys()
+ {
+ if (!File.Exists(AESManager_PATH))
+ {
+ AESEntries.AESEntriesList = new List();
+ KeysManager.Serialize(string.Empty, string.Empty);
+ }
+ else
+ {
+ KeysManager.Deserialize();
+ _oldAESEntriesList = AESEntries.AESEntriesList;
+ }
+
+ if (PAKEntries.PAKEntriesList != null && PAKEntries.PAKEntriesList.Any())
+ {
+ string KeysFromBen = EndpointsUtility.GetKeysFromBen();
+ if (!string.IsNullOrEmpty(KeysFromBen))
+ {
+ Dictionary KeysDict = JsonConvert.DeserializeObject>(KeysFromBen);
+ if (KeysDict != null)
+ {
+ AESEntries.AESEntriesList = new List();
+ foreach (PAKInfosEntry Pak in PAKEntries.PAKEntriesList.Where(x => x.bTheDynamicPAK == true //DYNAMIC PAK ONLY
+ && !AESEntries.AESEntriesList.Where(w => string.Equals(w.ThePAKName, Path.GetFileNameWithoutExtension(x.ThePAKPath))).Any() //IS NOT ALREADY ADDED
+ ))
+ {
+ if (KeysDict.ContainsKey(Path.GetFileName(Pak.ThePAKPath)))
+ {
+ KeysManager.Serialize(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), KeysDict[Path.GetFileName(Pak.ThePAKPath)].ToUpperInvariant().Substring(2));
+
+ if (_oldAESEntriesList != null)
+ {
+ if (!_oldAESEntriesList.Where(x => string.Equals(x.ThePAKKey, KeysDict[Path.GetFileName(Pak.ThePAKPath)].ToUpperInvariant().Substring(2))).Any())
+ {
+ new UpdateMyConsole(Path.GetFileName(Pak.ThePAKPath), CColors.Blue).Append();
+ new UpdateMyConsole(" can now be opened.", CColors.White, true).Append();
+ }
+ //else mean there was a FAESManager.xml but the key was already there and didn't change
+ }
+ else
+ {
+ //mostly for new users
+ new UpdateMyConsole(Path.GetFileName(Pak.ThePAKPath), CColors.Blue).Append();
+ new UpdateMyConsole(" can be opened.", CColors.White, true).Append();
+ }
+ }
+ else
+ {
+ KeysManager.Serialize(Path.GetFileName(Pak.ThePAKPath), string.Empty);
+ }
+ }
+ }
+ }
+ }
+
+ Directory.CreateDirectory(Path.GetDirectoryName(AESManager_PATH));
+ using (var fileStream = new FileStream(AESManager_PATH, FileMode.Create))
+ {
+ KeysManager.serializer.Serialize(fileStream, AESEntries.AESEntriesList);
+ }
+
+ FWindow.FMain.Dispatcher.InvokeAsync(() =>
+ {
+ PAKsUtility.DisableNonKeyedPAKs();
+ });
+ }
+ }
+}
diff --git a/FModel/Methods/AESManager/DynamicKeysManager.cs b/FModel/Methods/AESManager/DynamicKeysManager.cs
deleted file mode 100644
index dbcc66f7..00000000
--- a/FModel/Methods/AESManager/DynamicKeysManager.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Xml.Serialization;
-
-namespace FModel
-{
- static class DynamicKeysManager
- {
- public static List AESEntries { get; set; }
- private static XmlSerializer serializer = new XmlSerializer(typeof(List));
- public static string path = Properties.Settings.Default.ExtractOutput + "\\AESManager.xml";
-
- public static void serialize(string key, string pak)
- {
- Directory.CreateDirectory(Path.GetDirectoryName(path));
-
- AESEntries.Add(new AESEntry()
- {
- theKey = key,
- thePak = pak
- });
-
- using (var fileStream = new FileStream(path, FileMode.Create))
- {
- serializer.Serialize(fileStream, AESEntries);
- }
- }
-
- public static void deserialize()
- {
- if (File.Exists(path))
- {
- List outputList;
- using (var fileStream = new FileStream(path, FileMode.Open))
- {
- outputList = (List)serializer.Deserialize(fileStream);
- }
- AESEntries = outputList;
- }
- }
- }
-}
diff --git a/FModel/Methods/AESManager/KeysManager.cs b/FModel/Methods/AESManager/KeysManager.cs
new file mode 100644
index 00000000..fb305ae5
--- /dev/null
+++ b/FModel/Methods/AESManager/KeysManager.cs
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Xml.Serialization;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Methods.AESManager
+{
+ static class KeysManager
+ {
+ public static readonly XmlSerializer serializer = new XmlSerializer(typeof(List));
+ private static readonly string AESManager_PATH = FProp.Default.FOutput_Path + "\\FAESManager.xml";
+
+ public static void Serialize(string PAKName, string PAKKey)
+ {
+ AESEntries.AESEntriesList.Add(new AESInfosEntry
+ {
+ ThePAKName = PAKName,
+ ThePAKKey = PAKKey
+ });
+ }
+
+ public static void Deserialize()
+ {
+ if (File.Exists(AESManager_PATH))
+ {
+ List outputList;
+ using (var fileStream = new FileStream(AESManager_PATH, FileMode.Open))
+ {
+ outputList = (List)serializer.Deserialize(fileStream);
+ }
+ AESEntries.AESEntriesList = outputList;
+ }
+ }
+ }
+}
diff --git a/FModel/Methods/Assets/AssetInformations.cs b/FModel/Methods/Assets/AssetInformations.cs
new file mode 100644
index 00000000..4d021692
--- /dev/null
+++ b/FModel/Methods/Assets/AssetInformations.cs
@@ -0,0 +1,59 @@
+using FModel.Methods.MessageBox;
+using FModel.Methods.Utilities;
+using PakReader;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Windows;
+
+namespace FModel.Methods.Assets
+{
+ static class AssetInformations
+ {
+ public static void OpenAssetInfos(bool isFromDataGrid = false)
+ {
+ string infos = GetAssetInfos(isFromDataGrid);
+ if (DarkMessageBox.ShowYesNo(infos, FWindow.FCurrentAsset, "Copy Properties", "OK") == System.Windows.MessageBoxResult.Yes)
+ {
+ Clipboard.SetText(infos);
+
+ new UpdateMyConsole(FWindow.FCurrentAsset, CColors.Blue).Append();
+ new UpdateMyConsole("'s properties successfully copied", CColors.White, true).Append();
+ }
+ }
+
+ private static string GetAssetInfos(bool isFromDataGrid = false)
+ {
+ StringBuilder sb = new StringBuilder();
+
+ string fullPath = isFromDataGrid ? FWindow.FCurrentAsset : TreeViewUtility.GetFullPath(FWindow.TVItem) + "/" + FWindow.FCurrentAsset;
+ PakReader.PakReader reader = AssetsUtility.GetPakReader(fullPath);
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries(fullPath);
+ foreach (FPakEntry entry in entriesList)
+ {
+ sb.Append(
+ "\n- PAK File:\t" + Path.GetFileName(reader.Name) +
+ "\n- Path:\t\t" + entry.Name +
+ "\n- Position:\t" + entry.Pos +
+ "\n- Size:\t\t" + AssetsUtility.GetReadableSize(entry.UncompressedSize) +
+ "\n- Encrypted:\t" + entry.Encrypted +
+ "\n"
+ );
+ }
+ }
+
+ if (isFromDataGrid)
+ {
+ string selectedName = fullPath.Substring(fullPath.LastIndexOf("/") + 1);
+ if (selectedName.EndsWith(".uasset"))
+ {
+ selectedName = selectedName.Substring(0, selectedName.LastIndexOf('.'));
+ }
+ FWindow.FCurrentAsset = selectedName;
+ }
+ return sb.ToString();
+ }
+ }
+}
diff --git a/FModel/Methods/Assets/AssetTranslations.cs b/FModel/Methods/Assets/AssetTranslations.cs
new file mode 100644
index 00000000..d8afc644
--- /dev/null
+++ b/FModel/Methods/Assets/AssetTranslations.cs
@@ -0,0 +1,210 @@
+using FModel.Methods.Utilities;
+using PakReader;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Methods.Assets
+{
+ static class AssetTranslations
+ {
+ public static Dictionary>> HotfixLocResDict { get; set; } //namespace -> key -> language -> string
+ public static Dictionary> BRLocResDict { get; set; } //namespace -> key -> string
+ public static Dictionary> STWLocResDict { get; set; } //namespace -> key -> string
+
+ public static void SetAssetTranslation(string language)
+ {
+ string partialPath = "/FortniteGame/Content/Localization/Game_BR/{0}/Game_BR.locres";
+ switch (language)
+ {
+ case "French":
+ PopulateDict(string.Format(partialPath, "fr"));
+ break;
+ case "German":
+ PopulateDict(string.Format(partialPath, "de"));
+ break;
+ case "Italian":
+ PopulateDict(string.Format(partialPath, "it"));
+ break;
+ case "Spanish":
+ PopulateDict(string.Format(partialPath, "es"));
+ break;
+ case "Spanish (LA)":
+ PopulateDict(string.Format(partialPath, "es-419"));
+ break;
+ case "Arabic":
+ PopulateDict(string.Format(partialPath, "ar"));
+ break;
+ case "Japanese":
+ PopulateDict(string.Format(partialPath, "ja"));
+ break;
+ case "Korean":
+ PopulateDict(string.Format(partialPath, "ko"));
+ break;
+ case "Polish":
+ PopulateDict(string.Format(partialPath, "pl"));
+ break;
+ case "Portuguese (Brazil)":
+ PopulateDict(string.Format(partialPath, "pt-BR"));
+ break;
+ case "Russian":
+ PopulateDict(string.Format(partialPath, "ru"));
+ break;
+ case "Turkish":
+ PopulateDict(string.Format(partialPath, "tr"));
+ break;
+ case "Chinese (S)":
+ PopulateDict(string.Format(partialPath, "zh-CN"));
+ break;
+ case "Traditional Chinese":
+ PopulateDict(string.Format(partialPath, "zh-Hant"));
+ break;
+ default:
+ if (HotfixLocResDict == null) { SetHotfixedLocResDict(); } //once, no need to do more
+ break;
+ }
+ }
+
+ public static string SearchTranslation(string tNamespace, string tKey, string ifNotFound)
+ {
+ if (HotfixLocResDict != null &&
+ HotfixLocResDict.ContainsKey(tNamespace) &&
+ HotfixLocResDict[tNamespace].ContainsKey(tKey) &&
+ HotfixLocResDict[tNamespace][tKey].ContainsKey(GetLanguageCode()))
+ {
+ return HotfixLocResDict[tNamespace][tKey][GetLanguageCode()];
+ }
+ else if (FProp.Default.FLanguage == "English")
+ {
+ return ifNotFound;
+ }
+ else if (BRLocResDict != null && BRLocResDict.ContainsKey(tNamespace) && BRLocResDict[tNamespace].ContainsKey(tKey))
+ {
+ return BRLocResDict[tNamespace][tKey];
+ }
+ else if (STWLocResDict != null && STWLocResDict.ContainsKey(tNamespace) && STWLocResDict[tNamespace].ContainsKey(tKey))
+ {
+ return STWLocResDict[tNamespace][tKey];
+ }
+ else
+ {
+ return ifNotFound;
+ }
+ }
+
+ private static void PopulateDict(string LocResPath)
+ {
+ if (HotfixLocResDict == null) { SetHotfixedLocResDict(); } //once, no need to do more
+ BRLocResDict = GetLocResDict(LocResPath);
+ STWLocResDict = GetLocResDict(LocResPath.Replace("Game_BR", "Game_StW"));
+ }
+
+ private static Dictionary> GetLocResDict(string LocResPath)
+ {
+ PakReader.PakReader reader = AssetsUtility.GetPakReader(LocResPath);
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries(LocResPath);
+ foreach (FPakEntry entry in entriesList)
+ {
+ if (string.Equals(Path.GetExtension(entry.Name.ToLowerInvariant()), ".locres"))
+ {
+ using (var s = reader.GetPackageStream(entry))
+ return new LocResFile(s).Entries;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static void SetHotfixedLocResDict()
+ {
+ string pdd = Path.GetFullPath(Path.Combine(FProp.Default.FPak_Path, @"..\..\PersistentDownloadDir\EMS\"));
+ if (File.Exists(pdd + "a22d837b6a2b46349421259c0a5411bf"))
+ {
+ HotfixLocResDict = new Dictionary>> ();
+ using (StreamReader sr = new StreamReader(File.Open(pdd + "a22d837b6a2b46349421259c0a5411bf", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
+ {
+ while (!sr.EndOfStream)
+ {
+ string line = sr.ReadLine();
+ if (line.StartsWith("+TextReplacements=(Category=Game,"))
+ {
+ string txtNamespace = GetValueFromParam(line, "Namespace=\"", "\",");
+ string txtKey = GetValueFromParam(line, "Key=\"", "\",");
+
+ string translations = GetValueFromParam(line, "LocalizedStrings=(", "))");
+ if (!translations.EndsWith(")")) { translations = translations + ")"; }
+
+ if (!HotfixLocResDict.ContainsKey(txtNamespace)) { HotfixLocResDict[txtNamespace] = new Dictionary>(); }
+ if (!HotfixLocResDict[txtNamespace].ContainsKey(txtKey)) { HotfixLocResDict[txtNamespace][txtKey] = new Dictionary(); }
+
+ Regex regex = new Regex(@"(?<=\().+?(?=\))");
+ foreach (Match match in regex.Matches(translations))
+ {
+ try
+ {
+ string[] langParts = match.Value.Substring(1, match.Value.Length - 2).Split(new string[] { "\",\"" }, StringSplitOptions.None);
+
+ HotfixLocResDict[txtNamespace][txtKey][langParts[0]] = langParts[1];
+ }
+ catch (IndexOutOfRangeException)
+ {
+ string[] langParts = match.Value.Substring(1, match.Value.Length - 2).Split(new string[] { "\", \"" }, StringSplitOptions.None);
+
+ HotfixLocResDict[txtNamespace][txtKey][langParts[0]] = langParts[1];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static string GetValueFromParam(string fullLine, string startWith, string endWith)
+ {
+ int startIndex = fullLine.IndexOf(startWith, StringComparison.InvariantCultureIgnoreCase) + startWith.Length;
+ int endIndex = fullLine.Substring(startIndex).IndexOf(endWith, StringComparison.InvariantCultureIgnoreCase);
+ return fullLine.Substring(startIndex, endIndex);
+ }
+
+ private static string GetLanguageCode()
+ {
+ switch (FProp.Default.FLanguage)
+ {
+ case "French":
+ return "fr";
+ case "German":
+ return "de";
+ case "Italian":
+ return "it";
+ case "Spanish":
+ return "es";
+ case "Spanish (LA)":
+ return "es-419";
+ case "Arabic":
+ return "ar";
+ case "Japanese":
+ return "ja";
+ case "Korean":
+ return "ko";
+ case "Polish":
+ return "pl";
+ case "Portuguese (Brazil)":
+ return "pt-BR";
+ case "Russian":
+ return "ru";
+ case "Turkish":
+ return "tr";
+ case "Chinese (S)":
+ return "zh-CN";
+ case "Traditional Chinese":
+ return "zh-Hant";
+ default:
+ return "en";
+ }
+ }
+ }
+}
diff --git a/FModel/Methods/Assets/AssetsLoader.cs b/FModel/Methods/Assets/AssetsLoader.cs
new file mode 100644
index 00000000..fbfc8c1a
--- /dev/null
+++ b/FModel/Methods/Assets/AssetsLoader.cs
@@ -0,0 +1,236 @@
+using FModel.Methods.SyntaxHighlighter;
+using FModel.Methods.Utilities;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PakReader;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using System.IO;
+using System.Windows.Media;
+
+namespace FModel.Methods.Assets
+{
+ static class AssetsLoader
+ {
+ public static bool isRunning = false;
+ public static string ExportType { get; set; }
+
+ public static async Task LoadSelectedAsset()
+ {
+ FWindow.FMain.Button_Extract.IsEnabled = false;
+ FWindow.FMain.Button_Stop.IsEnabled = true;
+ FWindow.FMain.AssetPropertiesBox_Main.Text = string.Empty;
+ FWindow.FMain.AssetPropertiesBox_Main.SyntaxHighlighting = ResourceLoader.LoadHighlightingDefinition("Json.xshd");
+ FWindow.FMain.ImageBox_Main.Source = null;
+
+ string[] selectedItems = FWindow.FMain.ListBox_Main.SelectedItems.OfType().ToArray(); //store selected items, doesn't crash if user select another item while extracting
+ string treePath = TreeViewUtility.GetFullPath(FWindow.TVItem); //never change in the loop, in case user wanna see other folders while extracting
+
+ TasksUtility.CancellableTaskTokenSource = new CancellationTokenSource();
+ CancellationToken cToken = TasksUtility.CancellableTaskTokenSource.Token;
+ await Task.Run(() =>
+ {
+ isRunning = true;
+ foreach (string item in selectedItems)
+ {
+ cToken.ThrowIfCancellationRequested(); //if clicked on 'Stop' it breaks at the following item
+ FWindow.FMain.Dispatcher.InvokeAsync(() => //ui thread because if not, FCurrentAsset isn't updated in time to Auto Save a JSON Data for example
+ {
+ FWindow.FCurrentAsset = item;
+ });
+
+ LoadAsset(treePath + "/" + item);
+ }
+
+ }, cToken).ContinueWith(TheTask =>
+ {
+ TasksUtility.TaskCompleted(TheTask.Exception);
+ TasksUtility.CancellableTaskTokenSource.Dispose();
+ isRunning = false;
+ });
+
+ FWindow.FMain.Button_Extract.IsEnabled = true;
+ FWindow.FMain.Button_Stop.IsEnabled = false;
+ }
+
+ public static async Task ExtractFoldersAndSub(string path)
+ {
+ FWindow.FMain.Button_Extract.IsEnabled = false;
+ FWindow.FMain.Button_Stop.IsEnabled = true;
+ FWindow.FMain.AssetPropertiesBox_Main.Text = string.Empty;
+ FWindow.FMain.AssetPropertiesBox_Main.SyntaxHighlighting = ResourceLoader.LoadHighlightingDefinition("Json.xshd");
+ FWindow.FMain.ImageBox_Main.Source = null;
+
+ List> assetList = new List>();
+ if (!string.IsNullOrEmpty(FWindow.FCurrentPAK))
+ {
+ IEnumerable files = PAKEntries.PAKToDisplay[FWindow.FCurrentPAK]
+ .Where(x => x.Name.StartsWith(path + "/"))
+ .Select(x => x.Name);
+
+ if (files != null) { assetList.Add(files); }
+ }
+ else
+ {
+ foreach (FPakEntry[] PAKsFileInfos in PAKEntries.PAKToDisplay.Values)
+ {
+ IEnumerable files = PAKsFileInfos
+ .Where(x => x.Name.StartsWith(path + "/"))
+ .Select(x => x.Name);
+
+ if (files != null) { assetList.Add(files); }
+ }
+ }
+
+ TasksUtility.CancellableTaskTokenSource = new CancellationTokenSource();
+ CancellationToken cToken = TasksUtility.CancellableTaskTokenSource.Token;
+ await Task.Run(() =>
+ {
+ isRunning = true;
+ foreach (IEnumerable filesFromOnePak in assetList)
+ {
+ foreach (string asset in filesFromOnePak.OrderBy(s => s))
+ {
+ cToken.ThrowIfCancellationRequested(); //if clicked on 'Stop' it breaks at the following item
+
+ string target;
+ if (asset.EndsWith(".uexp") || asset.EndsWith(".ubulk")) { continue; }
+ else if (!asset.EndsWith(".uasset"))
+ {
+ target = asset; //ini uproject locres etc
+ }
+ else
+ {
+ target = asset.Substring(0, asset.LastIndexOf(".")); //uassets
+ }
+
+ FWindow.FMain.Dispatcher.InvokeAsync(() => //ui thread because if not, FCurrentAsset isn't updated in time to Auto Save a JSON Data for example
+ {
+ FWindow.FCurrentAsset = Path.GetFileName(target);
+ });
+ LoadAsset(target);
+ }
+ }
+
+ }, cToken).ContinueWith(TheTask =>
+ {
+ TasksUtility.TaskCompleted(TheTask.Exception);
+ TasksUtility.CancellableTaskTokenSource.Dispose();
+ isRunning = false;
+ });
+
+ FWindow.FMain.Button_Extract.IsEnabled = true;
+ FWindow.FMain.Button_Stop.IsEnabled = false;
+ }
+
+ private static void LoadAsset(string assetPath)
+ {
+ PakReader.PakReader reader = AssetsUtility.GetPakReader(assetPath);
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries(assetPath);
+ string jsonData = AssetsUtility.GetAssetJsonData(reader, entriesList, true);
+ FWindow.FMain.Dispatcher.InvokeAsync(() =>
+ {
+ FWindow.FMain.AssetPropertiesBox_Main.Text = jsonData;
+ if (FWindow.FMain.MI_AutoExportRaw.IsChecked)
+ {
+ AssetsUtility.ExportAssetData(assetPath);
+ }
+ if (FWindow.FMain.MI_AutoSaveJson.IsChecked)
+ {
+ AssetsUtility.SaveAssetProperties();
+ }
+ });
+
+ if (AssetsUtility.IsValidJson(jsonData))
+ {
+ dynamic AssetData = JsonConvert.DeserializeObject(jsonData);
+ JToken AssetMainToken;
+ if (jsonData.StartsWith("[") && jsonData.EndsWith("]"))
+ {
+ JArray AssetArray = JArray.FromObject(AssetData);
+ AssetMainToken = AssetArray[0];
+ }
+ else if (jsonData.StartsWith("{") && jsonData.EndsWith("}"))
+ {
+ AssetMainToken = AssetData;
+ }
+ else
+ {
+ AssetMainToken = null;
+ }
+
+
+ if (AssetMainToken != null && AssetMainToken["export_type"] != null && AssetMainToken["properties"] != null)
+ {
+ ExportType = AssetMainToken["export_type"].Value();
+ DrawingVisual VisualImage = null;
+ switch (ExportType)
+ {
+ case "AthenaBackpackItemDefinition":
+ case "AthenaBattleBusItemDefinition":
+ case "AthenaCharacterItemDefinition":
+ case "AthenaConsumableEmoteItemDefinition":
+ case "AthenaSkyDiveContrailItemDefinition":
+ case "AthenaDanceItemDefinition":
+ case "AthenaEmojiItemDefinition":
+ case "AthenaGliderItemDefinition":
+ case "AthenaItemWrapDefinition":
+ case "AthenaLoadingScreenItemDefinition":
+ case "AthenaMusicPackItemDefinition":
+ case "AthenaPetCarrierItemDefinition":
+ case "AthenaPickaxeItemDefinition":
+ case "AthenaSprayItemDefinition":
+ case "AthenaToyItemDefinition":
+ case "AthenaVictoryPoseItemDefinition":
+ case "FortBannerTokenType":
+ case "AthenaGadgetItemDefinition":
+ case "FortWeaponRangedItemDefinition":
+ case "FortWeaponMeleeItemDefinition":
+ case "FortWeaponMeleeDualWieldItemDefinition":
+ case "FortIngredientItemDefinition":
+ case "FortVariantTokenType":
+ case "FortAmmoItemDefinition":
+ case "FortHeroType":
+ case "FortDefenderItemDefinition":
+ case "FortContextTrapItemDefinition":
+ case "FortTrapItemDefinition":
+ case "FortCardPackItemDefinition":
+ case "FortPlaysetGrenadeItemDefinition":
+ case "FortConsumableAccountItemDefinition":
+ case "FortBadgeItemDefinition":
+ case "FortCurrencyItemDefinition":
+ case "FortConversionControlItemDefinition":
+ case "FortHomebaseNodeItemDefinition":
+ case "FortPersonalVehicleItemDefinition":
+ case "FortCampaignHeroLoadoutItemDefinition":
+ case "FortNeverPersistItemDefinition":
+ case "FortPersistentResourceItemDefinition":
+ case "FortResourceItemDefinition":
+ case "FortGadgetItemDefinition":
+ case "FortStatItemDefinition":
+ case "FortTokenType":
+ case "FortDailyRewardScheduleTokenDefinition":
+ case "FortWorkerType":
+ case "FortConditionalResourceItemDefinition":
+ case "FortAwardItemDefinition":
+ case "FortChallengeBundleScheduleDefinition":
+ case "FortAbilityKit":
+ case "FortSchematicItemDefinition":
+ case "FortAccoladeItemDefinition":
+ VisualImage = IconCreator.IconCreator.DrawNormalIconKThx(AssetMainToken["properties"].Value());
+ break;
+ case "FortChallengeBundleItemDefinition":
+ VisualImage = IconCreator.IconCreator.DrawChallengeKThx(AssetMainToken["properties"].Value(), assetPath);
+ break;
+ }
+ if (VisualImage != null) { ImagesUtility.LoadImageAfterExtraction(VisualImage); }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FModel/Methods/Assets/IconCreator/AthenaID/CosmeticSet.cs b/FModel/Methods/Assets/IconCreator/AthenaID/CosmeticSet.cs
new file mode 100644
index 00000000..36a1aadc
--- /dev/null
+++ b/FModel/Methods/Assets/IconCreator/AthenaID/CosmeticSet.cs
@@ -0,0 +1,75 @@
+using FModel.Methods.Utilities;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PakReader;
+using System.Collections.Generic;
+using System.Linq;
+using FProp = FModel.Properties.Settings;
+
+namespace FModel.Methods.Assets.IconCreator.AthenaID
+{
+ static class CosmeticSet
+ {
+ private static JArray ItemSetsArray { get; set; }
+
+ public static string GetCosmeticSet(string SetTagName)
+ {
+ if (ItemSetsArray == null)
+ {
+ PakReader.PakReader reader = AssetsUtility.GetPakReader("/FortniteGame/Content/Athena/Items/Cosmetics/Metadata/CosmeticSets");
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries("/FortniteGame/Content/Athena/Items/Cosmetics/Metadata/CosmeticSets");
+ string jsonData = AssetsUtility.GetAssetJsonData(reader, entriesList, true);
+ if (AssetsUtility.IsValidJson(jsonData))
+ {
+ dynamic AssetData = JsonConvert.DeserializeObject(jsonData);
+ JArray AssetArray = JArray.FromObject(AssetData);
+ ItemSetsArray = AssetArray[0]["rows"].Value();
+ return SearchSetDisplayName(SetTagName);
+ }
+ }
+ }
+ else
+ {
+ return SearchSetDisplayName(SetTagName);
+ }
+ return string.Empty;
+ }
+
+ private static string SearchSetDisplayName(string SetTagName)
+ {
+ JArray setArray = ItemSetsArray
+ .Where(x => string.Equals(x["Item1"].Value(), SetTagName))
+ .Select(x => x["Item2"]["properties"].Value())
+ .FirstOrDefault();
+ if (setArray != null)
+ {
+ JToken set_namespace = AssetsUtility.GetPropertyTagText(setArray, "DisplayName", "namespace");
+ JToken set_key = AssetsUtility.GetPropertyTagText(setArray, "DisplayName", "key");
+ JToken set_source_string = AssetsUtility.GetPropertyTagText(setArray, "DisplayName", "source_string");
+ if (set_namespace != null && set_key != null && set_source_string != null)
+ {
+ if (string.Equals(FProp.Default.FLanguage, "English"))
+ {
+ if (AssetTranslations.HotfixLocResDict != null &&
+ AssetTranslations.HotfixLocResDict.ContainsKey(set_namespace.Value()) &&
+ AssetTranslations.HotfixLocResDict[set_namespace.Value()].ContainsKey(set_key.Value()) &&
+ AssetTranslations.HotfixLocResDict[set_namespace.Value()][set_key.Value()].ContainsKey("en"))
+ {
+ return string.Format("\nPart of the {0} set.", AssetTranslations.HotfixLocResDict[set_namespace.Value()][set_key.Value()]["en"]);
+ }
+ return string.Format("\nPart of the {0} set.", set_source_string.Value());
+ }
+ else
+ {
+ string cosmeticSet = AssetTranslations.SearchTranslation(set_namespace.Value(), set_key.Value(), set_source_string.Value());
+ string cosmeticPart = AssetTranslations.SearchTranslation("Fort.Cosmetics", "CosmeticItemDescription_SetMembership_NotRich", "\nPart of the {0} set.");
+ return string.Format(cosmeticPart, cosmeticSet);
+ }
+ }
+ }
+ return string.Empty;
+ }
+ }
+}
diff --git a/FModel/Methods/Assets/IconCreator/AthenaID/IconUserFacingFlags.cs b/FModel/Methods/Assets/IconCreator/AthenaID/IconUserFacingFlags.cs
new file mode 100644
index 00000000..589a56d0
--- /dev/null
+++ b/FModel/Methods/Assets/IconCreator/AthenaID/IconUserFacingFlags.cs
@@ -0,0 +1,140 @@
+using FModel.Methods.Utilities;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PakReader;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows;
+using System.Windows.Media.Imaging;
+
+namespace FModel.Methods.Assets.IconCreator.AthenaID
+{
+ static class IconUserFacingFlags
+ {
+ private static JArray ItemCategoriesArray { get; set; }
+ public static int xCoords = 4 - 25;
+
+ public static void DrawUserFacingFlag(JToken uFF)
+ {
+ if (ItemCategoriesArray == null)
+ {
+ PakReader.PakReader reader = AssetsUtility.GetPakReader("/FortniteGame/Content/Items/ItemCategories");
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries("/FortniteGame/Content/Items/ItemCategories");
+ string jsonData = AssetsUtility.GetAssetJsonData(reader, entriesList, true);
+ if (AssetsUtility.IsValidJson(jsonData))
+ {
+ dynamic AssetData = JsonConvert.DeserializeObject(jsonData);
+ JArray AssetArray = JArray.FromObject(AssetData);
+ JToken tertiaryCategoriesToken = AssetsUtility.GetPropertyTag(AssetArray[0]["properties"].Value(), "TertiaryCategories");
+ if (tertiaryCategoriesToken != null)
+ {
+ ItemCategoriesArray = tertiaryCategoriesToken["data"].Value();
+
+ string uFFTargeted = uFF.Value().Substring("Cosmetics.UserFacingFlags.".Length);
+ SearchUserFacingFlag(uFFTargeted);
+ }
+ }
+ }
+ }
+ else
+ {
+ string uFFTargeted = uFF.Value().Substring("Cosmetics.UserFacingFlags.".Length);
+ SearchUserFacingFlag(uFFTargeted);
+ }
+ }
+
+ private static void SearchUserFacingFlag(string uFFTarget)
+ {
+ foreach (JToken data in ItemCategoriesArray)
+ {
+ JArray propertiesArray = data["struct_type"]["properties"].Value();
+ if (propertiesArray != null)
+ {
+ JToken categoryNameToken = AssetsUtility.GetPropertyTagText(propertiesArray, "CategoryName", "source_string");
+ if (categoryNameToken != null)
+ {
+ if (
+ uFFTarget.Contains("Animated") && categoryNameToken.Value() == "Animated" ||
+ uFFTarget.Contains("HasVariants") && categoryNameToken.Value() == "Unlockable Styles" ||
+ uFFTarget.Contains("Reactive") && categoryNameToken.Value() == "Reactive" ||
+ uFFTarget.Contains("Traversal") && categoryNameToken.Value() == "Traversal" ||
+ uFFTarget.Contains("BuiltInEmote") && categoryNameToken.Value() == "Built-in")
+ {
+ GetUFFImage(propertiesArray);
+ }
+ else if (uFFTarget.Contains("HasUpgradeQuests") && categoryNameToken.Value() == "Unlockable Styles")
+ {
+ if (AssetsLoader.ExportType == "AthenaPetCarrierItemDefinition")
+ {
+ BitmapImage bmp = new BitmapImage();
+ bmp.BeginInit();
+ bmp.CacheOption = BitmapCacheOption.OnLoad;
+ bmp.UriSource = new Uri("pack://application:,,,/Resources/T-Icon-Pets-64.png");
+ bmp.EndInit();
+ bmp.Freeze();
+
+ xCoords += 25;
+ IconCreator.ICDrawingContext.DrawImage(bmp, new Rect(xCoords, 4, 25, 25));
+ }
+ else
+ {
+ BitmapImage bmp = new BitmapImage();
+ bmp.BeginInit();
+ bmp.CacheOption = BitmapCacheOption.OnLoad;
+ bmp.UriSource = new Uri("pack://application:,,,/Resources/T-Icon-Quests-64.png");
+ bmp.EndInit();
+ bmp.Freeze();
+
+ xCoords += 25;
+ IconCreator.ICDrawingContext.DrawImage(bmp, new Rect(xCoords, 4, 25, 25));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static void GetUFFImage(JArray Properties)
+ {
+ JToken categoryBrushToken = AssetsUtility.GetPropertyTag(Properties, "CategoryBrush");
+ if (categoryBrushToken != null)
+ {
+ JArray categoryBrushProperties = categoryBrushToken["struct_type"]["properties"].Value();
+ if (categoryBrushProperties != null)
+ {
+ JToken BrushXXSToken = AssetsUtility.GetPropertyTag(categoryBrushProperties, "Brush_XXS");
+ if (BrushXXSToken != null)
+ {
+ JArray brushXXSProperties = BrushXXSToken["struct_type"]["properties"].Value();
+ if (brushXXSProperties != null)
+ {
+ JToken resourceObjectToken = AssetsUtility.GetPropertyTagOuterImport(brushXXSProperties, "ResourceObject");
+ if (resourceObjectToken != null)
+ {
+ string texturePath = FoldersUtility.FixFortnitePath(resourceObjectToken.Value());
+ using (Stream image = AssetsUtility.GetStreamImageFromPath(texturePath))
+ {
+ if (image != null)
+ {
+ BitmapImage bmp = new BitmapImage();
+ bmp.BeginInit();
+ bmp.CacheOption = BitmapCacheOption.OnLoad;
+ bmp.StreamSource = image;
+ bmp.EndInit();
+ bmp.Freeze();
+
+ xCoords += 25;
+ IconCreator.ICDrawingContext.DrawImage(bmp, new Rect(xCoords, 4, 25, 25));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/FModel/Methods/Assets/IconCreator/ChallengeID/ChallengeBundleInfos.cs b/FModel/Methods/Assets/IconCreator/ChallengeID/ChallengeBundleInfos.cs
new file mode 100644
index 00000000..8643b148
--- /dev/null
+++ b/FModel/Methods/Assets/IconCreator/ChallengeID/ChallengeBundleInfos.cs
@@ -0,0 +1,262 @@
+using FModel.Methods.Utilities;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PakReader;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace FModel.Methods.Assets.IconCreator.ChallengeID
+{
+ class ChallengeBundleInfos
+ {
+ public static List BundleData { get; set; }
+
+ public static void GetBundleData(JArray AssetProperties)
+ {
+ BundleData = new List();
+
+ JArray bundleDataArray = AssetsUtility.GetPropertyTagText(AssetProperties, "QuestInfos", "data");
+ if (bundleDataArray != null)
+ {
+ foreach (JToken data in bundleDataArray)
+ {
+ if (data["struct_name"] != null && data["struct_type"] != null && string.Equals(data["struct_name"].Value(), "FortChallengeBundleQuestEntry"))
+ {
+ JArray dataPropertiesArray = data["struct_type"]["properties"].Value();
+ if (dataPropertiesArray != null)
+ {
+ JToken questDefinitionToken = AssetsUtility.GetPropertyTagText(dataPropertiesArray, "QuestDefinition", "asset_path_name");
+ if (questDefinitionToken != null)
+ {
+ string path = FoldersUtility.FixFortnitePath(questDefinitionToken.Value());
+ new UpdateMyProcessEvents(System.IO.Path.GetFileNameWithoutExtension(path), "Waiting").Update();
+ GetQuestData(dataPropertiesArray, path);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ ///
+ /// this is kinda complex but at the end it only gets quest files names, counts, rewards, rewards quantity and the unlock type of the quests
+ /// and repeat the process if he find stage quests
+ ///
+ ///
+ ///
+ private static void GetQuestData(JArray BundleProperties, string assetPath)
+ {
+ PakReader.PakReader reader = AssetsUtility.GetPakReader(assetPath);
+ if (reader != null)
+ {
+ List entriesList = AssetsUtility.GetPakEntries(assetPath);
+ string jsonData = AssetsUtility.GetAssetJsonData(reader, entriesList);
+
+ if (AssetsUtility.IsValidJson(jsonData))
+ {
+ dynamic AssetData = JsonConvert.DeserializeObject(jsonData);
+ JToken AssetMainToken = null;
+ if (jsonData.StartsWith("[") && jsonData.EndsWith("]"))
+ {
+ JArray AssetArray = JArray.FromObject(AssetData);
+ AssetMainToken = AssetArray[0];
+ }
+ else if (jsonData.StartsWith("{") && jsonData.EndsWith("}"))
+ {
+ AssetMainToken = AssetData;
+ }
+
+ if (AssetMainToken != null)
+ {
+ JArray AssetProperties = AssetMainToken["properties"].Value