add missing Translations, adjust spelling and newlines on some for better appearance

--- RelhaxModpack/RelhaxModpack/Translations/TranslationsEnglish.cs
+++ RelhaxModpack/RelhaxModpack/Translations/TranslationsEnglish.cs
@@ -53,6 +53,10 @@
             //example: downloading file x "at" 10MB/s
             English.Add("at", "at");

+            //Component: seconds
+            // Used for download progress. Remaining time. Example: X minutes, Y seconds.
+            English.Add("seconds", "seconds");
+
             //Component: minutes
             // Used for download progress (remaining time) AND AutoSyncFrequencyComboBox autoupdate check frequency comboBox (Minutes/Hours/Days).
             English.Add("minutes", "minutes");
@@ -207,6 +211,14 @@
             //
             English.Add("backupModsSizeCalculating", "Calculating backups size...");

+            //Component: BackupModsCBDescription
+            //
+            English.Add("BackupModsCBDescription", "When enabled, the installer will backup your current mods installation folders to the specified location");
+
+            //Component: BackupModsSizeLabelUsed
+            //
+            English.Add("BackupModsSizeLabelUsedDescription", "When enabled, the installer will backup your current mods installation folders to the specified location");
+
             //Component: SaveLastInstallText
             //
             English.Add("SaveLastInstallText", "Save selection of last install");
@@ -510,11 +522,15 @@
             //Component: ExportModeCBDescription
             //Explaining the export mode
             English.Add("ExportModeCBDescription", "Export mode will allow you to select a folder and WoT version you wish to export your mods installation to. For advanced users only." +
-                "Note it will NOT: Unpack game xml files, patch files (provided from the game), or create the atlas files. Instructions can be found in the export directory.");
+                "\nNote it will NOT: Unpack game xml files, patch files (provided from the game), or create the atlas files. Instructions can be found in the export directory.");

             //Component: ViewCreditsButtonText
             //
             English.Add("ViewCreditsButtonText", "View Credits");
+
+            //Component: ViewCreditsButtonText
+            //
+            English.Add("ViewCreditsButtonDescription", "See all the awesome people and projects that support the modpack!");

             //Component: ExportWindowDesctiption
             //
@@ -592,7 +608,7 @@
             English.Add("FacebookButtonDescription", "Go to our Facebook page");

             //Component: DiscordButtonDescription
-            English.Add("DiscordButtonDescription", "Go to Discord server");
+            English.Add("DiscordButtonDescription", "Go to our Discord server");

             //Component: TwitterButtonDescription
             English.Add("TwitterButtonDescription", "Go to our Twitter page");
@@ -1372,7 +1388,7 @@
             English.Add("DeleteBackupFolder", "Backups");

             //Component: installFailed
-            //Error message to show at the end of an unsucessfull instalaltion
+            //Error message to show at the end of an unsuccessful installation
             //"The installation failed at the following steps: {newline} {failed_steps_list}
             English.Add("installFailed", "The installation failed at the following steps");
             #endregion
@@ -1393,6 +1409,10 @@
             //Component: InstallationCompleteStartGameCenter
             //
             English.Add("InstallationCompleteStartGameCenter", "Start WG Game Center?");
+
+            //Component: InstallationCompleteOpenXVM
+            //
+            English.Add("InstallationCompleteOpenXVM", "Open the xvm login website?");

             //Component: InstallationCompleteCloseThisWindow
             //


ScadaProject: fix creating project

ScadaProject: fix creating project

--- ScadaAdmin/ScadaAdmin5/ScadaAdminCommon/Project/ScadaProject.cs
+++ ScadaAdmin/ScadaAdmin5/ScadaAdminCommon/Project/ScadaProject.cs
@@ -362,15 +362,12 @@

                 if (File.Exists(projectFileName))
                 {
-                    // template exists
+                    // load from template
                     project.Load(projectFileName);
+                    project.Description = "";
                 }
-                else
-                {
-                    // template doesn't exist
-                    project.Description = "";
-                    project.Save(project.FileName);
-                }
+
+                project.Save(project.FileName);

                 // create the necessary directories
                 Directory.CreateDirectory(projectDir);


Clean up status mock in tab completion tests

--- test/PoshGit2.TabCompletion.Tests/TabCompletionTests.cs
+++ test/PoshGit2.TabCompletion.Tests/TabCompletionTests.cs
@@ -78,7 +78,7 @@
         [Theory]
         public async Task ResultContains(string command, string expected)
         {
-            var completer = new TabCompleter(CreateStatus());
+            var completer = CreateTabCompleter();

             var fullResult = await completer.CompleteAsync(command, CancellationToken.None);
             var result = GetResult(fullResult);
@@ -273,18 +273,9 @@
         [Theory]
         public async Task CheckCompletion(string cmd, string[] expected)
         {
-            var completer = new TabCompleter(CreateStatus());
-
-            var fullResult = await completer.CompleteAsync(cmd, CancellationToken.None);
-            var result = GetResult(fullResult);
-
-            _log.WriteLine("Expected output:");
-            _log.WriteLine(string.Join(Environment.NewLine, expected));
-            _log.WriteLine(string.Empty);
-            _log.WriteLine("Actual output:");
-            _log.WriteLine(string.Join(Environment.NewLine, result));
-
-            Assert.Equal(expected.OrderBy(o => o, StringComparer.Ordinal), result);
+            var completer = CreateTabCompleter();
+
+            await CompareAsync(completer, cmd, expected.OrderBy(o => o, StringComparer.Ordinal));
         }

         // git add
@@ -331,11 +322,16 @@
         public async Task CheckCompletionWithQuotations(string cmd, string[] initialExpected)
         {
             const string quot = "\"";
-            var completer = new TabCompleter(CreateStatus(" "));
+            var completer = CreateTabCompleter(" ");
             var expected = initialExpected
                 .OrderBy(o => o, StringComparer.Ordinal)
                 .Select(o => o.Contains(" ") ? $"{quot}{o}{quot}" : o);

+            await CompareAsync(completer, cmd, expected);
+        }
+
+        private async Task CompareAsync(ITabCompleter completer, string cmd, IEnumerable<string> expected)
+        {
             var fullResult = await completer.CompleteAsync(cmd, CancellationToken.None);
             var result = GetResult(fullResult);

@@ -348,7 +344,7 @@
             Assert.Equal(expected, result);
         }

-        private static Task<IRepositoryStatus> CreateStatus(string join = "-")
+        private static ITabCompleter CreateTabCompleter(string join = "-")
         {
             var status = Substitute.For<IRepositoryStatus>();

@@ -376,7 +372,7 @@
             status.RemoteBranches.Returns(new[] { "origin/remotefeature", "origin/cutfeature" });
             status.Stashes.Returns(new[] { "stash", "wip" });

-            return Task.FromResult(status);
+            return new TabCompleter(Task.FromResult(status));
         }

         private IEnumerable<string> GetResult(TabCompletionResult fullResult)


Add named Semaphore to prevent multiple instances running concurrently

Signed-off-by: Owen Smith <ff5e3d9c9f82290ce2a1ee2b399fd0e8322eba85@citrix.com>

--- src/xenupdater/Program.cs
+++ src/xenupdater/Program.cs
@@ -34,6 +34,10 @@
 using System.Linq;
 using System.Text;
 using System.Security.Principal;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security.AccessControl;
+using System.Threading;

 namespace XenUpdater
 {
@@ -46,6 +50,10 @@
         }
         static int Main(string[] args)
         {
+            int result = -2;
+            if (SingleApp.IsRunning())
+                return -3;
+
             try
             {
                 bool add = false;
@@ -97,28 +105,63 @@
                     AutoUpdate auto = new AutoUpdate();
                     auto.CheckNow();
                 }
-                return 0;
+                result = 0;
             }
             catch (UnauthorizedAccessException e)
             {
                 System.Diagnostics.Debug.Print("Exception: " + e.ToString());
-                return (int)HRESULT.E_ACCESSDENIED;
+                result = (int)HRESULT.E_ACCESSDENIED;
             }
             catch (FormatException e)
             {
                 System.Diagnostics.Debug.Print("Exception: " + e.ToString());
-                return (int)HRESULT.E_INVALIDARG;
+                result = (int)HRESULT.E_INVALIDARG;
             }
             catch (Exception e)
             {
                 System.Diagnostics.Debug.Print("Exception: " + e.ToString());
-                return -1; // TODO: Return the HRESULT of this exception
+                result = -1; // TODO: Return the HRESULT of this exception
             }
+
+            SingleApp.Close();
+            return result;
         }

         static bool IsElevated()
         {
             return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
         }
+
+        internal static class SingleApp
+        {
+            internal static bool IsRunning()
+            {
+                string guid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();
+                var semaphoreName = @"Global\" + guid;
+                try
+                {
+                    __semaphore = Semaphore.OpenExisting(semaphoreName, SemaphoreRights.Synchronize);
+
+                    Close();
+                    return true;
+                }
+                catch
+                {
+                    __semaphore = new Semaphore(0, 1, semaphoreName);
+                    return false;
+                }
+            }
+
+            internal static void Close()
+            {
+                if (__semaphore != null)
+                {
+                    __semaphore.Close();
+                    __semaphore = null;
+                }
+            }
+
+            private static Semaphore __semaphore;
+        }
     }
 }


Update build script

Update build script

--- build/Build.cs
+++ build/Build.cs
@@ -48,35 +48,36 @@
             });

     Target Coverage => _ => _
-    .DependsOn(Compile)
-    .Executes(() =>
-    {
-        var testProjectDirectory = SourceDirectory / "Dangl.WebDocumentation.Tests";
+        .DependsOn(Compile)
+        .Requires(() => Configuration.EqualsOrdinalIgnoreCase("Debug")) // Required for coverage data gathering
+        .Executes(() =>
+        {
+            var testProjectDirectory = SourceDirectory / "Dangl.WebDocumentation.Tests";

-        DotCoverAnalyse(x => x
-            .SetTargetExecutable(GetToolPath())
-            .SetTargetWorkingDirectory(testProjectDirectory)
-            .SetTargetArguments($"xunit -nobuild \"-xml {OutputDirectory / "testresults.xml"}\"")
-            .SetFilters("+:Dangl.WebDocumentation")
-            .SetAttributeFilters("System.CodeDom.Compiler.GeneratedCodeAttribute")
-            .SetOutputFile(OutputDirectory / "dotCover.xml")
-            .SetReportType(DotCoverReportType.DetailedXml));
+            DotCoverAnalyse(x => x
+                .SetTargetExecutable(GetToolPath())
+                .SetTargetWorkingDirectory(testProjectDirectory)
+                .SetTargetArguments($"xunit -nobuild \"-xml {OutputDirectory / "testresults.xml"}\"")
+                .SetFilters("+:Dangl.WebDocumentation")
+                .SetAttributeFilters("System.CodeDom.Compiler.GeneratedCodeAttribute")
+                .SetOutputFile(OutputDirectory / "dotCover.xml")
+                .SetReportType(DotCoverReportType.DetailedXml));

-        //// This is the report that's pretty and visualized in Jenkins
-        ReportGenerator(c => c
-            .SetReports(OutputDirectory / "dotCover.xml")
-            .SetTargetDirectory(OutputDirectory / "CoverageReport"));
+            //// This is the report that's pretty and visualized in Jenkins
+            ReportGenerator(c => c
+                .SetReports(OutputDirectory / "dotCover.xml")
+                .SetTargetDirectory(OutputDirectory / "CoverageReport"));

-        //// This is the report in Cobertura format that integrates so nice in Jenkins
-        //// dashboard and allows to extract more metrics and set build health based
-        //// on coverage readings
-        DotCoverToCobertura(s => s
-                .SetInputFile(OutputDirectory / "dotCover.xml")
-                .SetOutputFile(OutputDirectory / "cobertura.xml"))
-            .ConfigureAwait(false)
-            .GetAwaiter()
-            .GetResult();
-    });
+            //// This is the report in Cobertura format that integrates so nice in Jenkins
+            //// dashboard and allows to extract more metrics and set build health based
+            //// on coverage readings
+            DotCoverToCobertura(s => s
+                    .SetInputFile(OutputDirectory / "dotCover.xml")
+                    .SetOutputFile(OutputDirectory / "cobertura.xml"))
+                .ConfigureAwait(false)
+                .GetAwaiter()
+                .GetResult();
+        });

     Target Publish => _ => _
         .DependsOn(Restore)


