Procházet zdrojové kódy

qfu: add qfu.gui with full implementation

Dalibor Votruba před 1 rokem
rodič
revize
7a646dd47c
61 změnil soubory, kde provedl 3828 přidání a 36 odebrání
  1. 0 25
      qfu/Program.cs
  2. 22 0
      qfu/qfu.gui/Program.cs
  3. 16 0
      qfu/qfu.gui/Properties/PublishProfiles/FolderProfile.pubxml
  4. 93 0
      qfu/qfu.gui/Properties/Resources.Designer.cs
  5. 130 0
      qfu/qfu.gui/Properties/Resources.resx
  6. 49 0
      qfu/qfu.gui/RTFConsoleTextWriter.cs
  7. binární
      qfu/qfu.gui/Resources/Clear.gif
  8. binární
      qfu/qfu.gui/Resources/Continue.gif
  9. binární
      qfu/qfu.gui/Resources/EventLog.gif
  10. binární
      qfu/qfu.gui/Resources/ShowAll.png
  11. 104 0
      qfu/qfu.gui/Subforms/Common/DirectorySelectionCtrl.Designer.cs
  12. 38 0
      qfu/qfu.gui/Subforms/Common/DirectorySelectionCtrl.cs
  13. 120 0
      qfu/qfu.gui/Subforms/Common/DirectorySelectionCtrl.resx
  14. 108 0
      qfu/qfu.gui/Subforms/Common/FileSelectionCtrl.Designer.cs
  15. 43 0
      qfu/qfu.gui/Subforms/Common/FileSelectionCtrl.cs
  16. 120 0
      qfu/qfu.gui/Subforms/Common/FileSelectionCtrl.resx
  17. 73 0
      qfu/qfu.gui/Subforms/Common/FilterPathCtrl.Designer.cs
  18. 40 0
      qfu/qfu.gui/Subforms/Common/FilterPathCtrl.cs
  19. 120 0
      qfu/qfu.gui/Subforms/Common/FilterPathCtrl.resx
  20. 247 0
      qfu/qfu.gui/Subforms/CtrlClearDir.cs
  21. 120 0
      qfu/qfu.gui/Subforms/CtrlClearDir.resx
  22. 229 0
      qfu/qfu.gui/Subforms/CtrlClone.Designer.cs
  23. 79 0
      qfu/qfu.gui/Subforms/CtrlClone.cs
  24. 120 0
      qfu/qfu.gui/Subforms/CtrlClone.resx
  25. 126 0
      qfu/qfu.gui/Subforms/CtrlImgList.Designer.cs
  26. 36 0
      qfu/qfu.gui/Subforms/CtrlImgList.cs
  27. 120 0
      qfu/qfu.gui/Subforms/CtrlImgList.resx
  28. 10 0
      qfu/qfu.gui/Subforms/ICommanControl.cs
  29. 247 0
      qfu/qfu.gui/frmMain.Designer.cs
  30. 89 0
      qfu/qfu.gui/frmMain.cs
  31. 1182 0
      qfu/qfu.gui/frmMain.resx
  32. 69 0
      qfu/qfu.gui/qfu.gui.csproj
  33. binární
      qfu/qfu.gui/qfu.ico
  34. binární
      qfu/qfu.gui/qfu.png
  35. 0 0
      qfu/qfu.gui/readme.md
  36. 8 2
      qfu/qfu.sln
  37. 0 0
      qfu/qfu/Commands/Aspects/DryAspect.cs
  38. 0 0
      qfu/qfu/Commands/Aspects/EmptyAspect.cs
  39. 0 0
      qfu/qfu/Commands/Aspects/ExcludeAspect.cs
  40. 0 0
      qfu/qfu/Commands/Aspects/FilesAspect.cs
  41. 0 0
      qfu/qfu/Commands/Aspects/FilterAspect.cs
  42. 0 0
      qfu/qfu/Commands/Aspects/ForceAspect.cs
  43. 0 0
      qfu/qfu/Commands/Aspects/ListAspect.cs
  44. 0 0
      qfu/qfu/Commands/Aspects/ScopeAspect.cs
  45. 0 0
      qfu/qfu/Commands/Aspects/SourceAspect.cs
  46. 0 0
      qfu/qfu/Commands/Aspects/SubdirsAspect.cs
  47. 0 0
      qfu/qfu/Commands/BaseCmd.cs
  48. 0 0
      qfu/qfu/Commands/ClearDirCmd.cs
  49. 0 0
      qfu/qfu/Commands/CloneCmd.cs
  50. 0 0
      qfu/qfu/Commands/ImgListCmd.cs
  51. 33 0
      qfu/qfu/ConsoleRunner.cs
  52. 8 0
      qfu/qfu/GlobalSuppressions.cs
  53. 6 0
      qfu/qfu/Program.cs
  54. 3 4
      qfu/qfu/Properties/PublishProfiles/FolderProfile.pubxml
  55. 4 0
      qfu/qfu/Properties/launchSettings.json
  56. 0 0
      qfu/qfu/QfuCommandContext.cs
  57. 0 0
      qfu/qfu/QfuEngineContext.cs
  58. 11 4
      qfu/qfu/qfu.csproj
  59. binární
      qfu/qfu/qfu.ico
  60. 5 1
      qfu/qfu/releasenotes.md
  61. 0 0
      qfu/qfu/test_genstruct.cmd

+ 0 - 25
qfu/Program.cs

@@ -1,25 +0,0 @@
-// See https://aka.ms/new-console-template for more information
-using qdr.app.tools.qfu;
-using Quadarax.Foundation.Core.QConsole;
-using Quadarax.Foundation.Core.QConsole.Configuration;
-using Quadarax.Foundation.Core.Reflection.Extensions;
-using System.IO.Abstractions;
-using System.Reflection;
-
-var consoleVersion = Assembly.GetExecutingAssembly()?.GetName()?.Version;
-if (consoleVersion != null)
-{
-    var config = new StartupConfiguration("Quadarax Filesystem Tools", consoleVersion)
-    {
-        ConsoleCopyright = Assembly.GetExecutingAssembly().GetCopyright(),
-        AllowInteractive = false,
-        WaitOnKeyInNonInteractiveMode = false,
-        CommandDefinitionAssembly = new Assembly[] { Assembly.GetEntryAssembly()! }
-    };
-    config.DisableDefaultCommands();
-    config.ShowStatusOnEveryCommand = false;
-    config.IsConsoleDebug = false;
-
-    var console = new Engine(config, new QfuEngineContext(new FileSystem()), args);
-    console.Start();
-}

+ 22 - 0
qfu/qfu.gui/Program.cs

@@ -0,0 +1,22 @@
+
+
+namespace qdr.app.tools.qfu.gui
+{
+    internal static class Program
+    {
+        /// <summary>
+        ///  The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            // To customize application configuration such as set high DPI settings or default font,
+            // see https://aka.ms/applicationconfiguration.
+
+
+        
+            ApplicationConfiguration.Initialize();
+            Application.Run(new frmMain());
+        }
+    }
+}

+ 16 - 0
qfu/qfu.gui/Properties/PublishProfiles/FolderProfile.pubxml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
+<Project>
+  <PropertyGroup>
+    <Configuration>Release</Configuration>
+    <Platform>Any CPU</Platform>
+    <PublishDir>D:\Deploy\qfu</PublishDir>
+    <PublishProtocol>FileSystem</PublishProtocol>
+    <_TargetId>Folder</_TargetId>
+    <TargetFramework>net9.0-windows</TargetFramework>
+    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
+    <SelfContained>false</SelfContained>
+    <PublishSingleFile>false</PublishSingleFile>
+    <PublishReadyToRun>false</PublishReadyToRun>
+  </PropertyGroup>
+</Project>

+ 93 - 0
qfu/qfu.gui/Properties/Resources.Designer.cs

