From 9ce856b79dd175a9a51d8209cec6b168fc946220 Mon Sep 17 00:00:00 2001 From: Asval Date: Wed, 14 Aug 2019 16:15:06 +0200 Subject: [PATCH] added support for multiple userfacingflags and "BuiltInEmote" uff + button to delete current custom banner + less resources + fixed README.md --- FModel/FModel.csproj | 16 +- FModel/Forms/Settings.Designer.cs | 57 ++++--- FModel/Forms/Settings.cs | 27 +++- .../IconGenerator/ItemGenerator/DrawText.cs | 153 +++++++++++++++--- .../IconGenerator/ItemGenerator/ItemIcon.cs | 1 - FModel/Properties/Resources.Designer.cs | 40 ----- FModel/Properties/Resources.resx | 12 -- FModel/Resources/T-Icon-Adaptive-64.png | Bin 2690 -> 0 bytes FModel/Resources/T-Icon-Animated-64.png | Bin 1286 -> 0 bytes FModel/Resources/T-Icon-Traversal-64.png | Bin 1146 -> 0 bytes FModel/Resources/T-Icon-Variant-64.png | Bin 1644 -> 0 bytes README.md | 18 +-- 12 files changed, 201 insertions(+), 123 deletions(-) delete mode 100644 FModel/Resources/T-Icon-Adaptive-64.png delete mode 100644 FModel/Resources/T-Icon-Animated-64.png delete mode 100644 FModel/Resources/T-Icon-Traversal-64.png delete mode 100644 FModel/Resources/T-Icon-Variant-64.png diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 61026afe..48ddc559 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -236,19 +236,19 @@ ResXFileCodeGenerator - Resources.Designer.cs Designer + Resources.Designer.cs - - True - Resources.resx - True - SettingsSingleFileGenerator Settings.Designer.cs + + True + True + Resources.resx + True Settings.settings @@ -290,10 +290,6 @@ - - - - diff --git a/FModel/Forms/Settings.Designer.cs b/FModel/Forms/Settings.Designer.cs index 293fa5d3..988f4bce 100644 --- a/FModel/Forms/Settings.Designer.cs +++ b/FModel/Forms/Settings.Designer.cs @@ -38,6 +38,8 @@ namespace FModel.Forms this.label1 = new System.Windows.Forms.Label(); this.OKButton = new System.Windows.Forms.Button(); this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); this.comboBox1 = new System.Windows.Forms.ComboBox(); this.label10 = new System.Windows.Forms.Label(); this.checkBox8 = new System.Windows.Forms.CheckBox(); @@ -60,8 +62,7 @@ namespace FModel.Forms this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.textBox6 = new System.Windows.Forms.TextBox(); this.label12 = new System.Windows.Forms.Label(); - this.comboBox2 = new System.Windows.Forms.ComboBox(); - this.label2 = new System.Windows.Forms.Label(); + this.button5 = new System.Windows.Forms.Button(); this.groupBox3.SuspendLayout(); this.groupBox2.SuspendLayout(); this.groupBox4.SuspendLayout(); @@ -174,6 +175,28 @@ namespace FModel.Forms this.groupBox4.TabStop = false; this.groupBox4.Text = "Icon Creation"; // + // comboBox2 + // + this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Items.AddRange(new object[] { + "Default", + "Flat"}); + this.comboBox2.Location = new System.Drawing.Point(85, 48); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(294, 21); + this.comboBox2.TabIndex = 31; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.ComboBox2_SelectedIndexChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 51); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(73, 13); + this.label2.TabIndex = 30; + this.label2.Text = "Rarity Design:"; + // // comboBox1 // this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -304,6 +327,7 @@ namespace FModel.Forms // // groupBox6 // + this.groupBox6.Controls.Add(this.button5); this.groupBox6.Controls.Add(this.button3); this.groupBox6.Controls.Add(this.button2); this.groupBox6.Controls.Add(this.label7); @@ -422,27 +446,15 @@ namespace FModel.Forms this.label12.TabIndex = 9; this.label12.Text = "Watermark:"; // - // comboBox2 + // button5 // - this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox2.FormattingEnabled = true; - this.comboBox2.Items.AddRange(new object[] { - "Default", - "Flat"}); - this.comboBox2.Location = new System.Drawing.Point(85, 48); - this.comboBox2.Name = "comboBox2"; - this.comboBox2.Size = new System.Drawing.Size(294, 21); - this.comboBox2.TabIndex = 31; - this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.ComboBox2_SelectedIndexChanged); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(6, 51); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(73, 13); - this.label2.TabIndex = 30; - this.label2.Text = "Rarity Design:"; + this.button5.Location = new System.Drawing.Point(168, 48); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(124, 23); + this.button5.TabIndex = 34; + this.button5.Text = "Delete Current Banner"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.Button5_Click); // // Settings // @@ -514,5 +526,6 @@ namespace FModel.Forms private System.Windows.Forms.Label label7; private System.Windows.Forms.ComboBox comboBox2; private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button button5; } } diff --git a/FModel/Forms/Settings.cs b/FModel/Forms/Settings.cs index d068e9db..de85cdeb 100644 --- a/FModel/Forms/Settings.cs +++ b/FModel/Forms/Settings.cs @@ -34,7 +34,6 @@ namespace FModel.Forms { textBox6.Text = "@UseTheWatermarkBecauseWhyNot - {Date}"; } - else { textBox6.Text = Properties.Settings.Default.challengesWatermark; } checkBox_tryToOpen.Checked = Properties.Settings.Default.tryToOpenAssets; @@ -55,12 +54,16 @@ namespace FModel.Forms button3.Enabled = Properties.Settings.Default.isChallengesTheme; button4.Enabled = Properties.Settings.Default.isChallengesTheme; checkBox2.Checked = Properties.Settings.Default.isChallengesTheme; - trackBar3.Enabled = Properties.Settings.Default.isChallengesTheme; + trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); + button5.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); trackBar3.Value = Properties.Settings.Default.challengesOpacity; string[] colorParts = Properties.Settings.Default.challengesColors.Split(','); headerColor = Color.FromArgb(255, Int32.Parse(colorParts[0]), Int32.Parse(colorParts[1]), Int32.Parse(colorParts[2])); - if (File.Exists(Properties.Settings.Default.challengesBannerFileName)) { drawChallengeTemplate(headerColor, true); } - else { pictureBox1.Image = Resources.cTemplate; } + if (!checkBox2.Checked) + { + pictureBox1.Image = Resources.cTemplate; + } + else { drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); } //FEATURED checkBox8.Checked = Properties.Settings.Default.loadFeaturedImage; @@ -292,7 +295,7 @@ namespace FModel.Forms { button3.Enabled = checkBox2.Checked; button4.Enabled = checkBox2.Checked; - trackBar3.Enabled = checkBox2.Checked; + trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); if (!checkBox2.Checked) { @@ -423,6 +426,9 @@ namespace FModel.Forms Properties.Settings.Default.Save(); drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); + + trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); + button5.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); } } @@ -441,5 +447,16 @@ namespace FModel.Forms { bmp.Dispose(); } + + private void Button5_Click(object sender, EventArgs e) + { + Properties.Settings.Default.challengesBannerFileName = ""; + Properties.Settings.Default.Save(); + + drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); + + trackBar3.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); + button5.Enabled = File.Exists(Properties.Settings.Default.challengesBannerFileName); + } } } diff --git a/FModel/Methods/IconGenerator/ItemGenerator/DrawText.cs b/FModel/Methods/IconGenerator/ItemGenerator/DrawText.cs index e8b6d90e..c2d31bfd 100644 --- a/FModel/Methods/IconGenerator/ItemGenerator/DrawText.cs +++ b/FModel/Methods/IconGenerator/ItemGenerator/DrawText.cs @@ -5,6 +5,7 @@ using Newtonsoft.Json.Linq; using System.Drawing; using System.Linq; using System.IO; +using System.Collections.Generic; namespace FModel { @@ -18,12 +19,13 @@ namespace FModel private static string ItemAction { get; set; } private static string WeaponDataTable { get; set; } private static string WeaponRowName { get; set; } - private static string CosmeticUff { get; set; } + private static string[] CosmeticUff { get; set; } private static string HeroType { get; set; } private static string DefenderType { get; set; } private static string MinToMax { get; set; } private static JArray cosmeticsSetsArray { get; set; } private static JArray weaponsStatsArray { get; set; } + private static JArray tertiaryCategoriesArray { get; set; } private static string weaponStatsFilename { get; set; } public static void DrawTexts(JToken theItem, Graphics myGraphic, string mode) @@ -95,7 +97,7 @@ namespace FModel ItemAction = ""; WeaponDataTable = ""; WeaponRowName = ""; - CosmeticUff = ""; + CosmeticUff = null; HeroType = ""; DefenderType = ""; MinToMax = ""; @@ -162,10 +164,14 @@ namespace FModel ItemAction = athenaItemAction.Value().Substring(18); } - JToken userFacingFlags = gameplayTagsArray.Children().FirstOrDefault(x => x.ToString().StartsWith("Cosmetics.UserFacingFlags.")); + IEnumerable userFacingFlags = gameplayTagsArray.Children().Where(x => x.ToString().StartsWith("Cosmetics.UserFacingFlags.")); if (userFacingFlags != null) { - CosmeticUff = userFacingFlags.Value(); + CosmeticUff = new string[userFacingFlags.Count()]; + for (int i = 0; i < CosmeticUff.Length; i++) + { + CosmeticUff[i] = userFacingFlags.ElementAt(i).Value().Substring("Cosmetics.UserFacingFlags.".Length); + } } JToken defenderType = gameplayTagsArray.Children().FirstOrDefault(x => x.ToString().StartsWith("NPC.CharacterType.Survivor.Defender.")); @@ -226,37 +232,136 @@ namespace FModel } } + private static void DrawCosmeticUff(JToken theItem, Graphics myGraphic) + { + if (tertiaryCategoriesArray == null) + { + string extractedCosmeticsSetsPath = JohnWick.ExtractAsset(ThePak.AllpaksDictionary["ItemCategories"], "ItemCategories"); + if (extractedCosmeticsSetsPath != null) + { + if (extractedCosmeticsSetsPath.Contains(".uasset") || extractedCosmeticsSetsPath.Contains(".uexp") || extractedCosmeticsSetsPath.Contains(".ubulk")) + { + JohnWick.MyAsset = new PakAsset(extractedCosmeticsSetsPath.Substring(0, extractedCosmeticsSetsPath.LastIndexOf('.'))); + try + { + if (JohnWick.MyAsset.GetSerialized() != null) + { + dynamic AssetData = JsonConvert.DeserializeObject(JohnWick.MyAsset.GetSerialized()); + JToken tertiaryCategories = AssetData[0]["TertiaryCategories"]; + if (tertiaryCategories != null) + { + tertiaryCategoriesArray = tertiaryCategories.Value(); + DrawCosmeticUffFromArray(theItem, myGraphic); + } + } + } + catch (JsonSerializationException) + { + //do not crash when JsonSerialization does weird stuff + } + } + } + } + else { DrawCosmeticUffFromArray(theItem, myGraphic); } + } /// /// search for a known Cosmetics.UserFacingFlags, if found draw the uff icon /// Cosmetics.UserFacingFlags icons are basically the style icon or the animated/reactive/traversal icon /// /// /// - private static void DrawCosmeticUff(JToken theItem, Graphics myGraphic) + private static void DrawCosmeticUffFromArray(JToken theItem, Graphics myGraphic) { - Image imageLogo = null; - Point pointCoords = new Point(6, 6); - if (CosmeticUff != null) { - if (CosmeticUff.Contains("Animated")) - imageLogo = Resources.Animated64; - else if (CosmeticUff.Contains("HasUpgradeQuests") && !theItem["export_type"].Value().Equals("AthenaPetCarrierItemDefinition")) - imageLogo = Resources.Quests64; - else if (CosmeticUff.Contains("HasUpgradeQuests") && theItem["export_type"].Value().Equals("AthenaPetCarrierItemDefinition")) - imageLogo = Resources.Pets64; - else if (CosmeticUff.Contains("HasVariants")) - imageLogo = Resources.Variant64; - else if (CosmeticUff.Contains("Reactive")) - imageLogo = Resources.Adaptive64; - else if (CosmeticUff.Contains("Traversal")) - imageLogo = Resources.Traversal64; + int xCoord = 6; + for (int x = 0; x < tertiaryCategoriesArray.Count; x++) + { + JToken categoryName = tertiaryCategoriesArray[x]["CategoryName"]; + if (categoryName != null) + { + JToken text = categoryName["source_string"]; + if (text != null) + { + if (CosmeticUff.Any(target => target.Contains("Animated")) && string.Equals(text.Value(), "Animated")) + { + Image imageLogo = getUffFromBrush(x); + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + else if (CosmeticUff.Any(target => target.Contains("HasVariants")) && string.Equals(text.Value(), "Unlockable Styles")) + { + Image imageLogo = getUffFromBrush(x); + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + else if (CosmeticUff.Any(target => target.Contains("Reactive")) && string.Equals(text.Value(), "Reactive")) + { + Image imageLogo = getUffFromBrush(x); + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + else if (CosmeticUff.Any(target => target.Contains("Traversal")) && string.Equals(text.Value(), "Traversal")) + { + Image imageLogo = getUffFromBrush(x); + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + else if (CosmeticUff.Any(target => target.Contains("BuiltInEmote")) && string.Equals(text.Value(), "Built-in")) + { + Image imageLogo = getUffFromBrush(x); + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + else if (CosmeticUff.Any(target => target.Contains("HasUpgradeQuests")) && string.Equals(text.Value(), "Unlockable Styles") && !theItem["export_type"].Value().Equals("AthenaPetCarrierItemDefinition")) + { + Image imageLogo = Resources.Quests64; + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + else if (CosmeticUff.Any(target => target.Contains("HasUpgradeQuests")) && string.Equals(text.Value(), "Unlockable Styles") && theItem["export_type"].Value().Equals("AthenaPetCarrierItemDefinition")) + { + Image imageLogo = Resources.Pets64; + drawImageLogo(myGraphic, imageLogo, xCoord); + xCoord += 28; + } + } + } + } } - - if (imageLogo != null) + } + private static Image getUffFromBrush(int index) + { + JToken categoryBrush = tertiaryCategoriesArray[index]["CategoryBrush"]; + if (categoryBrush != null) { - myGraphic.DrawImage(ImageUtilities.ResizeImage(imageLogo, 28, 28), pointCoords); - imageLogo.Dispose(); + JToken brush_XXS = categoryBrush["Brush_XXS"]; + if (brush_XXS != null) + { + JToken resourceObject = brush_XXS["ResourceObject"]; + if (resourceObject != null) + { + string texture = JohnWick.AssetToTexture2D(resourceObject.Value()); + if (!string.IsNullOrEmpty(texture)) + { + return Image.FromFile(texture); + } + else { return null; } + } + else { return null; } + } + else { return null; } + } + else { return null; } + } + private static void drawImageLogo(Graphics myGraphic, Image logo, int x) + { + if (logo != null) + { + Point pointCoords = new Point(x, 6); + + myGraphic.DrawImage(ImageUtilities.ResizeImage(logo, 28, 28), pointCoords); + logo.Dispose(); } } diff --git a/FModel/Methods/IconGenerator/ItemGenerator/ItemIcon.cs b/FModel/Methods/IconGenerator/ItemGenerator/ItemIcon.cs index ad18be2a..ff4b76a3 100644 --- a/FModel/Methods/IconGenerator/ItemGenerator/ItemIcon.cs +++ b/FModel/Methods/IconGenerator/ItemGenerator/ItemIcon.cs @@ -3,7 +3,6 @@ using FModel.Properties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; -using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; diff --git a/FModel/Properties/Resources.Designer.cs b/FModel/Properties/Resources.Designer.cs index 4128625e..040753ad 100644 --- a/FModel/Properties/Resources.Designer.cs +++ b/FModel/Properties/Resources.Designer.cs @@ -60,26 +60,6 @@ namespace FModel.Properties { } } - /// - /// Recherche une ressource localisée de type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Adaptive64 { - get { - object obj = ResourceManager.GetObject("Adaptive64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Recherche une ressource localisée de type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Animated64 { - get { - object obj = ResourceManager.GetObject("Animated64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Recherche une ressource localisée de type System.Byte[]. /// @@ -310,16 +290,6 @@ namespace FModel.Properties { } } - /// - /// Recherche une ressource localisée de type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Traversal64 { - get { - object obj = ResourceManager.GetObject("Traversal64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Recherche une ressource localisée de type System.Drawing.Icon semblable à (Icône). /// @@ -350,16 +320,6 @@ namespace FModel.Properties { } } - /// - /// Recherche une ressource localisée de type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Variant64 { - get { - object obj = ResourceManager.GetObject("Variant64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Recherche une ressource localisée de type System.Drawing.Bitmap. /// diff --git a/FModel/Properties/Resources.resx b/FModel/Properties/Resources.resx index 281b8d53..891d868c 100644 --- a/FModel/Properties/Resources.resx +++ b/FModel/Properties/Resources.resx @@ -142,18 +142,6 @@ ..\Resources\FModel_Logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\T-Icon-Adaptive-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\T-Icon-Animated-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\T-Icon-Traversal-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\T-Icon-Variant-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\T-Icon-Quests-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/FModel/Resources/T-Icon-Adaptive-64.png b/FModel/Resources/T-Icon-Adaptive-64.png deleted file mode 100644 index 95b4789c8269251eaa65b99558cacf08bae87427..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2690 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 diff --git a/FModel/Resources/T-Icon-Animated-64.png b/FModel/Resources/T-Icon-Animated-64.png deleted file mode 100644 index eea5002db4e71624444b1409c754d5ae840138a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1286 zcmV+h1^N1kP)={A%cHoG zm6eq(#atL53=jqg18^wb!T@1_FhCf9L-7^{2m^!x!T=nKw=h5$APf)&;E-4MpdP9U zY20uuAfHO0?uD9x+cNU06mD71&u4&UG-40*;MNi>4e%p|)?_OIUGsjp*PF*U#&8W2 zSVB~_I0St|>Y#qcDEgt}GGfbRfJU^U8p{6;Ey1e74yYbnfnNfxXo8xBTLsi^jNue? z^!o%I*a|m$N2$v=4h<36Mgu&D15lGt<#3A{AnxJ!<5eiT-Zr?+qXy&n9KXY@1(#rD z8^F>CoyaI^0DHhTBr%OeL|s_91L$4y1yb;9hOVh=&B6a!wRS?|bYlu`diZ{9rgw1` zx3FH^07>X(bt8JfxQAEzxT?kgzJy;R+M)DNaSy+J%}3DZxz%C>y1&i#4EnHM)Bt;M z0+Ue7$d(4s!|U@uMjC!c(FA=?8RDu!4^r^^8V6C1%{Gd9tQR%Fi%3E@t8yKn7b&FS z){HjT_2LGoz%07pfA?F^2UU(jdK2fdnm@o^bU<&>zpzm{`EE?28~%-}c07m~DF4UF zURUBfT!PyUoPw^S;s(q$y_59IeKmi8r|>MMk!w3K3=QCyKnE(Y0A&ws*=r4O4uf#h z06(A>stkp+2tDIB$QVG&Br%Iz(#_w60el6&2E2|%+=9|MZtm-I_ziA5Fb}H?g|vwG z@F_9|cm)q*7P+LG*8sgp!EYa4gC1bB1L&9MHCVTGfS0i!bFkbS^wY=g#6{Qu?gbyh z8~779p>$4M=kY7t>M;VV6osU3#{1|(#sG)$BxYb`yJ4kwKnfZ`xfgr@N1<*)#a*uw z-57*hDTYx8rPqZtkLU3%G6pyReQ+AfP$kHg1{i_9d&<4wHoSwquuWq@CB8g6>v7W6^sbs@E* z3#<79s2A|WmVf>ms{9-FPe>zy6fQ!q-FD#wCXuajXv}V0hh<;SehkWyPjHIb%vC#;X&^zTrSSwKWE+}Mxr_qn~q6R2M6W+!ImQe=F zKS2Yi1oR`&iCI`0Kxxz_OhbP@$5oB1xB%sTy$+l~KH2%lk#TO^04j+iSim2!5mw-4 z1E>V_HaiQe1eQkFha1TDr*<{2LL>NJ?-)9fYdSyj;Z@WCZjaz4s7WaQyJy2#_hAA( z7=oL|J&ea;>EGpC1*-&gIE_Q_(>vC>j1O=fk!>`9N}v@@P-(c$pc>Y8 z4B`rg5LE(?p#e3BN)JDV6c%7<0ILqipg)!@4KRu`&@pSd3}7YD3>~YWqtXCsYRxc) zkZTR7hBb#Vj3X*{0G0CtM3v6~)>dc$H$AwO#_jAsAK-sg7$6J~1_%RiDBi*VVSq3| w7=T0Z76u3dgaN_;9E!IvKo}qlP}~Fj4YrfWm|&^&3;+NC07*qoM6N<$f>ZlMqW}N^ diff --git a/FModel/Resources/T-Icon-Traversal-64.png b/FModel/Resources/T-Icon-Traversal-64.png deleted file mode 100644 index 9ac1e6a4b5c1feeaf27e86c220f3c7868b843dba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1146 zcmV-=1cm#FP)i^n30=&6T<#_CBCGzX~& z+GsQ$>_O4?W@}$acENhGYKs_C+f8=+{RRHzpC`|3vh7USWabMWma?z&+u2FW&1SQd z=ZXP}0g3^N0l3L;#Q?0Rj~nXMn5e7fKg1sx(|Ku+2i-)9BhC(lpSDFeqhyV z05y##FoCv<4WKvN3(J3CU6_u-+JIe%H3ALLfI10%qg}|NSMV;vGjP!X`q~}f`%n5uztlsSUQ-!h@~s_5!e7PVF-Fo zmW`ng)}jOSB@OU2Do}oavv?1_J-7*BM=%Z>U@H!x3t6V0z!Y|%ibV(LOBz6@Y7fGu zu@Al%a4W1P)FkvX@Xg>xWSPDH?|2GF;j{baOB$dD8X?x(sKe5m+yTp8@NbO3_Y3Ys zmf8DT+o3bjT5x~T02S;+EFIKeupY)Eu$r*mgzs}ajx6)M{@4J@51>JOU*l(36+DMnAK(nEhj19a zGP0}z>pSeiADAy`0QEZ58u)&|1T2j;h*$@49M%n(f$w?_pgzSjn6K3U{m{XM102I= z@V!xr_bq;e?*wj#bv*~D;Xy3x4A_YZ!U2B6hwu%c8(}}eUxC#}cpg?6S=NB6p$F%2 zrPu)WfwtiRgw5eC_%zlgD0{w|#3%4+tYKLG@oCh6uZ}A2f||vZS`DDJdJ#5<vQ?P?q%N{_d|Fa0w03$dL%bzXwe02%$z^D858kYW@W`2MgHp92< z0dxV>=^CaFKZ+`>9`r)l^R0cDhNb)Ut;EilG-^QApwIO$d`k{st;H<}(-Z!|46JqN zMyx+khwn*jfLdyR3(y%RDtvqcKAm;?a_)v&aKK@$2I!RZMQp_(sHFxt2|IYTDhAjH z{cKdL0czL`->Miu+0Q6xfEu=78om`jfTc6QE}XuL&~N@8sFnvDwvq-ILhP^73E07_ zRXadGhT+p`-_~zFY$Xk#KZ9eibny4%KloPd0BR2Zql$Z>+B)E{l{UaB=s!Ak@G4gW z=tB4!e7PDxb-|ar0aC3PpctSSpcsIg{8kK53{VVE48To(%l!bC0o`<{ke4C(^b diff --git a/FModel/Resources/T-Icon-Variant-64.png b/FModel/Resources/T-Icon-Variant-64.png deleted file mode 100644 index 5f82477b45bf463a5d13b7c19c5dba6f8eca9c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcmV-y29x=TP)k!5G74)r2Uv_X zXhEJjupRrL3Vp&w4{#@5##-3MBTtuM+lIGr3WZek00%J-ZsU02EN<@zB0x<245Or4)o$E{kjiZQMIH4=mTv&lzRg`NVTPB;8)nv3~(1t!k4Z{ zy*RcK)FJ4D(_4}O8nFyE`vB?`-iNOmXuu9A_x4fQC)9#YxPwHs3e#b;w^yIwC}K-8 zKr5!e7CykY&=ZYI1E_bf4&mE}(-Yc?7omIuG~*$->Grm>Xh&?-23Uwk;1)iB?qC;s z5S1N39YF(pb>kk`;s&V43Pe30x36&kk@*IghSit^x2Ol~!*28=oI8M?^!Kev z&;wi40JYGEULB&IkJ|<8z-bK0H^5@(Yh@gK**oZlMyS?$yo;z_z!p?Xhi`xi4-jqu zUD$^q`386mD(L`fFZ5u(^n^RG1a7)*3*7sQN-v6gTiu_p0jM`Hq__d*Kr5?p@D;v; zoj8fO>=SlB4|Mg|_k9_0&A>{ymEg+`psTYNR~0wF)6n}>r5)f8Y)4%72{&U8)KYXp zh40VpIou96dw+2aKKwWz#`bP4xqLo>Z>tL`pR1eTb=>- z;~*+U4WReqJlOIKpu=y6`+I59Vb?$-*z|j8au0YI_H*aIq6S!rnaElhZdzQ+XGvG0 zu1L2MvUUPHQ7LMGR!l|K!gqKPpW+zOG#gK0BHT*I+8MN?Qq%w&FacS!ci0bo2p&b+ z!`n1MBlICy3zcVpOW1@;Q3C`fdpdMCx^Nn55P7PBnuaDcz>blnz&IrtV8|Z`)rTK& z0w*yN&A?3Dk2?4&!FCCoP$_DF4VVDikUu~=v|eRh;(FDuWx5*bp{pZm40nL@*o;b1 z1GHi)Z1xX~rbEY7i|`ok0B6vSN>KwmV~m+)u5{d7`T726K6G5Q&=_+u%UtQWG3F!V z6g5B-ls>)xLf%Sn8}fjm(*F4*-HJx2E>wydpy=EK=@sdQuLkIfvkmJL9EkyRAYD~D zylR85jZhjvuU56eay1+SOv4<<1h^#~z;+3}j?*Ztq6V-ZI1SLDYY;IMS)s8AK{sNOOT@^|L=rbeL7)b`u zLF?fj+HJH9;HCi*jZtlYXE7aaCFChE{sNP)@PU5Ahls4&0FUEgxLt1pe1k6#S+xOF zE2hA9Jq>Uc?T9VO0F77%+x0YneiC&Au_YNmEx~*gQDFQ9rkD<4FT5okK&?j|@)j6> zfyrMVwxDWh2B^gf)FDrS@fVnU>F~SIkE*2^Kxu?kn2f9i#$RBvcMcyQ(cx9v0hC5q zj<_qK+J|Id`~}8e+!NL-zZ;1Uud)oFd?Q?o0Wuw4WgWoQjQMaI=>ha<--%4+9YEcU z7EFN}sR7QS1HT}1MGRnDh3$VH`m2iX1@cr$Ks4=wFVu65QJ0 zYa`ssu<2iTy5tM{sZh}axYa{LG{7zG0Nv2Rdr)}8Ie<-X30)bpp>K~p@U;~BG(QHt q(z@h_t&tdDR5v!j*Z?>90RIBYd