Use DotNetTasks in build.

Use DotNetTasks in build.

(cherry picked from commit 3090916723cf48eff04dc7b3f773e837ab6c707b)

--- build/Build.cs
+++ build/Build.cs
@@ -5,6 +5,7 @@
 using System;
 using System.Linq;
 using Nuke.Common.Git;
+using Nuke.Common.Tools.DotNet;
 using Nuke.Common.Tools.GitLink;
 using Nuke.Common.Tools.GitVersion;
 using Nuke.Common.Tools.InspectCode;
@@ -13,10 +14,9 @@
 using Nuke.Common.Tools.Xunit;
 using Nuke.Core;
 using Nuke.Core.Utilities.Collections;
+using static Nuke.Common.Tools.DotNet.DotNetTasks;
 using static Nuke.Common.Tools.GitLink.GitLinkTasks;
 using static Nuke.Common.Tools.InspectCode.InspectCodeTasks;
-using static Nuke.Common.Tools.MSBuild.MSBuildTasks;
-using static Nuke.Common.Tools.NuGet.NuGetTasks;
 using static Nuke.Common.Tools.OpenCover.OpenCoverTasks;
 using static Nuke.Common.Tools.Xunit.XunitTasks;
 using static Nuke.Core.IO.FileSystemTasks;
@@ -43,7 +43,7 @@
             .DependsOn(Clean)
             .Executes(() =>
             {
-                MSBuild(s => DefaultMSBuildRestore);
+                DotNetRestore(s => DefaultDotNetRestore.SetProjectFile (SolutionFile));
             });

     Target Compile => _ => _
@@ -51,7 +51,7 @@
             .Requires(() => IsUnix || GitVersion != null)
             .Executes(() =>
             {
-                MSBuild(s => DefaultMSBuildCompile);
+                DotNetBuild(s => DefaultDotNetCompile.SetProjectFile(SolutionFile).EnableNoRestore());
             });

     Target Link => _ => _
@@ -69,7 +69,7 @@
             .DependsOn(Link)
             .Executes(() =>
             {
-                MSBuild(s => DefaultMSBuildPack);
+                DotNetPack(s => DefaultDotNetPack.SetProject(SolutionFile).EnableNoBuild());
             });

     Target Push => _ => _
@@ -79,11 +79,10 @@
             {
                 GlobFiles(OutputDirectory, "*.nupkg")
                         .Where(x => !x.EndsWith("symbols.nupkg"))
-                        .ForEach(x => NuGetPush(s => s
+                        .ForEach(x => DotNetNuGetPush(s => s
                                 .SetTargetPath(x)
                                 .SetSource("https://www.myget.org/F/nukebuild/api/v2/package")
-                                .SetApiKey(MyGetApiKey)
-                                .SetVerbosity(NuGetVerbosity.Detailed)));
+                                .SetApiKey(MyGetApiKey)));
             });

     Target Analysis => _ => _


TSI-3202 : Ability to override taxonomy node sorting for derived implementations

--- Sdl.Web.Tridion/Navigation/CILImpl/DynamicNavigationProvider.cs
+++ Sdl.Web.Tridion/Navigation/CILImpl/DynamicNavigationProvider.cs
@@ -268,7 +268,7 @@
                 }

                 // Ensure that children are ordered correctly
-                taxonomyNode.Items = children.OrderBy(i => i.OriginalTitle).ToList();
+                taxonomyNode.Items = SortTaxonomyNodes(children);
             }
         }

@@ -366,7 +366,7 @@
             }

             // Ensure that merged child items are ordered correctly
-            subtreeToMergeInto.Items = mergedChildItems.OrderBy(i => i.OriginalTitle).ToList();
+            subtreeToMergeInto.Items = SortTaxonomyNodes(mergedChildItems);
         }

         protected string GetNavigationTaxonomyUri(ILocalization localization)
@@ -409,6 +409,9 @@
                 return CreateTaxonomyNode(taxonomyRoot, -1, navFilter, localization);
             }
         }
+
+        protected virtual List<SitemapItem> SortTaxonomyNodes(IList<SitemapItem> taxonomyNodes)
+            => taxonomyNodes.OrderBy(i => i.OriginalTitle).ToList();

         protected virtual TaxonomyNode CreateTaxonomyNode(Keyword keyword, int expandLevels, NavigationFilter filter, ILocalization localization)
         {
@@ -446,7 +449,7 @@
                     }
                 }

-                childItems = childItems.OrderBy(i => i.OriginalTitle).ToList();
+                childItems = SortTaxonomyNodes(childItems);
             }

             string sequencePrefix;


Android: added polyline support to renderer

--- UnifiedMap/UnifiedMap.Droid/UnifiedMapRenderer.cs
+++ UnifiedMap/UnifiedMap.Droid/UnifiedMapRenderer.cs
@@ -22,6 +22,8 @@
         private static Bundle _bundle;
         private readonly RendererBehavior _behavior;
         private readonly LinkedList<Tuple<Marker, MapPin>> _markers;
+        private readonly Dictionary<MapPolyline, Polyline> _polylines;
+
         private GoogleMap _googleMap;

         public UnifiedMapRenderer()
@@ -128,12 +130,26 @@

         public void AddPolyline(MapPolyline line)
         {
-            throw new NotImplementedException();
+            if (_googleMap != null)
+            {
+                var options = new PolylineOptions();
+                options.Add(line.Select(p => p.ToLatLng()).ToArray());
+                options.InvokeColor(line.StrokeColor.ToAndroid().ToArgb());
+                options.InvokeWidth(line.LineWidth);
+
+                var polyline = _googleMap.AddPolyline(options);
+                _polylines.Add(line, polyline);
+            }
         }

         public void RemovePolyline(MapPolyline line)
         {
-            throw new NotImplementedException();
+            Polyline polyline;
+            if (_polylines.TryGetValue(line, out polyline))
+            {
+                polyline.Remove();
+                _polylines.Remove(line);
+            }
         }

         public void FitAllAnnotations(bool animated)


:wrench: make auto-resetter available for internal builds

--- source/Utils/PeanutButter.Utils/AutoResetter.cs
+++ source/Utils/PeanutButter.Utils/AutoResetter.cs
@@ -1,6 +1,11 @@
 using System;

-namespace PeanutButter.Utils
+namespace
+#if BUILD_PEANUTBUTTER_INTERNAL
+    Imported.PeanutButter.Utils
+#else
+PeanutButter.Utils
+#endif
 {
     /// <summary>
     /// Provides a mechanism to run code on construction and disposal,
@@ -10,7 +15,12 @@
     /// and the using() pattern guarantees that your disposalAction is called at
     /// disposal, even if your test fails.
     /// </summary>
-    public class AutoResetter: IDisposable
+#if BUILD_PEANUTBUTTER_INTERNAL
+    internal
+#else
+public
+#endif
+        class AutoResetter : IDisposable
     {
         private readonly object _lock = new object();
         private Action _disposalAction;
@@ -42,4 +52,4 @@
             }
         }
     }
-}
+}


Fix the Administration panel.

Fix the Administration panel.

--- SmartphoneStore/SmartphoneStore.Web/Views/Shared/_Layout.cshtml
+++ SmartphoneStore/SmartphoneStore.Web/Views/Shared/_Layout.cshtml
@@ -28,15 +28,8 @@
                     }
                     @if (User.IsInRole("Admin"))
                     {
-

-                            <button class="btn btn-default" type="button" data-toggle="dropdown">
-                                Administration
-                            </button>
-

-
@Html.ActionLink("Manufacturers", "Index", "ManufacturersAdministration")

-
@Html.ActionLink("Smartphones", "Index", "SmartphonesAdministration")

-

-

+
@Html.ActionLink("Manufacturers Administration", "Index", "ManufacturersAdministration")

+
@Html.ActionLink("Smartphones Administration", "Index", "SmartphonesAdministration")

                     }

                 @Html.Partial("_LoginPartial")


Refs #1124 Alle leden worden meteen overgezet voor een kadergroep.

--- Solution/Chiro.Gap.WebApp/Controllers/JaarOvergangController.cs
+++ Solution/Chiro.Gap.WebApp/Controllers/JaarOvergangController.cs
@@ -48,7 +48,9 @@
             // Als we met een gewest/verbond te doen hebben, dan zijn de afdelingen niet relevant
             if (model.GroepsNiveau.HeeftNiveau(Niveau.KaderGroep))
             {
-                return Stap2AfdelingsJarenVerdelen(new JaarOvergangAfdelingsJaarModel(), groepID);
+                var postmodel = new JaarOvergangAfdelingsJaarModel();
+                postmodel.LedenMeteenInschrijven = true;
+                return Stap2AfdelingsJarenVerdelen(postmodel, groepID);
             }

             model.Titel = "Jaarovergang stap 1: welke afdelingen heeft je groep volgend jaar?";


Updated DranetzGraph to accommodate possible non-square graphs

--- Source/Applications/openMIC/openMIC/wwwroot/DranetzGraph.cshtml
+++ Source/Applications/openMIC/openMIC/wwwroot/DranetzGraph.cshtml
@@ -974,7 +974,8 @@
                         const isVoltage = phasor.phasorType === phasorType.voltage;
                         const voltageTolerance = 0.9;  // 10% (NEMA)
                         const currentTolerance = 0.85; // 15%
-                        const extent = width * (isVoltage ? voltageTolerance : currentTolerance);
+                        const xExtent = width * (isVoltage ? voltageTolerance : currentTolerance);
+                        const yExtent = height * (isVoltage ? voltageTolerance : currentTolerance);
                         const phaseValues = self.phasorRegisterMap[key];
                         const scale = isVoltage ? vNom : iNom;
                         const magnitudeRatio = isVoltage && phasor.lineType === lineType.lineToLine ? sqrt3 : 1.0;
@@ -986,8 +987,8 @@
                         phasor.angle = ko.pureComputed({ read: () => phasor.angleRegister.value() - referenceAngleRegister.value(), owner: self });
                         phasor.magnitude = ko.pureComputed({ read: () => phasor.magnitudeRegister.value() / magnitudeRatio, owner: self });
                         phasor.perUnit = ko.pureComputed({ read: () => phasor.magnitude() / scale, owner: self });
-                        phasor.x2 = ko.pureComputed({ read: () => width + extent * phasor.perUnit() * Math.cos(phasor.angle() * Math.PI / 180.0), owner: self });
-                        phasor.y2 = ko.pureComputed({ read: () => height - extent * phasor.perUnit() * Math.sin(phasor.angle() * Math.PI / 180.0), owner: self });
+                        phasor.x2 = ko.pureComputed({ read: () => width + xExtent * phasor.perUnit() * Math.cos(phasor.angle() * Math.PI / 180.0), owner: self });
+                        phasor.y2 = ko.pureComputed({ read: () => height - yExtent * phasor.perUnit() * Math.sin(phasor.angle() * Math.PI / 180.0), owner: self });
                         phasor.visible = ko.observable(true);

                         phasor.angleRegister.title = `${phasor.angleRegister.title}<br/>Raw Value: ${self.localeValue(phasor.angleRegister.value())}`;


PackageManager Uninstall Tweaks #CHANGE: Uninstalling a package no longer removes all versions of it from the local config, but only the uninstalled one specifically.