@@ -0,0 +1,93 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace qdr.app.tools.qfu.gui.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("qdr.app.tools.qfu.gui.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Clear {
+            get {
+                object obj = ResourceManager.GetObject("Clear", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Continue {
+            get {
+                object obj = ResourceManager.GetObject("Continue", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap qfu {
+            get {
+                object obj = ResourceManager.GetObject("qfu", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}

+ 130 - 0
qfu/qfu.gui/Properties/Resources.resx

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

+ 49 - 0
qfu/qfu.gui/RTFConsoleTextWriter.cs

@@ -0,0 +1,49 @@
+using System.Text;
+
+namespace qdr.app.tools.qfu.gui
+{
+    internal class RTFConsoleTextWriter : TextWriter
+    {
+        public override Encoding Encoding => Encoding.UTF8;
+        private RichTextBox _richTextBox;
+
+        public RTFConsoleTextWriter(RichTextBox outputRtfBox)
+        {
+            _richTextBox = outputRtfBox ?? throw new ArgumentNullException(nameof(outputRtfBox));
+        }
+
+        public override void WriteLine(string? value)
+        {
+            if (value == null) return;
+            Write(value);
+        }
+
+        public override void Write(string? value)
+        {
+            if (value == null) return;
+            // Convert the string to RTF format
+            string rtfValue = ConvertToRtf(value);
+            // Write the RTF formatted string to the console
+            if (_richTextBox.InvokeRequired)
+            {
+                _richTextBox.Invoke(new Action(() => AppendRtfText(rtfValue)));
+            }
+            else
+            {
+                AppendRtfText(rtfValue);
+            }
+        }
+
+        private void AppendRtfText(string rtfValue)
+        {
+            _richTextBox.AppendText(rtfValue);
+           _richTextBox.SelectionStart = _richTextBox.TextLength;
+           _richTextBox.ScrollToCaret();
+        }
+
+        private string ConvertToRtf(string value)
+        {
+            return value + "\r";
+        }
+    }
+}

binární
qfu/qfu.gui/Resources/Clear.gif


binární
qfu/qfu.gui/Resources/Continue.gif


binární
qfu/qfu.gui/Resources/EventLog.gif


binární
qfu/qfu.gui/Resources/ShowAll.png


+ 104 - 0
qfu/qfu.gui/Subforms/Common/DirectorySelectionCtrl.Designer.cs

@@ -0,0 +1,104 @@
+namespace qdr.app.tools.qfu.gui.Subforms.Common
+{
+    partial class DirectorySelectionCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            tableLayoutPanel1 = new TableLayoutPanel();
+            tbSelectedPath = new TextBox();
+            butSelect = new Button();
+            lblText = new Label();
+            tableLayoutPanel1.SuspendLayout();
+            SuspendLayout();
+            // 
+            // tableLayoutPanel1
+            // 
+            tableLayoutPanel1.ColumnCount = 2;
+            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F));
+            tableLayoutPanel1.Controls.Add(tbSelectedPath, 0, 0);
+            tableLayoutPanel1.Controls.Add(butSelect, 1, 0);
+            tableLayoutPanel1.Dock = DockStyle.Fill;
+            tableLayoutPanel1.Location = new Point(0, 20);
+            tableLayoutPanel1.Name = "tableLayoutPanel1";
+            tableLayoutPanel1.RowCount = 1;
+            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
+            tableLayoutPanel1.Size = new Size(718, 36);
+            tableLayoutPanel1.TabIndex = 3;
+            // 
+            // tbSelectedPath
+            // 
+            tbSelectedPath.Dock = DockStyle.Fill;
+            tbSelectedPath.Location = new Point(3, 3);
+            tbSelectedPath.Name = "tbSelectedPath";
+            tbSelectedPath.ReadOnly = true;
+            tbSelectedPath.Size = new Size(662, 27);
+            tbSelectedPath.TabIndex = 0;
+            // 
+            // butSelect
+            // 
+            butSelect.Dock = DockStyle.Fill;
+            butSelect.Location = new Point(671, 3);
+            butSelect.Name = "butSelect";
+            butSelect.Size = new Size(44, 30);
+            butSelect.TabIndex = 1;
+            butSelect.Text = "...";
+            butSelect.UseVisualStyleBackColor = true;
+            butSelect.Click += butSelect_Click_1;
+            // 
+            // lblText
+            // 
+            lblText.AutoSize = true;
+            lblText.Dock = DockStyle.Top;
+            lblText.Location = new Point(0, 0);
+            lblText.Name = "lblText";
+            lblText.Size = new Size(50, 20);
+            lblText.TabIndex = 2;
+            lblText.Text = "label1";
+            // 
+            // DirectorySelectionCtrl
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(tableLayoutPanel1);
+            Controls.Add(lblText);
+            Name = "DirectorySelectionCtrl";
+            Size = new Size(718, 56);
+            tableLayoutPanel1.ResumeLayout(false);
+            tableLayoutPanel1.PerformLayout();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private TableLayoutPanel tableLayoutPanel1;
+        private TextBox tbSelectedPath;
+        private Button butSelect;
+        private Label lblText;
+    }
+}

+ 38 - 0
qfu/qfu.gui/Subforms/Common/DirectorySelectionCtrl.cs

@@ -0,0 +1,38 @@
+using System.ComponentModel;
+
+namespace qdr.app.tools.qfu.gui.Subforms.Common
+{
+    public partial class DirectorySelectionCtrl : UserControl
+    {
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public string Caption
+        {
+            get => lblText.Text;
+            set => lblText.Text = value;
+        }
+
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public string SelectedPath
+        {
+            get => tbSelectedPath.Text;
+            set => tbSelectedPath.Text = value;
+        }
+
+        public DirectorySelectionCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private void butSelect_Click_1(object sender, EventArgs e)
+        {
+             var dlg = new FolderBrowserDialog
+            {
+                Description = lblText.Text,
+            };
+            if (dlg.ShowDialog() == DialogResult.OK)
+            {
+                SelectedPath = dlg.SelectedPath;
+            }
+        }
+    }
+}

+ 120 - 0
qfu/qfu.gui/Subforms/Common/DirectorySelectionCtrl.resx

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

+ 108 - 0
qfu/qfu.gui/Subforms/Common/FileSelectionCtrl.Designer.cs

@@ -0,0 +1,108 @@
+namespace qdr.app.tools.qfu.gui.Subforms.Common
+{
+    partial class FileSelectionCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            lblText = new Label();
+            tableLayoutPanel1 = new TableLayoutPanel();
+            tbSelectedPath = new TextBox();
+            butSelect = new Button();
+            tableLayoutPanel1.SuspendLayout();
+            SuspendLayout();
+            // 
+            // lblText
+            // 
+            lblText.AutoSize = true;
+            lblText.Dock = DockStyle.Top;
+            lblText.Location = new Point(0, 0);
+            lblText.Name = "lblText";
+            lblText.Size = new Size(38, 15);
+            lblText.TabIndex = 0;
+            lblText.Text = "label1";
+            // 
+            // tableLayoutPanel1
+            // 
+            tableLayoutPanel1.ColumnCount = 2;
+            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 44F));
+            tableLayoutPanel1.Controls.Add(tbSelectedPath, 0, 0);
+            tableLayoutPanel1.Controls.Add(butSelect, 1, 0);
+            tableLayoutPanel1.Dock = DockStyle.Fill;
+            tableLayoutPanel1.Location = new Point(0, 15);
+            tableLayoutPanel1.Margin = new Padding(3, 2, 3, 2);
+            tableLayoutPanel1.Name = "tableLayoutPanel1";
+            tableLayoutPanel1.RowCount = 1;
+            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
+            tableLayoutPanel1.Size = new Size(545, 25);
+            tableLayoutPanel1.TabIndex = 1;
+            // 
+            // tbSelectedPath
+            // 
+            tbSelectedPath.Dock = DockStyle.Fill;
+            tbSelectedPath.Location = new Point(3, 2);
+            tbSelectedPath.Margin = new Padding(3, 2, 3, 2);
+            tbSelectedPath.Name = "tbSelectedPath";
+            tbSelectedPath.ReadOnly = true;
+            tbSelectedPath.Size = new Size(495, 23);
+            tbSelectedPath.TabIndex = 0;
+            // 
+            // butSelect
+            // 
+            butSelect.Dock = DockStyle.Fill;
+            butSelect.Location = new Point(504, 2);
+            butSelect.Margin = new Padding(3, 2, 3, 2);
+            butSelect.Name = "butSelect";
+            butSelect.Size = new Size(38, 21);
+            butSelect.TabIndex = 1;
+            butSelect.Text = "...";
+            butSelect.UseVisualStyleBackColor = true;
+            butSelect.Click += butSelect_Click;
+            // 
+            // FileSelectionCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 15F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(tableLayoutPanel1);
+            Controls.Add(lblText);
+            Margin = new Padding(3, 2, 3, 2);
+            Name = "FileSelectionCtrl";
+            Size = new Size(545, 40);
+            tableLayoutPanel1.ResumeLayout(false);
+            tableLayoutPanel1.PerformLayout();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private Label lblText;
+        private TableLayoutPanel tableLayoutPanel1;
+        private TextBox tbSelectedPath;
+        private Button butSelect;
+    }
+}

+ 43 - 0
qfu/qfu.gui/Subforms/Common/FileSelectionCtrl.cs

@@ -0,0 +1,43 @@
+using System.ComponentModel;
+
+namespace qdr.app.tools.qfu.gui.Subforms.Common
+{
+    public partial class FileSelectionCtrl : UserControl
+    {
+
+        public event EventHandler? SelectedFileChanged;
+
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public string Caption
+        {
+            get => lblText.Text;
+            set => lblText.Text = value;
+        }
+
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public string SelectedFile {
+            get => tbSelectedPath.Text;
+            set => tbSelectedPath.Text = value;
+        }
+
+        public FileSelectionCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private void butSelect_Click(object sender, EventArgs e)
+        {
+            var dlg = new OpenFileDialog
+            {
+                Title = lblText.Text,
+                Filter = "All files (*.*)|*.*",
+                Multiselect = false,
+            };
+            if (dlg.ShowDialog() == DialogResult.OK)
+            {
+               SelectedFile = dlg.FileName;
+               SelectedFileChanged?.Invoke(this, EventArgs.Empty);
+            }
+        }
+    }
+}

+ 120 - 0
qfu/qfu.gui/Subforms/Common/FileSelectionCtrl.resx

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

+ 73 - 0
qfu/qfu.gui/Subforms/Common/FilterPathCtrl.Designer.cs

@@ -0,0 +1,73 @@
+namespace qdr.app.tools.qfu.gui.Subforms.Common
+{
+    partial class FilterPathCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            chbCaption = new CheckBox();
+            tbFilter = new TextBox();
+            SuspendLayout();
+            // 
+            // chbCaption
+            // 
+            chbCaption.AutoSize = true;
+            chbCaption.Dock = DockStyle.Top;
+            chbCaption.Location = new Point(0, 0);
+            chbCaption.Name = "chbCaption";
+            chbCaption.Size = new Size(713, 24);
+            chbCaption.TabIndex = 0;
+            chbCaption.Text = "checkBox1";
+            chbCaption.UseVisualStyleBackColor = true;
+            chbCaption.CheckedChanged += chbCaption_CheckedChanged;
+            // 
+            // tbFilter
+            // 
+            tbFilter.Dock = DockStyle.Fill;
+            tbFilter.Location = new Point(0, 24);
+            tbFilter.Multiline = true;
+            tbFilter.Name = "tbFilter";
+            tbFilter.Size = new Size(713, 134);
+            tbFilter.TabIndex = 1;
+            // 
+            // FilterPathCtrl
+            // 
+            AutoScaleDimensions = new SizeF(8F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(tbFilter);
+            Controls.Add(chbCaption);
+            Name = "FilterPathCtrl";
+            Size = new Size(713, 158);
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private CheckBox chbCaption;
+        private TextBox tbFilter;
+    }
+}

+ 40 - 0
qfu/qfu.gui/Subforms/Common/FilterPathCtrl.cs

@@ -0,0 +1,40 @@
+using System.ComponentModel;
+
+namespace qdr.app.tools.qfu.gui.Subforms.Common
+{
+    public partial class FilterPathCtrl : UserControl
+    {
+        private const string CsFilterSeparator = "|";
+
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public string Caption
+        {
+            get => chbCaption.Text;
+            set => chbCaption.Text = value;
+        }
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public bool FilterEnabled
+        {
+            get => chbCaption.Checked;
+            set => chbCaption.Checked = value;
+        }
+
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public string FilterText
+        {
+            get => tbFilter.Text.ReplaceLineEndings(CsFilterSeparator);
+            set => tbFilter.Text = value.Replace(CsFilterSeparator, "\n");
+        }
+
+        public FilterPathCtrl()
+        {
+            InitializeComponent();
+            chbCaption_CheckedChanged( this, new EventArgs() );
+        }
+
+        private void chbCaption_CheckedChanged(object sender, EventArgs e)
+        {
+            tbFilter.Enabled = chbCaption.Checked;
+        }
+    }
+}

+ 120 - 0
qfu/qfu.gui/Subforms/Common/FilterPathCtrl.resx

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

+ 247 - 0
qfu/qfu.gui/Subforms/CtrlClearDir.cs

@@ -0,0 +1,247 @@
+using Quadarax.Foundation.Core.Value.Extensions;
+using System.Text;
+
+namespace qdr.app.tools.qfu.gui.Subforms
+{
+    public partial class CtrlClearDir : UserControl, ICommanControl
+    {
+#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
+        public CtrlClearDir()
+#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
+        {
+            InitializeComponent();
+        }
+
+        public string Description => "Clear Directory Command\r\nRemove files or directories from a specified directory with optional pattern matching.\r\n\r\nSyntax:\r\nqfu cleardir <scope> <directory> [options]\r\n\r\nArguments:\r\n- `scope`: Either `files` or `directories` - what to clean\r\n- `directory`: Path to the directory to clean\r\n\r\nOptions:\r\n- `-s`: Include subdirectories in the operation\r\n- `-f <patterns>`: Filter patterns (pipe-separated, e.g., `*.txt|*.log`)\r\n- `-dry`: Dry run - show what would be deleted without actually deleting\r\n- `-empty`: Only delete empty files or directories";
+
+        public string ViewName => "Clear Dir";
+
+        public void Execute()
+        {
+            var arguments = new StringBuilder();
+            arguments.Append("cleardir");
+            arguments.Append(" ");
+            if (rbScopeFile.Checked)
+            {
+                arguments.Append("files");
+            }
+            else if (rbScopeDir.Checked)
+            {
+                arguments.Append("directories");
+            }
+            else
+            {
+                throw new InvalidOperationException("Please select a scope (files or directories).");
+            }
+            arguments.Append(" ");
+            arguments.Append("\"").Append(ctrlDirSelection.SelectedPath).Append("\"");
+
+            if (chbIncludeSubdirs.Checked)
+            {
+                arguments.Append(" ");
+                arguments.Append(" -s");
+            }
+            if (ctrlFilter.FilterEnabled)
+            {
+                arguments.Append(" ");
+                arguments.Append(" -f:\"").Append(ctrlFilter.FilterText).Append("\"");
+            }
+            if (chbDryRun.Checked)
+            {
+                arguments.Append(" ");
+                arguments.Append(" -dry");
+            }
+            if (chbDeleteEmpty.Checked)
+            {
+                arguments.Append(" ");
+                arguments.Append(" -empty");
+            }
+            ConsoleRunner.Run(arguments.ToString().SplitQuoted(" ", "\"", removeEmptyItems: true, trimValues: false, keepBracket: true));
+        }
+
+        private void InitializeComponent()
+        {
+            tlpLevel0 = new TableLayoutPanel();
+            tlpLevel1L = new TableLayoutPanel();
+            groupBox1 = new GroupBox();
+            rbScopeFile = new RadioButton();
+            rbScopeDir = new RadioButton();
+            ctrlDirSelection = new qdr.app.tools.qfu.gui.Subforms.Common.DirectorySelectionCtrl();
+            tlpLevel1R = new TableLayoutPanel();
+            chbDeleteEmpty = new CheckBox();
+            chbDryRun = new CheckBox();
+            chbIncludeSubdirs = new CheckBox();
+            ctrlFilter = new qdr.app.tools.qfu.gui.Subforms.Common.FilterPathCtrl();
+            tlpLevel0.SuspendLayout();
+            tlpLevel1L.SuspendLayout();
+            groupBox1.SuspendLayout();
+            tlpLevel1R.SuspendLayout();
+            SuspendLayout();
+            // 
+            // tlpLevel0
+            // 
+            tlpLevel0.ColumnCount = 2;
+            tlpLevel0.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
+            tlpLevel0.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
+            tlpLevel0.Controls.Add(tlpLevel1L, 0, 0);
+            tlpLevel0.Controls.Add(tlpLevel1R, 1, 0);
+            tlpLevel0.Dock = DockStyle.Fill;
+            tlpLevel0.Location = new Point(0, 0);
+            tlpLevel0.Name = "tlpLevel0";
+            tlpLevel0.RowCount = 1;
+            tlpLevel0.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
+            tlpLevel0.Size = new Size(800, 220);
+            tlpLevel0.TabIndex = 0;
+            // 
+            // tlpLevel1L
+            // 
+            tlpLevel1L.ColumnCount = 1;
+            tlpLevel1L.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tlpLevel1L.Controls.Add(groupBox1, 0, 0);
+            tlpLevel1L.Controls.Add(ctrlDirSelection, 0, 1);
+            tlpLevel1L.Dock = DockStyle.Fill;
+            tlpLevel1L.Location = new Point(3, 3);
+            tlpLevel1L.Name = "tlpLevel1L";
+            tlpLevel1L.RowCount = 3;
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.Size = new Size(394, 214);
+            tlpLevel1L.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            groupBox1.Controls.Add(rbScopeFile);
+            groupBox1.Controls.Add(rbScopeDir);
+            groupBox1.Location = new Point(3, 3);
+            groupBox1.Name = "groupBox1";
+            groupBox1.Size = new Size(388, 41);
+            groupBox1.TabIndex = 0;
+            groupBox1.TabStop = false;
+            groupBox1.Text = "Scope";
+            // 
+            // rbScopeFile
+            // 
+            rbScopeFile.AutoSize = true;
+            rbScopeFile.Location = new Point(106, 20);
+            rbScopeFile.Name = "rbScopeFile";
+            rbScopeFile.Size = new Size(48, 19);
+            rbScopeFile.TabIndex = 1;
+            rbScopeFile.Text = "Files";
+            rbScopeFile.UseVisualStyleBackColor = true;
+            // 
+            // rbScopeDir
+            // 
+            rbScopeDir.AutoSize = true;
+            rbScopeDir.Checked = true;
+            rbScopeDir.Location = new Point(10, 20);
+            rbScopeDir.Name = "rbScopeDir";
+            rbScopeDir.Size = new Size(81, 19);
+            rbScopeDir.TabIndex = 0;
+            rbScopeDir.TabStop = true;
+            rbScopeDir.Text = "Directories";
+            rbScopeDir.UseVisualStyleBackColor = true;
+            // 
+            // ctrlDirSelection
+            // 
+            ctrlDirSelection.Caption = "Directory to operate";
+            ctrlDirSelection.Dock = DockStyle.Fill;
+            ctrlDirSelection.Location = new Point(3, 49);
+            ctrlDirSelection.Margin = new Padding(3, 2, 3, 2);
+            ctrlDirSelection.Name = "ctrlDirSelection";
+            ctrlDirSelection.SelectedPath = "";
+            ctrlDirSelection.Size = new Size(388, 56);
+            ctrlDirSelection.TabIndex = 1;
+            // 
+            // tlpLevel1R
+            // 
+            tlpLevel1R.ColumnCount = 1;
+            tlpLevel1R.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tlpLevel1R.Controls.Add(chbDeleteEmpty, 0, 2);
+            tlpLevel1R.Controls.Add(chbDryRun, 0, 1);
+            tlpLevel1R.Controls.Add(chbIncludeSubdirs, 0, 0);
+            tlpLevel1R.Controls.Add(ctrlFilter, 0, 3);
+            tlpLevel1R.Dock = DockStyle.Fill;
+            tlpLevel1R.Location = new Point(403, 3);
+            tlpLevel1R.Name = "tlpLevel1R";
+            tlpLevel1R.RowCount = 4;
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.Size = new Size(394, 214);
+            tlpLevel1R.TabIndex = 1;
+            // 
+            // chbDeleteEmpty
+            // 
+            chbDeleteEmpty.AutoSize = true;
+            chbDeleteEmpty.Location = new Point(3, 48);
+            chbDeleteEmpty.Margin = new Padding(3, 2, 3, 2);
+            chbDeleteEmpty.Name = "chbDeleteEmpty";
+            chbDeleteEmpty.Size = new Size(219, 19);
+            chbDeleteEmpty.TabIndex = 3;
+            chbDeleteEmpty.Text = "Only delete empty files or directories";
+            chbDeleteEmpty.UseVisualStyleBackColor = true;
+            // 
+            // chbDryRun
+            // 
+            chbDryRun.AutoSize = true;
+            chbDryRun.Location = new Point(3, 25);
+            chbDryRun.Margin = new Padding(3, 2, 3, 2);
+            chbDryRun.Name = "chbDryRun";
+            chbDryRun.Size = new Size(152, 19);
+            chbDryRun.TabIndex = 2;
+            chbDryRun.Text = "Dry run - without delete";
+            chbDryRun.UseVisualStyleBackColor = true;
+            // 
+            // chbIncludeSubdirs
+            // 
+            chbIncludeSubdirs.AutoSize = true;
+            chbIncludeSubdirs.Location = new Point(3, 2);
+            chbIncludeSubdirs.Margin = new Padding(3, 2, 3, 2);
+            chbIncludeSubdirs.Name = "chbIncludeSubdirs";
+            chbIncludeSubdirs.Size = new Size(143, 19);
+            chbIncludeSubdirs.TabIndex = 1;
+            chbIncludeSubdirs.Text = "Include Subdirectories";
+            chbIncludeSubdirs.UseVisualStyleBackColor = true;
+            // 
+            // ctrlFilter
+            // 
+            ctrlFilter.Caption = "Filter to include";
+            ctrlFilter.FilterEnabled = false;
+            ctrlFilter.FilterText = "";
+            ctrlFilter.Location = new Point(3, 71);
+            ctrlFilter.Margin = new Padding(3, 2, 3, 2);
+            ctrlFilter.Name = "ctrlFilter";
+            ctrlFilter.Size = new Size(388, 118);
+            ctrlFilter.TabIndex = 4;
+            // 
+            // CtrlClearDir
+            // 
+            AutoScroll = true;
+            AutoScrollMinSize = new Size(530, 220);
+            Controls.Add(tlpLevel0);
+            Name = "CtrlClearDir";
+            Size = new Size(800, 188);
+            tlpLevel0.ResumeLayout(false);
+            tlpLevel1L.ResumeLayout(false);
+            groupBox1.ResumeLayout(false);
+            groupBox1.PerformLayout();
+            tlpLevel1R.ResumeLayout(false);
+            tlpLevel1R.PerformLayout();
+            ResumeLayout(false);
+
+        }
+        private TableLayoutPanel tlpLevel0;
+        private TableLayoutPanel tlpLevel1L;
+        private GroupBox groupBox1;
+        private RadioButton rbScopeFile;
+        private RadioButton rbScopeDir;
+        private TableLayoutPanel tlpLevel1R;
+        private CheckBox chbDeleteEmpty;
+        private CheckBox chbDryRun;
+        private CheckBox chbIncludeSubdirs;
+        private Common.FilterPathCtrl ctrlFilter;
+        private Common.DirectorySelectionCtrl ctrlDirSelection;
+    }
+}

+ 120 - 0
qfu/qfu.gui/Subforms/CtrlClearDir.resx

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

+ 229 - 0
qfu/qfu.gui/Subforms/CtrlClone.Designer.cs

@@ -0,0 +1,229 @@
+namespace qdr.app.tools.qfu.gui.Subforms
+{
+    partial class CtrlClone
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            tlpLevel0 = new TableLayoutPanel();
+            tlpLevel1L = new TableLayoutPanel();
+            label1 = new Label();
+            tbOutputs = new TextBox();
+            chbRepeat = new CheckBox();
+            tbNRepeat = new NumericUpDown();
+            ctrlSource = new qdr.app.tools.qfu.gui.Subforms.Common.FileSelectionCtrl();
+            tlpLevel1R = new TableLayoutPanel();
+            chbFileList = new CheckBox();
+            chbPe = new CheckBox();
+            chbForce = new CheckBox();
+            ctrlFileList = new qdr.app.tools.qfu.gui.Subforms.Common.FileSelectionCtrl();
+            tlpLevel0.SuspendLayout();
+            tlpLevel1L.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)tbNRepeat).BeginInit();
+            tlpLevel1R.SuspendLayout();
+            SuspendLayout();
+            // 
+            // tlpLevel0
+            // 
+            tlpLevel0.ColumnCount = 2;
+            tlpLevel0.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
+            tlpLevel0.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 312F));
+            tlpLevel0.Controls.Add(tlpLevel1L, 0, 0);
+            tlpLevel0.Controls.Add(tlpLevel1R, 1, 0);
+            tlpLevel0.Dock = DockStyle.Fill;
+            tlpLevel0.Location = new Point(0, 0);
+            tlpLevel0.Name = "tlpLevel0";
+            tlpLevel0.RowCount = 1;
+            tlpLevel0.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
+            tlpLevel0.Size = new Size(702, 372);
+            tlpLevel0.TabIndex = 0;
+            // 
+            // tlpLevel1L
+            // 
+            tlpLevel1L.ColumnCount = 1;
+            tlpLevel1L.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tlpLevel1L.Controls.Add(label1, 0, 1);
+            tlpLevel1L.Controls.Add(tbOutputs, 0, 2);
+            tlpLevel1L.Controls.Add(chbRepeat, 0, 3);
+            tlpLevel1L.Controls.Add(tbNRepeat, 0, 4);
+            tlpLevel1L.Controls.Add(ctrlSource, 0, 0);
+            tlpLevel1L.Dock = DockStyle.Fill;
+            tlpLevel1L.Location = new Point(3, 3);
+            tlpLevel1L.Name = "tlpLevel1L";
+            tlpLevel1L.RowCount = 5;
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.RowStyles.Add(new RowStyle());
+            tlpLevel1L.Size = new Size(384, 366);
+            tlpLevel1L.TabIndex = 0;
+            // 
+            // label1
+            // 
+            label1.AutoSize = true;
+            label1.Location = new Point(3, 44);
+            label1.Name = "label1";
+            label1.Size = new Size(99, 15);
+            label1.TabIndex = 1;
+            label1.Text = "Output filenames";
+            // 
+            // tbOutputs
+            // 
+            tbOutputs.Dock = DockStyle.Fill;
+            tbOutputs.Location = new Point(3, 62);
+            tbOutputs.Multiline = true;
+            tbOutputs.Name = "tbOutputs";
+            tbOutputs.ScrollBars = ScrollBars.Both;
+            tbOutputs.Size = new Size(378, 145);
+            tbOutputs.TabIndex = 2;
+            // 
+            // chbRepeat
+            // 
+            chbRepeat.AutoSize = true;
+            chbRepeat.Location = new Point(3, 213);
+            chbRepeat.Name = "chbRepeat";
+            chbRepeat.Size = new Size(343, 19);
+            chbRepeat.TabIndex = 3;
+            chbRepeat.Text = "Generate N numbered copies instead of using target files list";
+            chbRepeat.UseVisualStyleBackColor = true;
+            chbRepeat.CheckedChanged += chbRepeat_CheckedChanged;
+            // 
+            // tbNRepeat
+            // 
+            tbNRepeat.Dock = DockStyle.Fill;
+            tbNRepeat.Location = new Point(3, 238);
+            tbNRepeat.Name = "tbNRepeat";
+            tbNRepeat.Size = new Size(378, 23);
+            tbNRepeat.TabIndex = 4;
+            // 
+            // ctrlSource
+            // 
+            ctrlSource.Caption = "File to clone (Source)";
+            ctrlSource.Dock = DockStyle.Fill;
+            ctrlSource.Location = new Point(3, 2);
+            ctrlSource.Margin = new Padding(3, 2, 3, 2);
+            ctrlSource.Name = "ctrlSource";
+            ctrlSource.SelectedFile = "";
+            ctrlSource.Size = new Size(378, 40);
+            ctrlSource.TabIndex = 5;
+            // 
+            // tlpLevel1R
+            // 
+            tlpLevel1R.ColumnCount = 1;
+            tlpLevel1R.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tlpLevel1R.Controls.Add(chbFileList, 0, 0);
+            tlpLevel1R.Controls.Add(chbPe, 0, 2);
+            tlpLevel1R.Controls.Add(chbForce, 0, 3);
+            tlpLevel1R.Controls.Add(ctrlFileList, 0, 1);
+            tlpLevel1R.Dock = DockStyle.Fill;
+            tlpLevel1R.Location = new Point(393, 3);
+            tlpLevel1R.Name = "tlpLevel1R";
+            tlpLevel1R.RowCount = 4;
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.RowStyles.Add(new RowStyle());
+            tlpLevel1R.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
+            tlpLevel1R.Size = new Size(306, 366);
+            tlpLevel1R.TabIndex = 1;
+            // 
+            // chbFileList
+            // 
+            chbFileList.AutoSize = true;
+            chbFileList.Location = new Point(3, 3);
+            chbFileList.Name = "chbFileList";
+            chbFileList.Size = new Size(234, 19);
+            chbFileList.TabIndex = 1;
+            chbFileList.Text = "Use FileList instead of Output filenames";
+            chbFileList.UseVisualStyleBackColor = true;
+            chbFileList.CheckedChanged += chbFileList_CheckedChanged;
+            // 
+            // chbPe
+            // 
+            chbPe.AutoSize = true;
+            chbPe.Location = new Point(3, 72);
+            chbPe.Name = "chbPe";
+            chbPe.Size = new Size(274, 19);
+            chbPe.TabIndex = 2;
+            chbPe.Text = "Create destination directories if they don't exist";
+            chbPe.UseVisualStyleBackColor = true;
+            // 
+            // chbForce
+            // 
+            chbForce.AutoSize = true;
+            chbForce.Location = new Point(3, 97);
+            chbForce.Name = "chbForce";
+            chbForce.Size = new Size(257, 19);
+            chbForce.TabIndex = 3;
+            chbForce.Text = "Overwrite existing destination files (if exists)";
+            chbForce.UseVisualStyleBackColor = true;
+            // 
+            // ctrlFileList
+            // 
+            ctrlFileList.Caption = "FileList file";
+            ctrlFileList.Dock = DockStyle.Fill;
+            ctrlFileList.Location = new Point(3, 27);
+            ctrlFileList.Margin = new Padding(3, 2, 3, 2);
+            ctrlFileList.Name = "ctrlFileList";
+            ctrlFileList.SelectedFile = "";
+            ctrlFileList.Size = new Size(300, 40);
+            ctrlFileList.TabIndex = 4;
+            ctrlFileList.SelectedFileChanged += ctrlFileList_SelectedFileChanged_1;
+            // 
+            // CtrlClone
+            // 
+            AutoScaleDimensions = new SizeF(7F, 15F);
+            AutoScaleMode = AutoScaleMode.Font;
+            AutoScroll = true;
+            AutoScrollMinSize = new Size(530, 220);
+            Controls.Add(tlpLevel0);
+            Name = "CtrlClone";
+            Size = new Size(702, 372);
+            tlpLevel0.ResumeLayout(false);
+            tlpLevel1L.ResumeLayout(false);
+            tlpLevel1L.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)tbNRepeat).EndInit();
+            tlpLevel1R.ResumeLayout(false);
+            tlpLevel1R.PerformLayout();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private TableLayoutPanel tlpLevel0;
+        private TableLayoutPanel tlpLevel1L;
+        private Label label1;
+        private TextBox tbOutputs;
+        private TableLayoutPanel tlpLevel1R;
+        private CheckBox chbRepeat;
+        private NumericUpDown tbNRepeat;
+        private CheckBox chbFileList;
+        private CheckBox chbPe;
+        private CheckBox chbForce;
+        private Common.FileSelectionCtrl ctrlFileList;
+        private Common.FileSelectionCtrl ctrlSource;
+    }
+}

