. in Edge query

. in Edge query

--- Icris.GremlinQuery/Icris.GremlinQuery/Query.cs
+++ Icris.GremlinQuery/Icris.GremlinQuery/Query.cs
@@ -79,9 +79,9 @@
         public IEdgeResult E(string id = null)
         {
             if (id != null)
-                this.query += $"E('{id}')";
-            else
-                this.query += "E()";
+                this.query += $".E('{id}')";
+            else
+                this.query += ".E()";
             return this;
         }


add null check to CloseHelper.Dispose()

add null check to CloseHelper.Dispose()

--- src/Adaptive.Agrona/CloseHelper.cs
+++ src/Adaptive.Agrona/CloseHelper.cs
@@ -63,7 +63,7 @@
         {
             try
             {
-                disposable.Dispose();
+                disposable?.Dispose();
             }
             catch (Exception ex)
             {


Added support for finding the same bitmap multiple times

--- src/BitmapLocator/BitmapLocator.cs
+++ src/BitmapLocator/BitmapLocator.cs
@@ -23,7 +23,7 @@

         private List<string> _fileNames = new List<string>();

-        private readonly List<Point> _foundBitmapLocations = new List<Point>();
+        private List<Point> _foundBitmapLocations = new List<Point>();

         /// <summary>
         /// Default constructor.
@@ -74,12 +74,7 @@
                         MessageBox.Show("One of the bitmaps is larger than the screen - it's not possible to find it.", "Invalid input", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                     }

-                    var location = SearchBitmap(smallBitmap, screenBitmap, 0);
-
-                    if (location.Width > 0)
-                    {
-                        _foundBitmapLocations.Add(new Point(location.X, location.Y));
-                    }
+                    _foundBitmapLocations = SearchBitmap(smallBitmap, screenBitmap, 0);

                     smallBitmap.Dispose();
                 }
@@ -134,7 +129,7 @@
         /// <param name="bigBmp">The bitmap where the small bitmap is searched for.</param>
         /// <param name="tolerance">Tolerance value, set this to a number between 0 (exact pixel-by-pixel match) and 0.2 (fuzzy match)</param>
         /// <returns>The location of the small bitmap inside the big bitmap as a Rectangle object.</returns>
-        private Rectangle SearchBitmap(Bitmap smallBmp, Bitmap bigBmp, double tolerance)
+        private List<Point> SearchBitmap(Bitmap smallBmp, Bitmap bigBmp, double tolerance)
         {
             var smallData =
               smallBmp.LockBits(new Rectangle(0, 0, smallBmp.Width, smallBmp.Height),
@@ -153,7 +148,7 @@
             var smallWidth = smallBmp.Width * 3;
             var smallHeight = smallBmp.Height;

-            var location = Rectangle.Empty;
+            var locations = new List<Point>();
             var margin = Convert.ToInt32(255.0 * tolerance);

             unsafe
@@ -204,14 +199,10 @@
                             pBig += bigStride * (1 + i);
                         }

-                        //If match found, we return.
+                        //If match found, we add the found point to the list.
                         if (matchFound)
                         {
-                            location.X = x;
-                            location.Y = y;
-                            location.Width = smallBmp.Width;
-                            location.Height = smallBmp.Height;
-                            break;
+                            locations.Add(new Point(x, y));
                         }
                         //If no match found, we restore the pointers and continue.
                         pBig = pBigBackup;
@@ -228,7 +219,7 @@
             bigBmp.UnlockBits(bigData);
             smallBmp.UnlockBits(smallData);

-            return location;
+            return locations;
         }
     }
 }


Added missing DI

Added missing DI

--- src/Bossr.Api/Bossr.Api/Startup.cs
+++ src/Bossr.Api/Bossr.Api/Startup.cs
@@ -50,6 +50,7 @@
             services.AddTransient<ITagRepository, TagRepository>();
             services.AddTransient<IRaidRepository, RaidRepository>();
             services.AddTransient<ISpawnRepository, SpawnRepository>();
+            services.AddTransient<IStatisticRepository, StatisticRepository>();

             services.AddTransient<IUserManager, UserManager>();
             services.AddTransient<IHashGenerator, HashGenerator>();


add serialized issue type

add serialized issue type

--- src/Examples/TestHydraApi/Issue.cs
+++ src/Examples/TestHydraApi/Issue.cs
@@ -4,10 +4,12 @@

 namespace TestHydraApi
 {
-    [SupportedClass("http://example.api/o#Issue")]
+    [SupportedClass(IssueType)]
     [Description("An issue reported by our users")]
     public class Issue : IssueBase
     {
+        private const string IssueType = "http://example.api/o#Issue";
+
         public string Id { get; set; }

         [JsonProperty("titel")]
@@ -31,5 +33,11 @@
         {
             return null;
         }
+
+        [JsonProperty]
+        private string Type
+        {
+            get { return IssueType; }
+        }
     }
 }


docs(ExceptionCommand): improve the XML comment on Execute.

--- src/Experiment/ExceptionCommand.cs
+++ src/Experiment/ExceptionCommand.cs
@@ -38,10 +38,10 @@
         }

         /// <summary>
-        /// 테스트 메소드 실행.
+        /// 이 테스트 실행 결과는 항상 <see cref="FailedResult"/>를 리턴함.
         /// </summary>
         /// <param name="testClass">테스트 메소드의 owner.</param>