--- Source/Editor/DualityEditor/PackageManagement/PackageManager.cs
+++ Source/Editor/DualityEditor/PackageManagement/PackageManager.cs
@@ -882,7 +882,8 @@
 			this.SaveUpdateSchedule(updateSchedule);

 			// Update local package configuration file
-			this.setup.Packages.RemoveAll(p => p.Id == e.Package.Id);
+			PackageName packageName = new PackageName(e.Package.Id, e.Package.Version.Version);
+			this.setup.Packages.RemoveAll(p => p.PackageName == packageName);
 			this.setup.Save(this.env.ConfigFilePath);

 			this.OnPackageUninstalled(new PackageEventArgs(new PackageName(e.Package.Id, e.Package.Version.Version)));


GSF.PhasorProtocols: Updated IEEE C37.118 frame parser to accommodate configuration frame 3 operations.

--- Source/Libraries/GSF.PhasorProtocols/IEEEC37_118/FrameParser.cs
+++ Source/Libraries/GSF.PhasorProtocols/IEEEC37_118/FrameParser.cs
@@ -60,6 +60,14 @@
         public event EventHandler<EventArgs<ConfigurationFrame2>> ReceivedConfigurationFrame2;

         /// <summary>
+        /// Occurs when an IEEE C37.118 <see cref="ConfigurationFrame2"/> has been received.
+        /// </summary>
+        /// <remarks>
+        /// <see cref="EventArgs{T}.Argument"/> is the <see cref="ConfigurationFrame3"/> that was received.
+        /// </remarks>
+        public event EventHandler<EventArgs<ConfigurationFrame3>> ReceivedConfigurationFrame3;
+
+        /// <summary>
         /// Occurs when an IEEE C37.118 <see cref="DataFrame"/> has been received.
         /// </summary>
         /// <remarks>
@@ -88,6 +96,7 @@

         // Fields
         private ConfigurationFrame2 m_configurationFrame2;
+        private ConfigurationFrame3 m_configurationFrame3;
         private bool m_configurationChangeHandled;
         private long m_unexpectedCommandFrames;

@@ -101,7 +110,7 @@
         /// <param name="checkSumValidationFrameTypes">Frame types that should perform check-sum validation; default to <see cref="GSF.PhasorProtocols.CheckSumValidationFrameTypes.AllFrames"/></param>
         /// <param name="trustHeaderLength">Determines if header lengths should be trusted over parsed byte count.</param>
         /// <param name="draftRevision">The <see cref="IEEEC37_118.DraftRevision"/> of this <see cref="FrameParser"/>.</param>
-        public FrameParser(CheckSumValidationFrameTypes checkSumValidationFrameTypes = CheckSumValidationFrameTypes.AllFrames, bool trustHeaderLength = true, DraftRevision draftRevision = DraftRevision.Draft7)
+        public FrameParser(CheckSumValidationFrameTypes checkSumValidationFrameTypes = CheckSumValidationFrameTypes.AllFrames, bool trustHeaderLength = true, DraftRevision draftRevision = DraftRevision.Std2005)
             : base(checkSumValidationFrameTypes, trustHeaderLength)
         {
             // Initialize protocol synchronization bytes for this frame parser
@@ -123,8 +132,13 @@
         /// </remarks>
         public override IConfigurationFrame ConfigurationFrame
         {
-            get => m_configurationFrame2;
-            set => m_configurationFrame2 = CastToDerivedConfigurationFrame(value, DraftRevision);
+            get => (IConfigurationFrame)m_configurationFrame3 ?? m_configurationFrame2;
+            set
+            {
+                IConfigurationFrame configuration = CastToDerivedConfigurationFrame(value, DraftRevision);
+                m_configurationFrame2 = configuration as ConfigurationFrame2;
+                m_configurationFrame3 = configuration as ConfigurationFrame3;
+            }
         }

         /// <summary>
@@ -135,16 +149,7 @@
         /// <summary>
         /// Gets the IEEE C37.118 resolution of fractional timestamps of the current <see cref="ConfigurationFrame"/>, if one has been parsed.
         /// </summary>
-        public uint Timebase
-        {
-            get
-            {
-                if (m_configurationFrame2 is null)
-                    return 0;
-
-                return m_configurationFrame2.Timebase;
-            }
-        }
+        public uint Timebase => (ConfigurationFrame as ConfigurationFrame1)?.Timebase ?? 0;

         /// <summary>
         /// Gets flag that determines if this protocol parsing implementation uses synchronization bytes.
@@ -193,10 +198,10 @@
                 case DraftRevision.Draft6:
                     base.Start(new[] { typeof(DataFrame), typeof(ConfigurationFrame1Draft6), typeof(ConfigurationFrame2Draft6), typeof(HeaderFrame) });
                     break;
-                case DraftRevision.Draft7:
+                case DraftRevision.Std2005:
                     base.Start(new[] { typeof(DataFrame), typeof(ConfigurationFrame1), typeof(ConfigurationFrame2), typeof(HeaderFrame) });
                     break;
-                case DraftRevision.Draft8:
+                case DraftRevision.Std2011:
                     base.Start(new[] { typeof(DataFrame), typeof(ConfigurationFrame1), typeof(ConfigurationFrame2), typeof(ConfigurationFrame3), typeof(HeaderFrame) });
                     break;
             }