+ 79 - 0
qfu/qfu.gui/Subforms/CtrlClone.cs

@@ -0,0 +1,79 @@
+using Quadarax.Foundation.Core.Value.Extensions;
+using System.Text;
+
+namespace qdr.app.tools.qfu.gui.Subforms
+{
+    public partial class CtrlClone : UserControl, ICommanControl
+    {
+
+        public string Description => "Clone Command\r\nClone a source file to one or more destination files.\r\n\r\nSyntax:\r\nqfu clone <source_file> <target_files> [options]\r\n\r\nArguments:\r\n- `source_file`: Path to the source file to clone\r\n- `target_files`: Pipe-separated list of target file paths (`file1.txt|file2.txt|file3.txt`)\r\n\r\nOptions:\r\n- `-pe` or `-path_ensure`: Create destination directories if they don't exist\r\n- `-force`: Overwrite existing destination files\r\n- `-list`: Treat the first target file as a text file containing a list of destination paths (one per line)\r\n- `-n <count>`: Generate N numbered copies instead of using target files list";
+
+        public string ViewName => "Clone";
+        public CtrlClone()
+        {
+            InitializeComponent();
+            chbFileList_CheckedChanged(this, new EventArgs());
+            chbRepeat_CheckedChanged(this, new EventArgs());
+        }
+
+        private void chbRepeat_CheckedChanged(object sender, EventArgs e)
+        {
+            tbNRepeat.Enabled = chbRepeat.Checked;
+            tbOutputs.Enabled = !chbRepeat.Checked;
+            chbFileList.Enabled = !chbRepeat.Checked;
+        }
+
+        public void Execute()
+        {
+            var arguments = new StringBuilder();
+            arguments.Append("clone");
+            arguments.Append(" ");
+            arguments.Append("\"").Append(ctrlSource.SelectedFile).Append("\"");
+
+            if (chbRepeat.Enabled && chbRepeat.Checked)
+            {
+                if (int.TryParse(tbNRepeat.Text, out int n) && n > 0)
+                {
+                    arguments.Append(" -n:").Append(n);
+                }
+                else
+                    throw new ArgumentException($"Invalid number of repeats specified '{tbNRepeat.Text}'. Please enter a valid positive integer.");
+            }
+            else if (chbFileList.Checked)
+            {
+                arguments.Append(" \"").Append(ctrlFileList.SelectedFile).Append("\"");
+                arguments.Append(" -list");
+            }
+            else
+            {
+                arguments.Append(" ");
+                var outputs = tbOutputs.Text.Split("\n", StringSplitOptions.RemoveEmptyEntries);
+                foreach (var output in outputs)
+                    arguments.Append(output.Trim()).Append("|");
+
+            }
+            if (chbPe.Checked)
+            {
+                arguments.Append(" -pe");
+            }
+            if (chbForce.Checked)
+            {
+                arguments.Append(" -force");
+            }
+
+            ConsoleRunner.Run(arguments.ToString().SplitQuoted(" ", "\"", removeEmptyItems: true, trimValues: false, keepBracket: true));
+        }
+
+        private void chbFileList_CheckedChanged(object sender, EventArgs e)
+        {
+            ctrlFileList.Enabled = chbFileList.Checked;
+            tbOutputs.Enabled = !chbFileList.Checked;
+            chbRepeat.Enabled = !chbFileList.Checked;
+
+        }
+        private void ctrlFileList_SelectedFileChanged_1(object sender, EventArgs e)
+        {
+            tbOutputs.Text = File.ReadAllText(ctrlFileList.SelectedFile);
+        }
+    }
+}