-        /// <returns>테스트 결과.</returns>
+        /// <returns> 특정 exception을 표현하는 <see cref="FailedResult"/> 결과.</returns>
         public override MethodResult Execute(object testClass)
         {
             return new FailedResult(testMethod, Exception, DisplayName);


Make ViesExtensions class public

Make ViesExtensions class public

--- src/vies/ViesExtensions.cs
+++ src/vies/ViesExtensions.cs
@@ -17,7 +17,7 @@

 namespace Padi.Vies
 {
-    internal static class ViesExtensions
+    public static class ViesExtensions
     {
         public static string GetValue(this string content, string pattern, Func<string, string> func = null)
         {


Fixed version stuff

Fixed version stuff

--- src/Fpr/Properties/AssemblyInfo.cs
+++ src/Fpr/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 // You can specify all the values or you can default the Build and  Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.1.2.*")]
-[assembly: AssemblyFileVersion("1.1.2.*")]
+[assembly: AssemblyVersion("1.1.4.*")]
+[assembly: AssemblyFileVersion("1.1.4.*")]


Change access of `RenamePass.ConvertCaseString` to allow external usage.

--- src/Generator/Passes/RenamePass.cs
+++ src/Generator/Passes/RenamePass.cs
@@ -343,7 +343,7 @@
         /// <param name="decl"></param>
         /// <param name="pattern">The cases.</param>
         /// <returns>string</returns>
-        static string ConvertCaseString(Declaration decl, RenameCasePattern pattern)
+        public static string ConvertCaseString(Declaration decl, RenameCasePattern pattern)
         {
             if (decl.Name.All(c => !char.IsLetter(c)))
                 return decl.Name;


var -> string

var -> string

--- src/ImageVisualizer14/ImageForm.cs
+++ src/ImageVisualizer14/ImageForm.cs
@@ -20,28 +20,28 @@
             get
             {
 #if VS10
-                var dteProgID = "VisualStudio.DTE.10.0";
+                string dteProgID = "VisualStudio.DTE.10.0";
 #elif VS11
-                var dteProgID = "VisualStudio.DTE.11.0";
+                string dteProgID = "VisualStudio.DTE.11.0";
 #elif VS12
-                var dteProgID = "VisualStudio.DTE.12.0";
+                string dteProgID = "VisualStudio.DTE.12.0";
 #elif VS13
-                var dteProgID = "VisualStudio.DTE.13.0";
+                string dteProgID = "VisualStudio.DTE.13.0";
 #elif VS14
-                var dteProgID = "VisualStudio.DTE.14.0";
+                string dteProgID = "VisualStudio.DTE.14.0";
 #elif VS15
-                var dteProgID = "VisualStudio.DTE.15.0";
+                string dteProgID = "VisualStudio.DTE.15.0";
 #elif VS16
-                var dteProgID = "VisualStudio.DTE.16.0";
+                string dteProgID = "VisualStudio.DTE.16.0";
 #endif
                 var dte = (EnvDTE.DTE)Marshal.GetActiveObject(dteProgID);
                 var fontProperty = dte.Properties["FontsAndColors", "Dialogs and Tool Windows"];
                 if (fontProperty != null)
                 {
                     object objValue = fontProperty.Item("FontFamily").Value;
-                    var fontFamily = objValue.ToString();
+                    string fontFamily = objValue.ToString();
                     objValue = fontProperty.Item("FontSize").Value;
-                    var fontSize = Convert.ToSingle(objValue);
+                    float fontSize = Convert.ToSingle(objValue);
                     var font = new Font(fontFamily, fontSize);

                     return font;
@@ -83,7 +83,7 @@
                 if (objectBitmap is Bitmap)
                 {
                     var hObject = ((Bitmap)objectBitmap).GetHbitmap();
-
+
                     try
                     {
                         bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(


Delete Ssd1306.cs

Delete Ssd1306.cs


Fixing potential NRE in transaction manager

--- src/Orchard/Data/SessionLocator.cs
+++ src/Orchard/Data/SessionLocator.cs
@@ -53,9 +53,13 @@
             EnsureSession();

             if (_cancelled) {
-                _transaction.Rollback();
-                _transaction.Dispose();
-                _transaction = null;
+                if (_transaction != null) {
+                    _transaction.Rollback();
+                    _transaction.Dispose();
+                    _transaction = null;
+                }
+
+                _cancelled = false;
             }
             else {
                 if (_transaction != null) {


Added tests for SqlConnection aliases

Added tests for SqlConnection aliases

--- src/Tests/SqlServerAliasesTests.cs
+++ src/Tests/SqlServerAliasesTests.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Data;
 using System.Data.SqlClient;
 using System.IO;
 using System.Linq;
@@ -86,6 +87,50 @@

         [Test]
+        public void OpenSqlConnection_returns_open_connection()
+        {
+            using (var connection = SqlServerAliases.OpenSqlConnection(context, ConnectionString))
+            {
+                connection.State.Should().Be(ConnectionState.Open);
+            }
+        }
+
+
+
+        [Test]
+        public void ExecuteSqlCommand_does_not_change_connection_state()
+        {
+            using (var connection = SqlServerAliases.OpenSqlConnection(context, ConnectionString))
+            {
+                connection.MonitorEvents();
+                SqlServerAliases.ExecuteSqlCommand(context, connection, "select * from sys.tables");
+                connection.ShouldNotRaise(nameof(connection.StateChange));
+            }
+        }
+
+        [Test]
+        public void ExecuteSqlFile_does_not_change_connection_state()
+        {
+            const string dbName = "ForFileExecution";
+            ExecuteSql($"Create database {dbName}");
+            try
+            {
+                using (var connection = SqlServerAliases.OpenSqlConnection(context, ConnectionString))
+                {
+                    connection.MonitorEvents();
+                    SqlServerAliases.ExecuteSqlFile(context, connection, GetSqlFilePath());
+                    connection.ShouldNotRaise(nameof(connection.StateChange));
+                }
+            }
+            finally
+            {
+                ExecuteSql($"Drop database {dbName}");
+            }
+        }
+
+
+
+        [Test]
         public void ExecuteSqlCommand_CreatesTables()
         {
             //Arrange
@@ -120,8 +165,7 @@
             var tableName1 = "WillExist1";
             var tableName2 = "WillExist2";
             ExecuteSql($"Create database {dbName}");
-            var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
-            var sqlFilePath = Directory.GetFiles(baseDirectory, "Script.sql", SearchOption.AllDirectories).FirstOrDefault();
+            var sqlFilePath = GetSqlFilePath();

             // Act
             SqlServerAliases.ExecuteSqlFile(context, connectionString, sqlFilePath);
@@ -130,6 +174,11 @@
             TableExists(dbName, tableName1).Should().BeTrue();
             TableExists(dbName, tableName2).Should().BeTrue();
             SqlServerAliases.DropDatabase(context, ConnectionString, dbName);
+        }
+
+        private static string GetSqlFilePath()
+        {
+            return Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "Script.sql", SearchOption.AllDirectories).FirstOrDefault();
         }

         [Test]


Extract ZBase32Encoding.PadSymbol as a readonly property.

--- src/Wiry.Base32/ZBase32Encoding.cs
+++ src/Wiry.Base32/ZBase32Encoding.cs
@@ -7,20 +7,21 @@
     internal sealed class ZBase32Encoding : Base32Encoding
     {
         protected override string Alphabet => "ybndrfg8ejkmcpqxot1uwisza345h769";
+        private char? PadSymbol => null;

         public override string GetString(byte[] bytes, int index, int count)
         {
-            return ToBase32(bytes, index, count, Alphabet, null);
+            return ToBase32(bytes, index, count, Alphabet, PadSymbol);
         }

         public override byte[] ToBytes(string encoded, int index, int length)
         {
-            return ToBytes(encoded, index, length, null, GetOrCreateLookupTable(Alphabet));
+            return ToBytes(encoded, index, length, PadSymbol, GetOrCreateLookupTable(Alphabet));
         }

         public override ValidationResult Validate(string encoded, int index, int length)
         {
-            return Validate(encoded, index, length, null, GetOrCreateLookupTable(Alphabet));
+            return Validate(encoded, index, length, PadSymbol, GetOrCreateLookupTable(Alphabet));
         }
     }
 }


Fix failing test due to collisions with other tests (#2797)

--- test/TesterInternal/StorageTests/CommonStorageTests.cs
+++ test/TesterInternal/StorageTests/CommonStorageTests.cs
@@ -44,7 +44,7 @@
             var grainTypeName = GrainTypeGenerator.GetGrainType<Guid>();
             int StartOfRange = 33900;
             int CountOfRange = countOfGrains;
-            string grainIdTemplate = $"{prefix}-" + "{0}";
+            string grainIdTemplate = $"{prefix}-{{0}}";

             //The purpose of this Task.Run is to ensure the storage provider will be tested from
             //multiple threads concurrently, as would happen in running system also.
@@ -55,7 +55,7 @@
                 //and the storage provider throws. Essentially it means either this range
                 //is ill chosen or the test failed due another problem.
                 var grainId = string.Format(grainIdTemplate, i);
-                var grainData = this.GetTestReferenceAndState(i, null);
+                var grainData = this.GetTestReferenceAndState(grainId, null);

                 //A sanity checker that the first version really has null as its state. Then it is stored
                 //to the database and a new version is acquired.


#93. Capture handler null check.

#93. Capture handler null check.

--- src/MMALSharp/Callbacks/VideoOutputCallbackHandler.cs
+++ src/MMALSharp/Callbacks/VideoOutputCallbackHandler.cs
@@ -110,7 +110,7 @@
                 if (this.CaptureHandler is IMotionVectorCaptureHandler)
                 {
                     var handler = this.CaptureHandler as IMotionVectorCaptureHandler;
-                    handler.ProcessMotionVectors(buffer.GetBufferData());
+                    handler?.ProcessMotionVectors(buffer.GetBufferData());
                 }
             }
             else


add new unit test for --package-directory with spaces in path

--- test/dotnet-add-package.Tests/GivenDotnetPackageAdd.cs
+++ test/dotnet-add-package.Tests/GivenDotnetPackageAdd.cs
@@ -73,6 +73,41 @@
         }

         [Fact]
+        public void
+            WhenValidProjectAndPackageWithPackageDirectoryContainingSpaceArePassedItGetsAdded()
+        {
+            var testAsset = "TestAppSimple";
+            var projectDirectory = TestAssets
+                .Get(testAsset)
+                .CreateInstance()
+                .WithSourceFiles()
+                .Root
+                .FullName;
+
+            var packageDirectory = Path.Combine(projectDirectory, "local packages");
+
+            var csproj = $"{projectDirectory + Path.DirectorySeparatorChar + testAsset}.csproj";
+            var packageName = "Newtonsoft.Json";
+            var packageVersion = "9.0.1";
+            var cmd = new DotnetCommand()
+                .WithWorkingDirectory(projectDirectory)
+                .ExecuteWithCapturedOutput($"add {csproj} package {packageName} --version {packageVersion} --package-directory \"{packageDirectory}\"");
+
+            _output.WriteLine($"[STDOUT] {cmd.StdOut}\n[STDERR]{cmd.StdErr}\n");
+
+            cmd.Should().Pass();
+
+            cmd.StdOut.Should()
+               .Contain($"PackageReference for package \'{packageName}\' version \'{packageVersion}\' added to file '{csproj}'.");
+
+            cmd.StdErr.Should().BeEmpty();
+
+            var restoredPackageDirectory = Path.Combine(packageDirectory, packageName, packageVersion);
+            var packageDirectoryExists = Directory.Exists(restoredPackageDirectory);
+            Assert.True(packageDirectoryExists);
+        }
+
+        [Fact]
         public void WhenValidPackageIsPassedAfterVersionItGetsAdded()
         {
             var testAsset = "TestAppSimple";


Use AppendOnlyCollection to avoid thread-safety issue

--- src/Meziantou.Framework/CachedEnumerableThreadSafe.cs
+++ src/Meziantou.Framework/CachedEnumerableThreadSafe.cs
@@ -1,11 +1,12 @@
 using System.Collections;
 using System.Diagnostics;
+using Meziantou.Framework.Collections;

 namespace Meziantou.Framework;

 internal sealed class CachedEnumerableThreadSafe<T> : ICachedEnumerable<T>
 {
-    private readonly List<T> _cache = new();
+    private readonly AppendOnlyCollection<T> _cache = new();
     private readonly IEnumerable<T> _enumerable;
     private IEnumerator<T>? _enumerator;
     private bool _enumerated;


Remove Frame.RequestUri.

Remove Frame.RequestUri.

--- src/Microsoft.AspNetCore.Server.Kestrel/Http/Frame.cs
+++ src/Microsoft.AspNetCore.Server.Kestrel/Http/Frame.cs
@@ -82,7 +82,6 @@
         public int LocalPort { get; set; }
         public string Scheme { get; set; }
         public string Method { get; set; }
-        public string RequestUri { get; set; }
         public string PathBase { get; set; }
         public string Path { get; set; }
         public string QueryString { get; set; }
@@ -276,7 +275,6 @@

             Scheme = null;
             Method = null;
-            RequestUri = null;
             PathBase = null;
             Path = null;
             QueryString = null;
@@ -914,7 +912,6 @@

                 consumed = scan;
                 Method = method;
-                RequestUri = requestUrlPath;
                 QueryString = queryString;
                 HttpVersion = httpVersion;


WIP - added DefaultNameClaimType

WIP - added DefaultNameClaimType

--- src/Owin.Security.HighQ/HighQAuthenticationHandler.cs
+++ src/Owin.Security.HighQ/HighQAuthenticationHandler.cs
@@ -119,6 +119,7 @@

                 context.Identity = new ClaimsIdentity(Options.AuthenticationType, ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
                 context.Identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, context.Id, ClaimValueTypes.String, Options.AuthenticationType));
+                context.Identity.AddClaim(new Claim(ClaimsIdentity.DefaultNameClaimType, context.Email, ClaimValueTypes.String, Options.AuthenticationType));
                 context.Identity.AddClaim(new Claim(ClaimTypes.GivenName, context.FirstName, ClaimValueTypes.String, Options.AuthenticationType));
                 context.Identity.AddClaim(new Claim(ClaimTypes.Surname, context.LastName, ClaimValueTypes.String, Options.AuthenticationType));
                 context.Identity.AddClaim(new Claim(ClaimTypes.Email, context.Email, ClaimValueTypes.Email, Options.AuthenticationType));


Fix the place where setting overflow flag for grid scroll

Overflow flag tells that computed viewport is smaller than render size. So, it has to walk backward. This happens when window size is getting larger beyond the last element in row or column.
The flag should be set regardless to the number of items added in reversed order - render window could be larget the whole grid.

--- src/Package/Impl/DataInspect/VisualGrid/GridPoints.cs
+++ src/Package/Impl/DataInspect/VisualGrid/GridPoints.cs
@@ -276,8 +276,8 @@
             }

             if (width.LessThan(visualViewport.Width)) {
+                overflow |= ScrollDirection.Horizontal;
                 for (int c = columnStart - 1; c >= 0; c--) {
-                    overflow |= ScrollDirection.Horizontal;
                     width += GetWidth(c);
                     if (width.GreaterThanOrClose(visualViewport.Width)) {
                         break;
@@ -297,8 +297,8 @@
             }

             if (height.LessThan(visualViewport.Height)) {
+                overflow |= ScrollDirection.Vertical;
                 for (int r = rowStart - 1; r >= 0; r--) {
-                    overflow |= ScrollDirection.Vertical;
                     height += GetHeight(r);
                     if (height.GreaterThanOrClose(visualViewport.Height)) {
                         break;


Fix shutdown packet sometimes passes preceding response packets.

--- test/MsgPack.Rpc.TestUtilities/Rpc/Server/Protocols/InProcServerTransport.cs
+++ test/MsgPack.Rpc.TestUtilities/Rpc/Server/Protocols/InProcServerTransport.cs
@@ -251,9 +251,10 @@

 		protected override void SendCore( ServerResponseContext context )
 		{
-			var task = this._manager.SendAsync( context );
-			this.OnSent( context );
-			task.Wait( this._receivingCancellationTokenSource.Token );
+			this._manager.SendAsync( context )
+				.ContinueWith(
+					previous => this.OnSent( context )
+				).Wait( this._receivingCancellationTokenSource.Token );
 		}
 	}
 }


Improve Accumulation Of Tooltips For Ship Modules

Adapt to observation in live tests: Ignore tooltips which contain no text. This assumes that every tooltip contains at least one `LabelText`. In case that does not apply anymore, we need to change the filter here to reflect this.
Thanks to pikacuq for sharing observations at https://forum.botengine.org/t/pikacuq-is-tweaking-a-bot/954/95?u=viir

Besides the accumulation filter, also change the casing of locals to match more popular convention.

--- src/Sanderling/Sanderling/Accumulator/ShipUiModule.cs
+++ src/Sanderling/Sanderling/Accumulator/ShipUiModule.cs
@@ -56,40 +56,39 @@

 		public bool? OverloadOn => RepresentedInstant?.OverloadOn;

-		protected override void Accumulated(PropertyGenTimespanInt64<Accumulation.IShipUiModuleAndContext> instant, Parse.IMemoryMeasurement shared)
+		protected override void Accumulated(PropertyGenTimespanInt64<IShipUiModuleAndContext> instant, Parse.IMemoryMeasurement otherUIElements)
 		{
-			base.Accumulated(instant, shared);
+			base.Accumulated(instant, otherUIElements);

-			var ModuleButtonTooltip = shared?.ModuleButtonTooltip;
+			var moduleButtonTooltip = otherUIElements?.ModuleButtonTooltip;

 			if ((instant?.Value?.Module?.HiliteVisible ?? false) &&
 				(instant?.Value?.Location).HasValue &&
-				null != ModuleButtonTooltip)
+				(moduleButtonTooltip?.LabelText?.Any() ?? false))
 			{
-				var TooltipWithTimespan = ModuleButtonTooltip.WithTimespanInt64(instant);
+				var tooltipWithTimespan = moduleButtonTooltip.WithTimespanInt64(instant);

-				var PreviousTooltip = ListTooltip?.LastOrDefault();
+				var previousTooltip = ListTooltip?.LastOrDefault();

-				ListTooltip.Enqueue(TooltipWithTimespan);
+				ListTooltip.Enqueue(tooltipWithTimespan);
 				ListTooltip.ListeKürzeBegin(4);

-				var TooltipLast = TooltipWithTimespan;
+				var tooltipLast = tooltipWithTimespan;

-				var PreviousInstant = InstantWithAgeStepCount(1);
+				var previousInstant = InstantWithAgeStepCount(1);

-				if ((PreviousInstant?.Value?.Module?.HiliteVisible ?? false) &&
-					PreviousInstant?.Value?.Module?.ModuleButtonIconTexture?.Id == instant?.Value?.Module?.ModuleButtonIconTexture?.Id &&
-					PreviousTooltip?.Begin == PreviousInstant?.Begin)
+				if ((previousInstant?.Value?.Module?.HiliteVisible ?? false) &&
+					previousInstant?.Value?.Module?.ModuleButtonIconTexture?.Id == instant?.Value?.Module?.ModuleButtonIconTexture?.Id &&
+					previousTooltip?.Begin == previousInstant?.Begin)
 				{
 					//	It seems that data read from module tooltips is corrupted frequently.
 					//	To alleviate this problem, tooltips in consecutive measurements are compared and a heuristic is applied to guess which one is the best to pick to be kept.
 					//	To benefit from this, a script generates multiple measurements while a tooltip is open for the module.
-					TooltipLast = new[] { TooltipLast, PreviousTooltip }.BestRead(inst => inst?.Value);
+					tooltipLast = new[] { tooltipLast, previousTooltip }.BestRead(inst => inst?.Value);
 				}

-				this.TooltipLast = TooltipLast;
+				TooltipLast = tooltipLast;
 			}
-
 		}

 		/// <summary>


Add xml doc comments for BufferWriter struct (#7350)

--- src/Servers/Kestrel/Core/src/Internal/BufferWriter.cs
+++ src/Servers/Kestrel/Core/src/Internal/BufferWriter.cs
@@ -5,13 +5,38 @@

 namespace System.Buffers
 {
+    /// <summary>
+    /// A fast access struct that wraps <see cref="IBufferWriter{T}"/>.
+    /// </summary>
+    /// <typeparam name="T">The type of element to be written.</typeparam>
     internal ref struct BufferWriter<T> where T : IBufferWriter<byte>
     {
+        /// <summary>
+        /// The underlying <see cref="IBufferWriter{T}"/>.
+        /// </summary>
         private T _output;
+
+        /// <summary>
+        /// The result of the last call to <see cref="IBufferWriter{T}.GetSpan(int)"/>, less any bytes already "consumed" with <see cref="Advance(int)"/>.
+        /// Backing field for the <see cref="Span"/> property.
+        /// </summary>
         private Span<byte> _span;
+
+        /// <summary>
+        /// The number of uncommitted bytes (all the calls to <see cref="Advance(int)"/> since the last call to <see cref="Commit"/>).
+        /// </summary>
         private int _buffered;
+
+        /// <summary>
+        /// The total number of bytes written with this writer.
+        /// Backing field for the <see cref="BytesCommitted"/> property.
+        /// </summary>
         private long _bytesCommitted;

+        /// <summary>
+        /// Initializes a new instance of the <see cref="BufferWriter{T}"/> struct.
+        /// </summary>
+        /// <param name="output">The <see cref="IBufferWriter{T}"/> to be wrapped.</param>
         public BufferWriter(T output)
         {
             _buffered = 0;
@@ -20,9 +45,20 @@
             _span = output.GetSpan();
         }

+        /// <summary>
+        /// Gets the result of the last call to <see cref="IBufferWriter{T}.GetSpan(int)"/>.
+        /// </summary>
         public Span<byte> Span => _span;
+
+        /// <summary>
+        /// Gets the total number of bytes written with this writer.
+        /// </summary>
         public long BytesCommitted => _bytesCommitted;

+        /// <summary>
+        /// Calls <see cref="IBufferWriter{T}.Advance(int)"/> on the underlying writer
+        /// with the number of uncommitted bytes.
+        /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Commit()
         {
@@ -35,6 +71,10 @@
             }
         }

+        /// <summary>
+        /// Used to indicate that part of the buffer has been written to.
+        /// </summary>
+        /// <param name="count">The number of bytes written to.</param>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Advance(int count)
         {
@@ -42,6 +82,10 @@
             _span = _span.Slice(count);
         }

+        /// <summary>
+        /// Copies the caller's buffer into this writer and calls <see cref="Advance(int)"/> with the length of the source buffer.
+        /// </summary>
+        /// <param name="source">The buffer to copy in.</param>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Write(ReadOnlySpan<byte> source)
         {
@@ -56,6 +100,10 @@
             }
         }

+        /// <summary>
+        /// Acquires a new buffer if necessary to ensure that some given number of bytes can be written to a single buffer.
+        /// </summary>
+        /// <param name="count">The number of bytes that must be allocated in a single buffer.</param>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Ensure(int count = 1)
         {
@@ -65,6 +113,10 @@
             }
         }

+        /// <summary>
+        /// Gets a fresh span to write to, with an optional minimum size.
+        /// </summary>
+        /// <param name="count">The minimum size for the next requested buffer.</param>
         [MethodImpl(MethodImplOptions.NoInlining)]
         private void EnsureMore(int count = 0)
         {
@@ -76,6 +128,10 @@
             _span = _output.GetSpan(count);
         }

+        /// <summary>
+        /// Copies the caller's buffer into this writer, potentially across multiple buffers from the underlying writer.
+        /// </summary>
+        /// <param name="source">The buffer to copy into this writer.</param>
         private void WriteMultiBuffer(ReadOnlySpan<byte> source)
         {
             while (source.Length > 0)


Fixing unit tests.

Fixing unit tests.

--- src/SixtenLabs.Spawn.Tests/SpawnXmlSerializerTests.cs
+++ src/SixtenLabs.Spawn.Tests/SpawnXmlSerializerTests.cs
@@ -6,6 +6,7 @@
 using System.IO;
 using System.Dynamic;
 using System.Collections.Generic;
+using System;

 namespace SixtenLabs.Spawn.Tests
 {
@@ -54,43 +55,29 @@
 			actual.Should().Be(ClassWithListClass);
 		}

-		[Fact(Skip = "Does not work with nested dynamic lists (why)")]
-		public void SerializeDynamicClassWithListClass()
-		{
-			var subject = NewSubjectUnderTests();
+		//[Fact(Skip = "Does not work with nested dynamic lists (why)")]
+		//public void SerializeDynamicClassWithListClass()
+		//{
+		//	var subject = NewSubjectUnderTests();

-			dynamic testClass = new ExpandoObject();
-			testClass.Name = "OneName";
-			testClass.Description = "OneDescription";
+		//	dynamic testClass = new ExpandoObject();
+		//	testClass.Name = "OneName";
+		//	testClass.Description = "OneDescription";

-			testClass.Twos = new[]
-				{
-					new
-					{
-						Name = "TwoName1", Description = "TwoDescription1" },
-					new { Name = "TwoName2", Description = "TwoDescription2" }
-				};
+		//	testClass.Twos = new[]
+		//		{
+		//			new
+		//			{
+		//				Name = "TwoName1", Description = "TwoDescription1" },
+		//			new { Name = "TwoName2", Description = "TwoDescription2" }
+		//		};

-			string actual = SerializeData(subject, testClass, "root");
+		//	string actual = SerializeData(subject, testClass, "root");

-			actual.Should().Be(ClassWithListClass);
-		}
+		//	actual.Should().Be(ClassWithListClass);
+		//}

-		private string ClassWithListClass { get; } = @"<?xml version=""1.0"" encoding=""utf-8""?>
-<root>
-  <Name>OneName</Name>
-  <Description>OneDescription</Description>
-  <Twos>
-    <TwosItem>
-      <Name>TwoName1</Name>
-      <Description>TwoDescription1</Description>
-    </TwosItem>
-    <TwosItem>
-      <Name>TwoName2</Name>
-      <Description>TwoDescription2</Description>
-    </TwosItem>
-  </Twos>
-</root>";
+		private string ClassWithListClass { get; } = $@"<?xml version=""1.0"" encoding=""utf-8""?>{Environment.NewLine}<root>{Environment.NewLine}  <Name>OneName</Name>{Environment.NewLine}  <Description>OneDescription</Description>{Environment.NewLine}  <Twos>{Environment.NewLine}    <TwosItem>{Environment.NewLine}      <Name>TwoName1</Name>{Environment.NewLine}      <Description>TwoDescription1</Description>{Environment.NewLine}    </TwosItem>{Environment.NewLine}    <TwosItem>{Environment.NewLine}      <Name>TwoName2</Name>{Environment.NewLine}      <Description>TwoDescription2</Description>{Environment.NewLine}    </TwosItem>{Environment.NewLine}  </Twos>{Environment.NewLine}</root>";

 		private string SerializeData(SpawnXmlSerializer serializer, dynamic data, string elementName)
 		{


revert changes

revert changes

--- src/Splunk.Client/Splunk/Client/SearchResultStream.cs
+++ src/Splunk.Client/Splunk/Client/SearchResultStream.cs
@@ -122,7 +122,7 @@
         {
             XmlReader reader = response.XmlReader;

-            await reader.MoveToDocumentElementAsync("/results","results", "response").ConfigureAwait(false);
+            await reader.MoveToDocumentElementAsync("results", "response").ConfigureAwait(false);

             if (reader.Name == "response")
             {


Check ip format (#2262)

Check ip format (#2262)


ParticleSystems first pass clean up and positioning.

--- tests/tests/classes/tests/ParticleTest/ParticleTest.cs
+++ tests/tests/classes/tests/ParticleTest/ParticleTest.cs
@@ -354,6 +354,8 @@
         {
             var touch = touches [0];
             var convertedLocation = touch.LocationOnScreen;
+            convertedLocation = Layer.ScreenToWorldspace(convertedLocation);
+            //convertedLocation = Layer.WorldToParentspace(convertedLocation);

             var pos = new CCPoint(0, 0);
             if (Background != null)
@@ -363,7 +365,7 @@

             if (Emitter != null)
             {
-                Emitter.Position = convertedLocation - pos;
+                Emitter.Position = convertedLocation;// - pos;
             }
         }

@@ -409,7 +411,8 @@
         {
             if (Emitter != null)
             {
-                Emitter.Position = new CCPoint(WindowSize.Width / 2, WindowSize.Height / 2 - 30);
+                var size = Layer.VisibleBoundsWorldspace.Size;
+                Emitter.Position = new CCPoint(size.Width / 2, size.Height / 2 - 30);
             }
         }
     }
@@ -1000,7 +1003,8 @@
     {
         public override void OnEnter()
         {
-base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+
+            base.OnEnter();

             Emitter = new CCParticleFlower(MidWindowPoint);

@@ -1030,7 +1034,9 @@
     {
         public override void OnEnter()
         {
-            base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            base.OnEnter();
+
+            var windowSize = Layer.VisibleBoundsWorldspace.Size;

             Background.Parent.RemoveChild(Background, true);
             Background = null;
@@ -1093,7 +1099,7 @@

         public override void OnEnter()
         {
-            base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            base.OnEnter();

             Color = new CCColor3B(0, 0, 0);
             RemoveChild(Background, true);
@@ -1141,7 +1147,7 @@
         public override void OnEnter()
         {
             base.OnEnter();
-            CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            var size = Layer.VisibleBoundsWorldspace.Size;

             Color = new CCColor3B(0, 0, 0);
             RemoveChild(Background, true);
@@ -1170,7 +1176,6 @@

             // emitter position

-			CCSize size = WindowSize;
             Emitter.Position = new CCPoint(size.Width / 2, size.Height / 2);
             Emitter.PositionVar = new CCPoint(0, 0);

@@ -1222,7 +1227,9 @@
     {
         public override void OnEnter()
         {
-            base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            base.OnEnter();
+
+            var size = Layer.VisibleBoundsWorldspace.Size;

             Color = new CCColor3B(0, 0, 0);
             RemoveChild(Background, true);
@@ -1252,7 +1259,6 @@

             // emitter position

-            CCSize size = WindowSize;
             Emitter.Position = new CCPoint(size.Width / 2, size.Height / 2);
             Emitter.PositionVar = new CCPoint(0, 0);

@@ -1304,7 +1310,9 @@
     {
         public override void OnEnter()
         {
-            base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            base.OnEnter();
+
+            var size = Layer.VisibleBoundsWorldspace.Size;

             Color = new CCColor3B(0, 0, 0);
             RemoveChild(Background, true);
@@ -1333,7 +1341,6 @@
             Emitter.AngleVar = 0;

             // emitter position
-            CCSize size = WindowSize;
             Emitter.Position = new CCPoint(size.Width / 2, size.Height / 2);
             Emitter.PositionVar = new CCPoint(0, 0);

@@ -1398,7 +1405,7 @@

         public override void OnEnter()
         {
-            base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            base.OnEnter();

             Color = new CCColor3B(0, 0, 0);
             RemoveChild(Background, true);
@@ -1603,7 +1610,9 @@

         public override void OnEnter()
         {
-base.OnEnter(); CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;
+            base.OnEnter();
+
+            CCSize windowSize = Layer.VisibleBoundsWorldspace.Size;

             Color = CCColor3B.Black;
             RemoveChild(Background, true);


Fixing monster position reset on new quest.


Fix copyright

Fix copyright

--- Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs
+++ Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs
@@ -1,4 +1,5 @@
-// Licensed under the MIT License. See LICENSE in the project root for license information.
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.

 using Microsoft.MixedReality.Toolkit.Input;
 using Microsoft.MixedReality.Toolkit.Utilities;


Change email

Change email


Actually don't use async for setting Thread.CurrentPrincipal

--- D2L.Security.OAuth2.WebApi/Validation/Request/AuthenticationMessageHandler.cs
+++ D2L.Security.OAuth2.WebApi/Validation/Request/AuthenticationMessageHandler.cs
@@ -49,8 +49,7 @@
 			) {

 			try {
-				await AuthenticateAsync( request )
-					.ConfigureAwait( false );
+				AuthenticateAsync( request );
 			} catch( ValidationException ex ) {
 				m_log.Warn( "Authentication failed", ex );
 				return request.CreateResponse( HttpStatusCode.Unauthorized );
@@ -79,17 +78,13 @@
 			base.Dispose( disposing );
 		}

-		private async Task AuthenticateAsync( HttpRequestMessage request ) {
-			var principal = await m_requestAuthenticator.AuthenticateAsync(
+		private void AuthenticateAsync( HttpRequestMessage request ) {
+			var principal = m_requestAuthenticator.AuthenticateAsync(
 				   request,
 				   m_authenticationMode
-			   ).ConfigureAwait( false );
+			   ).ConfigureAwait( false ).GetAwaiter().GetResult();

-			// It is okay to access Thread.CurrentPrincipal because it is contained in
-			// the SecurityContext which is part of ExecutionContext which you don't
-			// lose when you SafeAsync/ConfigureAwait( false ).
-			// See: http://blogs.msdn.com/b/pfxteam/archive/2012/06/15/executioncontext-vs-synchronizationcontext.aspx
 			Thread.CurrentPrincipal = new D2LPrincipalAdapter( principal );
 		}
 	}
-}
+}


clean

clean

--- CSharpGL/Canvas/LegacyBoundingBoxRenderer.cs
+++ CSharpGL/Canvas/LegacyBoundingBoxRenderer.cs
@@ -24,7 +24,6 @@
         /// </summary>
         /// <param name="min"></param>
         /// <param name="max"></param>
-        /// <param name="color"></param>
         public LegacyBoundingBoxRenderer(vec3 min, vec3 max)
         {
             this.MinPosition = min;


Fix DRG job gauge

Fix DRG job gauge

--- Chromatics/FFXIVInterfaces/FFXIVJobGauges.cs
+++ Chromatics/FFXIVInterfaces/FFXIVJobGauges.cs
@@ -688,14 +688,14 @@

                         var burstdrgcol = ColorTranslator.FromHtml(ColorMappings.ColorMappingJobDRGBloodDragon);
                         var negdrgcol = ColorTranslator.FromHtml(ColorMappings.ColorMappingJobDRGNegative);
-                        var bloodremain = Cooldowns.BloodOfTheDragonTimeRemaining;
-                        var polBlood = (bloodremain - 0) * (50 - 0) / (1.0 - 0) + 0;
+                        var bloodremain = Convert.ToInt32(Cooldowns.BloodOfTheDragonTimeRemaining * 100);
+                        var polBlood = (bloodremain - 0) * (50 - 0) / (60 - 0) + 0;

                         //Lightbar
                         if (_LightbarMode == LightbarMode.JobGauge)
                         {
                             var JobLightbar_Collection = DeviceEffects.LightbarZones;
-                            var JobLightbar_Interpolate = ((int)bloodremain - 0) * (JobLightbar_Collection.Length - 0) / (1.0 - 0) + 0;
+                            var JobLightbar_Interpolate = (bloodremain - 0) * (JobLightbar_Collection.Length - 0) / (60 - 0) + 0;

                             for (int i = 0; i < JobLightbar_Collection.Length; i++)
                             {
@@ -708,7 +708,7 @@
                         if (_FKeyMode == FKeyMode.JobGauge)
                         {
                             var JobFunction_Collection = DeviceEffects.Functions;
-                            var JobFunction_Interpolate = ((int)bloodremain - 0) * (JobFunction_Collection.Length - 0) / (1.0 - 0) + 0;
+                            var JobFunction_Interpolate = (bloodremain - 0) * (JobFunction_Collection.Length - 0) / (60 - 0) + 0;

                             for (int i = 0; i < JobFunction_Collection.Length; i++)
                             {
@@ -719,7 +719,27 @@

                         if (bloodremain > 0)
                         {
-                            if (polBlood <= 50 && polBlood > 40)
+                            if (polBlood > 50)
+                            {
+                                ToggleGlobalFlash3(false);
+
+                                GlobalApplyMapKeyLighting("NumLock", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("NumDivide", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("NumMultiply", burstdrgcol, false);
+
+                                GlobalApplyMapKeyLighting("Num7", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("Num8", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("Num9", burstdrgcol, false);
+
+                                GlobalApplyMapKeyLighting("Num4", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("Num5", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("Num6", burstdrgcol, false);
+
+                                GlobalApplyMapKeyLighting("Num1", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("Num2", burstdrgcol, false);
+                                GlobalApplyMapKeyLighting("Num3", burstdrgcol, false);
+                            }
+                            else if (polBlood <= 50 && polBlood > 40)
                             {
                                 ToggleGlobalFlash3(false);


BlanketJsCoverageEngine: Only proceed to map to local path when URI scheme is file

--- Chutzpah/Coverage/BlanketJsCoverageEngine.cs
+++ Chutzpah/Coverage/BlanketJsCoverageEngine.cs
@@ -127,6 +127,9 @@
             foreach (var entry in data)
             {
                 Uri uri = new Uri(entry.Key, UriKind.RelativeOrAbsolute);
+                if (uri.Scheme != "file")
+                    continue;
+
                 if (!uri.IsAbsoluteUri)
                 {
                     // Resolve against the test file path.


Update OneAnimation.cs

Update OneAnimation.cs

--- VoidEngine/OneAnimation.cs
+++ VoidEngine/OneAnimation.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -17,20 +17,26 @@
     /// </summary>
     public class OneAnimation : Sprite
     {
+        protected bool move;
+        protected int speed;
+        protected Keys up;
+        protected Keys down;
+        protected Keys left;
+        protected Keys right;
+
         /// <summary>
-        /// The creator of OneAnimation class with default properties
-        /// frameSize = (60, 50)
-        /// sheetSize = (5, 6)
-        /// fTime = 16
+        /// The creator of OneAnimation class with custom properties
         /// </summary>
         /// <param name="tex">The texture</param>
         /// <param name="pos">The position</param>
-        public OneAnimation(Texture2D tex, Vector2 pos) : base(tex, pos)
+        /// <param name="frameWidth">The frame's width</param>
+        /// <param name="frameHeight">The frame's Height</param>
+        /// <param name="sheetWidth">The amount of frames on the x axis</param>
+        /// <param name="sheetHeight">The amount of frames on the y axis</param>
+        /// <param name="fps">The frames per second in miliseconds</param>
+        public OneAnimation(Vector2 position) : base(position)
         {
-            frameSize = new Point(60, 50);
-            sheetSize = new Point(5, 6);
             move = false;
-            fTime = 16;
         }

         /// <summary>
@@ -43,35 +49,14 @@
         /// <param name="sheetWidth">The amount of frames on the x axis</param>
         /// <param name="sheetHeight">The amount of frames on the y axis</param>
         /// <param name="fps">The frames per second in miliseconds</param>
-        public OneAnimation(Texture2D tex, Vector2 pos, int frameWidth, int frameHeight, int sheetWidth, int sheetHeight, int fps) : base(tex, pos, frameWidth, frameHeight, sheetWidth, sheetHeight, fps)
+        public OneAnimation(Vector2 position, int speed, Keys up, Keys down, Keys left, Keys right) : base(position)
         {
-            frameSize = new Point(frameWidth, frameHeight);
-            sheetSize = new Point(sheetWidth, sheetHeight);
-            move = false;
-            fTime = fps;
-        }
-
-        /// <summary>
-        /// The creator of OneAnimation class with custom properties
-        /// </summary>
-        /// <param name="tex">The texture</param>
-        /// <param name="pos">The position</param>
-        /// <param name="frameWidth">The frame's width</param>
-        /// <param name="frameHeight">The frame's Height</param>
-        /// <param name="sheetWidth">The amount of frames on the x axis</param>
-        /// <param name="sheetHeight">The amount of frames on the y axis</param>
-        /// <param name="fps">The frames per second in miliseconds</param>
-        public OneAnimation(Texture2D tex, Vector2 pos, int frameWidth, int frameHeight, int sheetWidth, int sheetHeight, int fps, int sp, Keys u, Keys d, Keys l, Keys r) : base(tex, pos, frameWidth, frameHeight, sheetWidth, sheetHeight, fps, sp, u, d, l, r)
-        {
-            frameSize = new Point(frameWidth, frameHeight);
-            sheetSize = new Point(sheetWidth, sheetHeight);
             move = true;
-            fTime = fps;
-            speed = sp;
-            up = u;
-            down = d;
-            left = l;
-            right = r;
+            this.speed = speed;
+            this.up = up;
+            this.down = down;
+            this.left = left;
+            this.right = right;
         }

         public override void Update(GameTime gameTime)
@@ -99,17 +84,17 @@
                 {
                     position.Y = 0;
                 }
-                if (position.Y >= 480 - frameSize.Y)
+                if (position.Y >= 480 - currentAnimation.frameSize.Y)
                 {
-                    position.Y = 480 - frameSize.Y;
+                    position.Y = 480 - currentAnimation.frameSize.Y;
                 }
                 if (position.X <= 0)
                 {
                     position.X = 0;
                 }
-                if (position.X >= 480 - frameSize.X)
+                if (position.X >= 480 - currentAnimation.frameSize.X)
                 {
-                    position.X = 480 - frameSize.X;
+                    position.X = 480 - currentAnimation.frameSize.X;
                 }
             }


Update CouchDB.cs

Update CouchDB.cs

--- WDK.API.CouchDb/CouchDB.cs
+++ WDK.API.CouchDb/CouchDB.cs
@@ -1,4 +1,4 @@
-using Newtonsoft.Json;
+using Newtonsoft.Json;
 using Newtonsoft.Json.Converters;
 using Newtonsoft.Json.Linq;
 using System;
@@ -744,6 +744,20 @@

         #region " GetDocument "

+	    public object getDocument(string db, string docId)
+	    {
+			var result = doRequest(getUrl() + "/" + db + "/" + docId, "GET", false);
+
+		    if (!result.contentType.Contains("text/plain") && !result.contentType.Contains("application/json"))
+			    throw new InvalidServerResponseException("Invalid Server Response!", result);
+
+		    var serializer = new JsonSerializerSettings();
+		    serializer.Converters.Add(new JavaScriptDateTimeConverter());
+
+		    var ro = JsonConvert.DeserializeObject(result.contentString, serializer);
+		    return ro;
+	    }
+
         /// <summary>
         /// Get Document by its ID
         /// </summary>
@@ -751,28 +765,28 @@
         /// <param name="db"></param>
         /// <param name="docid"></param>
         /// <returns></returns>
-        public T getDocument<T>(string db, string docid) where T : new()
-        {
-            var result = doRequest(getUrl() + "/" + db + "/" + docid, "GET", false);
-
-            if (result.contentType.Contains("text/plain") || result.contentType.Contains("application/json"))
-            {
-                var serializer = new JsonSerializerSettings();
-                serializer.Converters.Add(new JavaScriptDateTimeConverter());
-
-                var ro = JsonConvert.DeserializeObject(result.contentString, serializer);
-
-                //ro.Remove("_id");
-                //ro.Remove("_rev");
-
-                var doc = new T();
-
-                JsonConvert.PopulateObject(ro.ToString(), doc);
-
-                return doc;
-            }
-            throw new InvalidServerResponseException("Invalid Server Response!", result);
-        }
+		//public T getDocument<T>(string db, string docid) where T : new()
+		//{
+		//	var result = doRequest(getUrl() + "/" + db + "/" + docid, "GET", false);
+
+		//	if (result.contentType.Contains("text/plain") || result.contentType.Contains("application/json"))
+		//	{
+		//		var serializer = new JsonSerializerSettings();
+		//		serializer.Converters.Add(new JavaScriptDateTimeConverter());
+
+		//		var ro = JsonConvert.DeserializeObject(result.contentString, serializer);
+
+		//		//ro.Remove("_id");
+		//		//ro.Remove("_rev");
+
+		//		var doc = new T();
+
+		//		JsonConvert.PopulateObject(ro.ToString(), doc);
+
+		//		return doc;
+		//	}
+		//	throw new InvalidServerResponseException("Invalid Server Response!", result);
+		//}

         #endregion

@@ -1017,7 +1031,7 @@

         public ServerResponse getInlineAttachment(string dbName, string docId, string attachmentName)
         {
-            var result = doRequest(getUrl() + "/" + dbName + "/" + docId + "/" + HttpUtility.UrlEncode(attachmentName), "GET", false);
+            var result = doRequest(getUrl() + "/" + dbName + "/" + docId + "/" + HttpUtility.UrlEncode(attachmentName), "GET", true);

             return result;
         }
@@ -2582,4 +2596,4 @@

         #endregion
     }
-}+}


Add back catch

Add back catch

--- WalletWasabi.Gui/Global.cs
+++ WalletWasabi.Gui/Global.cs
@@ -360,6 +360,13 @@
 				TransactionBroadcaster = new TransactionBroadcaster(Network, BitcoinStore, Synchronizer, Nodes, BitcoinCoreNode?.RpcClient);
 				CoinJoinProcessor = new CoinJoinProcessor(Synchronizer, BitcoinCoreNode?.RpcClient);
 			}
+			catch (Exception ex)
+			{
+				Logger.LogCritical(ex);
+				InitializationCompleted = true;
+				await DisposeAsync().ConfigureAwait(false);
+				Environment.Exit(1);
+			}
 			finally
 			{
 				InitializationCompleted = true;


Update WebAppSample to SDK 1.0.1

Update WebAppSample to SDK 1.0.1

--- WebAppSample/LineBotApp.cs
+++ WebAppSample/LineBotApp.cs
@@ -133,9 +133,10 @@
             if (userMessage == "buttons")
             {
                 replyMessage = new TemplateMessage("Button Template",
-                    new ButtonsTemplate(null, "ButtonsTemplate", "Click Buttons.",
-                    new List<ITemplateAction> {
-                        new MessageTemplateAction("Message Label", "sample data"),                  new PostbackTemplateAction("Postback Label", "sample data", "sample data"),
+                    new ButtonsTemplate(text:"ButtonsTemplate", title:"Click Buttons.",
+                    actions: new List<ITemplateAction> {
+                        new MessageTemplateAction("Message Label", "sample data"),
+                        new PostbackTemplateAction("Postback Label", "sample data", "sample data"),
                     new UriTemplateAction("Uri Label", "https://github.com/kenakamu")
                     }));
             }
@@ -167,10 +168,10 @@

                 replyMessage = new TemplateMessage("Button Template",
                     new CarouselTemplate(new List<CarouselColumn> {
-                        new CarouselColumn("https://github.com/apple-touch-icon.png",
-                        "Casousel 1 Title","Casousel 1 Text", actions1),
-                        new CarouselColumn("https://github.com/apple-touch-icon.png",
-                        "Casousel 1 Title","Casousel 1 Text", actions2)
+                        new CarouselColumn("Casousel 1 Text", "https://github.com/apple-touch-icon.png",
+                        "Casousel 1 Title", actions1),
+                        new CarouselColumn("Casousel 1 Text", "https://github.com/apple-touch-icon.png",
+                        "Casousel 1 Title", actions2)
                     }));
             }
             else if (userMessage == "imagecarousel")


Add ??list

Add ??list

--- WendySharp/Commands/Faq.cs
+++ WendySharp/Commands/Faq.cs
@@ -34,6 +34,18 @@
                 return;
             }

+            if (cmd[0] == "list")
+            {
+                if (!Commands.ContainsKey(command.Event.Recipient))
+                {
+                    command.Reply($"There are no commands in this channel.");
+                }
+
+                command.Reply($"Available commands: {string.Join(", ", Commands[command.Event.Recipient].Keys)}");
+
+                return;
+            }
+
             if (!Commands.ContainsKey(command.Event.Recipient))
             {
                 return;
@@ -50,7 +62,7 @@
                 command.Event.Sender.Nickname = $"{Color.RED}{cmd[1]}{Color.NORMAL}";
             }

-            command.Reply($"{Color.BLUE}{cmd[0]}{Color.NORMAL} - {text}");
+            command.Reply(text);
         }

         private void HandleModification(CommandArguments command, IReadOnlyList<string> cmd, bool isRemoval)


Compiler fix.

Compiler fix.

--- source/Cosmos.IL2CPU/GCImplementationRefs.cs
+++ source/Cosmos.IL2CPU/GCImplementationRefs.cs
@@ -11,7 +11,7 @@

         static GCImplementationRefs()
         {
-            Type xType = Type.GetType("Cosmos.Core.Common.GCImplementation, Cosmos.Core.Common", true);
+            Type xType = Type.GetType("Cosmos.Core.GCImplementation, Cosmos.Core", true);
             if (xType == null)
             {
                 throw new Exception("GCImplementation type not found!");


Periodically check for new versions every 4 hours #55

--- source/PlayniteUI/Windows/MainWindow.xaml.cs
+++ source/PlayniteUI/Windows/MainWindow.xaml.cs
@@ -150,59 +150,8 @@
             }

             LoadGames();
-
-            Task.Factory.StartNew(() =>
-            {
-                Thread.Sleep(1000);
-                var update = new Update();
-
-                try
-                {
-                    if (update.IsUpdateAvailable)
-                    {
-                        update.DownloadUpdate();
-
-                        try
-                        {
-                            update.DownloadReleaseNotes();
-                        }
-                        catch (Exception exc)
-                        {
-                            logger.Warn(exc, "Failed to download release notes.");
-                        }
-
-                        Dispatcher.Invoke(() =>
-                        {
-                            var window = new UpdateWindow()
-                            {
-                                Owner = this
-                            };
-
-                            window.SetUpdate(update);
-                            window.Show();
-                            window.Focus();
-                        });
-                    }
-                }
-                catch (Exception exc)
-                {
-                    logger.Error(exc, "Failed to process update.");
-                }
-            });
-
-            Task.Factory.StartNew(() =>
-            {
-                try
-                {
-                    var client = new ServicesClient();
-                    client.PostUserUsage();
-                }
-                catch (Exception exc)
-                {
-                    logger.Error(exc, "Failed to post user usage data.");
-                }
-            });
-
+            CheckUpdate();
+            SendUsageData();
             Focus();

             pipeService = new PipeService();
@@ -996,5 +945,71 @@
             GamesEditor.Instance.PlayGame(game);
             TrayPlaynite.TrayPopupResolved.IsOpen = false;
         }
+
+        private void CheckUpdate()
+        {
+            Task.Factory.StartNew(() =>
+            {
+                var update = new Update();
+                UpdateWindow updateWindow = null;
+
+                while (true)
+                {
+                    try
+                    {
+                        if ((updateWindow == null || !updateWindow.IsVisible) && update.IsUpdateAvailable)
+                        {
+                            if (update.IsUpdateAvailable)
+                            {
+                                update.DownloadUpdate();
+
+                                try
+                                {
+                                    update.DownloadReleaseNotes();
+                                }
+                                catch (Exception exc)
+                                {
+                                    logger.Warn(exc, "Failed to download release notes.");
+                                }
+
+                                Dispatcher.Invoke(() =>
+                                {
+                                    updateWindow = new UpdateWindow()
+                                    {
+                                        Owner = this
+                                    };
+
+                                    updateWindow.SetUpdate(update);
+                                    updateWindow.Show();
+                                    updateWindow.Focus();
+                                });
+                            }
+                        }
+                    }
+                    catch (Exception exc)
+                    {
+                        logger.Error(exc, "Failed to process update.");
+                    }
+
+                    Thread.Sleep(4 * 60 * 60 * 1000);
+                }
+            });
+        }
+
+        private void SendUsageData()
+        {
+            Task.Factory.StartNew(() =>
+            {
+                try
+                {
+                    var client = new ServicesClient();
+                    client.PostUserUsage();
+                }
+                catch (Exception exc)
+                {
+                    logger.Error(exc, "Failed to post user usage data.");
+                }
+            });
+        }
     }
 }


Fixed test failures caused by the debug/release naming change.

--- Compiler/Saltarelle.Compiler.Tests/Common.cs
+++ Compiler/Saltarelle.Compiler.Tests/Common.cs
@@ -11,16 +11,16 @@
 		public static readonly string MscorlibPath = Path.GetFullPath(@"..\..\..\Runtime\bin\mscorlib.dll");
 		public static readonly string LinqPath = Path.GetFullPath(@"..\..\..\Runtime\bin\Script.Linq.dll");

-        private static readonly Lazy<IAssemblyReference> _mscorlibLazy = new Lazy<IAssemblyReference>(() => new CecilLoader() { IncludeInternalMembers = true }.LoadAssemblyFile(MscorlibPath));
-        internal static IAssemblyReference Mscorlib { get { return _mscorlibLazy.Value; } }
+		private static readonly Lazy<IAssemblyReference> _mscorlibLazy = new Lazy<IAssemblyReference>(() => new CecilLoader() { IncludeInternalMembers = true }.LoadAssemblyFile(MscorlibPath));
+		internal static IAssemblyReference Mscorlib { get { return _mscorlibLazy.Value; } }

-        private static readonly Lazy<IAssemblyReference> _linqLazy = new Lazy<IAssemblyReference>(() => new CecilLoader() { IncludeInternalMembers = true }.LoadAssemblyFile(LinqPath));
-        internal static IAssemblyReference Linq { get { return _linqLazy.Value; } }
+		private static readonly Lazy<IAssemblyReference> _linqLazy = new Lazy<IAssemblyReference>(() => new CecilLoader() { IncludeInternalMembers = true }.LoadAssemblyFile(LinqPath));
+		internal static IAssemblyReference Linq { get { return _linqLazy.Value; } }

-        private static readonly Lazy<string> _mscorlibScriptLazy = new Lazy<string>(() => File.ReadAllText(@"..\..\..\Runtime\bin\Script\mscorlib.debug.js"));
+		private static readonly Lazy<string> _mscorlibScriptLazy = new Lazy<string>(() => File.ReadAllText(@"..\..\..\Runtime\bin\Script\mscorlib.js"));
 		internal static string MscorlibScript { get { return _mscorlibScriptLazy.Value; } }

-        private static readonly Lazy<string> _linqScriptLazy = new Lazy<string>(() => File.ReadAllText(@"..\..\..\Runtime\bin\Script\linq.js"));
+		private static readonly Lazy<string> _linqScriptLazy = new Lazy<string>(() => File.ReadAllText(@"..\..\..\Runtime\bin\Script\linq.js"));
 		internal static string LinqScript { get { return _linqScriptLazy.Value; } }

 		public static Mock<ITypeDefinition> CreateTypeMock(string fullName) {


TryEnter should fail when full

TryEnter should fail when full

--- Core/System/Threading/SemaphoreSlim.net35.cs
+++ Core/System/Threading/SemaphoreSlim.net35.cs
@@ -165,6 +165,10 @@
             // Should only be called when there is room in the semaphore
             // No check is done to verify that
             var result = Thread.VolatileRead(ref _count) + 1;
+            if (result > _maxCount)
+            {
+                return false;
+            }
             var found = Interlocked.CompareExchange(ref _count, result, _count);
             if (found == result - 1)
             {


Fixes #4192 Quick Info tooltip follows the mouse as it moves Only dismisses quick info if we have moved outside the applicable span.

--- Python/Product/PythonTools/PythonTools/Intellisense/IntellisenseController.cs
+++ Python/Product/PythonTools/PythonTools/Intellisense/IntellisenseController.cs
@@ -102,47 +102,67 @@
                 .DoNotWait();
         }

+        private static async Task DismissQuickInfo(IAsyncQuickInfoSession session) {
+            if (session != null && session.State != QuickInfoSessionState.Dismissed) {
+                await session.DismissAsync();
+            }
+        }
+
         private async Task TextViewMouseHoverWorker(MouseHoverEventArgs e) {
-            if (_quickInfoSession != null && _quickInfoSession.State != QuickInfoSessionState.Dismissed) {
-                await _quickInfoSession.DismissAsync();
-            }
-
             var pt = e.TextPosition.GetPoint(EditorExtensions.IsPythonContent, PositionAffinity.Successor);
-            if (pt != null) {
-                if (_textView.TextBuffer.GetInteractiveWindow() != null &&
-                    pt.Value.Snapshot.Length > 1 &&
-                    pt.Value.Snapshot[0] == '$') {
-                    // don't provide quick info on help, the content type doesn't switch until we have
-                    // a complete command otherwise we shouldn't need to do this.
-                    return;
-                }
-
-                var entry = await e.View.TextBuffer.GetAnalysisEntryAsync(_services);
-                if (entry == null) {
-                    return;
-                }
-
-                var t = entry.Analyzer.GetQuickInfoAsync(entry, _textView, pt.Value);
-                var quickInfo = await Task.Run(() => entry.Analyzer.WaitForRequest(t, "GetQuickInfo", null, 2));
-
-                AsyncQuickInfoSource.AddQuickInfo(_textView, quickInfo);
-
-                if (quickInfo != null) {
-                    var viewPoint = _textView.BufferGraph.MapUpToBuffer(
-                        pt.Value,
-                        PointTrackingMode.Positive,
-                        PositionAffinity.Successor,
-                        _textView.TextBuffer
-                    );
-
-                    if (viewPoint != null) {
-                        _quickInfoSession = await _services.QuickInfoBroker.TriggerQuickInfoAsync(
-                            _textView,
-                            viewPoint.Value.Snapshot.CreateTrackingPoint(viewPoint.Value, PointTrackingMode.Positive),
-                            QuickInfoSessionOptions.TrackMouse
-                        );
-                    }
-                }
+            if (pt == null) {
+                return;
+            }
+
+            if (_textView.TextBuffer.GetInteractiveWindow() != null &&
+                pt.Value.Snapshot.Length > 1 &&
+                pt.Value.Snapshot[0] == '$') {
+                // don't provide quick info on help, the content type doesn't switch until we have
+                // a complete command otherwise we shouldn't need to do this.
+                await DismissQuickInfo(Interlocked.Exchange(ref _quickInfoSession, null));
+                return;
+            }
+
+            var entry = await e.View.TextBuffer.GetAnalysisEntryAsync(_services);
+            if (entry == null) {
+                await DismissQuickInfo(Interlocked.Exchange(ref _quickInfoSession, null));
+                return;
+            }
+
+            var session = _quickInfoSession;
+            if (session != null) {
+                try {
+                    var span = session.ApplicableToSpan?.GetSpan(pt.Value.Snapshot);
+                    if (span != null && span.Value.Contains(pt.Value)) {
+                        return;
+                    }
+                } catch (ArgumentException) {
+                }
+            }
+
+            var t = entry.Analyzer.GetQuickInfoAsync(entry, _textView, pt.Value);
+            var quickInfo = await Task.Run(() => entry.Analyzer.WaitForRequest(t, "GetQuickInfo", null, 2));
+
+            AsyncQuickInfoSource.AddQuickInfo(_textView, quickInfo);
+
+            if (quickInfo == null) {
+                await DismissQuickInfo(Interlocked.Exchange(ref _quickInfoSession, null));
+                return;
+            }
+
+            var viewPoint = _textView.BufferGraph.MapUpToBuffer(
+                pt.Value,
+                PointTrackingMode.Positive,
+                PositionAffinity.Successor,
+                _textView.TextBuffer
+            );
+
+            if (viewPoint != null) {
+                _quickInfoSession = await _services.QuickInfoBroker.TriggerQuickInfoAsync(
+                    _textView,
+                    viewPoint.Value.Snapshot.CreateTrackingPoint(viewPoint.Value, PointTrackingMode.Positive),
+                    QuickInfoSessionOptions.TrackMouse
+                );
             }
         }


#151 Slight fixes

#151 Slight fixes

--- RDFSharp/Semantics/OWL/Ontology/Model/ClassModel/RDFOntologyClassModelLens.cs
+++ RDFSharp/Semantics/OWL/Ontology/Model/ClassModel/RDFOntologyClassModelLens.cs
@@ -50,7 +50,7 @@
                 if (ontology != null)
                 {
                     this.OntologyClass = ontologyClass;
-                    this.Ontology = ontology;
+                    this.Ontology = ontology.UnionWith(RDFBASEOntology.Instance);
                 }
                 else
                 {
@@ -176,7 +176,7 @@
             if (RDFOntologyHelper.CheckIsLiteralCompatibleClass(this.Ontology.Model.ClassModel, this.OntologyClass))
             {
                 IEnumerable<RDFOntologyLiteral> ontlits = this.Ontology.Data.Literals.Values.Where(ol => ol.Value is RDFTypedLiteral);
-                foreach (RDFOntologyLiteral ontlit in ontlits.Where(ol => RDFModelUtilities.GetDatatypeFromEnum(((RDFTypedLiteral)ol.Value).Datatype).Equals(this.OntologyClass)))
+                foreach (RDFOntologyLiteral ontlit in ontlits.Where(ol => RDFModelUtilities.GetDatatypeFromEnum(((RDFTypedLiteral)ol.Value).Datatype).Equals(this.OntologyClass.ToString())))
                 {
                     if (!result.Any(ol => ol.Equals(ontlit)))
                         result.Add((false, ontlit));


adding using statement to preview file to prevent missing htmlhelper error.

--- src/Umbraco.Web.UI/Umbraco/Views/Preview/Index.cshtml
+++ src/Umbraco.Web.UI/Umbraco/Views/Preview/Index.cshtml
@@ -1,4 +1,5 @@
-@inherits System.Web.Mvc.WebViewPage<Umbraco.Web.Models.ContentEditing.BackOfficePreview>
+@using System.Web.Mvc.Html
+@inherits System.Web.Mvc.WebViewPage<Umbraco.Web.Models.ContentEditing.BackOfficePreview>
 @{
     var disableDevicePreview = Model.DisableDevicePreview.ToString().ToLowerInvariant();
 }


New experiment was configured

New experiment was configured

--- src/Utils/WaveletCodesListDecodingAnalyzer/Program.cs
+++ src/Utils/WaveletCodesListDecodingAnalyzer/Program.cs
@@ -421,7 +421,7 @@
             (levelMatricesProvider, encodingLevelsCount) =>
                 new LinearMultilevelEncoder(
                     new CanonicalProvider(levelMatricesProvider),
-                    new DetailsAbsenceBasedProvider(encodingLevelsCount),
+                    new RepetitionBasedProvider(),
                     new BasicCodewordMutator(),
                     encodingLevelsCount
                 )
@@ -688,9 +688,9 @@
                     field,
                     16,
                     16,
-                    8,
+                    7,
                     4,
-                    5/*,
+                    8/*,
                     new FiltersBankVectors(
                         (null, null),
                         (field.CreateElementsVector(1, 2, 1, 2, 0, 1, 0, 0, 1, 2, 1, 2, 0, 1, 0, 0), null)


Add missing ToString unit test for WordCombination.

--- src/WordList.Tests/Processing/WordCombinationTests.cs
+++ src/WordList.Tests/Processing/WordCombinationTests.cs
@@ -22,6 +22,17 @@
       public void GivenNullWords_Throws() {
         Assert.Throws<ArgumentNullException>(() => new WordCombination(_word1, null));
         Assert.Throws<ArgumentNullException>(() => new WordCombination(null, _word2));
+      }
+    }
+
+    [TestFixture]
+    public new class ToString : WordCombinationTests {
+      [Test]
+      public void ToString_ReturnsValue() {
+        var expected = $"{_word1.Value} + {_word2.Value} => {_word1.Value + _word2.Value}";
+        var sut = new WordCombination(_word1, _word2);
+        var actual = sut.ToString();
+        Assert.That(actual, Is.EqualTo(expected));
       }
     }


added test case for VW string from JSON parsing

--- cs/unittest/TestJsonDirect.cs
+++ cs/unittest/TestJsonDirect.cs
@@ -3,6 +3,7 @@
 using VW;
 using VW.Interfaces;
 using VW.Labels;
+using VW.Serializer;

 namespace cs_unittest
 {
@@ -112,6 +113,42 @@
                 vw.Validate("| Feature:25", new JsonContextByte { Feature = 25 });
             }
         }
+
+        [TestMethod]
+        [TestCategory("JSON")]
+        public void TestJsonToVWString()
+        {
+            var jsonContext = new JsonContext()
+            {
+                Label = new SimpleLabel
+                {
+                    Label = 25
+                },
+                Ns1 = new Namespace1
+                {
+                    Foo = 1,
+                    Age = "25 old",
+                    DontConsider = "XXX"
+                },
+                Ns2 = new Namespace2
+                {
+                    FeatureA = true
+                },
+                Clicks = 5
+            };
+            var jsonContextString = JsonConvert.SerializeObject(jsonContext);
+
+            using (var vw = new VowpalWabbit(new VowpalWabbitSettings("--quiet -t", enableStringExampleGeneration: true, enableStringFloatCompact: true)))
+            {
+                var vwjson = new VowpalWabbitJsonSerializer(vw);
+                vwjson.Parse(jsonContextString);
+
+                VowpalWabbitExample vwExample = vwjson.CreateExample();
+                string vwExampleString = vwExample.VowpalWabbitString;
+
+                Assert.AreEqual("25 |a Bar:1 25_old |b Marker |  Clicks:5 MoreClicks:0", vwExampleString);
+            }
+        }
     }

     [JsonObject(MemberSerialization = MemberSerialization.OptOut)]


Fix a typo

Fix a typo

--- LiveSplit/LiveSplit.Core/Web/Share/SplitsIO.cs
+++ LiveSplit/LiveSplit.Core/Web/Share/SplitsIO.cs
@@ -38,7 +38,7 @@
             + "splits with the world and downloading them from there. "
             + "You can also browse Splits.io with \"Open Splits From Splits.io...\" "
             + "or import splits as a comparison with \"Import Comparison From Splits.io...\". "
-            + "Splits downloaded from Splits.io have not data loss, and the splits can be "
+            + "Splits downloaded from Splits.io have no data loss, and the splits can be "
             + "downloaded in the format for any timer.";

         public ISettings Settings { get; set; }


Alpha release

Alpha release

--- Main/Source/Effort/Helpers/ExpressionHelper.cs
+++ Main/Source/Effort/Helpers/ExpressionHelper.cs
@@ -36,6 +36,11 @@
     {
         public static void TryUnifyValueTypes(ref Expression left, ref Expression right)
         {
+            if (left.Type == right.Type)
+            {
+                return;
+            }
+
             if (TypeHelper.IsCastableTo(left.Type, right.Type))
             {
                 ConvertExpression(ref right, ref left);


Updating CannotSealType to report a better error message when the type is sealed due to a private constructor

--- src/ApiCompat/Rules/Compat/CannotSealType.cs
+++ src/ApiCompat/Rules/Compat/CannotSealType.cs
@@ -18,7 +18,7 @@
             if (impl.IsEffectivelySealed() && !contract.IsEffectivelySealed())
             {
                 differences.AddIncompatibleDifference(this,
-                    $"Type '{impl.FullName()}' is sealed in the {Implementation} but not sealed in the {Contract}.");
+                        $"Type '{impl.FullName()}' is {(impl.IsSealed ? "actually (has the sealed modifier)" : "effectively (has a private constructor)")} sealed in the {Implementation} but not sealed in the {Contract}.");

                 return DifferenceType.Changed;
             }


Revert async Task change

Revert async Task change

--- osu.Game/BackgroundBeatmapProcessor.cs
+++ osu.Game/BackgroundBeatmapProcessor.cs
@@ -5,6 +5,7 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using Newtonsoft.Json;
 using osu.Framework.Allocation;
@@ -45,12 +46,12 @@
         {
             base.LoadComplete();

-            Task.Run(async () =>
+            Task.Run(() =>
             {
                 Logger.Log("Beginning background beatmap processing..");
                 checkForOutdatedStarRatings();
-                await processBeatmapSetsWithMissingMetrics();
-                await processScoresWithMissingStatistics();
+                processBeatmapSetsWithMissingMetrics();
+                processScoresWithMissingStatistics();
             }).ContinueWith(t =>
             {
                 if (t.Exception?.InnerException is ObjectDisposedException)
@@ -99,7 +100,7 @@
             }
         }

-        private async Task processBeatmapSetsWithMissingMetrics()
+        private void processBeatmapSetsWithMissingMetrics()
         {
             HashSet<Guid> beatmapSetIds = new HashSet<Guid>();

@@ -123,7 +124,7 @@
                 while (localUserPlayInfo?.IsPlaying.Value == true)
                 {
                     Logger.Log("Background processing sleeping due to active gameplay...");
-                    await Task.Delay(TimeToSleepDuringGameplay);
+                    Thread.Sleep(TimeToSleepDuringGameplay);
                 }

                 realmAccess.Run(r =>
@@ -146,7 +147,7 @@
             }
         }

-        private async Task processScoresWithMissingStatistics()
+        private void processScoresWithMissingStatistics()
         {
             HashSet<Guid> scoreIds = new HashSet<Guid>();

@@ -168,7 +169,7 @@
                 while (localUserPlayInfo?.IsPlaying.Value == true)
                 {
                     Logger.Log("Background processing sleeping due to active gameplay...");
-                    await Task.Delay(TimeToSleepDuringGameplay);
+                    Thread.Sleep(TimeToSleepDuringGameplay);
                 }

                 try


Show notification when migration fails to give users a recovery path

--- osu.Game/Database/EFToRealmMigrator.cs
+++ osu.Game/Database/EFToRealmMigrator.cs
@@ -142,6 +142,16 @@
                 {
                     log("Migration failed!");
                     Logger.Log(t.Exception.ToString(), LoggingTarget.Database);
+
+                    notificationOverlay.Post(new SimpleErrorNotification
+                    {
+                        Text = "IMPORTANT: During data migration, some of your data could not be successfully migrated. It has been backed up in your osu! folder.\n\nFor further assistance, please open a discussion on github and attach your backup files (click to get started).",
+                        Activated = () =>
+                        {
+                            game.OpenUrlExternally(@"https://github.com/ppy/osu/discussions/new?title=Realm%20migration%20issue&body=Please%20attach%20your%20database%20backups%20by%20zipping%20them%20and%20dragging%20in%20here!&category=q-a");
+                            return true;
+                        }
+                    });
                 }

                 // Regardless of success, since the game is going to continue with startup let's move the ef database out of the way.


Apply the default `SampleControlPoint` if not externally provided

This is mostly to handle tests for now, as generally this should be
provided by an external source in all other cases.

--- osu.Game/Rulesets/Objects/HitObject.cs
+++ osu.Game/Rulesets/Objects/HitObject.cs
@@ -112,6 +112,10 @@
                 // This is done here since ApplyDefaultsToSelf may be used to determine the end time
                 SampleControlPoint = legacyInfo.SamplePointAt(this.GetEndTime() + control_point_leniency);
             }
+            else
+            {
+                SampleControlPoint ??= SampleControlPoint.DEFAULT;
+            }

             nestedHitObjects.Clear();


Revert "Also save on skin switch"

Revert "Also save on skin switch"

This reverts commit 2f55d1e5ab9c734bb07519849d6ca4c31f32b375.

--- osu.Game/Skinning/Editor/SkinEditor.cs
+++ osu.Game/Skinning/Editor/SkinEditor.cs
@@ -143,8 +143,6 @@
             // probably something which will be factored out in a future database refactor so not too concerning for now.
             currentSkin.BindValueChanged(skin =>
             {
-                Save();
-
                 hasBegunMutating = false;
                 Scheduler.AddOnce(skinChanged);
             }, true);


Revert public access

Revert public access

--- SpiceSharp/Components/Component.cs
+++ SpiceSharp/Components/Component.cs
@@ -45,7 +45,7 @@
         /// <summary>
         /// Gets the model of the circuit component (if any)
         /// </summary>
-        public Entity Model { get; set; } = null;
+        public Entity Model { get; protected set; } = null;

         /// <summary>
         /// Connect the component in the circuit


[fix]モールス信号変換ツールが上手く変換されない問題の修正

[fix]モールス信号変換ツールが上手く変換されない問題の修正

--- Src/KIBOTTER/KIBOTTER/MorseCode.cs
+++ Src/KIBOTTER/KIBOTTER/MorseCode.cs
@@ -305,7 +305,7 @@
             {
                 if (c == 'が')
                 {
-                    return "・－・・ ・・";
+                    return "・－・・　・・";
                 }
                 return "・－・・";
             }
@@ -313,7 +313,7 @@
             {
                 if (c == 'ぎ')
                 {
-                    return "－・－・・ ・・";
+                    return "－・－・・　・・";
                 }
                 return "－・－・・";
             }
@@ -321,7 +321,7 @@
             {
                 if (c == 'ぐ')
                 {
-                    return "・・・－ ・・";
+                    return "・・・－　・・";
                 }
                 return "・・・－";
             }
@@ -329,7 +329,7 @@
             {
                 if (c == 'げ')
                 {
-                    return "－・－－ ・・";
+                    return "－・－－　・・";
                 }
                 return "－・－－";
             }
@@ -337,7 +337,7 @@
             {
                 if (c == 'ご')
                 {
-                    return "－－－－ ・・";
+                    return "－－－－　・・";
                 }
                 return "－－－－";
             }
@@ -345,7 +345,7 @@
             {
                 if (c == 'ざ')
                 {
-                    return "－・－・－ ・・";
+                    return "－・－・－　・・";
                 }
                 return "－・－・－";
             }
@@ -353,7 +353,7 @@
             {
                 if (c == 'じ')
                 {
-                    return "－－・－・ ・・";
+                    return "－－・－・　・・";
                 }
                 return "－－・－・";
             }
@@ -361,7 +361,7 @@
             {
                 if (c == 'ず')
                 {
-                    return "－－－・－ ・・";
+                    return "－－－・－　・・";
                 }
                 return "－－－・－";
             }
@@ -369,7 +369,7 @@
             {
                 if (c == 'ぜ')
                 {
-                    return "・－－－・ ・・";
+                    return "・－－－・　・・";
                 }
                 return "・－－－・";
             }
@@ -377,7 +377,7 @@
             {
                 if (c == 'ぞ')
                 {
-                    return "－－－・ ・・";
+                    return "－－－・　・・";
                 }
                 return "－－－・";
             }
@@ -385,7 +385,7 @@
             {
                 if (c == 'だ')
                 {
-                    return "－・ ・・";
+                    return "－・　・・";
                 }
                 return "－・";
             }
@@ -393,7 +393,7 @@
             {
                 if (c == 'ぢ')
                 {
-                    return "・・－・ ・・";
+                    return "・・－・　・・";
                 }
                 return "・・－・";
             }
@@ -401,7 +401,7 @@
             {
                 if (c == 'づ')
                 {
-                    return "・－－・ ・・";
+                    return "・－－・　・・";
                 }
                 return "・－－・";
             }
@@ -409,7 +409,7 @@
             {
                 if (c == 'で')
                 {
-                    return "・－・－－ ・・";
+                    return "・－・－－　・・";
                 }
                 return "・－・－－";
             }
@@ -417,7 +417,7 @@
             {
                 if (c == 'ど')
                 {
-                    return "・・－・・ ・・";
+                    return "・・－・・　・・";
                 }
                 return "・・－・・";
             }
@@ -445,11 +445,11 @@
             {
                 if (c == 'ば')
                 {
-                    return "－・・・ ・・";
+                    return "－・・・　・・";
                 }
                 if (c == 'ぱ')
                 {
-                    return "－・・・ ・・－－・";
+                    return "－・・・　・・－－・";
                 }
                 return "－・・・";
             }
@@ -457,11 +457,11 @@
             {
                 if (c == 'び')
                 {
-                    return "－－・・－ ・・";
+                    return "－－・・－　・・";
                 }
                 if (c == 'ぴ')
                 {
-                    return "－－・・－ ・・－－・";
+                    return "－－・・－　・・－－・";
                 }
                 return "－－・・－";
             }
@@ -469,11 +469,11 @@
             {
                 if (c == 'ぶ')
                 {
-                    return "－－・・ ・・";
+                    return "－－・・　・・";
                 }
                 if (c == 'ぷ')
                 {
-                    return "－－・・ ・・－－・";
+                    return "－－・・　・・－－・";
                 }
                 return "－－・・";
             }
@@ -481,11 +481,11 @@
             {
                 if (c == 'べ')
                 {
-                    return "・ ・・";
+                    return "・　・・";
                 }
                 if (c == 'ぺ')
                 {
-                    return "・ ・・－－・";
+                    return "・　・・－－・";
                 }
                 return "・";
             }
@@ -493,11 +493,11 @@
             {
                 if (c == 'ぼ')
                 {
-                    return "－・・ ・・";
+                    return "－・・　・・";
                 }
                 if (c == 'ぽ')
                 {
-                    return "－・・ ・・－－・";
+                    return "－・・　・・－－・";
                 }
                 return "－・・";
             }
@@ -666,7 +666,7 @@
             {
                 if (c == 'ガ')
                 {
-                    return "・－・・ ・・";
+                    return "・－・・　・・";
                 }
                 return "・－・・";
             }
@@ -674,7 +674,7 @@
             {
                 if (c == 'ギ')
                 {
-                    return "－・－・・ ・・";
+                    return "－・－・・　・・";
                 }
                 return "－・－・・";
             }
@@ -682,7 +682,7 @@
             {
                 if (c == 'グ')
                 {
-                    return "・・・－ ・・";
+                    return "・・・－　・・";
                 }
                 return "・・・－";
             }
@@ -690,7 +690,7 @@
             {
                 if (c == 'ゲ')
                 {
-                    return "－・－－ ・・";
+                    return "－・－－　・・";
                 }
                 return "－・－－";
             }
@@ -698,7 +698,7 @@
             {
                 if (c == 'ゴ')
                 {
-                    return "－－－－ ・・";
+                    return "－－－－　・・";
                 }
                 return "－－－－";
             }
@@ -706,7 +706,7 @@
             {
                 if (c == 'ザ')
                 {
-                    return "－・－・－ ・・";
+                    return "－・－・－　・・";
                 }
                 return "－・－・－";
             }
@@ -714,7 +714,7 @@
             {
                 if (c == 'ジ')
                 {
-                    return "－－・－・ ・・";
+                    return "－－・－・　・・";
                 }
                 return "－－・－・";
             }
@@ -722,7 +722,7 @@
             {
                 if (c == 'ズ')
                 {
-                    return "－－－・－ ・・";
+                    return "－－－・－　・・";
                 }
                 return "－－－・－";
             }
@@ -730,7 +730,7 @@
             {
                 if (c == 'ゼ')
                 {
-                    return "・－－－・ ・・";
+                    return "・－－－・　・・";
                 }
                 return "・－－－・";
             }
@@ -738,7 +738,7 @@
             {
                 if (c == 'ゾ')
                 {
-                    return "－－－・ ・・";
+                    return "－－－・　・・";
                 }
                 return "－－－・";
             }
@@ -746,7 +746,7 @@
             {
                 if (c == 'ダ')
                 {
-                    return "－・ ・・";
+                    return "－・　・・";
                 }
                 return "－・";
             }
@@ -754,7 +754,7 @@
             {
                 if (c == 'ヂ')
                 {
-                    return "・・－・ ・・";
+                    return "・・－・　・・";
                 }
                 return "・・－・";
             }
@@ -763,7 +763,7 @@
             {
                 if (c == 'ヅ')
                 {
-                    return "・－－・ ・・";
+                    return "・－－・　・・";
                 }
                 return "・－－・";
             }
@@ -771,7 +771,7 @@
             {
                 if (c == 'デ')
                 {
-                    return "・－・－－ ・・";
+                    return "・－・－－　・・";
                 }
                 return "・－・－－";
             }
@@ -779,7 +779,7 @@
             {
                 if (c == 'ド')
                 {
-                    return "・・－・・ ・・";
+                    return "・・－・・　・・";
                 }
                 return "・・－・・";
             }
@@ -808,11 +808,11 @@
             {
                 if (c == 'バ')
                 {
-                    return "－・・・ ・・";
+                    return "－・・・　・・";
                 }
                 if (c == 'パ')
                 {
-                    return "－・・・ ・・－－・";
+                    return "－・・・　・・－－・";
                 }
                 return "－・・・";
             }
@@ -821,11 +821,11 @@
             {
                 if (c == 'ビ')
                 {
-                    return "－－・・－ ・・";
+                    return "－－・・－　・・";
                 }
                 if (c == 'ピ')
                 {
-                    return "－－・・－ ・・－－・";
+                    return "－－・・－　・・－－・";
                 }
                 return "－－・・－";
             }
@@ -834,11 +834,11 @@
             {
                 if (c == 'ブ')
                 {
-                    return "－－・・ ・・";
+                    return "－－・・　・・";
                 }
                 if (c == 'プ')
                 {
-                    return "－－・・ ・・－－・";
+                    return "－－・・　・・－－・";
                 }
                 return "－－・・";
             }
@@ -847,11 +847,11 @@
             {
                 if (c == 'ベ')
                 {
-                    return "・ ・・";
+                    return "・　・・";
                 }
                 if (c == 'ペ')
                 {
-                    return "・ ・・－－・";
+                    return "・　・・－－・";
                 }
                 return "・";
             }
@@ -860,11 +860,11 @@
             {
                 if (c == 'ボ')
                 {
-                    return "－・・ ・・";
+                    return "－・・　・・";
                 }
                 if (c == 'ポ')
                 {
-                    return "－・・ ・・－－・";
+                    return "－・・　・・－－・";
                 }
                 return "－・・";
             }