@@ -229,10 +234,10 @@
             if (length >= CommonFrameHeader.FixedLength)
             {
                 // Parse common frame header
-                CommonFrameHeader parsedFrameHeader = new CommonFrameHeader(m_configurationFrame2, buffer, offset);
+                CommonFrameHeader parsedFrameHeader = new CommonFrameHeader(ConfigurationFrame as ConfigurationFrame1, buffer, offset);

                 // Look for probable misaligned bad frame header parse
-                if (parsedFrameHeader.FrameType == FundamentalFrameType.Undetermined || parsedFrameHeader.Version > 3)
+                if (parsedFrameHeader.FrameType == FundamentalFrameType.Undetermined || parsedFrameHeader.Version > (byte)DraftRevision.LatestVersion)
                     throw new InvalidOperationException("Probable frame misalignment detected, forcing scan ahead to next sync byte");

                 // As an optimization, we also make sure entire frame buffer image is available to be parsed - by doing this
@@ -247,7 +252,7 @@
                     {
                         case FrameType.DataFrame:
                             // Assign data frame parsing state
-                            parsedFrameHeader.State = new DataFrameParsingState(parsedFrameHeader.FrameLength, m_configurationFrame2, DataCell.CreateNewCell, TrustHeaderLength, ValidateDataFrameCheckSum);
+                            parsedFrameHeader.State = new DataFrameParsingState(parsedFrameHeader.FrameLength, ConfigurationFrame, DataCell.CreateNewCell, TrustHeaderLength, ValidateDataFrameCheckSum);
                             break;
                         case FrameType.ConfigurationFrame1:
                         case FrameType.ConfigurationFrame2:
@@ -255,7 +260,7 @@
                             parsedFrameHeader.State = new ConfigurationFrameParsingState(parsedFrameHeader.FrameLength, ConfigurationCell.CreateNewCell, TrustHeaderLength, ValidateConfigurationFrameCheckSum);
                             break;
                         case FrameType.ConfigurationFrame3:
-                            // parsedFrameHeader.State = new ConfigurationFrameParsingState(parsedFrameHeader.FrameLength, ConfigurationCell3.CreateNewCell, TrustHeaderLength, ValidateConfigurationFrameCheckSum);
+                            parsedFrameHeader.State = new ConfigurationFrameParsingState(parsedFrameHeader.FrameLength, ConfigurationCell3.CreateNewCell, TrustHeaderLength, ValidateConfigurationFrameCheckSum);
                             break;
                         case FrameType.HeaderFrame:
                             // Assign header frame parsing state
@@ -276,15 +281,19 @@
         /// <param name="frame"><see cref="IConfigurationFrame"/> to send to <see cref="FrameParserBase{TypeIndentifier}.ReceivedConfigurationFrame"/> event.</param>
         protected override void OnReceivedConfigurationFrame(IConfigurationFrame frame)
         {
-            // We override this method so we can cache configuration 2 frame when it's received
+            // We override this method so we can cache configuration frame (2 or 3) when it's received
             base.OnReceivedConfigurationFrame(frame);

-            // Cache new configuration frame for parsing subsequent data frames...
-
-            if (frame is ConfigurationFrame2 configurationFrame2)
-                m_configurationFrame2 = configurationFrame2;
-
-            // TODO: Add handler for config3 frame
+            switch (frame)
+            {
+                // Cache new configuration frame for parsing subsequent data frames...
+                case ConfigurationFrame3 configurationFrame3:
+                    m_configurationFrame3 = configurationFrame3;
+                    break;
+                case ConfigurationFrame2 configurationFrame2:
+                    m_configurationFrame2 = configurationFrame2;
+                    break;
+            }
         }

         /// <summary>
@@ -335,7 +344,7 @@
             base.OnReceivedChannelFrame(frame);

             // Raise IEEE C37.118 specific channel frame events, if any have been subscribed
-            if (frame is null || ReceivedDataFrame is null && ReceivedConfigurationFrame2 is null && ReceivedConfigurationFrame1 is null && ReceivedHeaderFrame is null && ReceivedCommandFrame is null)
+            if (frame is null || ReceivedDataFrame is null && ReceivedConfigurationFrame3 is null && ReceivedConfigurationFrame2 is null && ReceivedConfigurationFrame1 is null && ReceivedHeaderFrame is null && ReceivedCommandFrame is null)
                 return;

             switch (frame)
@@ -343,6 +352,12 @@
                 case DataFrame dataFrame:
                 {
                     ReceivedDataFrame?.Invoke(this, new EventArgs<DataFrame>(dataFrame));
+                    break;
+                }
+                // Configuration frame type 3 is more specific than type 1 (and more common), so we check it first
+                case ConfigurationFrame3 configFrame3:
+                {
+                    ReceivedConfigurationFrame3?.Invoke(this, new EventArgs<ConfigurationFrame3>(configFrame3));
                     break;
                 }
                 // Configuration frame type 2 is more specific than type 1 (and more common), so we check it first
@@ -392,26 +407,26 @@

         // Attempts to cast given frame into an IEEE C37.118 configuration frame - theoretically this will
         // allow the same configuration frame to be used for any protocol implementation
-        internal static ConfigurationFrame2 CastToDerivedConfigurationFrame(IConfigurationFrame sourceFrame, DraftRevision draftRevision)
-        {
-            // See if frame is already an IEEE C37.118 configuration frame, type 2 (if so, we don't need to do any work)
-
-            if (!(sourceFrame is ConfigurationFrame2 derivedFrame))
-            {
-                // Create a new IEEE C37.118 configuration frame converted from equivalent configuration information
-                ConfigurationCell derivedCell;
-                IFrequencyDefinition sourceFrequency;
-
-                // Assuming configuration frame 2 and timebase = 100000
-                if (draftRevision == DraftRevision.Draft7)
-                    derivedFrame = new ConfigurationFrame2(100000, sourceFrame.IDCode, sourceFrame.Timestamp, sourceFrame.FrameRate);
-                else
-                    derivedFrame = new ConfigurationFrame2Draft6(100000, sourceFrame.IDCode, sourceFrame.Timestamp, sourceFrame.FrameRate);
+        internal static IConfigurationFrame CastToDerivedConfigurationFrame(IConfigurationFrame sourceFrame, DraftRevision draftRevision)
+        {
+            switch (sourceFrame)
+            {
+                // See if frame is already an IEEE C37.118 configuration frame 2 or 3
+                case ConfigurationFrame3 configurationFrame3:
+                    return configurationFrame3;
+                case ConfigurationFrame2 configurationFrame2:
+                    return configurationFrame2;
+            }
+
+            if (draftRevision == DraftRevision.Std2011)
+            {
+                // Handle configuration 3 frame as a special case:
+                ConfigurationFrame3 derivedFrame3 = new ConfigurationFrame3(100000, sourceFrame.IDCode, sourceFrame.Timestamp, sourceFrame.FrameRate);

                 foreach (IConfigurationCell sourceCell in sourceFrame.Cells)
                 {
                     // Create new derived configuration cell
-                    derivedCell = new ConfigurationCell(derivedFrame, sourceCell.IDCode, sourceCell.NominalFrequency);
+                    ConfigurationCell3 derivedCell = new ConfigurationCell3(derivedFrame3, sourceCell.IDCode, sourceCell.NominalFrequency);

                     string stationName = sourceCell.StationName;
                     string idLabel = sourceCell.IDLabel;
@@ -430,25 +445,86 @@

                     // Create equivalent derived phasor definitions
                     foreach (IPhasorDefinition sourcePhasor in sourceCell.PhasorDefinitions)
-                        derivedCell.PhasorDefinitions.Add(new PhasorDefinition(derivedCell, sourcePhasor.Label, sourcePhasor.ScalingValue, sourcePhasor.Offset, sourcePhasor.PhasorType, null));
+                        derivedCell.PhasorDefinitions.Add(new PhasorDefinition3(derivedCell, sourcePhasor.Label, sourcePhasor.ScalingValue, sourcePhasor.Offset, sourcePhasor.PhasorType, null));

                     // Create equivalent derived frequency definition
-                    sourceFrequency = sourceCell.FrequencyDefinition;
+                    IFrequencyDefinition sourceFrequency = sourceCell.FrequencyDefinition;

                     if (!(sourceFrequency is null))
                         derivedCell.FrequencyDefinition = new FrequencyDefinition(derivedCell, sourceFrequency.Label);

                     // Create equivalent derived analog definitions (assuming analog type = SinglePointOnWave)
                     foreach (IAnalogDefinition sourceAnalog in sourceCell.AnalogDefinitions)
-                        derivedCell.AnalogDefinitions.Add(new AnalogDefinition(derivedCell, sourceAnalog.Label, sourceAnalog.ScalingValue, sourceAnalog.Offset, sourceAnalog.AnalogType));
+                        derivedCell.AnalogDefinitions.Add(new AnalogDefinition3(derivedCell, sourceAnalog.Label, sourceAnalog.ScalingValue, sourceAnalog.Offset, sourceAnalog.AnalogType));

                     // Create equivalent derived digital definitions
                     foreach (IDigitalDefinition sourceDigital in sourceCell.DigitalDefinitions)
-                        derivedCell.DigitalDefinitions.Add(new DigitalDefinition(derivedCell, sourceDigital.Label, 0, 0));
+                        derivedCell.DigitalDefinitions.Add(new DigitalDefinition3(derivedCell, sourceDigital.Label, 0, 0));

                     // Add cell to frame
-                    derivedFrame.Cells.Add(derivedCell);
-                }
+                    derivedFrame3.Cells.Add(derivedCell);
+                }
+
+                return derivedFrame3;
+            }
+
+            // Create a new IEEE C37.118 configuration frame converted from equivalent configuration information
+            ConfigurationFrame1 derivedFrame;
+
+            // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault
+            switch (draftRevision)
+            {
+                // Assuming configuration frame 2 and timebase = 100000
+                case DraftRevision.Draft6:
+                    derivedFrame = new ConfigurationFrame2Draft6(100000, sourceFrame.IDCode, sourceFrame.Timestamp, sourceFrame.FrameRate);
+                    break;
+                case DraftRevision.Std2005:
+                    derivedFrame = new ConfigurationFrame2(100000, sourceFrame.IDCode, sourceFrame.Timestamp, sourceFrame.FrameRate);
+                    break;
+                default:
+                    throw new ArgumentOutOfRangeException(nameof(draftRevision), draftRevision, null);
+            }
+
+            foreach (IConfigurationCell sourceCell in sourceFrame.Cells)
+            {
+                // Create new derived configuration cell
+                ConfigurationCell derivedCell = new ConfigurationCell(derivedFrame, sourceCell.IDCode, sourceCell.NominalFrequency);
+
+                string stationName = sourceCell.StationName;
+                string idLabel = sourceCell.IDLabel;
+
+                if (!string.IsNullOrWhiteSpace(stationName))
+                    derivedCell.StationName = stationName.TruncateLeft(derivedCell.MaximumStationNameLength);
+
+                if (!string.IsNullOrWhiteSpace(idLabel))
+                    derivedCell.IDLabel = idLabel.TruncateLeft(derivedCell.IDLabelLength);
+
+                derivedCell.PhasorCoordinateFormat = sourceCell.PhasorCoordinateFormat;
+                derivedCell.PhasorAngleFormat = sourceCell.PhasorAngleFormat;
+                derivedCell.PhasorDataFormat = sourceCell.PhasorDataFormat;
+                derivedCell.FrequencyDataFormat = sourceCell.FrequencyDataFormat;
+                derivedCell.AnalogDataFormat = sourceCell.AnalogDataFormat;
+
+                // Create equivalent derived phasor definitions
+                foreach (IPhasorDefinition sourcePhasor in sourceCell.PhasorDefinitions)
+                    derivedCell.PhasorDefinitions.Add(new PhasorDefinition(derivedCell, sourcePhasor.Label, sourcePhasor.ScalingValue, sourcePhasor.Offset, sourcePhasor.PhasorType, null));
+
+                // Create equivalent derived frequency definition
+                IFrequencyDefinition sourceFrequency = sourceCell.FrequencyDefinition;
+
+                if (!(sourceFrequency is null))
+                    derivedCell.FrequencyDefinition = new FrequencyDefinition(derivedCell, sourceFrequency.Label);
+
+                // Create equivalent derived analog definitions (assuming analog type = SinglePointOnWave)
+                foreach (IAnalogDefinition sourceAnalog in sourceCell.AnalogDefinitions)
+                    derivedCell.AnalogDefinitions.Add(new AnalogDefinition(derivedCell, sourceAnalog.Label, sourceAnalog.ScalingValue, sourceAnalog.Offset, sourceAnalog.AnalogType));
+
+                // Create equivalent derived digital definitions
+                foreach (IDigitalDefinition sourceDigital in sourceCell.DigitalDefinitions)
+                    derivedCell.DigitalDefinitions.Add(new DigitalDefinition(derivedCell, sourceDigital.Label, 0, 0));
+
+                // Add cell to frame
+                derivedFrame.Cells.Add(derivedCell);
             }

             return derivedFrame;


GSF.TimeSeries: Removed TODO comment from compact measurement for GEP code

--- Source/Libraries/GSF.TimeSeries/Transport/CompactMeasurement.cs
+++ Source/Libraries/GSF.TimeSeries/Transport/CompactMeasurement.cs
@@ -640,7 +640,6 @@
             // Check that OS endian-order matches endian-order of compressed data
             if (!(BitConverter.IsLittleEndian && (flags & DataPacketFlags.LittleEndianCompression) > 0))
             {
-                // TODO: Set a flag, e.g., Endianness decompressAs, to pass into pattern decompressor so it
                 // can be modified to decompress a payload that is in a non-native Endian order
                 throw new NotImplementedException("Cannot currently decompress payload that is not in native endian-order.");
             }


Add X-Download-Options

Add X-Download-Options

Add the X-Download-Options HTTP response header.

--- src/API/Middleware/CustomHttpHeadersMiddleware.cs
+++ src/API/Middleware/CustomHttpHeadersMiddleware.cs
@@ -86,6 +86,7 @@

                     context.Response.Headers.Add("Content-Security-Policy", _contentSecurityPolicy);
                     context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
+                    context.Response.Headers.Add("X-Download-Options", "noopen");
                     context.Response.Headers.Add("X-Frame-Options", "DENY");
                     context.Response.Headers.Add("X-XSS-Protection", "1; mode=block");


osx add native seperators to menu

osx add native seperators to menu

--- src/Avalonia.Native/AvaloniaNativeMenuExporter.cs
+++ src/Avalonia.Native/AvaloniaNativeMenuExporter.cs
@@ -195,6 +195,10 @@
                         AddItemsToMenu(submenu, item.Menu?.Items);
                     }
                 }
+                else if (i is NativeMenuItemSeperator seperator)
+                {
+                    menu.AddItem(_factory.CreateMenuItemSeperator());
+                }
             }
         }

@@ -247,6 +251,10 @@

                     menu.AddItem(menuItem);
                 }
+                else if(i is NativeMenuItemSeperator seperator)
+                {
+                    menu.AddItem(_factory.CreateMenuItemSeperator());
+                }
             }
         }


Use the defined constant

Use the defined constant

Looks like this was missed

--- src/Bugsnag.ConfigurationSection/Configuration.cs
+++ src/Bugsnag.ConfigurationSection/Configuration.cs
@@ -207,7 +207,7 @@

     private const string ignoreClasses = "ignoreClasses";

-    [ConfigurationProperty("ignoreClasses", IsRequired = false)]
+    [ConfigurationProperty(ignoreClasses, IsRequired = false)]
     private string InternalIgnoreClasses
     {
       get


Fix integration tests for 7.7.0 and constant_keyword feature

--- tests/Tests/Indices/MappingManagement/GetMapping/GetMappingApiTest.cs
+++ tests/Tests/Indices/MappingManagement/GetMapping/GetMappingApiTest.cs
@@ -87,11 +87,16 @@
 			var b = TestClient.Configuration.Random.SourceSerializer;

 			var supportsFlattenedType = TestConfiguration.Instance.InRange(">=7.3.0");
+			var supportsConstantKeyword = TestConfiguration.Instance.InRange(">=7.7.0");
+
+			var keywordCount = b ? 19 : 18;
+			if (!supportsConstantKeyword)
+				keywordCount++;

 			response.Accept(visitor);
 			visitor.CountsShouldContainKeyAndCountBe("type", 1);
 			visitor.CountsShouldContainKeyAndCountBe("text", b ? 18 : 17);
-			visitor.CountsShouldContainKeyAndCountBe("keyword", b ? 20 : 19);
+			visitor.CountsShouldContainKeyAndCountBe("keyword", keywordCount);
 			visitor.CountsShouldContainKeyAndCountBe("object", supportsFlattenedType? 8 : 9);
 			visitor.CountsShouldContainKeyAndCountBe("number", 9);
 			visitor.CountsShouldContainKeyAndCountBe("ip", 2);
@@ -110,6 +115,9 @@

 			if (supportsFlattenedType)
 				visitor.CountsShouldContainKeyAndCountBe("flattened", 1);
+
+			if (supportsConstantKeyword)
+				visitor.CountsShouldContainKeyAndCountBe("constant_keyword", 1);
 		}
 	}


Bumped version to 0.5.14.0 by Jenkins

Bumped version to 0.5.14.0 by Jenkins

--- src/CollectdWinService/Properties/AssemblyInfo.cs
+++ src/CollectdWinService/Properties/AssemblyInfo.cs
@@ -35,5 +35,5 @@
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]

-[assembly: AssemblyVersion("0.5.13.0")]
-[assembly: AssemblyFileVersion("0.5.13.0")]
+[assembly: AssemblyVersion("0.5.14.0")]
+[assembly: AssemblyFileVersion("0.5.14.0")]


PathPattern: Limit filename length to 200 characters (bgo#636450)

If a track has a really long title, we would reach the limit of the
filesystem and fail to write it. In particular, this lead to crashes
when ripping some CDs.

On most filesystems, filenames are limited to 255 characters or 255
bytes. As we can't be sure of the byte size when the filename reaches
the filesystem, we use an arbitrary limit of 200 characters. This should
be enough to be safe in most cases, without being too limiting.

Signed-off-by: Bertrand Lorentz <eb7ac131ef7bff6d2ebccd6e5bf9a7cb6485cf2c@gmail.com>

--- src/Core/Banshee.Core/Banshee.Base/PathPattern.cs
+++ src/Core/Banshee.Core/Banshee.Base/PathPattern.cs
@@ -167,17 +167,23 @@
                 ext = String.Format (".{0}", ext);
             }