+ 120 - 0
qfu/qfu.gui/Subforms/CtrlClone.resx

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

+ 126 - 0
qfu/qfu.gui/Subforms/CtrlImgList.Designer.cs

@@ -0,0 +1,126 @@
+namespace qdr.app.tools.qfu.gui.Subforms
+{
+    partial class CtrlImgList
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            tableLayoutPanel1 = new TableLayoutPanel();
+            panel1 = new Panel();
+            chbIncludeSubdirs = new CheckBox();
+            ctrlDirSelection = new qdr.app.tools.qfu.gui.Subforms.Common.DirectorySelectionCtrl();
+            ctrlFilter = new qdr.app.tools.qfu.gui.Subforms.Common.FilterPathCtrl();
+            tableLayoutPanel1.SuspendLayout();
+            panel1.SuspendLayout();
+            SuspendLayout();
+            // 
+            // tableLayoutPanel1
+            // 
+            tableLayoutPanel1.ColumnCount = 2;
+            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
+            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
+            tableLayoutPanel1.Controls.Add(panel1, 1, 0);
+            tableLayoutPanel1.Controls.Add(ctrlDirSelection, 0, 0);
+            tableLayoutPanel1.Controls.Add(ctrlFilter, 0, 1);
+            tableLayoutPanel1.Dock = DockStyle.Fill;
+            tableLayoutPanel1.Location = new Point(0, 0);
+            tableLayoutPanel1.Margin = new Padding(3, 2, 3, 2);
+            tableLayoutPanel1.Name = "tableLayoutPanel1";
+            tableLayoutPanel1.RowCount = 2;
+            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 45F));
+            tableLayoutPanel1.RowStyles.Add(new RowStyle());
+            tableLayoutPanel1.Size = new Size(610, 220);
+            tableLayoutPanel1.TabIndex = 0;
+            // 
+            // panel1
+            // 
+            panel1.Controls.Add(chbIncludeSubdirs);
+            panel1.Dock = DockStyle.Fill;
+            panel1.Location = new Point(308, 2);
+            panel1.Margin = new Padding(3, 2, 3, 2);
+            panel1.Name = "panel1";
+            panel1.Size = new Size(299, 41);
+            panel1.TabIndex = 1;
+            // 
+            // chbIncludeSubdirs
+            // 
+            chbIncludeSubdirs.AutoSize = true;
+            chbIncludeSubdirs.Location = new Point(3, 2);
+            chbIncludeSubdirs.Margin = new Padding(3, 2, 3, 2);
+            chbIncludeSubdirs.Name = "chbIncludeSubdirs";
+            chbIncludeSubdirs.Size = new Size(143, 19);
+            chbIncludeSubdirs.TabIndex = 0;
+            chbIncludeSubdirs.Text = "Include Subdirectories";
+            chbIncludeSubdirs.UseVisualStyleBackColor = true;
+            // 
+            // ctrlDirSelection
+            // 
+            ctrlDirSelection.AutoScroll = true;
+            ctrlDirSelection.Caption = "Source Directory";
+            ctrlDirSelection.Dock = DockStyle.Fill;
+            ctrlDirSelection.Location = new Point(3, 2);
+            ctrlDirSelection.Margin = new Padding(3, 2, 3, 2);
+            ctrlDirSelection.Name = "ctrlDirSelection";
+            ctrlDirSelection.SelectedPath = "";
+            ctrlDirSelection.Size = new Size(299, 41);
+            ctrlDirSelection.TabIndex = 2;
+            // 
+            // ctrlFilter
+            // 
+            ctrlFilter.Caption = "Excluded files patterns";
+            ctrlFilter.FilterEnabled = false;
+            ctrlFilter.FilterText = "";
+            ctrlFilter.Location = new Point(3, 47);
+            ctrlFilter.Margin = new Padding(3, 2, 3, 2);
+            ctrlFilter.Name = "ctrlFilter";
+            ctrlFilter.Size = new Size(229, 118);
+            ctrlFilter.TabIndex = 3;
+            // 
+            // CtrlImgList
+            // 
+            AutoScaleDimensions = new SizeF(7F, 15F);
+            AutoScaleMode = AutoScaleMode.Font;
+            AutoScroll = true;
+            AutoScrollMinSize = new Size(530, 220);
+            Controls.Add(tableLayoutPanel1);
+            Margin = new Padding(3, 2, 3, 2);
+            Name = "CtrlImgList";
+            Size = new Size(610, 163);
+            tableLayoutPanel1.ResumeLayout(false);
+            panel1.ResumeLayout(false);
+            panel1.PerformLayout();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private TableLayoutPanel tableLayoutPanel1;
+        private Panel panel1;
+        private CheckBox chbIncludeSubdirs;
+        private Common.DirectorySelectionCtrl ctrlDirSelection;
+        private Common.FilterPathCtrl ctrlFilter;
+    }
+}

+ 36 - 0
qfu/qfu.gui/Subforms/CtrlImgList.cs

@@ -0,0 +1,36 @@
+using Quadarax.Foundation.Core.Value.Extensions;
+using System.Text;
+
+namespace qdr.app.tools.qfu.gui.Subforms
+{
+    public partial class CtrlImgList : UserControl, ICommanControl
+    {
+        public CtrlImgList()
+        {
+            InitializeComponent();
+        }
+
+        public string Description => "Image List Command\r\nList all image files from a directory with their dimensions, resolution, and size information.\r\n\r\nSyntax:\r\n`qfu img_list <source> [options]`\r\n\r\nArguments:\r\n- `source`: Path to directory to scan for image files\r\nOptions:\r\n`-s`: Include subdirectories in the scan\r\n`-exclude <patterns>`: Exclude files matching patterns (pipe-separated, e.g., `*.tmp|backup*`)\r\nOutput Format:\r\nDimensions   Resolution      Size      File Path\r\n------------ --------------- --------- --------------------------------------------------\r\n1920x1080    72x72 DPI       2.5 MB    photos/vacation.jpg\r\n800x600      96x96 DPI       145.2 KB  thumbnails/small.png\r\n";
+
+        public string ViewName => "Image List";
+
+        public void Execute()
+        {
+            var arguments = new StringBuilder();
+            arguments.Append("img_list");
+            arguments.Append(" ");
+            arguments.Append("\"").Append(ctrlDirSelection.SelectedPath).Append("\"");
+            if (chbIncludeSubdirs.Checked)
+            {
+                arguments.Append(" ");
+                arguments.Append(" -s");
+            }
+            if(ctrlFilter.FilterEnabled)
+            {
+                arguments.Append(" ");
+                arguments.Append(" -exclude:\"").Append(ctrlFilter.FilterText).Append("\"");
+            }
+            ConsoleRunner.Run(arguments.ToString().SplitQuoted(" ", "\"", removeEmptyItems:true, trimValues:false, keepBracket:true));
+        }
+    }
+}

+ 120 - 0
qfu/qfu.gui/Subforms/CtrlImgList.resx

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

+ 10 - 0
qfu/qfu.gui/Subforms/ICommanControl.cs

@@ -0,0 +1,10 @@
+namespace qdr.app.tools.qfu.gui.Subforms
+{
+    internal interface ICommanControl
+    {
+        string ViewName { get; }
+        string Description { get; }
+        void Execute();
+        bool Visible { get; set; }
+    }
+}

+ 247 - 0
qfu/qfu.gui/frmMain.Designer.cs

@@ -0,0 +1,247 @@
+namespace qdr.app.tools.qfu.gui
+{
+    partial class frmMain
+    {
+        /// <summary>
+        ///  Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        ///  Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        ///  Required method for Designer support - do not modify
+        ///  the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
+            pbImage = new PictureBox();
+            gbLogo = new GroupBox();
+            toolStrip1 = new ToolStrip();
+            toolStripLabel1 = new ToolStripLabel();
+            tscbCommand = new ToolStripComboBox();
+            toolStripSeparator1 = new ToolStripSeparator();
+            tsbutExecute = new ToolStripButton();
+            toolStripSeparator2 = new ToolStripSeparator();
+            tsbutClear = new ToolStripButton();
+            tplLevel1 = new TableLayoutPanel();
+            groupBox2 = new GroupBox();
+            tbDescription = new TextBox();
+            tlpLevel0 = new TableLayoutPanel();
+            tbConsole = new RichTextBox();
+            ((System.ComponentModel.ISupportInitialize)pbImage).BeginInit();
+            gbLogo.SuspendLayout();
+            toolStrip1.SuspendLayout();
+            tplLevel1.SuspendLayout();
+            groupBox2.SuspendLayout();
+            tlpLevel0.SuspendLayout();
+            SuspendLayout();
+            // 
+            // pbImage
+            // 
+            pbImage.Image = Properties.Resources.qfu;
+            pbImage.InitialImage = (Image)resources.GetObject("pbImage.InitialImage");
+            pbImage.Location = new Point(15, 20);
+            pbImage.Margin = new Padding(3, 2, 3, 2);
+            pbImage.Name = "pbImage";
+            pbImage.Size = new Size(134, 115);
+            pbImage.SizeMode = PictureBoxSizeMode.StretchImage;
+            pbImage.TabIndex = 0;
+            pbImage.TabStop = false;
+            // 
+            // gbLogo
+            // 
+            gbLogo.Controls.Add(pbImage);
+            gbLogo.Dock = DockStyle.Fill;
+            gbLogo.Location = new Point(3, 2);
+            gbLogo.Margin = new Padding(3, 2, 3, 2);
+            gbLogo.Name = "gbLogo";
+            gbLogo.Padding = new Padding(3, 2, 3, 2);
+            gbLogo.Size = new Size(169, 157);
+            gbLogo.TabIndex = 1;
+            gbLogo.TabStop = false;
+            // 
+            // toolStrip1
+            // 
+            toolStrip1.ImageScalingSize = new Size(20, 20);
+            toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripLabel1, tscbCommand, toolStripSeparator1, tsbutExecute, toolStripSeparator2, tsbutClear });
+            toolStrip1.Location = new Point(0, 0);
+            toolStrip1.Name = "toolStrip1";
+            toolStrip1.Size = new Size(845, 27);
+            toolStrip1.TabIndex = 2;
+            toolStrip1.Text = "toolStrip1";
+            // 
+            // toolStripLabel1
+            // 
+            toolStripLabel1.Name = "toolStripLabel1";
+            toolStripLabel1.Size = new Size(67, 24);
+            toolStripLabel1.Text = "Command:";
+            // 
+            // tscbCommand
+            // 
+            tscbCommand.Name = "tscbCommand";
+            tscbCommand.Size = new Size(106, 27);
+            tscbCommand.ToolTipText = "Select QFU command";
+            tscbCommand.SelectedIndexChanged += tscbCommand_SelectedIndexChanged;
+            // 
+            // toolStripSeparator1
+            // 
+            toolStripSeparator1.Name = "toolStripSeparator1";
+            toolStripSeparator1.Size = new Size(6, 27);
+            // 
+            // tsbutExecute
+            // 
+            tsbutExecute.DisplayStyle = ToolStripItemDisplayStyle.Image;
+            tsbutExecute.Image = Properties.Resources.Continue;
+            tsbutExecute.ImageTransparentColor = Color.Magenta;
+            tsbutExecute.Name = "tsbutExecute";
+            tsbutExecute.Size = new Size(24, 24);
+            tsbutExecute.Text = "Execute";
+            tsbutExecute.ToolTipText = "Execute selected command.";
+            tsbutExecute.Click += tsbutExecute_Click;
+            // 
+            // toolStripSeparator2
+            // 
+            toolStripSeparator2.Name = "toolStripSeparator2";
+            toolStripSeparator2.Size = new Size(6, 27);
+            // 
+            // tsbutClear
+            // 
+            tsbutClear.DisplayStyle = ToolStripItemDisplayStyle.Image;
+            tsbutClear.Image = Properties.Resources.Clear;
+            tsbutClear.ImageTransparentColor = Color.Magenta;
+            tsbutClear.Name = "tsbutClear";
+            tsbutClear.Size = new Size(24, 24);
+            tsbutClear.Text = "toolStripButton1";
+            tsbutClear.ToolTipText = "Clears output window";
+            tsbutClear.Click += tsbutClear_Click;
+            // 
+            // tplLevel1
+            // 
+            tplLevel1.ColumnCount = 2;
+            tplLevel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 175F));
+            tplLevel1.ColumnStyles.Add(new ColumnStyle());
+            tplLevel1.Controls.Add(gbLogo, 0, 0);
+            tplLevel1.Controls.Add(groupBox2, 1, 0);
+            tplLevel1.Dock = DockStyle.Fill;
+            tplLevel1.Location = new Point(3, 2);
+            tplLevel1.Margin = new Padding(3, 2, 3, 2);
+            tplLevel1.Name = "tplLevel1";
+            tplLevel1.RowCount = 1;
+            tplLevel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
+            tplLevel1.Size = new Size(839, 161);
+            tplLevel1.TabIndex = 3;
+            // 
+            // groupBox2
+            // 
+            groupBox2.Controls.Add(tbDescription);
+            groupBox2.Dock = DockStyle.Fill;
+            groupBox2.Location = new Point(178, 2);
+            groupBox2.Margin = new Padding(3, 2, 3, 2);
+            groupBox2.Name = "groupBox2";
+            groupBox2.Padding = new Padding(3, 2, 3, 2);
+            groupBox2.Size = new Size(661, 157);
+            groupBox2.TabIndex = 2;
+            groupBox2.TabStop = false;
+            groupBox2.Text = "Description";
+            // 
+            // tbDescription
+            // 
+            tbDescription.Dock = DockStyle.Fill;
+            tbDescription.Location = new Point(3, 18);
+            tbDescription.Margin = new Padding(3, 2, 3, 2);
+            tbDescription.Multiline = true;
+            tbDescription.Name = "tbDescription";
+            tbDescription.ReadOnly = true;
+            tbDescription.ScrollBars = ScrollBars.Horizontal;
+            tbDescription.Size = new Size(655, 137);
+            tbDescription.TabIndex = 0;
+            // 
+            // tlpLevel0
+            // 
+            tlpLevel0.ColumnCount = 1;
+            tlpLevel0.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
+            tlpLevel0.Controls.Add(tplLevel1, 0, 0);
+            tlpLevel0.Controls.Add(tbConsole, 0, 2);
+            tlpLevel0.Dock = DockStyle.Fill;
+            tlpLevel0.Location = new Point(0, 27);
+            tlpLevel0.Margin = new Padding(3, 2, 3, 2);
+            tlpLevel0.Name = "tlpLevel0";
+            tlpLevel0.RowCount = 3;
+            tlpLevel0.RowStyles.Add(new RowStyle(SizeType.Absolute, 165F));
+            tlpLevel0.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
+            tlpLevel0.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
+            tlpLevel0.Size = new Size(845, 371);
+            tlpLevel0.TabIndex = 4;
+            // 
+            // tbConsole
+            // 
+            tbConsole.BackColor = Color.Black;
+            tbConsole.Dock = DockStyle.Fill;
+            tbConsole.Font = new Font("Consolas", 10.2F, FontStyle.Regular, GraphicsUnit.Point, 0);
+            tbConsole.ForeColor = Color.Lime;
+            tbConsole.Location = new Point(3, 270);
+            tbConsole.Margin = new Padding(3, 2, 3, 2);
+            tbConsole.Name = "tbConsole";
+            tbConsole.ReadOnly = true;
+            tbConsole.ScrollBars = RichTextBoxScrollBars.ForcedVertical;
+            tbConsole.Size = new Size(839, 99);
+            tbConsole.TabIndex = 4;
+            tbConsole.Text = "";
+            // 
+            // frmMain
+            // 
+            AutoScaleDimensions = new SizeF(7F, 15F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(845, 398);
+            Controls.Add(tlpLevel0);
+            Controls.Add(toolStrip1);
+            Icon = (Icon)resources.GetObject("$this.Icon");
+            Margin = new Padding(3, 2, 3, 2);
+            Name = "frmMain";
+            Text = "QFU GUI";
+            Load += frmMain_Load;
+            ((System.ComponentModel.ISupportInitialize)pbImage).EndInit();
+            gbLogo.ResumeLayout(false);
+            toolStrip1.ResumeLayout(false);
+            toolStrip1.PerformLayout();
+            tplLevel1.ResumeLayout(false);
+            groupBox2.ResumeLayout(false);
+            groupBox2.PerformLayout();
+            tlpLevel0.ResumeLayout(false);
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private PictureBox pbImage;
+        private GroupBox gbLogo;
+        private ToolStrip toolStrip1;
+        private ToolStripLabel toolStripLabel1;
+        private ToolStripComboBox tscbCommand;
+        private ToolStripSeparator toolStripSeparator1;
+        private ToolStripButton tsbutExecute;
+        private TableLayoutPanel tplLevel1;
+        private GroupBox groupBox2;
+        private TableLayoutPanel tlpLevel0;
+        private RichTextBox tbConsole;
+        private TextBox tbDescription;
+        private ToolStripSeparator toolStripSeparator2;
+        private ToolStripButton tsbutClear;
+    }
+}