-            string songpath = CreateFromTrackInfo (track) + ext;
+            string songpath = CreateFromTrackInfo (track);
             songpath = Hyena.StringUtil.EscapePath (songpath);
+
             string dir = Path.GetFullPath (Path.Combine (base_dir,
                 Path.GetDirectoryName (songpath)));
-            string filename = Path.Combine (dir, Path.GetFileName (songpath));
-
             if (!Banshee.IO.Directory.Exists (dir)) {
                 Banshee.IO.Directory.Create (dir);
             }

-            return filename;
+            string filename = Path.GetFileName (songpath);
+            // Most filesystems have a filename length limit of 255 characters or bytes
+            // We use a limit of 200 characters as a compromise
+            if (filename.Length > 200) {
+                filename = filename.Remove (200);
+            }
+
+            return Path.Combine (dir, filename + ext);
         }

         public static string Escape (string input)


[UBER-1077] Fixed setting message about last error in TelerikRadNumericUpDown.

--- src/Cruciatus/Elements/TelerikRadNumericUpDown.cs
+++ src/Cruciatus/Elements/TelerikRadNumericUpDown.cs
@@ -68,32 +68,6 @@
             }
         }

-        public Button IncreaseButton
-        {
-            get
-            {
-                if (this.ElementInstance == null)
-                {
-                    this.Find();
-                }
-
-                return this.increaseButton;
-            }
-        }
-
-        public Button DecreaseButton
-        {
-            get
-            {
-                if (this.ElementInstance == null)
-                {
-                    this.Find();
-                }
-
-                return this.decreaseButton;
-            }
-        }
-
         public string Text
         {
             get
@@ -105,6 +79,57 @@

                 return this.textBox.Text;
             }
+        }
+
+        public bool SetText(string text)
+        {
+            if (this.ElementInstance == null)
+            {
+                this.Find();
+            }
+
+            if (this.textBox.SetText(text))
+            {
+                return true;
+            }
+
+            // TODO: информация об ошибке должна быть более точной
+            this.LastErrorMessage = string.Format("Не удалось установить текст элементу {0}.", this.ToString());
+            return false;
+        }
+
+        public bool ClickIncreaseButton()
+        {
+            if (this.ElementInstance == null)
+            {
+                this.Find();
+            }
+
+            if (this.increaseButton.Click())
+            {
+                return true;
+            }
+
+            // TODO: информация об ошибке должна быть более точной
+            this.LastErrorMessage = string.Format("Не удалось нажать по увеличивающей значение кнопке {0}.", this.ToString());
+            return false;
+        }
+
+        public bool ClickDecreaseButton()
+        {
+            if (this.ElementInstance == null)
+            {
+                this.Find();
+            }
+
+            if (this.decreaseButton.Click())
+            {
+                return true;
+            }
+
+            // TODO: информация об ошибке должна быть более точной
+            this.LastErrorMessage = string.Format("Не удалось нажать по уменьшающей значение кнопке {0}.", this.ToString());
+            return false;
         }

         /// <summary>
@@ -124,16 +149,6 @@
             {
                 return ControlType.Spinner;
             }
-        }
-
-        public bool SetText(string text)
-        {
-            if (this.ElementInstance == null)
-            {
-                this.Find();
-            }
-
-            return this.textBox.SetText(text);
         }

         internal override void Find()


Fix CreatedTimeConverter to use UTC

Fix CreatedTimeConverter to use UTC

--- WinMasto/Tools/Converters/CreatedTimeConverter.cs
+++ WinMasto/Tools/Converters/CreatedTimeConverter.cs
@@ -13,7 +13,7 @@
         public object Convert(object value, Type targetType, object parameter, string language)
         {
             var accountDateTime = (DateTime) value;
-            var timespan = DateTime.Now.Subtract(accountDateTime);
+            var timespan = DateTime.UtcNow.Subtract(accountDateTime);
             return timespan.ToPrettyString(2, UnitStringRepresentation.Compact);
         }


fix issue66 & issue81.r

fix issue66 & issue81.r

--- sdk/Common/Communication/netcore/ServiceClientNewImpl.cs
+++ sdk/Common/Communication/netcore/ServiceClientNewImpl.cs
@@ -64,10 +64,12 @@
                     if (!_response.IsSuccessStatusCode)
                     {
                         if (_response.Content != null) { // after the EnsureSuccessStatusCode(), the _strema will be closed if the status code is non-successful one.
-                            _stream = new MemoryStream();
-                            _response.Content.CopyToAsync(_stream).Wait();
+                            var tmpStream = new MemoryStream();
+                            _stream.CopyToAsync(tmpStream).Wait();
+                            _stream.Dispose();
+                            _stream = tmpStream;
                             _stream.Seek(0, SeekOrigin.Begin);
-                            _disposeStream = true;
+                            _disposeStream = true;
                         }
                     }
                     _response.EnsureSuccessStatusCode();


Fixed xml comments for BlobServiceClient.FindBlobsByTag() (#15741)

--- sdk/storage/Azure.Storage.Blobs/src/BlobServiceClient.cs
+++ sdk/storage/Azure.Storage.Blobs/src/BlobServiceClient.cs
@@ -1654,10 +1654,11 @@
         /// Find Blobs by Tags</see>.
         /// </summary>
         /// <param name="tagFilterSqlExpression">
-        /// The where parameter enables the caller to query blobs whose tags match a given expression.
-        /// The given expression must evaluate to true for a blob to be returned in the results.
-        /// The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-        /// however, only a subset of the OData filter syntax is supported in the Blob service.
+        /// The where parameter finds blobs in the storage account whose tags match a given expression.
+        /// The expression must evaluate to true for a blob to be returned in the result set.
+        /// The storage service supports a subset of the ANSI SQL WHERE clause grammar for the value of the where=expression query parameter.
+        /// The following operators are supported: =, >, >=, <, <=, AND. and @container.
+        /// Example expression: "tagKey"='tagValue'.
         /// </param>
         /// <param name="cancellationToken">
         /// Optional <see cref="CancellationToken"/> to propagate
@@ -1685,10 +1686,11 @@
         /// Find Blobs by Tags</see>.
         /// </summary>
         /// <param name="tagFilterSqlExpression">
-        /// The where parameter enables the caller to query blobs whose tags match a given expression.
-        /// The given expression must evaluate to true for a blob to be returned in the results.
-        /// The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
-        /// however, only a subset of the OData filter syntax is supported in the Blob service.
+        /// The where parameter finds blobs in the storage account whose tags match a given expression.
+        /// The expression must evaluate to true for a blob to be returned in the result set.
+        /// The storage service supports a subset of the ANSI SQL WHERE clause grammar for the value of the where=expression query parameter.
+        /// The following operators are supported: =, >, >=, <, <=, AND. and @container.
+        /// Example expression: "tagKey"='tagValue'.
         /// </param>
         /// <param name="cancellationToken">
         /// Optional <see cref="CancellationToken"/> to propagate


Cluster Clients

Cluster Clients

--- src/cluster-playground/ClusterExperiment1/Program.cs
+++ src/cluster-playground/ClusterExperiment1/Program.cs
@@ -42,12 +42,12 @@
             );
             var logger = Log.CreateLogger(nameof(Program));

-            var system1 = new ActorSystem();
-            var consul1 = new ConsulProvider(new ConsulProviderOptions());
-            var serialization1 = new Serialization();
-            serialization1.RegisterFileDescriptor(MessagesReflection.Descriptor);
-            var c1 = new Cluster(system1, serialization1);
-            await c1.StartClientAsync(new ClusterConfig("mycluster", "127.0.0.1", 8090, consul1).WithPidCache(false));
+            var system = new ActorSystem();
+            var consul = new ConsulProvider(new ConsulProviderOptions());
+            var serialization = new Serialization();
+            serialization.RegisterFileDescriptor(MessagesReflection.Descriptor);
+            var cluster = new Cluster(system, serialization);
+            await cluster.StartClientAsync(new ClusterConfig("mycluster", "127.0.0.1", 8090, consul).WithPidCache(false));

             _ = Task.Run(async () =>
@@ -58,7 +58,7 @@
                         try
                         {
                             var id = "myactor" + rnd.Next(0, 1000);
-                            var res = await c1.RequestAsync<HelloResponse>(id, "hello", new HelloRequest(),
+                            var res = await cluster.RequestAsync<HelloResponse>(id, "hello", new HelloRequest(),
                                 new CancellationTokenSource(TimeSpan.FromSeconds(5)).Token
                             );


Fix torus "medium" weight not mapped to "regular" when using `With`

--- osu.Game/Graphics/OsuFont.cs
+++ osu.Game/Graphics/OsuFont.cs
@@ -35,7 +35,10 @@
         /// <param name="fixedWidth">Whether all characters should be spaced the same distance apart.</param>
         /// <returns>The <see cref="FontUsage"/>.</returns>
         public static FontUsage GetFont(Typeface typeface = Typeface.Torus, float size = DEFAULT_FONT_SIZE, FontWeight weight = FontWeight.Medium, bool italics = false, bool fixedWidth = false)
-            => new FontUsage(GetFamilyString(typeface), size, GetWeightString(typeface, weight), getItalics(italics), fixedWidth);
+        {
+            string familyString = GetFamilyString(typeface);
+            return new FontUsage(familyString, size, GetWeightString(familyString, weight), getItalics(italics), fixedWidth);
+        }

         private static bool getItalics(in bool italicsRequested)
         {
@@ -72,25 +75,17 @@
         /// <summary>
         /// Retrieves the string representation of a <see cref="FontWeight"/>.
         /// </summary>
-        /// <param name="typeface">The <see cref="Typeface"/>.</param>
-        /// <param name="weight">The <see cref="FontWeight"/>.</param>
-        /// <returns>The string representation of <paramref name="weight"/> in the specified <paramref name="typeface"/>.</returns>
-        public static string GetWeightString(Typeface typeface, FontWeight weight)
+        /// <param name="family">The font family.</param>
+        /// <param name="weight">The font weight.</param>
+        /// <returns>The string representation of <paramref name="weight"/> in the specified <paramref name="family"/>.</returns>
+        public static string GetWeightString(string family, FontWeight weight)
         {
-            if (typeface == Typeface.Torus && weight == FontWeight.Medium)
+            if (family == @"Torus" && weight == FontWeight.Medium)
                 // torus doesn't have a medium; fallback to regular.
                 weight = FontWeight.Regular;

-            return GetWeightString(GetFamilyString(typeface), weight);
+            return weight.ToString();
         }
-
-        /// <summary>
-        /// Retrieves the string representation of a <see cref="FontWeight"/>.
-        /// </summary>
-        /// <param name="family">The family string.</param>
-        /// <param name="weight">The <see cref="FontWeight"/>.</param>
-        /// <returns>The string representation of <paramref name="weight"/> in the specified <paramref name="family"/>.</returns>
-        public static string GetWeightString(string family, FontWeight weight) => weight.ToString();
     }

     public static class OsuFontExtensions


Add protected copy constructor to avoid breaking changes

--- osu.Framework/Localisation/LocalisationParameters.cs
+++ osu.Framework/Localisation/LocalisationParameters.cs
@@ -21,6 +21,15 @@
         public readonly bool PreferOriginalScript;

         /// <summary>
+        /// Creates a new instance of <see cref="LocalisationParameters"/> based off another <see cref="LocalisationParameters"/>.
+        /// </summary>
+        /// <param name="parameters">The <see cref="LocalisationParameters"/> to copy values from.</param>
+        protected LocalisationParameters(LocalisationParameters parameters)
+            : this(parameters.Store, parameters.PreferOriginalScript)
+        {
+        }
+
+        /// <summary>
         /// Creates a new instance of <see cref="LocalisationParameters"/>.
         /// </summary>
         /// <param name="store">The <see cref="ILocalisationStore"/> to be used for string lookups and culture-specific formatting.</param>


Handle invalid origins as Anchor.TopLeft

--- osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
+++ osu.Game/Beatmaps/Formats/LegacyStoryboardDecoder.cs
@@ -269,9 +269,9 @@
                     return Anchor.BottomCentre;
                 case LegacyOrigins.BottomRight:
                     return Anchor.BottomRight;
-            }
-
-            throw new InvalidDataException($@"Unknown origin: {value}");
+                default:
+                    return Anchor.TopLeft;
+            }
         }

         private void handleVariables(string line)