+ 89 - 0
qfu/qfu.gui/frmMain.cs

@@ -0,0 +1,89 @@
+using qdr.app.tools.qfu.gui.Subforms;
+using Quadarax.Foundation.Core.QConsole;
+using Quadarax.Foundation.Core.Reflection.Extensions;
+using System.Reflection;
+
+namespace qdr.app.tools.qfu.gui
+{
+    public partial class frmMain : Form
+    {
+        private IList<ICommanControl> _views = new List<ICommanControl>();
+        private ICommanControl? _lastSelectedCommandControl;
+        private ICommanControl CurrentCommandControl => _views[tscbCommand.SelectedIndex];
+        #region *** Constructors ***
+        public frmMain()
+        {
+            InitializeComponent();
+            Text = $"{Application.ProductName} GUI - {Application.ProductVersion?.Split("+")?.FirstOrDefault()} / supports qfu v.{Assembly.GetAssembly(typeof(ConsoleRunner))?.GetVersion()?.ToString()}";
+            Console.SetOut(new RTFConsoleTextWriter(tbConsole));
+
+            var ctrl = new CtrlImgList();
+            ctrl.Dock = DockStyle.Fill;
+            ctrl.Name = "ctrlImgList";
+            _views.Add(ctrl);
+
+            var ctrl1 = new CtrlClearDir();
+            ctrl1.Dock = DockStyle.Fill;
+            ctrl1.Name = "ctrlClearDir";
+            _views.Add(ctrl1);
+
+            var ctrl2 = new CtrlClone();
+            ctrl2.Dock = DockStyle.Fill;
+            ctrl2.Name = "ctrlClone";
+            _views.Add(ctrl2);
+
+            tscbCommand.Items.AddRange(_views.Select(v => v.ViewName).ToArray());
+            tscbCommand.SelectedIndex = 0;
+
+            //tlpLevel0.Controls.Add(ctrlImgList, 0, 1);
+        }
+        #endregion
+
+
+        #region *** Form handlers ***
+        private void frmMain_Load(object sender, EventArgs e)
+        {
+
+        }
+        #endregion
+
+
+        private void tscbCommand_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            tbDescription.Text = CurrentCommandControl.Description;
+            tbDescription.SelectionStart = 0;
+            tbDescription.SelectionLength = 0;
+            if (_lastSelectedCommandControl != null)
+            {
+                foreach (var control in tlpLevel0.Controls)
+                {
+                    if (control is ICommanControl cmdControl && cmdControl.ViewName == _lastSelectedCommandControl.ViewName)
+                    {
+                        tlpLevel0.Controls.Remove((Control)cmdControl);
+                        break;
+                    }
+                }
+            }
+            tlpLevel0.Controls.Add((Control)CurrentCommandControl, 0, 1);
+            _lastSelectedCommandControl = CurrentCommandControl;
+        }
+
+        private void tsbutExecute_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                CurrentCommandControl.Execute();
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(this, $"Error executing command: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void tsbutClear_Click(object sender, EventArgs e)
+        {
+            tbConsole.Clear();
+        }
+    }
+}
+

+ 1182 - 0
qfu/qfu.gui/frmMain.resx

@@ -0,0 +1,1182 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="pbImage.InitialImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        l79lVQUf/QAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>25</value>
+  </metadata>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        RqqC2MWRxU4/V4qR+qyub3WElNgDK2w6vnB9ZueWapKdPvXuWXp7VKLs0HArCBBxbgArBI5lkYCpPN9z
+        mJHEMqrtgCJ2KjacB61iVjGz1evynVjISExuvEH0w/CtHF+eMUw1UgYjBAbf+bMSXzAmBz4QA0XfmaEt
+        FkehFIxedJFytMd62vQ02lqosuNHyBoxsQuoxTmliHY+AQFJIQNWkUdswaiTNfty+c6ZEZayKQIpDrWl
+        ixtjQVUKE5B56g9xOCKHmUUHCMDsWKGL2WQRbZDH8DizBLJE9dwgehNp7IP0WDEbU6DscM7sRo5kaJVu
+        OS++Wf2VdGTdYzMcbJwM1hCJNxAMrUjGcdcMTLLoUAe6TXsQ5AsRt9hZKeSkVnLFCS8w1OZ9UOUyIAWn
+        J64EHJhIJztNRowz3RmNJ2P46mKgRTX5wSGFHkwZkuXRDMQsaYCSPifSpPY/3lLEvWAZu0LyB4KKzz3/
+        ipGLuJyyzYJ1igAqzMoWLUA1SrbmBKUv71mBIsnygpth++LIecf5qkKVRyHZCxX/rxN+1oENIoCXHYhY
+        SJezf/4gxETkGWWi0V8HmqIRLco272mPllLiagmW1usQOw15agGfmoRFaZZBwYz5q/SBgXYx5QDqhWIN
+        SSgeI6gjRtd+RnwBCWAuUSzxcwZmKEvLsxif1IyhcMVrZZIq0tyVFXwjLXbMxiZ9xJxc/AFSZ5OmxfIs
+        /n8y0VxkyPXTHQAAAABJRU5ErkJggigAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAEBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUE/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQF
+        BP8EBQT/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8DBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQT/BAUE/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQT/BAUE/wQFBf8EBQT/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBP8EBQT/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        BP8DBQT/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBP8EBQT/BAUF/wQF
+        BP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBP8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/Dk8Q/x6W
+        I/8IMQr/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBP8EBQT/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/Hpgj/yW3K/8ZhB3/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQF
+        BP8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUE/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8LRg7/JbYr/ya3K/8jryn/BR8H/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQF
+        BP8EBQT/BAUE/wQFBP8EBQT/BAUF/wQFBf8cjiD/Jbcr/yW3K/8ltyv/Fnca/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBP8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wgzCv8lsyr/Jrcr/yW2K/8ltyv/Iqko/wQK
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/xmEHv8ltyv/Jrcr/yW2
+        K/8ltyv/Jbcr/xNrF/8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQF
+        BP8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/CDIK/ySx
+        Kf8ltyv/JbYr/yW2K/8ltyv/Jbcr/yGlJv8EDAX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/CTcL/yCgJv8ltCr/JLQq/yW0
+        Kv8ktCr/JbQq/yS0Kv8ktCr/JLQq/yS0Kv8ktCr/JLQq/yS0Kv8ktCr/JLQq/yS0Kv8ltCr/JLQq/xmH
+        Hv8EBwX/H5gj/yW3K/8ltyv/JbYr/yW2K/8ltyv/Jbcr/yW3K/8ZgR3/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/Gokf/ya3
+        K/8mtiv/JrYr/ya2K/8mtiv/JrYr/ya2K/8mtiv/JbYr/yW2K/8ltyv/Jrcr/ya2K/8mtiv/JrYr/ya2
+        K/8mtyv/IKEl/wQQBv8ahx7/Jbcr/yW3K/8ltyv/Jbcr/yW2K/8ltyv/Jbcr/yW2K/8ltiv/E20Y/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/G5Ag/ya3K/8mtiv/JrYr/ya2K/8mtiv/JbYr/ya2K/8mtiv/JrYr/yW2K/8mtiv/JrYr/ya2
+        K/8mtiv/JrYr/ya3K/8ltyv/DlUS/xBdFP8ltiv/Jbcr/yW2K/8jryn/Goof/xZ8G/8ckiH/JLQq/yW2
+        K/8ltyv/JLIq/wk+DP8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/GYUe/ya3K/8mtiv/JrYr/yCgJf8MSw//CUEM/wlBDP8JQQz/CUEM/wlB
+        Df8JQQz/CUEM/wlBDP8KQQz/CkEM/wpCDP8QXRP/BAUF/x+dJP8ltiv/JbYr/yGlJ/8INAr/BAUF/wQF
+        Bf8EBQX/DU8Q/yOwKf8ltiv/Jbcr/xqLH/8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/Fnob/ya3K/8ltiv/JrYr/xZ4Gv8EBQX/CkEN/w5V
+        Ev8PVRL/D1US/wtDDv8GJwj/D1YS/w5VEv8PVRL/DlER/wQFBf8EBQX/BicI/yW1K/8ltiv/Jbcr/w5V
+        Ef8EBQX/BAUF/wQFBf8EBQX/BAUF/xZ5Gv8ltiv/Jbcr/yKpJ/8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/E20X/ya3K/8mtiv/JrYr/xV3
+        Gf8EBQX/I6wn/x6cIv8emyL/Hpsi/yOvKP8aih//IKYm/x6bIv8emyP/Iq4n/xBfE/8EBQX/DVEQ/yW3
+        K/8ltiv/I68p/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wpHDf8ltyv/JrYr/yW1K/8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/EF8U/ya3
+        K/8mtiv/JrYr/xV3Gv8EBQX/I68o/wUVBv8EBQX/BAUF/yKtKP8bjh//FHIY/wQFBf8EBQX/HJUg/xFm
+        Ff8EBQX/DE8P/yW2K/8ltiv/I7Ep/wQGBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wxMDv8ltiv/Jrcr/yS1
+        K/8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/C0wP/ya2K/8mtiv/JrYr/xV3Gf8EBQX/I7Ao/wUVBv8EBQX/BAUF/yKtKP8bjh//FHMY/wQF
+        Bf8EBQX/HJUg/xFlFf8EBQX/BSIH/yW1Kv8mtiv/Jbcr/xFgFP8EBQX/BAUF/wQFBf8EBQX/BAUF/xiA
+        HP8ltyv/Jbcr/yGnJ/8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/By8J/ya3K/8mtiv/JrYr/xV3Gv8EBQX/I68p/xRwGP8Tbxf/E28X/yOv
+        KP8bjh//G44g/xNvF/8Tbxf/H6Ik/xFmFf8EBQX/BAUF/x6ZI/8mtyv/Jbcr/yKqKP8LQw7/BAUF/wQF
+        Bf8EBQX/El8W/yWzKv8mtyv/Jbcr/xmEHv8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/yW1K/8mtiv/JrYr/xV3Gv8EBQX/F38b/xyR
+        If8bkSD/G5Eg/xmCHf8QXRP/HJEg/xuRIP8bkSD/G48g/wk7DP8EBQX/EGMU/w1QEP8ltSr/Jbcr/yW3
+        K/8lsyr/HpQj/xuHIP8hnCb/JrYr/yW3K/8ltyv/I64p/wcwCf8GJgf/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/yOuKf8mtyv/JrYr/xV3
+        Gv8EBQX/IKEl/yOtKP8jrij/I64o/yGlJv8YgBz/JLAp/yOuKP8jrij/JLAp/w5VEv8EBQX/Iakn/wYj
+        CP8UcRj/JbYr/yW3K/8mtyv/Jrcr/ya3K/8ltyv/Jbcr/yW3K/8ksSr/D1gS/wxFDv8Zhh7/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/yGm
+        Jv8mtyv/Jrcr/xV3Gv8EBQX/I68p/wQUBv8EBQX/BAUF/yKtKP8ajh//FHMY/wQFBf8EBQX/HJUh/xFm
+        Fv8EBQX/Jbcq/x6aJP8FGQb/EF4U/yGoJ/8ltyv/Jbcr/yW3K/8ltyv/Jbcr/x+eJP8MSQ//CTgM/yKo
+        KP8emCP/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/yCeJP8mtiv/Jrcr/xV3Gv8EBQX/JK8p/wQTBv8EBQX/BAUF/yKtKP8bjh//FHIZ/wQF
+        Bf8EBQX/HJUh/xJmFv8EBQX/Jbcr/yW3K/8hoSb/DEUP/wQGBf8PWhL/F3wb/xiEHf8WeBr/DEsP/wQF
+        Bf8RXBX/I6sp/ya3K/8goyb/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/x2VIv8mtyv/Jrcr/xV3Gv8EBQX/I68p/wg/C/8HPAr/BzwK/yKu
+        KP8ajiD/FXsa/wc8Cv8HOwr/HZki/xJmFv8EBQX/Jbcr/ya2K/8ltyv/JbUr/x6TI/8WaRn/D0YS/wo9
+        Df8RTxX/GXUd/yGeJv8mtyv/Jrcr/ya3K/8jrSj/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/xuMH/8mtyv/Jrcr/xV3Gv8EBQX/HZgi/yKp
+        J/8iqSf/Iqkn/x+cJP8Vdxn/Iqkn/yKpJ/8iqSf/Iagn/wxMEP8EBQX/Jbcq/ya2K/8ltiv/Jrcr/yW3
+        K/8ltyv/Jbcr/ya3K/8ltyv/Jrcr/yW2K/8mtyv/Jrcr/ya2K/8ltiv/BAkF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/xiBHP8mtyv/Jrcr/xZ7
+        G/8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8FHgf/Jbcr/yW2
+        K/8ltiv/Jbcr/yW3K/8ltyv/JbYr/yW2K/8mtyv/Jrcr/ya2K/8ltiv/JrYr/yW2K/8ltyv/CUAN/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/xZ2
+        Gv8mtyv/Jrcr/yStKf8Yfhz/F3sb/xd7HP8Xexz/F3sb/xd7G/8Xexv/F3sc/xd7HP8Xexz/F3sc/xd7
+        HP8fmST/Jrcr/yW2K/8ltiv/Jbcr/yW3K/8ltiv/JbYr/yW2K/8ltyv/Jbcr/yW2K/8mtyv/Jrcr/yW3
+        K/8ltyv/D1oT/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/xJjFf8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya2K/8ltiv/Jbcr/yW3K/8ltyv/Jbcr/ya3K/8ltyv/Jbcr/yW3
+        K/8ltyv/JrYr/yW3K/8ltyv/EF8U/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQT/BAUF/wQFBf8EBQX/CDoL/wUQBv8gnST/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8ltyv/Jbcr/yW3K/8mtyv/Jbcr/ya3
+        K/8ltyv/Jbcr/yW3K/8ltyv/Jrcr/ya3K/8hoyb/BRkG/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/GYQe/xBbFP8EBgX/DE0Q/w5YEv8OWBL/DlcS/w5X
+        Ev8OVxL/DlcS/w5YEv8OWBL/DlcS/w5YEv8OVxL/DlgS/w5YEv8OWBL/DlgS/w5YEv8OVxP/DlcS/w5X
+        Ev8OVxL/DlcS/w5XEv8OVxL/DlgS/w5YEv8OVxL/DlcS/w1SEf8EDgb/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/Goge/ya1K/8diyH/FWoa/xRo
+        Gf8UaBj/FGgY/xRoGP8UaRj/FGkY/xRpGf8UaRn/FGgY/xRpGf8UaRn/FGkY/xRpGf8UaRj/FGkY/xRo
+        Gf8UaRn/FGkZ/xRoGf8UaBn/FGkZ/xRpGP8UaRn/FGkZ/xRpGf8UaRn/FGgZ/xFeFf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/Goce/ya3
+        K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8ltyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8ltyv/Jrcr/yCg
+        Jf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/Goge/ya3K/8mtyv/Jrcr/ya3K/8mtyz/Jrcr/ya3K/8mtyz/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8mtyv/Jrcr/ya2K/8mtiv/JrYr/ya2K/8mtiv/JrYr/ya2K/8mtiv/JrYr/ya2K/8mtiv/JrYr/ya2
+        K/8mtiv/I6wp/xBbFP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/Goge/ya3K/8mtyz/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8mtyv/Jrcr/ya3K/8elyP/CDQL/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/GoYe/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        LP8mtyv/Jrcr/ya3K/8mtyv/Jrcr/x+bJP8FFgb/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/D1US/yW1K/8mtyv/Jrcs/ya3
+        LP8mtyz/Jrcs/ya3LP8mtyz/Jrcr/ya3K/8mtyv/IKAl/wUhB/8EBQX/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/w9b
+        E/8bjyD/HJIh/xySIf8ckiH/HJIh/xySIf8ckiH/HJIh/xySIf8Yfx3/BiII/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBP8EBQT/BAUE/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBP8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        BP8EBQX/BAUE/wQFBP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQF
+        Bf8EBQT/BAUE/wQFBP8EBQT/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUE/wQFBf8FFAb/Hpsk/wpB
+        Df8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/xRv
+        GP8ltyv/G4sf/wQFBf8EBQT/BAUF/wQFBf8EBQT/BAUE/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/IaUm/yW3K/8ksyr/By8K/wQFBP8EBQX/BAUE/wQFBP8EBQX/BAUE/wQFBP8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/xFgFf8ltyv/JrYr/yW3K/8YgRz/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wpBDf8Taxf/E2wX/xNrF/8Taxf/E2wX/xNrF/8TbBf/E2wX/xNr
+        F/8TbBf/E2wX/xFiFf8EDgX/IKIm/yW2K/8ltiv/Jbcr/yOwKf8IMQr/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUE/wQFBf8FHQb/JLAp/yW3K/8mtiv/JbYr/ya2K/8mtiv/JbYr/ya3
+        K/8mtyv/Jrcr/ya2K/8mtyv/E2oX/xuJH/8ltyv/JbYr/yW2K/8ltyv/JbYr/x+dJP8FFQb/BAUF/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wUlCP8mtyv/JrYr/ya1K/8goSX/IJ8l/yCf
+        JP8fnyT/IJ8k/yCfJf8gnyT/IJ8k/x2UIv8RXxT/JbYr/yW2K/8bjiD/EmkW/xiDHf8ksyr/Jbcr/xiA
+        HP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/yWzKv8mtiv/HZQi/wQP
+        Bv8LRg7/C0YO/wo9DP8IMQr/C0YO/wtGDv8GJAj/BAUF/x2VIv8ltiv/G4wf/wQFBf8EBQX/BAUF/xV0
+        Gf8ltiv/Iqon/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/I6wo/ya2
+        K/8ckCD/EWEU/x2XIv8YgRz/IKEk/x2WIv8YgRz/GYcd/xmGHf8EBQX/IKQl/yW2K/8RZBX/BAUF/wQF
+        Bf8EBQX/CDkK/yW3K/8ltiv/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8hpCb/JrYr/xyQIP8RZBT/FXEY/wQFBf8bkCD/HJQh/wQFBf8IPAr/GYge/wQFBf8fnCT/JrYr/xd9
+        HP8EBQX/BAUF/wQFBf8RYBT/Jbcr/yOvKf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/x+bJP8mtiv/HJAg/xFgFP8fnSP/Gowf/yCjJf8dliH/G4wf/xuRIP8Zhh3/BSEH/xV0
+        Gf8ltyv/JLIq/xNpF/8FEQb/ElkV/yKqKP8mtyv/G44g/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/HZMh/ya2K/8ckCD/C0UO/x2YI/8dmCL/G5Eg/xd+HP8dmCL/HZgi/xNq
+        F/8TbBb/DVAR/x6bI/8ltyv/Jbcr/ya4LP8ltyv/Jbcr/yKpJ/8LRQ7/EF8U/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8aiR7/Jrcr/xyQIP8RZBX/FXEZ/wQFBf8bkCD/HJQh/wQF
+        Bf8IOwr/GYgf/xNwF/8iqyj/DEkP/xiAHP8iqif/JbYr/yOuKf8bjSD/C0IO/yCfJf8YgR3/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/xh+HP8mtiv/HJAg/xFkFP8Wdxr/BjEI/xyT
+        If8clCH/BjEJ/wpLDv8aiB7/FHAX/ya2K/8ksir/GoQf/xBQE/8JMwz/D0kS/xl7Hf8krSn/Jrcr/xuO
+        IP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/FXIY/ya3K/8ckCD/CkEN/xuN
+        H/8bjSD/GYYe/xVzGf8bjSD/G40f/xFgFP8TcBf/JbYr/ya2K/8mtyv/Jbcr/yW2K/8ltyv/Jbcr/ya2
+        K/8ltiv/Hpoj/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8RZBX/Jrcr/yKo
+        J/8TaBb/EmYW/xJmFv8SZhb/EmYW/xJmFv8SZhb/EmYW/x6XI/8mtiv/JbYr/yW3K/8ltyv/JbYr/yW3
+        K/8ltyv/Jbcr/yW3K/8gpSb/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wtE
+        Dv8mtiv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya2K/8ltiv/Jbcr/yW3
+        K/8ltyv/Jbcr/yW3K/8ltyv/Jrcr/yCjJv8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/FXIZ/xFgFf8YgR3/GIId/xiCHf8Zgh3/GIId/xiCHf8Ygh3/GIId/xiCHf8Ygh3/GIId/xiC
+        Hf8Ygh3/GIId/xiCHf8Ygh3/GIId/xiCHf8YgBz/DEcP/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQT/BAUF/wQFBf8mtyv/H5Yk/xuJIP8biSD/G4kg/xuJIP8biSD/G4kg/xuJIP8biSD/G4kg/xuJ
+        IP8biSD/G4kg/xuJIP8biSD/G4kg/xuJIP8biSD/G4kg/xmAHf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/ya4K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8mtyv/JrYr/ya2K/8mtiv/JrYr/ya2K/8mtiv/JbYr/ya2K/8ltiv/G4of/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/Jrgr/ya3K/8mtyv/Jrcr/ya3K/8mtyv/Jrcr/ya3
+        K/8ltSv/FG4Y/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8jqij/Jrcr/ya3K/8mtyz/Jrcs/ya3
+        K/8mtyv/JrYr/xVxGf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wk9DP8Wdxr/Fnka/xZ5
+        G/8WeRr/Fnka/xZ5Gv8PWhP/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUE/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBP8EBQT/BAUE/wQFBP8EBQT/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUE/wQFBP8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        BP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBP8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQT/BAUF/wQFBf8ahx7/DU8Q/wQFBf8EBQX/BAUE/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8IMQr/JLIq/xyTIf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8SYxX/Hpci/x6XIv8dlyL/Hpci/x6XIv8Ygh3/HI4g/yW2K/8ltSr/D1cS/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/GoYe/ySuKf8XeRv/F3wb/xd6G/8Xehv/FXUa/yOtKP8PWhP/GH8c/yGo
+        J/8EBQX/BAUF/wQFBf8EBQX/BAUF/xd6G/8hpCb/FnYZ/xd/HP8XfRv/Fnka/xV0Gf8emSP/BAUF/wg4
+        C/8ltSv/BAUF/wQFBf8EBQX/BAUF/wQFBf8Ubhj/IaUm/xd+HP8dliL/G44g/xmIHv8PWxP/I68p/xyP
+        If8hoib/HZUi/wcwCf8EBQX/BAUF/wQFBf8EBQX/EV8U/yGlJv8TbBf/E2wX/xNuF/8TbRf/HZUi/xqG
+        Hv8aiB//GoYf/x+aJP8RYhX/BAUF/wQFBf8EBQX/BAUF/w1ND/8jqyj/E2sX/xd5G/8VdBn/FHAZ/yCg
+        Jf8ltyv/JbYr/yW3K/8mtyv/FXQZ/wQFBf8EBQX/BAUF/wQFBf8LRA7/H5kj/yCfJf8gnyX/IJ8l/yCf
+        Jf8gnyX/H58l/yCfJf8fnyX/H58l/xBdE/8EBQX/BAUF/wQFBf8EBQX/GoYe/yKlJ/8hoib/IaIm/yGi
+        Jv8hoib/IaIm/yGiJv8hoib/IaIm/x2UIv8EBQX/BAUF/wQFBf8EBQX/BAUF/xmBHf8mtyv/Jrcr/ya3
+        K/8iqCf/CTgL/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8FHgf/D1cS/w9Y
+        Ev8PWBL/By0J/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQF
+        Bf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUF/wQFBf8EBQX/BAUE/wQFBf8AAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+</value>
+  </data>
+</root>