Expose AddTextAwesome for OsuTextFlowContainer.

--- osu.Game/Graphics/Containers/OsuTextFlowContainer.cs
+++ osu.Game/Graphics/Containers/OsuTextFlowContainer.cs
@@ -1,6 +1,8 @@
 // Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu-framework/master/LICENCE

+using System;
+using System.Collections.Generic;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Sprites;
 using osu.Game.Graphics.Sprites;
@@ -10,5 +12,7 @@
     public class OsuTextFlowContainer: TextFlowContainer
     {
         protected override SpriteText CreateSpriteText() => new OsuSpriteText();
+
+        public IEnumerable<SpriteText> AddTextAwesome(FontAwesome icon, Action<SpriteText> creationParameters = null) => AddText(((char)icon).ToString(), creationParameters);
     }
 }


Remove some exceptions.

Remove some exceptions.

--- pGina/src/Shared/Registration/CredProviderManager.cs
+++ pGina/src/Shared/Registration/CredProviderManager.cs
@@ -170,17 +170,17 @@

         public override bool Registered6432()
         {
-            throw new Exception("Not used for GINA");
+            return false;
         }

         public override bool Enabled()
         {
-            throw new NotImplementedException();
+            return false;
         }

         public override bool Enabled6432()
         {
-            throw new Exception("Not used for GINA");
+            return false;
         }
     }


forgot a call to map the actual tokens.

forgot a call to map the actual tokens.

--- hybrasyl/FormulaParser.cs
+++ hybrasyl/FormulaParser.cs
@@ -20,6 +20,8 @@
             _target = target;
         }

+
+
         private string[] _operators = { "-", "+", "/", "*", "^" };
         private Func<double, double, double>[] _operations = {
         (a1, a2) => a1 - a2,
@@ -36,6 +38,8 @@
             Stack<string> operatorStack = new Stack<string>();
             int tokenIndex = 0;

+            MapTokens(ref tokens);
+
             while (tokenIndex < tokens.Count)
             {
                 string token = tokens[tokenIndex];


Setting: `ExcelPackage.LicenseContext = LicenseContext.NonCommercial`

--- OpenKh.Tools.Kh2SystemEditor/Utils/DictListWriteUtil.cs
+++ OpenKh.Tools.Kh2SystemEditor/Utils/DictListWriteUtil.cs
@@ -26,6 +26,7 @@
             }
             else if (fileExt == ".xlsx")
             {
+                ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                 using var xlsx = new ExcelPackage();
                 var book = xlsx.Workbook;
                 var sheet = book.Worksheets.Add("Item");


added verbose output of unhandled packets from the viewer

--- OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
+++ OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -359,7 +359,7 @@
                         }
                         break;
                     case PacketType.ObjectPermissions:
-                        //Console.WriteLine("permissions set " + Pack.ToString());
+                        OpenSim.Framework.Console.MainLog.Instance.Verbose("CLIENT", "unhandled packet " + Pack.ToString());
                         break;

                         #endregion
@@ -541,7 +541,7 @@
                         }
                         break;
                     case PacketType.MoveTaskInventory:
-                        //Console.WriteLine(Pack.ToString());
+                        OpenSim.Framework.Console.MainLog.Instance.Verbose("CLIENT", "unhandled packet " + Pack.ToString());
                         break;
                     case PacketType.RezScript:
                         //Console.WriteLine(Pack.ToString());
@@ -691,7 +691,6 @@
                                                   Convert.ToInt32(selectPacket.ParcelData.ReturnType), this);
                         }
                         break;
-
                     case PacketType.ParcelObjectOwnersRequest:
                         ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket) Pack;
                         if (OnParcelObjectOwnerRequest != null)
@@ -718,12 +717,15 @@

                     case PacketType.AgentIsNowWearing:
                         // AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack;
-                        //Console.WriteLine(Pack.ToString());
+                        OpenSim.Framework.Console.MainLog.Instance.Verbose("CLIENT", "unhandled packet " + Pack.ToString());
                         break;
                     case PacketType.ObjectScale:
-                        //OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString());
-                        break;
-
+                        OpenSim.Framework.Console.MainLog.Instance.Verbose("CLIENT", "unhandled packet " + Pack.ToString());
+                        break;
+                    default:
+                        OpenSim.Framework.Console.MainLog.Instance.Verbose("CLIENT", "unhandled packet " + Pack.ToString());
+                        break;
+
                         #endregion
                 }
             }


* While this is not producing any problems..  and does help in low bandwidth situations I can't demonstrate that it's better then just letting the client request what it needs in terms of responsiveness of the mesh in the scene yet.

--- OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
+++ OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
@@ -250,7 +250,7 @@
                 base(null, null, null, null, pId, int.MaxValue)
             {
                 m_scene = scene;
-                m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene);
+                m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene, pId);
                 // x is request id, y is userid
                 HasEvents = (x, y) =>
                 {
@@ -419,21 +419,35 @@
             private float CapThrottleDistributon = 0.30f;
             private readonly Scene m_scene;
             private ThrottleOutPacketType Throttle;
+            private readonly UUID User;

-            public MeshCapsDataThrottler(int pBytes, int max, int min, Scene pScene)
+            public MeshCapsDataThrottler(int pBytes, int max, int min, Scene pScene, UUID puser)
             {
                 ThrottleBytes = pBytes;
                 lastTimeElapsed = Util.EnvironmentTickCount();
                 Throttle = ThrottleOutPacketType.Task;
                 m_scene = pScene;
+                User = puser;
             }

             public bool hasEvents(UUID key, Dictionary<UUID, aPollResponse> responses)
             {
+                const float ThirtyPercent = 0.30f;
+                const float FivePercent = 0.05f;
                 PassTime();
                 // Note, this is called IN LOCK
                 bool haskey = responses.ContainsKey(key);
+
+                if (responses.Count > 2)
+                {
+                    SplitThrottle(ThirtyPercent);
+                }
+                else
+                {
+                    SplitThrottle(FivePercent);
+                }
+
                 if (!haskey)
                 {
                     return false;
@@ -441,7 +455,8 @@
                 aPollResponse response;
                 if (responses.TryGetValue(key, out response))
                 {
-
+                    float LOD3Over = (((ThrottleBytes*CapThrottleDistributon)%50000) + 1);
+                    float LOD2Over = (((ThrottleBytes*CapThrottleDistributon)%10000) + 1);
                     // Normal
                     if (BytesSent + response.bytes <= ThrottleBytes)
                     {
@@ -449,16 +464,16 @@

                         return true;
                     }
-                    // Lod3 Over
-                    else if (response.bytes > ThrottleBytes && Lod3 <= (((ThrottleBytes * .30f) % 50000) + 1))
+                    // Lod3 Over Throttle protection to keep things processing even when the throttle bandwidth is set too little.
+                    else if (response.bytes > ThrottleBytes && Lod3 <= ((LOD3Over < 1)? 1: LOD3Over) )
                     {
                         Interlocked.Increment(ref Lod3);
                         BytesSent += response.bytes;

                         return true;
                     }
-                    // Lod2 Over
-                    else if (response.bytes > ThrottleBytes && Lod2 <= (((ThrottleBytes * .30f) % 10000) + 1))
+                    // Lod2 Over Throttle protection to keep things processing even when the throttle bandwidth is set too little.
+                    else if (response.bytes > ThrottleBytes && Lod2 <= ((LOD2Over < 1) ? 1 : LOD2Over))
                     {
                         Interlocked.Increment(ref Lod2);
                         BytesSent += response.bytes;
@@ -477,7 +492,20 @@
             {
                 BytesSent -= bytes;
             }
-
+            private void SplitThrottle(float percentMultiplier)
+            {
+
+                if (CapThrottleDistributon != percentMultiplier) // don't switch it if it's already set at the % multipler
+                {
+                    CapThrottleDistributon = percentMultiplier;
+                    ScenePresence p;
+                    if (m_scene.TryGetScenePresence(User, out p)) // If we don't get a user they're not here anymore.
+                    {
+                        AlterThrottle(UserSetThrottle, p);
+                    }
+                }
+            }
+
             public void ProcessTime()
             {
                 PassTime();


Add comments

Add comments

--- PA.Utilities.InnoSetupTask/PreprocessInnoSetupScript.cs
+++ PA.Utilities.InnoSetupTask/PreprocessInnoSetupScript.cs
@@ -68,7 +68,7 @@
             }
             catch (Exception exception)
             {
-                logger.LogError("Error occurred: " + exception + "\n" + exception.StackTrace);
+				logger.LogError("Error occurred: " + exception + " at line "+exception.Source+"\n" + exception.StackTrace);
                 return false;
             }
             finally


Adjusted unit tests

Adjusted unit tests

--- PART/Source/Core/Installers.Tests/Installation.Tests.cs
+++ PART/Source/Core/Installers.Tests/Installation.Tests.cs
@@ -42,7 +42,6 @@
             public void RunCommandWithResult_C_NotNullOrEmpty()
             {
                 string error;
-                System.Diagnostics.Debugger.Launch();
                 var sitesDataStr = RunCommandWithResult(
                         @"C:\Magenta Workspace\PART\Source\Core\Installers\bin\Debug\ElevatedDllRunner.exe",
                         string.Format("\"{0}\" PopulateWebSites", typeof(WebInstallationInfo).AssemblyQualifiedName),
@@ -116,7 +115,6 @@
             [Test]
             public void CopyConfigNode_Overwrite_OK()
             {
-                System.Diagnostics.Debugger.Launch();
                 var sourceName = "Src" + Strings.NewRandomString(5);
                 var targetName = "Target" + Strings.NewRandomString(5);


There is no point in rounding if a minute is not divisible by the poll interval

--- PaletteInsightAgent/ThreadInfoPoller/ThreadInfoAgent.cs
+++ PaletteInsightAgent/ThreadInfoPoller/ThreadInfoAgent.cs
@@ -185,6 +185,13 @@

         protected static DateTime GetRoundedPollCycleTimeStamp(DateTime now, int pollInterval)
         {
+            if (60 % pollInterval != 0)
+            {
+                // If a minute is not divisible by the poll interval, we could only achieve synchronized poll cycle
+                // time stamps among machines for an unacceptable high cost. So, no rounding in this case.
+                return now;
+            }
+
             List<int> timeEntries = GetTimingEntries(pollInterval);
             timeEntries.Reverse();
             // Make sure that the result will be really rounded.


Adjust Items Control.

Adjust Items Control.

--- Project/Selenium.StandardControls/ItemsControlDriver.cs
+++ Project/Selenium.StandardControls/ItemsControlDriver.cs
@@ -12,13 +12,9 @@
     /// Access item by index.
     /// </summary>
     /// <typeparam name="T">Item's type.</typeparam>
+    [Obsolete]
     public interface IIndexAccessItemsControlDriver<T>
     {
-        /// <summary>
-        /// 可視状態のアイテムのインデックス
-        /// </summary>
-        int[] VisibleItemIndices { get; }
-
         /// <summary>
         /// Item count.
         /// </summary>
@@ -32,23 +28,45 @@
         T GetItem(int index);
     }

-    //TODO
-    //public interface IKeyItemsControlDriver<T>
-    //{
-    //    string[] Keys { get; }
-    //    T GetItem(string key);
-    //}
+    /// <summary>
+    /// Items Control Driver.
+    /// Access item by key.
+    /// </summary>
+    /// <typeparam name="Key">Key type.</typeparam>
+    /// <typeparam name="Driver">Driver type.</typeparam>
+    public interface IKeyAccessItemsControlDriver<Key, Driver>
+    {
+        /// <summary>
+        /// Keys of visible item.
+        /// </summary>
+        Key[] VisibleItemKeys { get; }
+
+        /// <summary>
+        /// Get item.
+        /// </summary>
+        /// <param name="key">key</param>
+        /// <returns>item.</returns>
+        Driver GetItem(Key key);
+
+        /// <summary>
+        /// Code text of argument passed to GetItem.
+        /// Used by TestAssistantPro during capture.
+        /// </summary>
+        /// <param name="key">key.</param>
+        /// <returns>text.</returns>
+        string ToArgumentCode(Key key);
+    }

     /// <summary>
     /// Items Control Driver
     /// </summary>
     /// <typeparam name="T">Item's type.</typeparam>
-    public class ItemsControlDriver<T> : ControlDriverBase, IIndexAccessItemsControlDriver<T> where T : class
+    public class ItemsControlDriver<T> : ControlDriverBase, IKeyAccessItemsControlDriver<int, T> where T : class
     {
         /// <summary>
-        /// 可視状態のアイテムのインデックス
+        /// Keys of visible item.
         /// </summary>
-        public int[] VisibleItemIndices
+        public int[] VisibleItemKeys
         {
             get
             {
@@ -67,6 +85,14 @@
                 return visibles.Cast<long>().Select(e => (int)e).ToArray();
             }
         }
+
+        /// <summary>
+        /// Code text of argument passed to GetItem.
+        /// Used by TestAssistantPro during capture.
+        /// </summary>
+        /// <param name="key">key.</param>
+        /// <returns>text.</returns>
+        public string ToArgumentCode(int key) => key.ToString();

         /// <summary>
         /// Item count.


Await SetupFocusFrame

Await SetupFocusFrame

--- Project/uwpmm/uwpmm.WindowsPhone/Pages/MainPage.xaml.cs
+++ Project/uwpmm/uwpmm.WindowsPhone/Pages/MainPage.xaml.cs
@@ -1377,10 +1377,10 @@

             FocusFrameSetting = new AppSettingData<bool>(SystemUtil.GetStringResource("FocusFrameDisplay"), SystemUtil.GetStringResource("Guide_FocusFrameDisplay"),
                 () => { return ApplicationSettings.GetInstance().RequestFocusFrameInfo; },
-                enabled =>
+                async enabled =>
                 {
                     ApplicationSettings.GetInstance().RequestFocusFrameInfo = enabled;
-                    SetupFocusFrame(enabled);
+                    await SetupFocusFrame(enabled);
                     if (!enabled) { _FocusFrameSurface.ClearFrames(); }
                 });
             display_settings.Add(new CheckBoxSetting(FocusFrameSetting));


Remove unused code

Remove unused code

--- PureLayoutSample/PureLayoutSample/RootViewController.cs
+++ PureLayoutSample/PureLayoutSample/RootViewController.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Foundation;
 using GalaSoft.MvvmLight.Helpers;
 using PureLayout.Net;


Select default UI tab according to module mode

--- R7.University.EduProgramProfiles/EditContingent.ascx.cs
+++ R7.University.EduProgramProfiles/EditContingent.ascx.cs
@@ -37,9 +37,9 @@
         public enum EditContingentTab
         {
             Actual,
+            Vacant,
             Admission,
             Movement,
-            Vacant
         }

         #region Properties
@@ -52,9 +52,26 @@

                 // otherwise, get current tab from viewstate
                 var obj = ViewState ["SelectedTab"];
-                return (obj != null) ? (EditContingentTab) obj : EditContingentTab.Actual;
+                return (obj != null) ? (EditContingentTab) obj : GetDefaultTab ();
             }
             set { ViewState ["SelectedTab"] = value; }
+        }
+
+        EditContingentTab GetDefaultTab ()
+        {
+            if (Settings.Mode == ContingentDirectoryMode.Admission) {
+                return EditContingentTab.Admission;
+            }
+
+            if (Settings.Mode == ContingentDirectoryMode.Movement) {
+                return EditContingentTab.Movement;
+            }
+
+            if (Settings.Mode == ContingentDirectoryMode.Vacant) {
+                return EditContingentTab.Vacant;
+            }
+
+            return EditContingentTab.Actual;
         }

         ContingentDirectorySettings _settings;


397 Deleting contents of source file containing references breaks "Find all references"

Impact: User sees error message, goto definition fails
Workaround: None
Fix: Only return non-stale references

--- Release/Product/Python/Analysis/Analyzer/VariableDef.cs
+++ Release/Product/Python/Analysis/Analyzer/VariableDef.cs
@@ -196,7 +196,7 @@
             get {
                 if (_dependencies.Count != 0) {
                     foreach (var keyValue in _dependencies) {
-                        if (keyValue.Value.References != null) {
+                        if (keyValue.Value.References != null && keyValue.Key.AnalysisVersion == keyValue.Value.Version) {
                             foreach (var reference in keyValue.Value.References) {
                                 yield return new KeyValuePair<IProjectEntry, SimpleSrcLocation>(keyValue.Key, reference);
                             }
@@ -210,7 +210,7 @@
             get {
                 if (_dependencies.Count != 0) {
                     foreach (var keyValue in _dependencies) {
-                        if (keyValue.Value.Assignments != null) {
+                        if (keyValue.Value.Assignments != null && keyValue.Key.AnalysisVersion == keyValue.Value.Version) {
                             foreach (var reference in keyValue.Value.Assignments) {
                                 yield return new KeyValuePair<IProjectEntry, SimpleSrcLocation>(keyValue.Key, reference);
                             }


Fixing Unity 2020.1.8f1 compatability issues.

--- Runtime/UrdfComponents/UrdfJoints/UrdfJointPrismatic.cs
+++ Runtime/UrdfComponents/UrdfJoints/UrdfJointPrismatic.cs
@@ -22,6 +22,9 @@
     {

         private ArticulationDrive drive;
+#if UNITY_2020_1
+        private float maxLinearVelocity;
+#endif

         public override JointTypes JointType => JointTypes.Prismatic;

@@ -30,7 +33,7 @@
             UrdfJointPrismatic urdfJoint = linkObject.AddComponent<UrdfJointPrismatic>();
 #if UNITY_2020_1_OR_NEWER
             linkObject.AddComponent<ArticulationBody>();
-            urdfJoint.unityJoint = linkObject.GetComponent<ArticulationBody>();
+            urdfJoint.unityJoint = linkObject.GetComponent<ArticulationBody>();
             urdfJoint.unityJoint.jointType = ArticulationJointType.PrismaticJoint;
 #else
             urdfJoint.unityJoint = linkObject.AddComponent<ConfigurableJoint>();
@@ -94,7 +97,7 @@
         }

         /// <summary>
-        /// Rotates the joint by deltaState m
+        /// Rotates the joint by deltaState m
         /// </summary>
         /// <param name="deltaState">amount in m by which joint needs to be rotated</param>
         protected override void OnUpdateJointState(float deltaState)
@@ -164,7 +167,11 @@
                 drive.upperLimit = (float)joint.limit.upper;
                 drive.lowerLimit = (float)joint.limit.lower;
                 drive.forceLimit = (float)joint.limit.effort;
+#if UNITY_2020_2_OR_NEWER
                 unityJoint.maxLinearVelocity = (float)joint.limit.velocity;
+#elif UNITY_2020_1
+                maxLinearVelocity = (float)joint.limit.velocity;
+#endif
                 unityJoint.xDrive = drive;
             }
         }
@@ -192,7 +199,7 @@

         public override bool AreLimitsCorrect()
         {
-#if UNITY_2020_1_OR_NEWER
+#if UNITY_2020_1_OR_NEWER
             ArticulationBody joint = GetComponent<ArticulationBody>();
             return joint.linearLockX == ArticulationDofLock.LimitedMotion && joint.xDrive.lowerLimit < joint.xDrive.upperLimit;
 #else
@@ -205,7 +212,11 @@
         {
 #if UNITY_2020_1_OR_NEWER
             ArticulationDrive drive = GetComponent<ArticulationBody>().xDrive;
+            #if UNITY_2020_2_OR_NEWER
             return new Joint.Limit(drive.lowerLimit, drive.upperLimit, drive.forceLimit, unityJoint.maxLinearVelocity);
+            #elif UNITY_2020_1
+            return new Joint.Limit(drive.lowerLimit, drive.upperLimit, drive.forceLimit, maxLinearVelocity);
+            #endif
 #else
             PrismaticJointLimitsManager prismaticLimits = GetComponent<PrismaticJointLimitsManager>();
             return new Joint.Limit(


SampleMultiConnection. Try/catch storage loading errors.

--- Samples/Common/SampleMultiConnection/MainWindow.xaml.cs
+++ Samples/Common/SampleMultiConnection/MainWindow.xaml.cs
@@ -140,10 +140,17 @@
 			if (Connector.StorageAdapter == null)
 				return;

-			entityRegistry.Init();
-
-			Connector.StorageAdapter.DaysLoad = TimeSpan.FromDays(3);
-			Connector.StorageAdapter.Load();
+			try
+			{
+				entityRegistry.Init();
+
+				Connector.StorageAdapter.DaysLoad = TimeSpan.FromDays(3);
+				Connector.StorageAdapter.Load();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(this, ex.ToString());
+			}

 			ConfigManager.RegisterService<IExchangeInfoProvider>(new ExchangeInfoProvider(entityRegistry));
 		}


compiled regex

compiled regex

--- SolrNet/Impl/QuerySerializers/QueryByFieldSerializer.cs
+++ SolrNet/Impl/QuerySerializers/QueryByFieldSerializer.cs
@@ -25,8 +25,10 @@
             return string.Format("{0}:{1}", q.FieldName, Quote(q.FieldValue));
         }

-        public string Quote(string value) {
-            string r = Regex.Replace(value, "(\\+|\\-|\\&\\&|\\|\\||\\!|\\{|\\}|\\[|\\]|\\^|\\(|\\)|\\\"|\\~|\\:|\\;|\\\\|\\?|\\*)", "\\$1");
+        public static readonly Regex SpecialCharactersRx = new Regex("(\\+|\\-|\\&\\&|\\|\\||\\!|\\{|\\}|\\[|\\]|\\^|\\(|\\)|\\\"|\\~|\\:|\\;|\\\\|\\?|\\*)", RegexOptions.Compiled);
+
+        public static string Quote(string value) {
+            string r = SpecialCharactersRx.Replace(value, "\\$1");
             if (r.IndexOf(' ') != -1 || r == "")
                 r = string.Format("\"{0}\"", r);
             return r;


Log using specified entry and success levels instead of debug

--- Solutions/SharpArchContrib.Core/Logging/MethodLogger.cs
+++ Solutions/SharpArchContrib.Core/Logging/MethodLogger.cs
@@ -40,7 +40,7 @@
                 }

                 logMessage.Append(")");
-                logger.Log(LoggingLevel.Debug, logMessage.ToString());
+                logger.Log(entryLevel, logMessage.ToString());
             }
         }

@@ -59,9 +59,8 @@
             if (this.ShouldLog(logger, successLevel, methodBase))
             {
                 logger.Log(
-                    LoggingLevel.Debug,
-                    string.Format(
-                        "{0} Returns:[{1}]", methodBase.Name, returnValue != null ? returnValue.ToString() : string.Empty));
+                    successLevel,
+                    string.Format("{0} Returns:[{1}]", methodBase.Name, returnValue != null ? returnValue.ToString() : string.Empty));
             }
         }


PropertyCollection IEnumerable

PropertyCollection IEnumerable

--- Source/Devsense.PHP.Parser/Syntax/PropertyCollection.cs
+++ Source/Devsense.PHP.Parser/Syntax/PropertyCollection.cs
@@ -14,6 +14,9 @@
 // permissions and limitations under the License.

 using System;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
 using System.Diagnostics;

 using Hashtable = System.Collections.Generic.Dictionary<object, object>;
@@ -93,7 +96,7 @@
     /// <summary>
     /// Manages list of properties, organized by a key.
     /// </summary>
-    public struct PropertyCollection : IPropertyCollection
+    public struct PropertyCollection : IPropertyCollection, IEnumerable<KeyValuePair<object, object>>
     {
         #region Fields & Properties

@@ -121,13 +124,88 @@

         #endregion

+        #region IEnumerable
+
+        /// <summary>
+        /// Returns an enumerator that iterates through the collection.
+        /// </summary>
+        public IEnumerator<KeyValuePair<object, object>> GetEnumerator() => Enumerable.GetEnumerator();
+
+        /// <summary>
+        /// Returns an enumerator that iterates through the collection.
+        /// </summary>
+        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
+
+        /// <summary>
+        /// Enumerates items in this collection.
+        /// </summary>
+        /// <returns>Enumerable object of the collection. Cannot be <c>null</c>.</returns>
+        IEnumerable<KeyValuePair<object, object>>/*!*/Enumerable
+        {
+            get
+            {
+                object p = _type;
+                object o = _obj;
+
+                if (p != null)
+                {
+                    // non-empty container
+                    if (object.ReferenceEquals(p, TypeList))
+                    {
+                        Debug.Assert(o is DictionaryNode);
+                        return (DictionaryNode)o;   // IEnumerable
+                    }
+                    else if (object.ReferenceEquals(p, TypeHashtable))
+                    {
+                        Debug.Assert(o is Hashtable);
+                        return (Hashtable)o;
+                    }
+                    else
+                    {
+                        // single item in here
+                        return new[] { new KeyValuePair<object, object>(p, o) };
+                    }
+                }
+                else
+                {
+                    return EmptyArray<KeyValuePair<object, object>>.Instance;
+                }
+            }
+        }
+
+        #endregion
+
         #region Nested class: DictionaryNode

-        private sealed class DictionaryNode
+        private sealed class DictionaryNode : IEnumerable<KeyValuePair<object, object>>
         {
             public object key;
             public object value;
-            public PropertyCollection.DictionaryNode next;
+            public DictionaryNode next;
+
+            /// <summary>
+            /// Casts node to <see cref="KeyValuePair{Object, Object}"/>.
+            /// </summary>
+            public static implicit operator KeyValuePair<object, object>(DictionaryNode node) => new KeyValuePair<object, object>(node.key, node.value);
+
+            /// <summary>
+            /// Items count in this node.
+            /// </summary>
+            public int Count => CountItems(this);
+
+            #region IEnumerable
+
+            public IEnumerator<KeyValuePair<object, object>> GetEnumerator()
+            {
+                for (var node = this; node != null; node = node.next)
+                {
+                    yield return node;
+                }
+            }
+
+            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
+
+            #endregion
         }

         #endregion
@@ -475,7 +553,7 @@
     public class PropertyCollectionClass : IPropertyCollection
     {
         /// <summary>
-        /// Internbal collection (struct).
+        /// Internal collection (struct).
         /// </summary>
         private PropertyCollection _properties = new PropertyCollection();


[Direct3D11] Adds support for a null render targets array while unsetting them with OutputMerger.SetRenderTargets

--- Source/SharpDX.Direct3D11/DeviceContext.OutputMerger.cs
+++ Source/SharpDX.Direct3D11/DeviceContext.OutputMerger.cs
@@ -152,7 +152,7 @@
             /// <param name = "renderTargetViews">A set of render target views to bind.</param>
             public void SetTargets(DepthStencilView depthStencilView, params RenderTargetView[] renderTargetViews)
             {
-                SetRenderTargets(renderTargetViews.Length, renderTargetViews, depthStencilView);
+                SetRenderTargets(renderTargetViews==null?0:renderTargetViews.Length, renderTargetViews, depthStencilView);
             }

             /// <summary>


fixing some grammatic errors

fixing some grammatic errors

--- Source/Toolkit/SharpDX.Toolkit.Graphics/Buffer.Index.cs
+++ Source/Toolkit/SharpDX.Toolkit.Graphics/Buffer.Index.cs
@@ -31,7 +31,7 @@
         public static class Index
         {
             /// <summary>
-            /// Creates a new index buffer with <see cref="ResourceUsage.Default"/> uasge by default.
+            /// Creates a new index buffer with <see cref="ResourceUsage.Default"/> usage by default.
             /// </summary>
             /// <param name="device">The <see cref="GraphicsDevice"/>.</param>
             /// <param name="size">The size in bytes.</param>
@@ -43,7 +43,7 @@
             }

             /// <summary>
-            /// Creates a new index buffer with <see cref="ResourceUsage.Default"/> uasge by default.
+            /// Creates a new index buffer with <see cref="ResourceUsage.Default"/> usage by default.
             /// </summary>
             /// <typeparam name="T">Type of the index buffer to get the sizeof from</typeparam>
             /// <param name="device">The <see cref="GraphicsDevice"/>.</param>
@@ -56,7 +56,7 @@
             }

             /// <summary>
-            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> uasge by default.
+            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> usage by default.
             /// </summary>
             /// <typeparam name="T">Type of the index buffer to get the sizeof from</typeparam>
             /// <param name="device">The <see cref="GraphicsDevice"/>.</param>
@@ -69,7 +69,7 @@
             }

             /// <summary>
-            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> uasge by default.
+            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> usage by default.
             /// </summary>
             /// <typeparam name="T">Type of the index buffer to get the sizeof from</typeparam>
             /// <param name="device">The <see cref="GraphicsDevice"/>.</param>
@@ -82,7 +82,7 @@
             }

             /// <summary>
-            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> uasge by default.
+            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> usage by default.
             /// </summary>
             /// <param name="device">The <see cref="GraphicsDevice"/>.</param>
             /// <param name="value">The value to initialize the index buffer.</param>
@@ -95,7 +95,7 @@
             }

             /// <summary>
-            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> uasge by default.
+            /// Creates a new index buffer with <see cref="ResourceUsage.Immutable"/> usage by default.
             /// </summary>
             /// <param name="device">The <see cref="GraphicsDevice"/>.</param>
             /// <param name="value">The value to initialize the index buffer.</param>
@@ -107,4 +107,4 @@
             }
         }
     }
-}+}


update version

update version

--- Sources/ReCommendedExtension/Properties/AssemblyInfo.cs
+++ Sources/ReCommendedExtension/Properties/AssemblyInfo.cs
@@ -13,5 +13,5 @@
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

-[assembly: AssemblyVersion("5.1.4.0")]
-[assembly: AssemblyFileVersion("5.1.4")]+[assembly: AssemblyVersion("5.1.5.0")]
+[assembly: AssemblyFileVersion("5.1.5")]


update version

update version

--- Sources/ReCommendedExtension/Properties/AssemblyInfo.cs
+++ Sources/ReCommendedExtension/Properties/AssemblyInfo.cs
@@ -13,5 +13,5 @@
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

-[assembly: AssemblyVersion("3.5.1.0")]
-[assembly: AssemblyFileVersion("3.5.1")]+[assembly: AssemblyVersion("3.6.0.0")]
+[assembly: AssemblyFileVersion("3.6.0")]


Make multi-select Cicero test more robust

--- Spa/NakedObjects.Spa.Selenium.Test/tests/CiceroTests.cs
+++ Spa/NakedObjects.Spa.Selenium.Test/tests/CiceroTests.cs
@@ -9,6 +9,7 @@
 using OpenQA.Selenium;
 using System;
 using System.Linq;
+using System.Threading;

 namespace NakedObjects.Web.UnitTests.Selenium
 {
@@ -1120,6 +1121,7 @@
             EnterCommand("action List Products By Sub Categories");
             WaitForOutputContaining("Action dialog: List Products By Sub Categories");
             WaitForOutputContaining("Sub Categories: -Mountain Bikes-Touring Bikes");
+            Thread.Sleep(200);
             EnterCommand("enter sub, handlebars");
             WaitForOutputContaining("Sub Categories: -Mountain Bikes-Touring Bikes-Handlebars");
             EnterCommand("enter sub, touring bikes");
@@ -1135,6 +1137,7 @@
             EnterCommand("action Find By Product Lines And Classes");
             WaitForOutputContaining("Product Line: M,S,");
             WaitForOutputContaining("Product Class: H,");
+            Thread.Sleep(200);
             EnterCommand("enter line, r");
             WaitForOutputContaining("Product Line: M,S,R");
             EnterCommand("enter line, m");
@@ -1413,7 +1416,7 @@
             Cancel();
             Clipboard();
             Edit();
-            Enter();
+            Enter();
             Gemini();
             Goto();
             Help();


fix cicero test

fix cicero test

--- Spa/NakedObjects.Spa.Selenium.Test/tests/CiceroTests.cs
+++ Spa/NakedObjects.Spa.Selenium.Test/tests/CiceroTests.cs
@@ -1186,7 +1186,7 @@
             WaitForOutput("Clipboard contains: Product: Mountain-400-W Silver, 38");
             EnterCommand("menu emp");
             WaitForOutput("Employees menu");
-            EnterCommand("ac create");
+            EnterCommand("ac create new");
             WaitForOutput("Employees menu\r\nAction dialog: Create New Employee From Contact\r\nContact Details: empty");
             EnterCommand("enter details, paste");
             WaitForOutput("Contents of Clipboard are not compatible with the field");


Selenium test for clearing auto-complete reference

--- Spa/NakedObjects.Spa.Selenium.Test/tests/DialogTests.cs
+++ Spa/NakedObjects.Spa.Selenium.Test/tests/DialogTests.cs
@@ -255,6 +255,15 @@
             WaitForView(Pane.Single, PaneType.Object, "Adjustable Race");
         }

+        public virtual void ClearingAutoCompleteTextClearsUnderlyingReference()
+        {
+            Url(ProductServiceUrl);
+            OpenActionDialog("Find Product");
+            Assert.AreEqual("Adjustable Race", WaitForCss(".value input[type='text']").GetAttribute("value"));
+            ClearFieldThenType("#product1", "");
+            OKButton().AssertIsDisabled().AssertHasTooltip("Missing mandatory fields: Product; ");
+        }
+

         public virtual void AutoCompleteParmShowSingleItem()
         {
@@ -439,6 +448,11 @@
         public override void AutoCompleteParm() { base.AutoCompleteParm(); }
         [TestMethod]
         public override void AutoCompleteParmDefault() { base.AutoCompleteParmDefault(); }
+        [TestMethod]
+        public override void ClearingAutoCompleteTextClearsUnderlyingReference()
+        {
+            base.ClearingAutoCompleteTextClearsUnderlyingReference();
+        }
         [TestMethod]
         public override void AutoCompleteParmShowSingleItem() { base.AutoCompleteParmShowSingleItem(); }
         [TestMethod]
@@ -566,6 +580,7 @@
             base.ConditionalChoicesMultiple();
             base.AutoCompleteParm();
             base.AutoCompleteParmDefault();
+            base.ClearingAutoCompleteTextClearsUnderlyingReference();
             base.AutoCompleteParmShowSingleItem();
             base.AutoCompleteScalarField();
             base.MandatoryParameterEnforced();