+ 69 - 0
qfu/qfu.gui/qfu.gui.csproj

@@ -0,0 +1,69 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>WinExe</OutputType>
+    <TargetFramework>net9.0-windows</TargetFramework>
+	<RuntimeIdentifier>win-x64</RuntimeIdentifier>
+    <Nullable>enable</Nullable>
+    <UseWindowsForms>true</UseWindowsForms>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Title>Quadarax Filesystem Utils GUI</Title>
+    <Authors>Dalibor Votruba</Authors>
+    <Company>Quadarax</Company>
+    <Product>QFU</Product>
+    <Description>GUI interface for Quadarax Filesystem Utility </Description>
+    <Copyright>Quadarax © 2025</Copyright>
+    <PackageProjectUrl>https://quadarax.com/qfu</PackageProjectUrl>
+    <PackageIcon>qfu.ico</PackageIcon>
+    <PackageReadmeFile>readme.md</PackageReadmeFile>
+    <PackageTags>FILE, UTILITY, GUI, TOOL</PackageTags>
+    <RootNamespace>qdr.app.tools.qfu.gui</RootNamespace>
+	<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
+    <ForceDesignerDpiUnaware>true</ForceDesignerDpiUnaware>
+    <Platforms>AnyCPU;x64</Platforms>
+    <ApplicationIcon>qfu.ico</ApplicationIcon>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <None Remove="qfu.png" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="qfu.ico" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="..\qfu.ico">
+      <Pack>True</Pack>
+      <PackagePath>\</PackagePath>
+    </None>
+    <None Include="readme.md">
+      <Pack>True</Pack>
+      <PackagePath>\</PackagePath>
+    </None>
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\qfu\qfu.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Resource Include="qfu.png" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Properties\Resources.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Update="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+
+</Project>

binární
qfu/qfu.gui/qfu.ico


binární
qfu/qfu.gui/qfu.png


+ 0 - 0
qfu/qfu.gui/readme.md


+ 8 - 2
qfu/qfu.sln

@@ -1,9 +1,11 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 17
-VisualStudioVersion = 17.14.36127.28 d17.14
+VisualStudioVersion = 17.14.36127.28
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "qfu", "qfu.csproj", "{AB1CC122-C154-4492-B63B-987E75A0FB33}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "qfu", "qfu\qfu.csproj", "{AB1CC122-C154-4492-B63B-987E75A0FB33}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "qfu.gui", "qfu.gui\qfu.gui.csproj", "{D53FE700-5CE8-41FC-ADDE-E305775DD1AB}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
 		{AB1CC122-C154-4492-B63B-987E75A0FB33}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{AB1CC122-C154-4492-B63B-987E75A0FB33}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{AB1CC122-C154-4492-B63B-987E75A0FB33}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D53FE700-5CE8-41FC-ADDE-E305775DD1AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D53FE700-5CE8-41FC-ADDE-E305775DD1AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D53FE700-5CE8-41FC-ADDE-E305775DD1AB}.Release|Any CPU.ActiveCfg = Release|x64
+		{D53FE700-5CE8-41FC-ADDE-E305775DD1AB}.Release|Any CPU.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 0 - 0
qfu/Commands/Aspects/DryAspect.cs → qfu/qfu/Commands/Aspects/DryAspect.cs


+ 0 - 0
qfu/Commands/Aspects/EmptyAspect.cs → qfu/qfu/Commands/Aspects/EmptyAspect.cs


+ 0 - 0
qfu/Commands/Aspects/ExcludeAspect.cs → qfu/qfu/Commands/Aspects/ExcludeAspect.cs


+ 0 - 0
qfu/Commands/Aspects/FilesAspect.cs → qfu/qfu/Commands/Aspects/FilesAspect.cs


+ 0 - 0
qfu/Commands/Aspects/FilterAspect.cs → qfu/qfu/Commands/Aspects/FilterAspect.cs


+ 0 - 0
qfu/Commands/Aspects/ForceAspect.cs → qfu/qfu/Commands/Aspects/ForceAspect.cs


+ 0 - 0
qfu/Commands/Aspects/ListAspect.cs → qfu/qfu/Commands/Aspects/ListAspect.cs


+ 0 - 0
qfu/Commands/Aspects/ScopeAspect.cs → qfu/qfu/Commands/Aspects/ScopeAspect.cs


+ 0 - 0
qfu/Commands/Aspects/SourceAspect.cs → qfu/qfu/Commands/Aspects/SourceAspect.cs


+ 0 - 0
qfu/Commands/Aspects/SubdirsAspect.cs → qfu/qfu/Commands/Aspects/SubdirsAspect.cs


+ 0 - 0
qfu/Commands/BaseCmd.cs → qfu/qfu/Commands/BaseCmd.cs


+ 0 - 0
qfu/Commands/ClearDirCmd.cs → qfu/qfu/Commands/ClearDirCmd.cs


+ 0 - 0
qfu/Commands/CloneCmd.cs → qfu/qfu/Commands/CloneCmd.cs


+ 0 - 0
qfu/Commands/ImgListCmd.cs → qfu/qfu/Commands/ImgListCmd.cs


+ 33 - 0
qfu/qfu/ConsoleRunner.cs

@@ -0,0 +1,33 @@
+using Quadarax.Foundation.Core.QConsole;
+using Quadarax.Foundation.Core.QConsole.Configuration;
+using Quadarax.Foundation.Core.Reflection.Extensions;
+using System.IO.Abstractions;
+using System.Reflection;
+
+namespace qdr.app.tools.qfu
+{
+    public static class ConsoleRunner
+    {
+        public static void Run(string[] args)
+        {
+            var consoleVersion = Assembly.GetExecutingAssembly()?.GetName()?.Version;
+            if (consoleVersion != null)
+            {
+                var config = new StartupConfiguration("Quadarax Filesystem Tools", consoleVersion)
+                {
+                    ConsoleCopyright = Assembly.GetExecutingAssembly().GetCopyright(),
+                    AllowInteractive = false,
+                    WaitOnKeyInNonInteractiveMode = false,
+                    CommandDefinitionAssembly = new Assembly[] { Assembly.GetExecutingAssembly()! }
+                };
+                config.DisableDefaultCommands();
+                config.ShowStatusOnEveryCommand = false;
+                config.IsConsoleDebug = false;
+
+                var console = new Engine(config, new QfuEngineContext(new FileSystem()), args);
+                console.Start();
+
+            }
+        }
+    }
+}

+ 8 - 0
qfu/qfu/GlobalSuppressions.cs

@@ -0,0 +1,8 @@
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project.
+// Project-level suppressions either have no target or are given
+// a specific target and scoped to a namespace, type, member, etc.
+
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>", Scope = "member", Target = "~M:qdr.app.tools.qfu.Commands.ImgListCmd.GetImageInfo(System.String)~qdr.app.tools.qfu.Commands.ImgListCmd.ImageInfo")]

+ 6 - 0
qfu/qfu/Program.cs

@@ -0,0 +1,6 @@
+// See https://aka.ms/new-console-template for more information
+using qdr.app.tools.qfu;
+using Quadarax.Foundation.Core.QConsole;
+
+
+ConsoleRunner.Run(Engine.GetCurrentCommandLine());

+ 3 - 4
qfu/Properties/PublishProfiles/FolderProfile.pubxml → qfu/qfu/Properties/PublishProfiles/FolderProfile.pubxml

@@ -4,14 +4,13 @@
   <PropertyGroup>
     <Configuration>Release</Configuration>
     <Platform>Any CPU</Platform>
-    <PublishDir>D:\Deploy</PublishDir>
+    <PublishDir>D:\Deploy\qfu</PublishDir>
     <PublishProtocol>FileSystem</PublishProtocol>
     <_TargetId>Folder</_TargetId>
     <TargetFramework>net9.0</TargetFramework>
     <RuntimeIdentifier>win-x64</RuntimeIdentifier>
-    <SelfContained>true</SelfContained>
-    <PublishSingleFile>true</PublishSingleFile>
+    <SelfContained>false</SelfContained>
+    <PublishSingleFile>false</PublishSingleFile>
     <PublishReadyToRun>true</PublishReadyToRun>
-    <PublishTrimmed>false</PublishTrimmed>
   </PropertyGroup>
 </Project>

+ 4 - 0
qfu/Properties/launchSettings.json → qfu/qfu/Properties/launchSettings.json

@@ -18,6 +18,10 @@
     "qfu cleardir": {
       "commandName": "Project",
       "commandLineArgs": "cleardir direcories testdir -s -dry"
+    },
+    "qfu img_list": {
+      "commandName": "Project",
+      "commandLineArgs": "img_list \"D:\\\\Temp\\Foo.out\\Foto 15x23cm\" -dbg\r\n"
     }
   }
 }

+ 0 - 0
qfu/QfuCommandContext.cs → qfu/qfu/QfuCommandContext.cs


+ 0 - 0
qfu/QfuEngineContext.cs → qfu/qfu/QfuEngineContext.cs


+ 11 - 4
qfu/qfu.csproj → qfu/qfu/qfu.csproj

@@ -8,19 +8,26 @@
     <Title>Quadarax Filesystem Utility</Title>
     <Authors>Quadarax</Authors>
     <Company>Quadarax</Company>
-    <Description>Quadarax Filesystem Utility to privide operations and manipulations with directory and files</Description>
+    <Description>Quadarax Filesystem Utility to provide operations and manipulations with directory and files</Description>
     <Copyright>Quadarax © 2025</Copyright>
     <PackageProjectUrl>https://quadarax.com/qfu</PackageProjectUrl>
-    <PackageIcon>qfu.ico</PackageIcon>
-    <PackageTags>FILE, UTILITY</PackageTags>
+    <PackageIcon>..\qfu.ico</PackageIcon>
+    <PackageTags>FILE, UTILITY, TOOL</PackageTags>
     <RootNamespace>qdr.app.tools.qfu</RootNamespace>
     <SignAssembly>True</SignAssembly>
     <AssemblyOriginatorKeyFile>D:\Projects\quadarax\qdr.app\qdr.app.tools\bo_strong_key_pair.snk</AssemblyOriginatorKeyFile>
     <PackageReadmeFile>readme.md</PackageReadmeFile>
+    <Product>QFU</Product>
+    <ApplicationIcon>qfu.ico</ApplicationIcon>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="qdr.fnd.core.qconsole" Version="0.0.7-alpha" />
+    <Content Include="qfu.ico" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="qdr.fnd.core" Version="0.0.10-alpha" />
+    <PackageReference Include="qdr.fnd.core.qconsole" Version="0.0.8-alpha" />
     <PackageReference Include="System.Drawing.Common" Version="9.0.6" />
   </ItemGroup>
 

binární
qfu/qfu/qfu.ico


+ 5 - 1
qfu/releasenotes.md → qfu/qfu/releasenotes.md

@@ -1,3 +1,7 @@
+# 1.0.1.
+ 20.6.2025
+- Fix to define wrong filelist file (when you change ordinal position of arguments). Check if filelist file is correct.
+
 # 1.0.0.
  17.6.2025
 - Initial version
@@ -7,4 +11,4 @@
 - Added comprehensive error handling and progress reporting
 - Implemented dry run mode for safe testing
 - Added pattern matching and filtering capabilities
-- Added img_list_ command to list image files with metadata
+- Added img_list_ command to list image files with metadata

+ 0 - 0
qfu/test_genstruct.cmd → qfu/qfu/test_genstruct.cmd