Remove array allocation from CTS.CreateLinkedTokenSource

The most common uses of CreateLinkedTokenSource involve passing in one or two tokens, but even for these cases we end up allocating an array of registrations.  This commit fixes that.

--- src/mscorlib/src/System/Threading/CancellationTokenSource.cs
+++ src/mscorlib/src/System/Threading/CancellationTokenSource.cs
@@ -864,12 +864,19 @@
         /// <param name="token2">The second <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to observe.</param>
         /// <returns>A <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that is linked
         /// to the source tokens.</returns>
-        public static CancellationTokenSource CreateLinkedTokenSource(CancellationToken token1, CancellationToken token2)
-        {
-            return token1.CanBeCanceled || token2.CanBeCanceled ?
-                new LinkedCancellationTokenSource(token1, token2) :
-                new CancellationTokenSource();
-        }
+        public static CancellationTokenSource CreateLinkedTokenSource(CancellationToken token1, CancellationToken token2) =>
+            !token1.CanBeCanceled ? CreateLinkedTokenSource(token2) :
+            token2.CanBeCanceled ? new Linked2CancellationTokenSource(token1, token2) :
+            (CancellationTokenSource)new Linked1CancellationTokenSource(token1);
+
+        /// <summary>
+        /// Creates a <see cref="CancellationTokenSource"/> that will be in the canceled state
+        /// when any of the source tokens are in the canceled state.
+        /// </summary>
+        /// <param name="token">The first <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to observe.</param>
+        /// <returns>A <see cref="CancellationTokenSource"/> that is linked to the source tokens.</returns>
+        internal static CancellationTokenSource CreateLinkedTokenSource(CancellationToken token) =>
+            token.CanBeCanceled ? new Linked1CancellationTokenSource(token) : new CancellationTokenSource();

         /// <summary>
         /// Creates a <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that will be in the canceled state
@@ -884,14 +891,19 @@
             if (tokens == null)
                 throw new ArgumentNullException(nameof(tokens));

-            if (tokens.Length == 0)
-                throw new ArgumentException(Environment.GetResourceString("CancellationToken_CreateLinkedToken_TokensIsEmpty"));
-
-            // a defensive copy is not required as the array has value-items that have only a single IntPtr field,
-            // hence each item cannot be null itself, and reads of the payloads cannot be torn.
-            Contract.EndContractBlock();
-
-            return new LinkedCancellationTokenSource(tokens);
+            switch (tokens.Length)
+            {
+                case 0:
+                    throw new ArgumentException(Environment.GetResourceString("CancellationToken_CreateLinkedToken_TokensIsEmpty"));
+                case 1:
+                    return CreateLinkedTokenSource(tokens[0]);
+                case 2:
+                    return CreateLinkedTokenSource(tokens[0], tokens[1]);
+                default:
+                    // a defensive copy is not required as the array has value-items that have only a single reference field,
+                    // hence each item cannot be null itself, and reads of the payloads cannot be torn.
+                    return new LinkedNCancellationTokenSource(tokens);
+            }
         }

@@ -907,35 +919,50 @@
             }
         }

-        private sealed class LinkedCancellationTokenSource : CancellationTokenSource
-        {
-            private static readonly Action<object> s_linkedTokenCancelDelegate =
+        private sealed class Linked1CancellationTokenSource : CancellationTokenSource
+        {
+            private readonly CancellationTokenRegistration _reg1;
+
+            internal Linked1CancellationTokenSource(CancellationToken token1)
+            {
+                _reg1 = token1.InternalRegisterWithoutEC(LinkedNCancellationTokenSource.s_linkedTokenCancelDelegate, this);
+            }
+
+            protected override void Dispose(bool disposing)
+            {
+                if (!disposing || m_disposed) return;
+                _reg1.Dispose();
+                base.Dispose(disposing);
+            }
+        }
+
+        private sealed class Linked2CancellationTokenSource : CancellationTokenSource
+        {
+            private readonly CancellationTokenRegistration _reg1;
+            private readonly CancellationTokenRegistration _reg2;
+
+            internal Linked2CancellationTokenSource(CancellationToken token1, CancellationToken token2)
+            {
+                _reg1 = token1.InternalRegisterWithoutEC(LinkedNCancellationTokenSource.s_linkedTokenCancelDelegate, this);
+                _reg2 = token2.InternalRegisterWithoutEC(LinkedNCancellationTokenSource.s_linkedTokenCancelDelegate, this);
+            }
+
+            protected override void Dispose(bool disposing)
+            {
+                if (!disposing || m_disposed) return;
+                _reg1.Dispose();
+                _reg2.Dispose();
+                base.Dispose(disposing);
+            }
+        }
+
+        private sealed class LinkedNCancellationTokenSource : CancellationTokenSource
+        {
+            internal static readonly Action<object> s_linkedTokenCancelDelegate =
                 s => ((CancellationTokenSource)s).NotifyCancellation(throwOnFirstException: false); // skip ThrowIfDisposed() check in Cancel()
             private CancellationTokenRegistration[] m_linkingRegistrations;

-            internal LinkedCancellationTokenSource(CancellationToken token1, CancellationToken token2)
-            {
-                bool token2CanBeCanceled = token2.CanBeCanceled;
-
-                if (token1.CanBeCanceled)
-                {
-                    m_linkingRegistrations = new CancellationTokenRegistration[token2CanBeCanceled ? 2 : 1]; // there will be at least 1 and at most 2 linkings
-                    m_linkingRegistrations[0] = token1.InternalRegisterWithoutEC(s_linkedTokenCancelDelegate, this);
-                }
-
-                if (token2CanBeCanceled)
-                {
-                    int index = 1;
-                    if (m_linkingRegistrations == null)
-                    {
-                        m_linkingRegistrations = new CancellationTokenRegistration[1]; // this will be the only linking
-                        index = 0;
-                    }
-                    m_linkingRegistrations[index] = token2.InternalRegisterWithoutEC(s_linkedTokenCancelDelegate, this);
-                }
-            }
-
-            internal LinkedCancellationTokenSource(params CancellationToken[] tokens)
+            internal LinkedNCancellationTokenSource(params CancellationToken[] tokens)
             {
                 m_linkingRegistrations = new CancellationTokenRegistration[tokens.Length];

@@ -968,7 +995,6 @@

                 base.Dispose(disposing);
             }
-
         }
     }


PropInst works some more.. (what worked for calls now also works for assignments, roughly..)

--- AddOns/PropInst/PropInst/Program.cs
+++ AddOns/PropInst/PropInst/Program.cs
@@ -18,6 +18,9 @@
     {
         public HashSet<IToken> ProcsThatHaveBeenInstrumented = new HashSet<IToken>();

+
+        //TODO: collect some stats about the instrumentation, mb some debugging output??
+
         private static void Main(string[] args)
         {
             if (args.Length < 3)
@@ -34,14 +37,14 @@
             #region parse the property file

             var propString = File.ReadAllText(args[0]);
-            var singleInstructions = propString.Split(new string[] {Constants.RuleSeparator}, StringSplitOptions.None);
+            var singleInstructions = propString.Split(new string[] { Constants.RuleSeparator }, StringSplitOptions.None);
             foreach (var s in singleInstructions)
             {
                 var instruction = s.Trim();
-                var lines = instruction.Split(new char[] {'\n'}, 2);
+                var lines = instruction.Split(new char[] { '\n' }, 2);

                 var instructionType = lines[0].Trim();
-                var instructionData = lines[1].Split(new char[] {'\n'}).Where(line => !(line.StartsWith("//") || line.Trim() == ""));
+                var instructionData = lines[1].Split(new char[] { '\n' }).Where(line => !(line.StartsWith("//") || line.Trim() == ""));

                 switch (instructionType)
                 {
@@ -218,12 +221,10 @@
     class InstrumentInsertionAtCmd
     {
         private readonly Prop_InsertCodeAtCmd _propInsertCodeAtCmd;
-        private readonly Program _program; // exists for debugging purposes

         private InstrumentInsertionAtCmd(Prop_InsertCodeAtCmd ins, Program prog)
         {
             _propInsertCodeAtCmd = ins;
-            _program = prog;
         }

         public static void Instrument(Program program, Prop_InsertCodeAtCmd ins)
@@ -249,11 +250,6 @@
                     else newcmds.Add(cmd);
                 }
                 block.Cmds = newcmds;
-                //Debug.Assert(BoogieUtil.ResolveProgram(_program, "C:\\Users\\t-alnu\\Desktop\\try\\out.bpl"));
-                //Debug.Assert(BoogieUtil.ReResolve(_program) != null);
-                //Debug.Assert(BoogieUtil.TypecheckProgram(_program, "C:\\Users\\t-alnu\\Desktop\\try\\out.bpl"));
-                //BoogieUtil.ReResolve(_program);
-                //BoogieUtil.PrintProgram(_program, "C:\\Users\\t-alnu\\Desktop\\try\\out.bpl");
             }
         }

@@ -265,17 +261,9 @@
             {
                 if (!(m is CallCmd))
                     continue;
-                var toMatch = (CallCmd) m;
-
-                //TODO: these will have to map to lists of Expressions and so in the end (there may be multiple matches..)
-                // --> so we'll call the substitutionvisitor for each list entry and get a new command out..
-                //var identifierSubstitution = new Dictionary<IdentifierExpr, List<Expr>>();
-                //var functionSubstitution = new Dictionary<string, List<IAppliable>>();
-                //var substitution = new Dictionary<IdentifierExpr, List<Expr>>();
-                var identifierSubstitutions = new List<Dictionary<IdentifierExpr, Expr>>();
-                var functionSubstitutions = new List<Dictionary<string, IAppliable>>();
-                var substitutions = new List<Dictionary<IdentifierExpr, Expr>>();
-
+                var toMatch = (CallCmd)m;
+
+                var substitutions = new List<Tuple<Dictionary<IdentifierExpr, Expr>, Dictionary<string, IAppliable>>>();

                 #region match procedure name
                 if (toMatch.callee == Constants.AnyProcedure)
@@ -319,143 +307,88 @@
                 }
                 else if (toMatch.Ins.Count == 1
                     && toMatch.Ins[0] is NAryExpr
-                    && ((NAryExpr) toMatch.Ins[0]).Fun.FunctionName == Constants.AnyArgs)
-                {
-                    var anyArgsExpr = (NAryExpr) toMatch.Ins[0];
+                    && ((NAryExpr)toMatch.Ins[0]).Fun.FunctionName == Constants.AnyArgs)
+                {
+                    var anyArgsExpr = (NAryExpr)toMatch.Ins[0];

                     var matchingExprs = new List<Expr>();

                     foreach (var arg in cmd.Ins)
                     {
-                        //List<Cmd> ret = new List<Cmd>();
-
-                        var toMatchNae = anyArgsExpr;
-
-                        Debug.Assert(toMatchNae.Args.Count == 1,
+
+                        Debug.Assert(anyArgsExpr.Args.Count == 1,
                             "we expect Constants.AnyArgs to have at most one argument, " +
                             "which is the matching pattern expression");
-                        if (toMatchNae.Args[0] is NAryExpr
-                            && ((NAryExpr)toMatchNae.Args[0]).Fun.FunctionName == Constants.MemAccess)
-                        {
-                            //special case: we want to match anything that is a memory access
-                            //i.e. someting like MemT.sometypename[someExpression]
-                            //and get out someExpression
-                            //TODO: this is the current case --> generalize such that someExpression may be a complex match, too??
-                            var memAccessExpr = (NAryExpr)toMatchNae.Args[0];
-
-                            Debug.Assert(memAccessExpr.Args.Count == 1);
-                            //TODO above --> generalize to other matches..");
-
-                            var memAccessToMatchExpr = memAccessExpr.Args[0];
-
-                            var gma = new GatherMemAccesses();
-                            gma.Visit(arg);
-
-                            if (gma.accesses.Count == 0)
-                            {
-                                // there's no memory access in this argument --> do nothing for it
-                                return ret;
-                            }
-
-                            // we have a memory access
-                            foreach (var access in gma.accesses)
-                            {
-                                var emv = new ExprMatchVisitor(new List<Expr>() { memAccessToMatchExpr });
-                                emv.Visit(access.Item2);
-
-                                // here we have all we need to make a new command:
-                                // for each arg of the anyargs, for each memoryAccess in that arg:
-                                // instantiate the ToInsert accordingly
-                                if (emv.MayStillMatch)
-                                {
-
-                                    functionSubstitutions.Add(emv.FunctionSubstitution);
-                                    substitutions.Add(emv.Substitution);
-                                    //identifierSubstitutions = MergeSubstitutions(emv.IdentifierSubstitution, identifierSubstitutions);
-                                    //functionSubstitutions = MergeSubstitutions(emv.FunctionSubstitution, functionSubstitutions);
-                                    //substitution = MergeSubstitutions(emv.Substitution, substitution);
-                                }
-                            }
-                        }
-                        else
-                        {
-                            //TODO: other matches of anyargs than memAccess
-                            throw new NotImplementedException();
-                        }
+                        UpdateSubstitutionsAccordingToMatchAndTargetExpr(anyArgsExpr.Args[0], arg, substitutions);
                     }
                 }
                 #endregion
-
-                foreach (var subs in identifierSubstitutions)
-                {
-                   //hack to get a deepcopy
+                foreach (var subsPair in substitutions)
+                {
+                    //hack to get a deepcopy
                     var toInsertClone = _propInsertCodeAtCmd.ToInsert.Map(i => StringToBoogie.ToCmd(i.ToString()));

-                    var sv = new SubstitionVisitor(subs);
+                    var sv = new SubstitionVisitor(subsPair.Item1, subsPair.Item2);
                     ret.AddRange(sv.VisitCmdSeq(toInsertClone));
                 }
-                foreach (var subs in substitutions)
-                {
-                   //hack to get a deepcopy
-                    var toInsertClone = _propInsertCodeAtCmd.ToInsert.Map(i => StringToBoogie.ToCmd(i.ToString()));
-
-                    var sv = new SubstitionVisitor(subs);
-                    ret.AddRange(sv.VisitCmdSeq(toInsertClone));
-                }
-
             }
             ret.Add(cmd);
             return ret;
         }

-        //private List<Dictionary<IdentifierExpr, Expr>>  Convert(Dictionary<IdentifierExpr> )
-
-        //private Dictionary<string, List<IAppliable>> MergeSubstitutions(Dictionary<string, IAppliable> sub1, Dictionary<string, List<IAppliable>> sub2)
-        //{
-        //    var converted = new Dictionary<string, List<IAppliable>>();
-        //    foreach (var kvp in sub1)
-        //        converted[kvp.Key] = new List<IAppliable>() { kvp.Value };
-        //    return MergeSubstitutions(converted, sub2);
-        //}
-
-        //private Dictionary<IdentifierExpr, List<Expr>> MergeSubstitutions(Dictionary<IdentifierExpr, Expr> sub1, Dictionary<IdentifierExpr, List<Expr>> sub2)
-        //{
-        //    var converted = new Dictionary<IdentifierExpr, List<Expr>>();
-        //    foreach (var kvp in sub1)
-        //        converted[kvp.Key] = new List<Expr>() { kvp.Value };
-        //    return MergeSubstitutions(converted, sub2);
-        //}
-
-        //private Dictionary<string, List<IAppliable>> MergeSubstitutions(Dictionary<string, List<IAppliable>> sub1, Dictionary<string, List<IAppliable>> sub2)
-        //{
-        //    var result = new Dictionary<string, List<IAppliable>>();
-        //    foreach (var kvp in sub1)
-        //    {
-        //        result.Add(kvp.Key, kvp.Value);
-        //    }
-        //    foreach (var kvp in sub2)
-        //    {
-        //        if (result.ContainsKey(kvp.Key))
-        //            result[kvp.Key].AddRange(kvp.Value);
-        //        else
-        //            result.Add(kvp.Key, kvp.Value);
-        //    }
-        //    return result;
-        //}
-
-        //private Dictionary<IdentifierExpr, List<Expr>> MergeSubstitutions(Dictionary<IdentifierExpr, List<Expr>> sub1, Dictionary<IdentifierExpr, List<Expr>> sub2)
-        //{
-        //    var result = new Dictionary<IdentifierExpr, List<Expr>>();
-        //    foreach (var kvp in sub1)
-        //    {
-        //        result.Add(kvp.Key, kvp.Value);
-        //    }
-        //    foreach (var kvp in sub2)
-        //    {
-        //        result.Add(kvp.Key, kvp.Value);
-        //    }
-        //    return result;
-        //}
+        private static void UpdateSubstitutionsAccordingToMatchAndTargetExpr(Expr toMatch, Expr expr, List<Tuple<Dictionary<IdentifierExpr, Expr>, Dictionary<string, IAppliable>>> substitutions)
+        {
+
+            if (toMatch is NAryExpr
+                && ((NAryExpr)toMatch).Fun.FunctionName == Constants.MemAccess)
+            {
+                //special case: we want to match anything that is a memory access
+                //i.e. someting like MemT.sometypename[someExpression]
+                //and get out someExpression
+                //TODO: this is the current case --> generalize such that someExpression may be a complex match, too??
+                var memAccessExpr = (NAryExpr)toMatch;
+
+                Debug.Assert(memAccessExpr.Args.Count == 1);
+                //TODO above --> generalize to other matches..");
+
+                var memAccessToMatchExpr = memAccessExpr.Args[0];
+
+                var gma = new GatherMemAccesses();
+                gma.Visit(expr);
+
+                if (gma.accesses.Count == 0)
+                {
+                    // there's no memory access in this argument --> do nothing for it
+                    //return ret;
+                    return;
+                }
+
+                // we have a memory access
+                foreach (var access in gma.accesses)
+                {
+                    var emv = new ExprMatchVisitor(new List<Expr>() { memAccessToMatchExpr });
+                    emv.Visit(access.Item2);
+
+                    // here we have all we need to make a new command:
+                    // for each expr of the anyargs, for each memoryAccess in that expr:
+                    // instantiate the ToInsert accordingly
+                    if (emv.MayStillMatch)
+                    {
+                        //TODO: right now, we get a substitution (pair) for each match.
+                        //TODO: In the future we may need to several substitutions for example because
+                        //TODO: there are many memaccesses, args that match anyargs, and so on.. --> right??
+                        substitutions.Add(
+                            new Tuple<Dictionary<IdentifierExpr, Expr>, Dictionary<string, IAppliable>>(emv.Substitution,
+                                emv.FunctionSubstitution));
+                    }
+                }
+            }
+            else
+            {
+                //TODO: other matches of anyargs than memAccess
+                throw new NotImplementedException();
+            }
+        }

         private List<Cmd> ProcessAssume(AssumeCmd cmd)
@@ -506,18 +439,37 @@
             {
                 if (!(m is AssignCmd))
                     continue;
-                var toMatchCmd = (AssignCmd) m;
-
-                Debug.Assert(toMatchCmd.Lhss.Count == 1, "--> have to adapt to multi-assignments..");
-                var toMatchLhs = toMatchCmd.Lhss.First().AsExpr;
-                var toMatchRhs = toMatchCmd.Rhss.First();
-
-                Debug.Assert(cmd.Lhss.Count == 1, "--> have to adapt to multi-assignments..");
-                //var lhsEmv = new ExprMatchVisitor(new List<Expr>() { toMatchLhs});
-                //lhsEmv.VisitExpr(cmd.Lhss.First().AsExpr);
-                //var rhsEmv = new ExprMatchVisitor(new List<Expr>() { toMatchRhs});
-                //rhsEmv.VisitExpr(cmd.Rhss.First());
-
+                var toMatchCmd = (AssignCmd)m;
+
+                var substitutions = new List<Tuple<Dictionary<IdentifierExpr, Expr>, Dictionary<string, IAppliable>>>();
+
+                //do Lefthandsides match??
+                if (toMatchCmd.Lhss.Count == 1
+                    && toMatchCmd.Lhss.First() is SimpleAssignLhs
+                    && toMatchCmd.Lhss.First().DeepAssignedIdentifier.Name == Constants.AnyLhss)
+                {
+                    //matches --> go on..
+                }
+                else
+                {
+                    continue;
+                }
+
+                //do Righthandsides match??
+                for (int i = 0; i < cmd.Rhss.Count; i++)
+                {
+                    var rhs = cmd.Rhss[i];
+                    UpdateSubstitutionsAccordingToMatchAndTargetExpr(toMatchCmd.Rhss[i], rhs, substitutions);
+                }
+
+                foreach (var subsPair in substitutions)
+                {
+                    //hack to get a deepcopy
+                    var toInsertClone = _propInsertCodeAtCmd.ToInsert.Map(i => StringToBoogie.ToCmd(i.ToString()));
+
+                    var sv = new SubstitionVisitor(subsPair.Item1, subsPair.Item2);
+                    ret.AddRange(sv.VisitCmdSeq(toInsertClone));
+                }
             }

@@ -529,7 +481,7 @@
     internal class Constants
     {
         // arbitrary list of parameters (at a procedure declaration)
-        public const string AnyParams = "$$ANYPARAMS";
+        public const string AnyParams = "$$ANYPARAMS";
         // arbitrary list of arguments (at a procedure call)
         // may be used as a function: argument is an expression, we choose those where the expression matches
         public const string AnyArgs = "$$ANYARGUMENTS";


-Fixed/Resolved issue: 21477;

-Fixed/Resolved issue: 21477;

git-tfs-id: [https://tfs.codeplex.com:443/tfs/TFS02]$/alphafs/Development;C111141

--- AlphaFS/Filesystem/NativeMethods.cs
+++ AlphaFS/Filesystem/NativeMethods.cs
@@ -281,7 +281,7 @@
       internal static string UnitSizeToText<T>(T numberOfBytes, bool usePercent = false)
       {
          string template = "{0:0.00}{1}";
-         string sfx = "bytes";
+         string sfx = "B";

          double bytes = Convert.ToDouble(numberOfBytes, CultureInfo.InvariantCulture);

@@ -293,7 +293,7 @@
          else if (bytes >= 1024) { sfx = "KB"; bytes /= 1024; }

          else if (!usePercent)
-            // Will return "512 bytes" instead of "512,00 bytes".
+            // Will return "512 B" instead of "512,00 B".
             template = "{0:0}{1}";

          return string.Format(CultureInfo.CurrentCulture, template, bytes, usePercent ? "%" : " " + sfx);


move indicator on mouse down

move indicator on mouse down

--- Arena/Views/FightArena/Index.cshtml
+++ Arena/Views/FightArena/Index.cshtml
@@ -49,7 +49,7 @@
                 fightHub.server.register();

                 var indicator = createElement();
-                arena.onmousemove = function () {
+                arena.onmousedown = function () {
                     fightHub.server.moveUser(event.clientX, event.clientY);

                     indicator.style.left = event.clientX + "px";


Clear the logcat

Clear the logcat

--- Assets/Ouya/SDK/Editor/OuyaPanel.cs
+++ Assets/Ouya/SDK/Editor/OuyaPanel.cs
@@ -1974,7 +1974,9 @@
                     EditorGUIUtility.ExitGUI();
                 }

-                if (GUILayout.Button("Open Logcat"))
+                GUILayout.BeginHorizontal();
+                GUILayout.Label("Logcat");
+                if (GUILayout.Button("Open"))
                 {
                     if (File.Exists(pathADB))
                     {
@@ -1998,6 +2000,31 @@
                     }
                     EditorGUIUtility.ExitGUI();
                 }
+                if (GUILayout.Button("Clear"))
+                {
+                    if (File.Exists(pathADB))
+                    {
+                        //Debug.Log(appPath);
+                        //Debug.Log(pathADB);
+                        string args = string.Format(@"shell logcat -c");
+                        //Debug.Log(args);
+                        ProcessStartInfo ps = new ProcessStartInfo(pathADB, args);
+                        Process p = new Process();
+                        ps.RedirectStandardOutput = false;
+                        ps.UseShellExecute = true;
+                        ps.CreateNoWindow = false;
+                        ps.WorkingDirectory = Path.GetDirectoryName(pathADB);
+                        p.StartInfo = ps;
+                        p.Exited += (object sender, EventArgs e) =>
+                        {
+                            p.Dispose();
+                        };
+                        p.Start();
+                        //p.WaitForExit();
+                    }
+                    EditorGUIUtility.ExitGUI();
+                }
+                GUILayout.EndHorizontal();

                 GUILayout.BeginHorizontal();
                 GUILayout.Label("Language:");


Fix ChannelGroup.addGroup missing arguments.

--- Assets/Plugins/FMOD/Wrapper/fmod.cs
+++ Assets/Plugins/FMOD/Wrapper/fmod.cs
@@ -3408,9 +3408,16 @@
         }

         // Nested channel groups.
-        public RESULT addGroup               (ChannelGroup group)
-        {
-            return FMOD5_ChannelGroup_AddGroup(getRaw(), group.getRaw());
+        public RESULT addGroup               (ChannelGroup group, bool propagatedspclock, out DSPConnection connection)
+        {
+            connection = null;
+
+            IntPtr connectionRaw;
+            RESULT result = FMOD5_ChannelGroup_AddGroup(getRaw(), group.getRaw(), propagatedspclock, out connectionRaw);
+            connection = new DSPConnection(connectionRaw);
+
+            return result;
+
         }
         public RESULT getNumGroups           (out int numgroups)
         {
@@ -3468,7 +3475,7 @@
         [DllImport(VERSION.dll)]
         private static extern RESULT FMOD5_ChannelGroup_Release          (IntPtr channelgroup);
         [DllImport(VERSION.dll)]
-        private static extern RESULT FMOD5_ChannelGroup_AddGroup         (IntPtr channelgroup, IntPtr group);
+        private static extern RESULT FMOD5_ChannelGroup_AddGroup         (IntPtr channelgroup, IntPtr group, bool propogatedspclocks, out IntPtr connection);
         [DllImport(VERSION.dll)]
         private static extern RESULT FMOD5_ChannelGroup_GetNumGroups     (IntPtr channelgroup, out int numgroups);
         [DllImport(VERSION.dll)]


The dpads on Windows were inverted for left and right.

--- Assets/Plugins/OuyaExampleCommon.cs
+++ Assets/Plugins/OuyaExampleCommon.cs
@@ -288,11 +288,9 @@
                         break;
                     case OuyaSDK.KeyEnum.BUTTON_DPAD_LEFT:
                         axisName = string.Format("Joy{0} Axis 6", (int)player);
-                        invert = true;
                         break;
                     case OuyaSDK.KeyEnum.BUTTON_DPAD_RIGHT:
                         axisName = string.Format("Joy{0} Axis 6", (int)player);
-                        invert = true;
                         break;
                     case OuyaSDK.KeyEnum.BUTTON_DPAD_UP:
                         axisName = string.Format("Joy{0} Axis 7", (int)player);


fixed dialogue affinity

fixed dialogue affinity

--- Assets/Script/Dialogue/HBMDialog.cs
+++ Assets/Script/Dialogue/HBMDialog.cs
@@ -185,7 +185,7 @@
         PlaySound(this.NpcIntelligenceTaxSystem);
         Npc.Say("That sounds awesome, I tried",
             "to change the german tax system for years");
-        Npc.ModifyAffinity(10f);
+        Npc.ModifyAffinity(5.0f);

         yield return End();
     }
@@ -212,7 +212,7 @@
         PlaySound(this.NpcIntelligenceMilitarySmall);
         Npc.Say("That sounds like something even I",
             "can manage.");
-        Npc.ModifyAffinity(10f);
+        Npc.ModifyAffinity(5.0f);
         yield return End();
     }

@@ -226,7 +226,7 @@

         PlaySound(this.NpcIntelligenceWorldLeader);
         Npc.Say("More tanks? Nooooooooooo");
-        Npc.ModifyAffinity(-20f);
+        Npc.ModifyAffinity(-4.0f);
         yield return End();
     }

@@ -240,7 +240,7 @@

         PlaySound(this.NpcIntelligenceWomen);
         Npc.Say("No thanks, I already got the best girlfriend.");
-        Npc.ModifyAffinity(-10f);
+        Npc.ModifyAffinity(-4.0f);
         yield return End();
     }
     #endregion
@@ -271,7 +271,7 @@
             Npc.Say(
                 "Oh, please don't tell anyone!",
                 "They will know about my heritage!");
-            Npc.ModifyAffinity(20f);
+            Npc.ModifyAffinity(5.0f);
             yield return End();
         }
         else if (!this.HasHappend(HappeningKeys.SaidWrongName))
@@ -291,7 +291,7 @@

             PlaySound(this.NpcIntimidateBWrong);
             Npc.Say("Mmmnnnyeaaaah... thats not it.");
-            Npc.ModifyAffinity(-20f);
+            Npc.ModifyAffinity(-4.0f);
             yield return End();
         }
     }
@@ -307,7 +307,7 @@

         PlaySound(this.NpcIntimidateScratchCar);
         Npc.Say("Oh no! Please don't hurt it!");
-        Npc.ModifyAffinity(10f);
+        Npc.ModifyAffinity(5.0f);

         yield return End();
     }
@@ -324,7 +324,7 @@
         Npc.Say("You can't hurt him, ",
             "he was Schützenmeister five years in a row!",
             "And I don't... even... like him.");
-        Npc.ModifyAffinity(-10f);
+        Npc.ModifyAffinity(-4.0f);

         yield return End();
     }
@@ -338,7 +338,7 @@

         PlaySound(this.NpcIntimidateFeedDog);
         Npc.Say("Ahm... I... don't... have a dog.");
-        Npc.ModifyAffinity(-10f);
+        Npc.ModifyAffinity(-4.0f);
         yield return End();
     }
     #endregion
@@ -392,7 +392,7 @@
         PlaySound(this.NpcCharismaLoveYou);
         Npc.Say("First of, you are way to funky,",
             "secondly I got a Girlfriend.");
-        Npc.ModifyAffinity(-20f);
+        Npc.ModifyAffinity(-4.0f);
         yield return End();
     }

@@ -404,7 +404,7 @@

         PlaySound(this.NpcCharismaPanzerGeneral);
         Npc.Say("Straight up lie!");
-        Npc.ModifyAffinity(-10f);
+        Npc.ModifyAffinity(-4.0f);
         yield return End();
     }
     #endregion


Calculate Q

Calculate Q

--- Assets/Scripts/Beam/BeamAnalyzer.cs
+++ Assets/Scripts/Beam/BeamAnalyzer.cs
@@ -6,10 +6,10 @@

     BeamCollector collector;

-    float[] df,pi;
+    float[] df,pi,q;
     List<IndexMatrix> k;
     IndexMatrix s;
-    List<IndexArray> qf,u,ku,q;
+    List<IndexArray> qf,u,ku,qi;
     IndexArray pf,p,d;

     struct IndexArray
@@ -51,6 +51,7 @@
         GenerateD();
         GenerateU();
         GenerateKU();
+        GenerateQI();
         GenerateQ();
     }
     #region DoF
@@ -414,6 +415,7 @@

     float[,] ConvertTo2D(float[][] arr2d)
     {
+        if (arr2d.Length == 0) return null;
         float[,] newarr2d = new float[arr2d.Length,arr2d[0].Length];
         for (int i = 0; i < arr2d.Length; i++)
         {
@@ -670,9 +672,9 @@
     }
     #endregion
     #region q
-    void GenerateQ()
-    {
-        q = new List<IndexArray>();
+    void GenerateQI()
+    {
+        qi = new List<IndexArray>();
         foreach (IndexArray kui in ku)
         {
             List<int> index = kui.index;
@@ -701,19 +703,19 @@
                     }
                 }
             }
-            q.Add(new IndexArray(index, val));
-        }
-
-        string qStr = "q = \n";
-        foreach (IndexArray qi in q)
-        {
-            foreach (float val in qi.val)
-            {
-                qStr += val + " ";
-            }
-            qStr += "\n";
-        }
-        Debug.Log(qStr);
+            qi.Add(new IndexArray(index, val));
+        }
+
+        string qiStr = "qi = \n";
+        foreach (IndexArray qii in qi)
+        {
+            foreach (float val in qii.val)
+            {
+                qiStr += val + " ";
+            }
+            qiStr += "\n";
+        }
+        Debug.Log(qiStr);
     }

     bool ListEqual(List<int> list1,List<int> list2)
@@ -724,6 +726,29 @@
                 return false;
         return true;
     }
+
+    void GenerateQ()
+    {
+        q = new float[collector.nodes.Count*2];
+        foreach (GameObject node in collector.nodes)
+        {
+            NodeProperty property = node.GetComponent<NodeProperty>();
+            q[property.number * 2] = 0;
+            q[property.number * 2 + 1] = 0;
+            foreach (IndexArray qii in qi)
+            {
+                if (qii.index.IndexOf(property.number * 2) >= 0)
+                    q[property.number * 2] += qii.val[qii.index.IndexOf(property.number * 2)];
+                if (qii.index.IndexOf(property.number * 2+1) >= 0)
+                    q[property.number * 2+1] += qii.val[qii.index.IndexOf(property.number * 2+1)];
+            }
+        }
+
+        string qStr = "q = ";
+        foreach (float qi in q) qStr += qi + " ";
+        Debug.Log(qStr);
+    }
+
     #endregion
     public void ResetAnalyzer()
     {


lock cursor

lock cursor

--- Assets/Scripts/Input/PlayerLogic.cs
+++ Assets/Scripts/Input/PlayerLogic.cs
@@ -12,6 +12,9 @@
     public float reach = 4;
     public ushort held = 1;

+    // capture cursor
+    public static bool lockCursor = true;
+
     void Start()
     {
         cameraObject = GameObject.FindGameObjectWithTag("MainCamera");
@@ -20,6 +23,16 @@

     void Update()
     {
+        // capture cursor
+        if (Screen.lockCursor != lockCursor)
+        {
+            if (lockCursor && Input.GetMouseButton(0))
+                Screen.lockCursor = true;
+            else if (!lockCursor)
+                Screen.lockCursor = false;
+        }
+
+        // interact with the world
         Ray ray = new Ray(cameraObject.transform.position, cameraObject.transform.forward);
         RaycastHit hit;


Fix wrong palette with AITD1 demo

Fix wrong palette with AITD1 demo

--- Assets/Scripts/Model/ModelLoader.cs
+++ Assets/Scripts/Model/ModelLoader.cs
@@ -843,13 +843,13 @@
 	{
 		//detect game based on number of models
 		if (modelCount > 700)
-			return 3;
+			return 3; //AITD3
 		else if (modelCount > 550)
-			return 2;
+			return 2; //AITD2
 		else if (modelCount > 500)
 			return 5; //TIME GATE
-		else if (modelCount > 200)
-			return 1;
+		else if (modelCount > 200 || modelCount < 30)
+			return 1; //AITD1 or DEMO
 		else
 			return 4; //JITD
 	}


Shell script

Shell script

--- Assets/Scripts/Player/Controller.cs
+++ Assets/Scripts/Player/Controller.cs
@@ -15,6 +15,9 @@

     Animator animator;

+    Component item_held;
+
+
     private void Awake()
     {
         animator = GetComponent<Animator>();
@@ -31,8 +34,42 @@

 	}

-
-    bool is_drifting = false;
+    public void pick_item_up(Component item)
+    {
+        if (item_held == null)
+        {
+            item_held = item;
+            item_held.transform.parent = this.transform;
+
+            var item_rigid_body = item.GetComponent<Rigidbody2D>();
+            Destroy(item_rigid_body);
+        }
+    }
+
+    public void pick_item_down()
+    {
+        if (item_held != null)
+        {
+            item_held.transform.parent = null;
+            item_held.gameObject.AddComponent<Rigidbody2D>();
+
+            var item_rigid_body = item_held.GetComponent<Rigidbody2D>();
+            item_rigid_body.freezeRotation = true;
+
+            kick_item(item_held);
+
+            item_held = null;
+        }
+
+    }
+    public void kick_item(Component item)
+    {
+        var item_rigid_body = item.GetComponent<Rigidbody2D>();
+        var rigid_body = GetComponent<Rigidbody2D>();
+        var local_scale = rigid_body.transform.localScale;
+
+        item_rigid_body.AddForce(new Vector2(WalkSpeed * local_scale.x, 0));
+    }

     void FixedUpdate()
     {
@@ -159,10 +196,12 @@
             if (is_turbo)
             {
                 TopSpeed = TopSpeedBound + TopSpeedBound * 0.65f;
-            } else
+            }
+            else
             {
                 StartCoroutine("verify_turbo");
             }
+
         }
         else
         {
@@ -172,9 +211,16 @@

             animator.SetBool("is_running", is_running);
             animator.SetBool("is_turbo", is_turbo);
-        }
-
-    }
+
+            if(item_held != null && !Input.GetKey(KeyCode.Z))
+            {
+                pick_item_down();
+            }
+
+        }
+    }
+
+

     private IEnumerator verify_turbo()
     {


Added a position and altitude indicator and made the speed display 0-10 instead of 0-500.

--- Assets/VPCsimCharacterController.cs
+++ Assets/VPCsimCharacterController.cs
@@ -10,15 +10,15 @@

 public class VPCsimCharacterController : MonoBehaviour
 {
-	public float rotationSpeedY = 1f;
-	public float minimumY = -90f;
-	public float maximumY = 90f;
+	float rotationSpeedY = 0.75f;
+	float minimumY = -90f;
+	float maximumY = 90f;
 	float rotationY = 0;
-	public float speed = 10.0f;
-	public float minimumSpeed = 1f;
-	public float maximumSpeed = 500f;
-	public float acceleration = 1f;
-	public float rotationSpeedHorizontal = 100.0f;
+	float speed = 11.0f;
+	float minimumSpeed = 1.0f;
+	float maximumSpeed = 91.0f;
+	float acceleration = 10.0f;
+	float rotationSpeedHorizontal = 50.0f;
 	bool isWalking;

 	// Use this for initialization
@@ -37,11 +37,11 @@
 	void Update()
 	{
 		//'q' & 'z' acceleration
-		if (Input.GetKey("q"))
+		if (Input.GetKeyDown("q"))
 		{
 			speed += acceleration;
 		}
-		else if (Input.GetKey("z"))
+		else if (Input.GetKeyDown("z"))
 		{
 			speed -= acceleration;
 		}
@@ -72,7 +72,12 @@
 	//Add a fly/walk button to the GUI
 	void OnGUI()
 	{
-		GUI.Box(new Rect(10, 265, 100, 25), "Speed: " + ((int)speed).ToString());
+		Vector3 position = transform.position;
+		int displayedSpeed = ((int)speed / 10) + 1;
+		GUI.Box(new Rect(10, 265, 100, 25), "Speed: " + displayedSpeed.ToString());
+		GUI.Box(new Rect(10, 295, 130, 50), "Position: " + ((int)position.x).ToString() +
+											", " + ((int)position.z).ToString() +
+											"\nAltitude: " + ((int)position.y).ToString());
 		GUI.Box(new Rect(10, 200, 100, 60), boxText);
 		bool walkFlyButton = GUI.Button(new Rect(20, 230, 80, 20), new GUIContent(buttonText));
 		if (walkFlyButton)


Added a function that prints the results of musicSource.isPlaying to the debug.log for testing #151

--- Assets/scripts/audio/MusicPlayer.cs
+++ Assets/scripts/audio/MusicPlayer.cs
@@ -24,6 +24,11 @@
         if (Input.GetKeyDown("n"))
         {
             PlayNextSong();
+        }
+
+        if (Input.GetKeyDown("t"))
+        {
+            IsPlayingTest();
         }

     }
@@ -85,5 +90,9 @@
         musicSource.Pause();
     }

+    public void IsPlayingTest()
+    {
+        Debug.Log("Music Source is playing == " + musicSource.isPlaying);
+    }
 }


Corrected a small typo in a CodeAnalysis suppression attribute.

--- AtomEventStore/AtomEventObserver.cs
+++ AtomEventStore/AtomEventObserver.cs
@@ -239,7 +239,7 @@
             });
         }

-        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Since the offending exception handling block wraps around a piece of behaviour that ultimately is implemented behind an interface, there's no way to know what type of exception will can be thrown. Since it's important to suppress any exceptions in this special case, all exception types must be suppressed. Frankly, I can't think of a better solution, but I'm open to suggestions.")]
+        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Since the offending exception handling block wraps around a piece of behaviour that ultimately is implemented behind an interface, there's no way to know what type of exception can be thrown. Since it's important to suppress any exceptions in this special case, all exception types must be suppressed. Frankly, I can't think of a better solution, but I'm open to suggestions.")]
         private void AddEntryToNewPage(
             AtomEntry entry,
             AtomFeed index,


Removed a redundant conditional.

Removed a redundant conditional.

The reason that conditional check even existed, was in order to arrive at
a proper failing test, previously.

--- AtomEventStore/AtomEventObserver.cs
+++ AtomEventStore/AtomEventObserver.cs
@@ -70,10 +70,8 @@

                     var nextLink = AtomLink.CreateNextLink(nextAddress);

-                    var previousPage = lastPage;
-                    if (!lastPage.Links.Any(l => l.IsNextLink))
-                        previousPage = lastPage
-                            .WithLinks(lastPage.Links.Concat(new[] { nextLink }));
+                    var previousPage = lastPage
+                        .WithLinks(lastPage.Links.Concat(new[] { nextLink }));

                     var previousLink = previousPage.Links
                         .Single(l => l.IsSelfLink)


Update AutoCADIOUtilities.cs

Update AutoCADIOUtilities.cs

--- AutoCADIOUtil/AutoCADIOUtilities.cs
+++ AutoCADIOUtil/AutoCADIOUtilities.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -12,11 +12,22 @@

 namespace Autodesk
 {
+    class ForgeDesignAutoSrv
+    {
+        public static string containerUrl = "https://developer.api.autodesk.com/autocad.io/us-east/v2/";
+
+        //check with developer portal of Forge if any endpoints are updated when you test this sample
+        //https://developer.autodesk.com
+
+        public static string forgeServiceBaseUrl = "https://developer.api.autodesk.com";
+        public static string autenticationUrl = forgeServiceBaseUrl + "/authentication/v1/authenticate";
+    }
+
     public class AcadIOUtils
     {
         private static AIO.Operations.Container container = null;
         private static String _accessToken = String.Empty;
-        private static RestSharp.RestClient restClient = new RestSharp.RestClient("https://developer.api.autodesk.com/autocad.io/v2/");
+        private static RestSharp.RestClient restClient = new RestSharp.RestClient(ForgeDesignAutoSrv.containerUrl);

         /// <summary>
         /// Does setup of AutoCAD IO.
@@ -32,7 +43,7 @@
                 String clientId = autocadioclientid;
                 String clientSecret = autocadioclientsecret;

-                Uri uri = new Uri("https://developer.api.autodesk.com/autocad.io/us-east/v2/");
+                Uri uri = new Uri(ForgeDesignAutoSrv.containerUrl);
                 container = new AIO.Operations.Container(uri);
                 container.Format.UseJson();

@@ -43,8 +54,9 @@
                     values.Add(new KeyValuePair<string, string>("client_secret", clientSecret));
                     values.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
                     values.Add(new KeyValuePair<string, string>("scope", "code:all"));
+
                     var requestContent = new FormUrlEncodedContent(values);
-                    var response = client.PostAsync("https://developer.api.autodesk.com/authentication/v1/authenticate", requestContent).Result;
+                    var response = client.PostAsync(ForgeDesignAutoSrv.autenticationUrl, requestContent).Result;
                     var responseContent = response.Content.ReadAsStringAsync().Result;
                     var resValues = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseContent);
                     _accessToken = resValues["token_type"] + " " + resValues["access_token"];


Please use your api key

Please use your api key

--- BalancedPayments.Console/Program.cs
+++ BalancedPayments.Console/Program.cs
@@ -18,7 +18,7 @@
                 BalancedService service = new BalancedService("1",
                     "https://api.balancedpayments.com",
                     "[YOUR API KEY]",
-                    "/v1/marketplaces/[YOUR MARKETPLACE ID]");
+                    "/v1/marketplaces/[YOUR MARKETPLACE ID]");

                 Console.WriteLine(string.Format("Marketplace: {0}", service.Marketplace.name));


Fix formatting.

Fix formatting.

--- src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/SpecifyIFormatProviderTests.cs
+++ src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/SpecifyIFormatProviderTests.cs
@@ -1318,13 +1318,13 @@

             await csharpTest.RunAsync();

-var vbTest = new VerifyVB.Test
-{
-    TestState =
-                {
-                    Sources =
-                    {
-                        @"
+            var vbTest = new VerifyVB.Test
+            {
+                TestState =
+                            {
+                                Sources =
+                                {
+                                    @"
 Imports System

 Namespace NS


Add comment.

Add comment.

--- src/Workspaces/CSharp/Portable/Extensions/ITypeSymbolExtensions.TypeSyntaxGeneratorVisitor.cs
+++ src/Workspaces/CSharp/Portable/Extensions/ITypeSymbolExtensions.TypeSyntaxGeneratorVisitor.cs
@@ -3,7 +3,9 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Microsoft.CodeAnalysis.Options;
 using Microsoft.CodeAnalysis.Shared.Extensions;
 using Microsoft.CodeAnalysis.Simplification;

@@ -247,6 +249,11 @@
                 }
             }

+            /// <summary>
+            /// We always unilaterally add "global::" to all named types/namespaces.  This
+            /// will then be trimmed off if possible by calls to
+            /// <see cref="Simplifier.ReduceAsync(Document, OptionSet, CancellationToken)"/>
+            /// </summary>
             private TypeSyntax AddGlobalAlias(INamespaceOrTypeSymbol symbol, SimpleNameSyntax syntax)
             {
                 return AddInformationTo(


Improved the creation examples to show how to edit in different wany Cleanup of text Added more documentation


Restored route to publish 1 ga

Restored route to publish 1 ga


Adding test to a catigory so it will be rn on build

--- Selenium.WebDriver.Equip.Tests/PageNotLoadedExceptionTests.cs
+++ Selenium.WebDriver.Equip.Tests/PageNotLoadedExceptionTests.cs
@@ -6,10 +6,12 @@
     public class PageNotLoadedExceptionTests
     {
         [Test]
-
-        public void test()
+        [Category(TestCategories.HeadLess)]
+        public void PageNotLoadedExceptionPageName()
         {
             var ajaxyControlPage = new AjaxyControlPage();
+            var pageException = Assert.Throws<PageNotLoadedException>(() => { throw new PageNotLoadedException(ajaxyControlPage); });
+            Assert.AreEqual("Page name: TestWebPages.UIFramework.Pages.AjaxyControlPage", pageException.Message);
         }
     }
 }


Update PlayFabEditor.cs (#113)

Update PlayFabEditor.cs (#113)

This was reported by a user where if we change something in our editor extensions they will sometimes crash on us.

--- Source/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs
+++ Source/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs
@@ -79,7 +79,7 @@
         }

         [InitializeOnLoad]
-        public class Startup
+        public static class Startup
         {
             static Startup()
             {


:bug: Apos

:bug: Apos

--- Source/Orion.UWP/Converters/TextToBlockCollectionConverter.cs
+++ Source/Orion.UWP/Converters/TextToBlockCollectionConverter.cs
@@ -39,9 +39,10 @@
             // Is HTML?
             if (_tagRegex.IsMatch(value) || value.Contains("br"))
                 text = FlattenHtmlText(value);
-            text = text.Replace("<", "<");
-            text = text.Replace(">", ">");
-            text = text.Replace("&", "&");
+            text = text.Replace("<", "<"); // Twitter
+            text = text.Replace(">", ">"); // Twitter
+            text = text.Replace("&", "&"); // Twitter
+            text = text.Replace("'", "'"); // Mastodon
             text = text.Replace("\n", Environment.NewLine);

             var extractor = new Extractor();


Implemented interface for EssaysService

Implemented interface for EssaysService


ready to pack 1.4.6

ready to pack 1.4.6

--- Terradue.Metadata.EarthObservation/Properties/AssemblyInfo.cs
+++ Terradue.Metadata.EarthObservation/Properties/AssemblyInfo.cs
@@ -8,7 +8,7 @@
 @{
     Terradue .Net C# library implementing the Earth Observation Metadata profile of Observations & Measurements

-    \xrefitem sw_version "Versions" "Software Package Version" 1.4.5
+    \xrefitem sw_version "Versions" "Software Package Version" 1.4.6

     \xrefitem sw_link "Link" "Software Package Link" [DotNetEarthObservation](https://github.com/Terradue/DotNetEarthObservation)

@@ -38,8 +38,8 @@
 // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.
-[assembly: AssemblyVersion("1.4.5.*")]
-[assembly: AssemblyInformationalVersion("1.4.5")]
+[assembly: AssemblyVersion("1.4.6.*")]
+[assembly: AssemblyInformationalVersion("1.4.6")]
 [assembly: AssemblyAuthors("Emmanuel Mathot")]
 [assembly: AssemblyProjectUrl("https://github.com/Terradue/DotNetEarthObservation")]
 [assembly: AssemblyLicenseUrl("https://github.com/Terradue/DotNetEarthObservation/blob/master/LICENSE")]


add stackapps.com in global equivalent domains (#1209)

stackapps.com belongs to Stack Exchange
see https://stackexchange.com/sites

--- src/Core/Utilities/StaticStore.cs
+++ src/Core/Utilities/StaticStore.cs
@@ -85,7 +85,7 @@
             GlobalDomains.Add(GlobalEquivalentDomainsType.Wikimedia, new List<string> { "mediawiki.org", "wikibooks.org", "wikidata.org", "wikimedia.org", "wikinews.org", "wikipedia.org", "wikiquote.org", "wikisource.org", "wikiversity.org", "wikivoyage.org", "wiktionary.org" });
             GlobalDomains.Add(GlobalEquivalentDomainsType.Airbnb, new List<string> { "airbnb.at", "airbnb.be", "airbnb.ca", "airbnb.ch", "airbnb.cl", "airbnb.co.cr", "airbnb.co.id", "airbnb.co.in", "airbnb.co.kr", "airbnb.co.nz", "airbnb.co.uk", "airbnb.co.ve", "airbnb.com", "airbnb.com.ar", "airbnb.com.au", "airbnb.com.bo", "airbnb.com.br", "airbnb.com.bz", "airbnb.com.co", "airbnb.com.ec", "airbnb.com.gt", "airbnb.com.hk", "airbnb.com.hn", "airbnb.com.mt", "airbnb.com.my", "airbnb.com.ni", "airbnb.com.pa", "airbnb.com.pe", "airbnb.com.py", "airbnb.com.sg", "airbnb.com.sv", "airbnb.com.tr", "airbnb.com.tw", "airbnb.cz", "airbnb.de", "airbnb.dk", "airbnb.es", "airbnb.fi", "airbnb.fr", "airbnb.gr", "airbnb.gy", "airbnb.hu", "airbnb.ie", "airbnb.is", "airbnb.it", "airbnb.jp", "airbnb.mx", "airbnb.nl", "airbnb.no", "airbnb.pl", "airbnb.pt", "airbnb.ru", "airbnb.se" });
             GlobalDomains.Add(GlobalEquivalentDomainsType.Eventbrite, new List<string> { "eventbrite.at", "eventbrite.be", "eventbrite.ca", "eventbrite.ch", "eventbrite.cl", "eventbrite.co", "eventbrite.co.nz", "eventbrite.co.uk", "eventbrite.com", "eventbrite.com.ar", "eventbrite.com.au", "eventbrite.com.br", "eventbrite.com.mx", "eventbrite.com.pe", "eventbrite.de", "eventbrite.dk", "eventbrite.es", "eventbrite.fi", "eventbrite.fr", "eventbrite.hk", "eventbrite.ie", "eventbrite.it", "eventbrite.nl", "eventbrite.pt", "eventbrite.se", "eventbrite.sg" });
-            GlobalDomains.Add(GlobalEquivalentDomainsType.StackExchange, new List<string> { "stackexchange.com", "superuser.com", "stackoverflow.com", "serverfault.com", "mathoverflow.net", "askubuntu.com" });
+            GlobalDomains.Add(GlobalEquivalentDomainsType.StackExchange, new List<string> { "stackexchange.com", "superuser.com", "stackoverflow.com", "serverfault.com", "mathoverflow.net", "askubuntu.com", "stackapps.com" });
             GlobalDomains.Add(GlobalEquivalentDomainsType.Docusign, new List<string> { "docusign.com", "docusign.net" });
             GlobalDomains.Add(GlobalEquivalentDomainsType.Envato, new List<string> { "envato.com", "themeforest.net", "codecanyon.net", "videohive.net", "audiojungle.net", "graphicriver.net", "photodune.net", "3docean.net" });
             GlobalDomains.Add(GlobalEquivalentDomainsType.X10Hosting, new List<string> { "x10hosting.com", "x10premium.com" });


add a new method.

add a new method.

--- src/ECommon/Utilities/ObjectId.cs
+++ src/ECommon/Utilities/ObjectId.cs
@@ -252,6 +252,15 @@
         }

         /// <summary>
+        /// Generates a new ObjectId string with a unique value.
+        /// </summary>
+        /// <returns>The string value of the new generated ObjectId.</returns>
+        public static string GenerateNewStringId()
+        {
+            return GenerateNewId().ToString();
+        }
+
+        /// <summary>
         /// Packs the components of an ObjectId into a byte array.
         /// </summary>
         /// <param name="timestamp">The timestamp.</param>


Correctly insert implicit 'using' declarations during namespace creation

--- src/Flame.Ecs/GlobalConverters.cs
+++ src/Flame.Ecs/GlobalConverters.cs
@@ -71,8 +71,8 @@
             var nsScope = Scope;
             foreach (var name in qualName.Path)
             {
-                ns = Namespace.DefineNamespace(name.ToString());
-                nsScope = Scope.WithBinder(Scope.Binder.UseNamespace(ns.FullName));
+                ns = ns.DefineNamespace(name.ToString());
+                nsScope = nsScope.WithBinder(nsScope.Binder.UseNamespace(ns.FullName));
             }

             foreach (var elem in Node.Args[2].Args)


InitExpressionFactory<T> 클래스 내부 메서드 이름의 오류를 수정합니다.

--- src/Flip/InitExpressionFactory.cs
+++ src/Flip/InitExpressionFactory.cs
@@ -88,7 +88,7 @@
                 if (property == null)
                 {
                     InitExpressionError error =
-                        GetNoPropertyFoundMatchesParameter(
+                        GetNoPropertyMatchesParameterError(
                             constructor, parameter);
                     return InitExpressionResult<Func<T, T, T>>.WithError(error);
                 }
@@ -117,7 +117,7 @@
             return new InitExpressionResult<Func<T, T, T>>(lambdaExpression);
         }

-        private static InitExpressionError GetNoPropertyFoundMatchesParameter(
+        private static InitExpressionError GetNoPropertyMatchesParameterError(
             ConstructorInfo constructor, ParameterInfo parameter)
         {
             var message = new StringBuilder();


Removed setter from Type property

Removed setter from Type property

--- src/HabitRPG.Client/Model/Todo.cs
+++ src/HabitRPG.Client/Model/Todo.cs
@@ -9,7 +9,6 @@
     public override string Type
     {
       get { return "todo"; }
-      set { throw new NotImplementedException(); }
     }

     [JsonProperty("completed")]


Refactored DriverHandler.CleanUpServices()

Use new Helpers.DeleteService()

Signed-off-by: Kostas Ladopoulos <7920ee5edb7fd3a4c6c6e3ebe9bd13d4a7f2eff1@citrix.com>

--- src/InstallAgent/DriverHandler.cs
+++ src/InstallAgent/DriverHandler.cs
@@ -609,7 +609,7 @@
         }

         private static void CleanUpServices()
-        // Removes left over 'Services' registry keys
+        // Properly uninstalls PV drivers' services
         {
             // On 2k8 if you're going to reinstall straight away,
             // don't remove 'xenbus' or 'xenfilt' - as 2k8 assumes
@@ -628,17 +628,9 @@
                 services.Add("xenfilt");
             }

-            using (RegistryKey baseRK = Registry.LocalMachine.OpenSubKey(
-                       @"SYSTEM\CurrentControlSet\Services", true))
-            {
-                foreach (string service in services)
-                {
-                    try
-                    {
-                        baseRK.DeleteSubKeyTree(service);
-                    }
-                    catch (ArgumentException) { }
-                }
+            foreach (string service in services)
+            {
+                Helpers.DeleteService(service);
             }
         }


Eventクラスのregionの名前を変更

Eventクラスのregionの名前を変更

--- uxMidi/IO/Event.cs
+++ uxMidi/IO/Event.cs
@@ -15,7 +15,7 @@
     /// </summary>
     public abstract class Event
     {
-        #region Property
+        #region -- Public Properties --
         /// <summary>
         /// 以前のイベントとの差分時間 (デルタタイム) を取得します。
         /// </summary>
@@ -32,7 +32,7 @@
         public EventType Type { get; protected set; }
         #endregion

-        #region Constructor
+        #region -- Constructors --
         /// <summary>
         /// デルタタイムとティック位置を指定して新しい Event クラスのインスタンスを初期化します。
         /// </summary>
@@ -45,7 +45,7 @@
         }
         #endregion

-        #region Public Method
+        #region -- Public Methods --
         /// <summary>
         /// デルタタイムを解析します。
         /// </summary>


R# remove unsued using

R# remove unsued using

--- src/LazyStorage/StorableObject.cs
+++ src/LazyStorage/StorableObject.cs
@@ -1,4 +1,3 @@
-using System;
 using System.Collections.Generic;

 namespace LazyStorage


Fixed AddLine() to write the line in the debug msg

Before the debug message was:  "LE - Adding Line: line" which doesn't make much sense to me...

--- src/LogentriesCore/AsyncLogger.cs
+++ src/LogentriesCore/AsyncLogger.cs
@@ -596,7 +596,7 @@

         public virtual void AddLine(string line)
         {
-            WriteDebugMessages("LE - Adding Line: line");
+            WriteDebugMessages("LE - Adding Line: " + line);
             if (!IsRunning)
             {
                 // We need to load user credentials only
@@ -637,4 +637,4 @@

         #endregion
     }
-}+}


fix init values

fix init values

--- src/NLog/Common/InternalLogger.cs
+++ src/NLog/Common/InternalLogger.cs
@@ -81,9 +81,9 @@
             Info("NLog internal logger initialized.");
 #else
             LogLevel = LogLevel.Info;
-            LogToConsole = null;
-            LogToConsoleError = null;
-            LogFile = null;
+            LogToConsole = false;
+            LogToConsoleError = false;
+            LogFile = string.Empty;
 #endif
             IncludeTimestamp = true;
             LogWriter = null;


React to logging in DI change

React to logging in DI change

--- samples/IdentityOIDCWebApplicationSample/MetaPackage/WebHost.cs
+++ samples/IdentityOIDCWebApplicationSample/MetaPackage/WebHost.cs
@@ -177,7 +177,7 @@
                 })
                 .ConfigureLogging((hostingContext, logging) =>
                 {
-                    logging.UseConfiguration(hostingContext.Configuration.GetSection("Logging"));
+                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                     logging.AddConsole();
                     logging.AddDebug();
                 })


Adding Alpha.ToChar()

Adding Alpha.ToChar()

--- src/SLANG/src/Core/ALPHA/Alpha.cs
+++ src/SLANG/src/Core/ALPHA/Alpha.cs
@@ -8,11 +8,19 @@
 // --------------------------------------------------------------------------------------------------------------------
 namespace SLANG.Core.ALPHA
 {
+    using System.Diagnostics;
+
     public class Alpha : Alternative
     {
         public Alpha(Element element)
             : base(element)
         {
         }
+
+        public char ToChar()
+        {
+            Debug.Assert(this.Data.Length == 1, "this.Data.Length == 1");
+            return this.Data[0];
+        }
     }
 }


Fix #224

Fix #224

--- src/SoapCore/MetaWCFBodyWriter.cs
+++ src/SoapCore/MetaWCFBodyWriter.cs
@@ -451,7 +451,11 @@

 					writer.WriteStartElement("xs:element");
 					writer.WriteAttributeString("name", GetTypeName(type));
-					writer.WriteAttributeString("nillable", "true");
+					if (Nullable.GetUnderlyingType(type) != null)
+					{
+						writer.WriteAttributeString("nillable", "true");
+					}
+
 					writer.WriteAttributeString("type", "tns:" + GetTypeName(type));
 					writer.WriteEndElement(); // xs:element
 				}
@@ -957,7 +961,11 @@

 		private void WriteComplexElementType(XmlDictionaryWriter writer, string typeName, string schemaNamespace, string objectNamespace, Type type)
 		{
-			writer.WriteAttributeString("nillable", "true");
+			if (Nullable.GetUnderlyingType(type) != null)
+			{
+				writer.WriteAttributeString("nillable", "true");
+			}
+
 			if (schemaNamespace != objectNamespace)
 			{
 				var ns = $"q{_namespaceCounter++}";


Implement smooth/curveto Bézier command with reflected control point

- Issue MatterHackers/MCCentral#4936
Parsed Svg path incorrect

--- agg/VertexSource/VertexStorage.cs
+++ agg/VertexSource/VertexStorage.cs
@@ -821,37 +821,32 @@
 						{
 							do
 							{
-								parseIndex++;
-								Vector2 controlPoint1;
-								if (foundSecondControlPoint)
-								{
-									if (command == 's')
+								Vector2 controlPoint = lastXY;
+
+								if (vertexDataManager.last_command() == ShapePath.FlagsAndCommand.Curve4)
 									{
-										controlPoint1 = new Vector2();
-									}
-									else
-									{
-										controlPoint1 = curXY;
-									}
+									controlPoint = Reflect(secondControlPoint, lastXY);
 								}
 								else
 								{
-									controlPoint1.X = curXY.X - (secondControlPoint.X - curXY.X);
-									controlPoint1.Y = curXY.Y - (secondControlPoint.Y - curXY.Y);
+									controlPoint = curXY;
 								}
+
+								parseIndex++;
+
 								foundSecondControlPoint = true;
+
 								secondControlPoint.X = agg_basics.ParseDouble(dString, ref parseIndex, fastSimpleNumbers);
 								secondControlPoint.Y = agg_basics.ParseDouble(dString, ref parseIndex, fastSimpleNumbers);
 								curXY.X = agg_basics.ParseDouble(dString, ref parseIndex, fastSimpleNumbers);
 								curXY.Y = agg_basics.ParseDouble(dString, ref parseIndex, fastSimpleNumbers);
 								if (command == 's')
 								{
-									controlPoint1 += lastXY;
 									secondControlPoint += lastXY;
 									curXY += lastXY;
 								}

-								this.curve4(controlPoint1.X, controlPoint1.Y, secondControlPoint.X, secondControlPoint.Y, curXY.X, curXY.Y);
+								this.curve4(controlPoint.X, controlPoint.Y, secondControlPoint.X, secondControlPoint.Y, curXY.X, curXY.Y);

 								// if the next element is another coordinate than we just continue to add more curves.
 							} while (NextElementIsANumber(dString, parseIndex));
@@ -975,6 +970,32 @@
 			}
 		}

+		private static Vector2 Reflect(Vector2 point, Vector2 mirror)
+		{
+			double x, y, dx, dy;
+			dx = Math.Abs(mirror.X - point.X);
+			dy = Math.Abs(mirror.Y - point.Y);
+
+			if (mirror.X >= point.X)
+			{
+				x = mirror.X + dx;
+			}
+			else
+			{
+				x = mirror.X - dx;
+			}
+			if (mirror.Y >= point.Y)
+			{
+				y = mirror.Y + dy;
+			}
+			else
+			{
+				y = mirror.Y - dy;
+			}
+
+			return new Vector2(x, y);
+		}
+
 		HashSet<char> validNumberStartingCharacters = new HashSet<char> { '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
 		HashSet<char> validSkipCharacters = new HashSet<char> { ' ', ',' };
 		private bool NextElementIsANumber(string dString, int parseIndex)


Minor adjustments of the descriptions for the ActivationsOptions in the .App

--- CSMarkdown.App/ActivationOptions.cs
+++ CSMarkdown.App/ActivationOptions.cs
@@ -9,31 +9,31 @@
 {
     internal class ActivationOptions
     {
-        [SwitchArgument('w', "webapp", false, Description = "Starts the web app")]
+        [SwitchArgument('w', "webapp", false, Description = "Starts the web app.")]
         public bool WebApp { get; set; }

-        [SwitchArgument('r', "render", false, Description = "Render report")]
+        [SwitchArgument('r', "render", false, Description = "Render report.")]
         public bool Render { get; set; }

-        [SwitchArgument('f', "flattenhtml", true, Description = "Use when you don't want the html to be flattened. Default is true")]
+        [SwitchArgument('f', "flattenhtml", true, Description = "Use when you don't want the html to be flattened. Default is true.")]
         public bool FalttenHtml { get; set; }

-        [ValueArgument(typeof(string), 's', LongName = "smdfile", Description = "Name of the .smd file to use")]
+        [ValueArgument(typeof(string), 's', LongName = "smdfile", Description = "Name of the .smd file to use.")]
         public string SmdFileName { get; set; }

-        [ValueArgument(typeof(string), 'n', LongName = "newfilename", Description = "Name of the output file. If name consists of white spaces, use \"[name]\" around the name")]
+        [ValueArgument(typeof(string), 'n', LongName = "newfilename", Description = "Name of the output file. If name consists of white spaces, use \"[name]\" around the name.")]
         public string NewFileName { get; set; }

-        [ValueArgument(typeof(string), 'i', LongName = "inputpath", Description = "Holds the path of the smd file to use")]
+        [ValueArgument(typeof(string), 'i', LongName = "inputpath", Description = "Holds the path of the smd file to use.")]
         public string InputPath { get; set; }

-        [ValueArgument(typeof(string), 'o', LongName = "outputpath", Description = "Holds the path of where to put the output file")]
+        [ValueArgument(typeof(string), 'o', LongName = "outputpath", Description = "Holds the path of where to put the output file.")]
         public string OutputPath { get; set; }

-        [ValueArgument(typeof(string), 't', LongName = "outputtype", Description = "Define which type the output document should be")]
+        [ValueArgument(typeof(string), 't', LongName = "outputtype", Description = "Define which type the output document should be.")]
         public string OutputType { get; set; }

-        [ValueArgument(typeof(string), 'p', LongName = "parameters", Description = "Holds the parameters for the report. If the argument with parameters contains whitespaces, then use \"[parameters]\" to encapsulate", Example = "from=2016-04-01, to=2016-01-03, tag=NameTag")]
+        [ValueArgument(typeof(string), 'p', LongName = "parameters", Description = "Holds the parameters for the report. If the argument with parameters contains whitespaces, then use \"[parameters]\" to encapsulate.", Example = "from=2016-11-25, to=2016-11-28, tag=NameTag")]
         public string Parameters { get; set; }
     }
 }


update

update

--- CSharpGL/0Foundations/Maths/vec4.cs
+++ CSharpGL/0Foundations/Maths/vec4.cs
@@ -13,25 +13,21 @@
     public struct vec4 : IEquatable<vec4>, ILoadFromString
     {
         /// <summary>
-        /// Don't change the order of x, y, z, w appears!
         /// </summary>
         [FieldOffset(sizeof(float) * 0)]
         public float x;

         /// <summary>
-        /// Don't change the order of x, y, z, w appears!
         /// </summary>
         [FieldOffset(sizeof(float) * 1)]
         public float y;

         /// <summary>
-        /// Don't change the order of x, y, z, w appears!
         /// </summary>
         [FieldOffset(sizeof(float) * 2)]
         public float z;

         /// <summary>
-        /// Don't change the order of x, y, z, w appears!
         /// </summary>
         [FieldOffset(sizeof(float) * 3)]
         public float w;


Fixed a bug with indexer property

Fixed a bug with indexer property

--- Ceen.Httpd/StorageImplementation.cs
+++ Ceen.Httpd/StorageImplementation.cs
@@ -52,9 +52,9 @@
 			if (iface == null)
 				throw new Exception($"The given type ${m_wrapped.GetType()} does not implement {typeof(IStorageEntry)}");

-			m_index = iface.GetProperties().FirstOrDefault(x => x.GetIndexParameters().Length == 1);
-
-			if (new[] { m_wrapped, m_expires, m_name }.Any(x => x == null))
+			m_index = typeof(IDictionary<string, string>).GetProperties().FirstOrDefault(x => x.GetIndexParameters().Length == 1);
+
+			if (new[] { m_wrapped, m_expires, m_name, m_index }.Any(x => x == null))
 				throw new Exception($"Something changed in {typeof(IStorageEntry)}");
 		}


Fixes a bug where "this" project wasn't being skipped.

The purpose of the skip is because GetReferencedProjects returns a collection that includes the current project.  We don't want to try to import .ts files from the imported project so we need to skip it.

Previously, there was a bug where we would skip the first found .ts file, not the first project.

--- code/FromReferencesTask.cs
+++ code/FromReferencesTask.cs
@@ -48,8 +48,8 @@

 				var typeScriptFullPaths = GetReferencedProjects(project)
 					.NotNullToNull()
+					.Skip(1)
 					.SelectMany(x => GetTypeScriptItems(x).NotNullToNull(), GetTypeScriptFileFullPath)
-					.Skip(1)
 					.NotNull();

 				foreach (var typeScriptFullPath in typeScriptFullPaths)


added VpnServer prop. to use the same ravendb document store for multiple vpn servers

--- openvpn.api/openvpn.api.common/Event.cs
+++ openvpn.api/openvpn.api.common/Event.cs
@@ -21,6 +21,11 @@
         ///
         /// </summary>
         public EventType Type { get; set; }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public string VpnServer { get; set; }

         /// <summary>
         ///


Fixes bug in SkipEventsUntil, always skipped first event

--- Common/Scheduling/ScheduledEvent.cs
+++ Common/Scheduling/ScheduledEvent.cs
@@ -168,6 +168,9 @@
         /// <param name="utcTime">Frontier time</param>
         public void SkipEventsUntil(DateTime utcTime)
         {
+            // check if our next event is in the past
+            if (utcTime < _orderedEventUtcTimes.Current) return;
+
             while (_orderedEventUtcTimes.MoveNext())
             {
                 // zoom through the enumerator until we get to the desired time


Make handheld flash not flash thourgh walls. (#5916)

Also make it so mobs don't block the flash.

--- Content.Server/Flash/FlashSystem.cs
+++ Content.Server/Flash/FlashSystem.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using Content.Server.Flash.Components;
 using Content.Server.Inventory.Components;
 using Content.Server.Items;
@@ -75,10 +76,7 @@
                 return;
             }

-            foreach (var entity in _entityLookup.GetEntitiesInRange(EntityManager.GetComponent<TransformComponent>(comp.Owner).Coordinates, comp.Range))
-            {
-                Flash(entity, args.User, uid, comp.AoeFlashDuration, comp.SlowTo);
-            }
+            FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, true);
         }

         private bool UseFlash(FlashComponent comp, EntityUid user)
@@ -142,15 +140,24 @@
         public void FlashArea(EntityUid source, EntityUid? user, float range, float duration, float slowTo = 0f, bool displayPopup = false, SoundSpecifier? sound = null)
         {
             var transform = EntityManager.GetComponent<TransformComponent>(source);
+            var flashableEntities = new List<EntityUid>();

             foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range))
             {
-                if (!EntityManager.HasComponent<FlashableComponent>(entity) ||
-                    !transform.InRangeUnobstructed(entity, range, CollisionGroup.Opaque)) continue;
+                if (!EntityManager.HasComponent<FlashableComponent>(entity))
+                    continue;
+
+                flashableEntities.Add(entity);
+            }
+
+            foreach (var entity in flashableEntities)
+            {
+                // Check for unobstructed entities while ignoring the mobs with flashable components.
+                if (!transform.InRangeUnobstructed(entity, range, CollisionGroup.Opaque, (e) => flashableEntities.Contains(e)))
+                    continue;

                 Flash(entity, user, source, duration, slowTo, displayPopup);
             }
-
             if (sound != null)
             {
                 SoundSystem.Play(Filter.Pvs(transform), sound.GetSound(), transform.Coordinates);


Use value because we need to.

Use value because we need to.

--- osu.Game/Overlays/Music/PlaylistList.cs
+++ osu.Game/Overlays/Music/PlaylistList.cs
@@ -77,7 +77,8 @@
             {
                 set
                 {
-                    InvalidateLayout();
+                    if (value)
+                        InvalidateLayout();
                 }
             }


Fix CI error.

Fix CI error.

--- osu.Game/Overlays/Music/PlaylistList.cs
+++ osu.Game/Overlays/Music/PlaylistList.cs
@@ -8,7 +8,6 @@
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Input;
-using osu.Framework.MathUtils;
 using osu.Game.Beatmaps;
 using osu.Game.Graphics.Containers;
 using OpenTK;


Clarifying docs

Clarifying docs

--- Controllers/PersonListController.cs
+++ Controllers/PersonListController.cs
@@ -3,6 +3,8 @@
  * content type. It doesn't make too much difference but you need to keep in mind that the ContentItems are stored in
  * the documents (which contain the parts and fields serialized) and can have multiple index records referencing a
  * content item (e.g. the previously created PersonPartIndex that indexes data in from PersonPart).
+ *
+ * We'll also see some examples of how to modify and create content items from code.
  *
  * Note that there is no custom controller or action demonstrated for displaying the editor for the Person. Go to the
  * administration page (/Admin) and create a few Person content items, including ones with ages above 30.


Add query with bindVar and fluent query tests.

--- src/Arango/Arango.Tests/QueryOperations/QueryOperationsTests.cs
+++ src/Arango/Arango.Tests/QueryOperations/QueryOperationsTests.cs
@@ -286,6 +286,58 @@
         }

         [Test()]
+        public void Should_execute_AQL_query_with_bindVar()
+        {
+            var documents = Database.ClearCollectionAndFetchTestDocumentData(Database.TestDocumentCollectionName);
+            var db = new ArangoDatabase(Database.Alias);
+
+            var queryResult = db.Query
+                .BindVar("barNumber", 1)
+                .Aql(string.Format(@"
+                FOR item IN {0}
+                    FILTER item.bar == @barNumber
+                    RETURN item
+                ", Database.TestDocumentCollectionName))
+                .ToList();
+
+            Assert.AreEqual(201, queryResult.StatusCode);
+            Assert.IsTrue(queryResult.Success);
+            Assert.AreEqual(queryResult.Value.Count, 1);
+        }
+
+        [Test()]
+        public void Should_execute_AQL_query_fluent()
+        {
+            var documents = Database.ClearCollectionAndFetchTestDocumentData(Database.TestDocumentCollectionName);
+            var db = new ArangoDatabase(Database.Alias);
+            var useCount = true;
+            var useBatchSize = true;
+
+            var queryOperation = db.Query
+                .Aql(string.Format(@"
+                FOR item IN {0}
+                    RETURN item
+                ", Database.TestDocumentCollectionName));
+
+            if (useCount)
+            {
+                queryOperation.Count(true);
+            }
+
+            if (useBatchSize)
+            {
+                queryOperation.BatchSize(1);
+            }
+
+            var queryResult = queryOperation.ToList();
+
+            Assert.AreEqual(200, queryResult.StatusCode);
+            Assert.IsTrue(queryResult.Success);
+            Assert.AreEqual(queryResult.Value.Count, 2);
+            Assert.AreEqual(queryResult.Extra.Long("count"), 2);
+        }
+
+        [Test()]
         public void Should_return_404_with_deleteCursor_operation()
         {
             var documents = Database.ClearCollectionAndFetchTestDocumentData(Database.TestDocumentCollectionName);


Make sure that error diagnostics can't be suppressed

--- src/Common/Implementation/Emission/DiagnosticReporter.Roslyn.cs
+++ src/Common/Implementation/Emission/DiagnosticReporter.Roslyn.cs
@@ -1,6 +1,8 @@
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.Tags;
 using RestEase.Implementation.Analysis;

 namespace RestEase.Implementation.Emission
@@ -343,8 +345,11 @@
             this.AddDiagnostic(expressionsNotAvailable, Location.None);
         }

-        private static DiagnosticDescriptor CreateDescriptor(DiagnosticCode code, string title, string messageFormat, DiagnosticSeverity severity = DiagnosticSeverity.Error) =>
-            new DiagnosticDescriptor(code.Format(), title, messageFormat, "RestEaseGeneration", severity, isEnabledByDefault: true);
+        private static DiagnosticDescriptor CreateDescriptor(DiagnosticCode code, string title, string messageFormat, DiagnosticSeverity severity = DiagnosticSeverity.Error)
+        {
+            var tags = severity == DiagnosticSeverity.Error ? new[] { WellKnownDiagnosticTags.NotConfigurable } : Array.Empty<string>();
+            return new DiagnosticDescriptor(code.Format(), title, messageFormat, "RestEaseGeneration", severity, isEnabledByDefault: true, customTags: tags);
+        }

         private void AddDiagnostic(DiagnosticDescriptor descriptor, IEnumerable<Location> locations, params object?[] args)
         {


Fix a warning

Fix a warning

--- src/Compilers/CSharp/Portable/Symbols/Tuples/TupleTypeSymbol.cs
+++ src/Compilers/CSharp/Portable/Symbols/Tuples/TupleTypeSymbol.cs
@@ -1117,7 +1117,7 @@

                 if (TypeSymbol.Equals(underlyingMemberDefinition.ContainingType, TupleUnderlyingType.OriginalDefinition, TypeCompareKind.ConsiderEverything))
                 {
-                    if (UnderlyingDefinitionToMemberMap.TryGetValue(underlyingMemberDefinition, out Symbol result))
+                    if (UnderlyingDefinitionToMemberMap.TryGetValue(underlyingMemberDefinition, out Symbol? result))
                     {
                         return (TMember)result;
                     }


Adding details inside comment to not confuse users

--- src/FluentMigrator.Abstractions/Builders/IColumnOptionSyntax.cs
+++ src/FluentMigrator.Abstractions/Builders/IColumnOptionSyntax.cs
@@ -53,7 +53,7 @@
         TNext WithColumnDescription(string description);

         /// <summary>
-        /// Sets any additional column descriptions
+        /// Sets any additional column descriptions using a pair of name and description content
         /// </summary>
         /// <param name="descriptionName">The descriptionName</param>
         /// <param name="description">The description</param>
@@ -61,7 +61,7 @@
         TNext WithColumnAdditionalDescription(string descriptionName, string description);

         /// <summary>
-        /// Sets any additional column descriptions
+        /// Sets any additional column descriptions using a Dictionary containing multiple pairs of name and description content
         /// </summary>
         /// <param name="columnDescriptions">The columnDescriptions list</param>
         /// <returns>The next step</returns>


Add TODO comment

Add TODO comment

--- src/ImGui/OSImplementation/Shared/Text/TypographyTextContext.cs
+++ src/ImGui/OSImplementation/Shared/Text/TypographyTextContext.cs
@@ -85,6 +85,7 @@
             this.Text = text;
             this.FontFamily = fontFamily;
             this.FontSize = fontSize;
+            //TODO remove Alignment, alignment has no meaning without a rectangle region
             this.Alignment = alignment;
         }


Write the autolink's URL so we can see the autolink.

--- src/Markdig.Wpf/Renderers/Wpf/Inlines/AutoLinkInlineRenderer.cs
+++ src/Markdig.Wpf/Renderers/Wpf/Inlines/AutoLinkInlineRenderer.cs
@@ -34,7 +34,9 @@
                 ToolTip = url,
             };

-            renderer.WriteInline(hyperlink);
+            renderer.Push(hyperlink);
+            renderer.WriteText(link.Url);
+            renderer.Pop();
         }
     }
 }


Fixed mistake

Fixed mistake

--- src/OpenTKAnalyzer/OpenTKAnalyzer/Utility/NumericValueParser.cs
+++ src/OpenTKAnalyzer/OpenTKAnalyzer/Utility/NumericValueParser.cs
@@ -129,7 +129,7 @@
 		/// </summary>
 		/// <param name="expression">An expression syntax node containing a number to convert.</param>
 		/// <returns>Int value equivalent.</returns>
-		static public double ParseFromExpressionInt(ExpressionSyntax expression)
+		static public int ParseFromExpressionInt(ExpressionSyntax expression)
 		{
 			var result = ParseFromExpressionIntOrNull(expression);
 			if (result.HasValue)


Added support for space separated polygon and polyline and display="none" attribute

Reading of polygon and polylines now checks it is comma separated pairs
or spaces.

In addition, when the display attribute is detected with the value of
none, the reading of that element is skipped as it will not be shown.

--- source/FFImageLoading.Svg.Shared/SkSvg.cs
+++ source/FFImageLoading.Svg.Shared/SkSvg.cs
@@ -179,6 +179,9 @@

 		private void ReadElement(XElement e, SKCanvas canvas, SKPaint stroke, SKPaint fill)
 		{
+            if (e.Attribute("display")?.Value == "none")
+                return;
+
 			// transform matrix
 			var transform = ReadTransform(e.Attribute("transform")?.Value ?? string.Empty);
 			canvas.Save();
@@ -210,6 +213,7 @@
 						var rx = ReadNumber(e.Attribute("rx"));
 						var ry = ReadNumber(e.Attribute("ry"));
 						var rect = SKRect.Create(x, y, width, height);
+
 						if (rx > 0 || ry > 0)
 						{
 							if (fill != null)
@@ -848,12 +852,33 @@
 		{
 			var path = new SKPath();
 			var points = pointsData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
-			for (int i = 0; i < points.Length; i++)
-			{
-				var point = points[i];
-				var xy = point.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-				var x = ReadNumber(xy[0]);
-				var y = ReadNumber(xy[1]);
+
+            if (pointsData.Contains(','))
+            {
+                for (int i = 0; i < points.Length; i++)
+                {
+                    var point = points[i];
+
+                    var xy = point.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+                    var x = ReadNumber(xy[0]);
+                    var y = ReadNumber(xy[1]);
+
+                    if (i == 0)
+                    {
+                        path.MoveTo(x, y);
+                    }
+                    else
+                    {
+                        path.LineTo(x, y);
+                    }
+                }
+            }
+
+            for (int i = 0; i < points.Length; i=i+2)
+            {
+				var x = ReadNumber(points[i]);
+				var y = ReadNumber(points[i+1]);
+
 				if (i == 0)
 				{
 					path.MoveTo(x, y);
@@ -862,7 +887,8 @@
 				{
 					path.LineTo(x, y);
 				}
-			}
+            }
+
 			if (closePath)
 			{
 				path.Close();
@@ -1111,4 +1137,4 @@
 			return r;
 		}
 	}
-}
+}


Fix typo

Fix typo

--HG--
branch : dev

--- src/Orchard.Web/Modules/Orchard.Themes/Services/ThemeService.cs
+++ src/Orchard.Web/Modules/Orchard.Themes/Services/ThemeService.cs
@@ -75,7 +75,7 @@
             while (!string.IsNullOrWhiteSpace(baseThemeName)) {
                 //todo: (heskew) need a better way to protect from recursive references
                 if (themesSeen.Contains(baseThemeName))
-                    throw new InvalidOperationException(T("The theme \"{0}\" was already seen - looks like we're going aruond in circles.", baseThemeName).Text);
+                    throw new InvalidOperationException(T("The theme \"{0}\" was already seen - looks like we're going around in circles.", baseThemeName).Text);
                 themesSeen.Add(baseThemeName);

                 var baseTheme = GetThemeByName(baseThemeName);


[Fixes #7326] Orchard.Widgets - Fix typo in logger (#7327)

--- src/Orchard.Web/Modules/Orchard.Widgets/Filters/WidgetFilter.cs
+++ src/Orchard.Web/Modules/Orchard.Widgets/Filters/WidgetFilter.cs
@@ -59,7 +59,7 @@
             foreach (var widgetPart in widgetParts) {
                 var commonPart = widgetPart.As<ICommonPart>();
                 if (commonPart == null || commonPart.Container == null) {
-                    Logger.Warning("The widget '{0}' is has no assigned layer or the layer does not exist.", widgetPart.Title);
+                    Logger.Warning("The widget '{0}' has no assigned layer or the layer does not exist.", widgetPart.Title);
                     continue;
                 }


Removed debug message.

Removed debug message.

--- source/WaypointManager/WaypointManager.cs
+++ source/WaypointManager/WaypointManager.cs
@@ -201,7 +201,6 @@
             GameDatabase.TextureInfo nyan = GameDatabase.Instance.databaseTexture.Where(t => t.name.Contains("WaypointManager/icons/Special/nyan")).FirstOrDefault();
             if (nyan != null && DateTime.Now.Month == 4 && DateTime.Now.Day == 1)
             {
-                Debug.Log("doing stuff, nyan = " + nyan.name);
                 foreach (GameDatabase.TextureInfo texInfo in GameDatabase.Instance.databaseTexture.Where(t => t.name.StartsWith("Squad/Contracts/Icons/")))
                 {
                     string name = texInfo.name.Replace("Squad/Contracts/Icons/", "");


fix for some failed unittests

fix for some failed unittests

--- src/Simple.OData.Client.Core/Extensions/DictionaryExtensions.cs
+++ src/Simple.OData.Client.Core/Extensions/DictionaryExtensions.cs
@@ -123,9 +123,9 @@

                 foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                 {
-                    type = assembly.GetType(odataType);
-                    if (type != null)
-                        return type;
+                    var typeFound = assembly.GetType(odataType);
+                    if (typeFound != null)
+                        return typeFound;
                 }

                 // TODO: Should we throw an exception here or log a warning here as we don't understand the data


Use MvcJsonOptions json serializer formatting when generating swagger.json

--- src/Swashbuckle.Swagger/Application/SwaggerSerializerFactory.cs
+++ src/Swashbuckle.Swagger/Application/SwaggerSerializerFactory.cs
@@ -12,6 +12,7 @@
             return new JsonSerializer
             {
                 NullValueHandling = NullValueHandling.Ignore,
+                Formatting = mvcJsonOptions.Value.SerializerSettings.Formatting,
                 ContractResolver = new SwaggerContractResolver(mvcJsonOptions.Value.SerializerSettings)
             };
         }


Remove 'changed' icon from schedule

Remove 'changed' icon from schedule

--- src/Swetugg.Web/Areas/Swetugg2017/Views/Conference/Index.cshtml
+++ src/Swetugg.Web/Areas/Swetugg2017/Views/Conference/Index.cshtml
@@ -382,8 +382,9 @@

                         Schemat är preliminärt och kan komma att ändras.
-
+                    @*
                         Förändrat sedan schemat trycktes
+                    *@


Re-enable ConcurrentQueue test for UapAot to obtain repro for issue #22385. (#23114)

--- src/System.Collections.Concurrent/tests/ConcurrentQueueTests.cs
+++ src/System.Collections.Concurrent/tests/ConcurrentQueueTests.cs
@@ -98,8 +98,8 @@
         public void MultipleProducerConsumer_AllItemsTransferred(int producers, int consumers, int itemsPerProducer)
         {
             //ActiveIssue("https://github.com/dotnet/corefx/issues/22385 - Never terminates on Win10 RS3 - when built using CHK framework on ILC", TargetFrameworkMonikers.UapAot)
-            if (PlatformDetection.IsNetNative && PlatformDetection.IsWindows10InsiderPreviewBuild16215OrGreater)
-                return;
+            //if (PlatformDetection.IsNetNative && PlatformDetection.IsWindows10InsiderPreviewBuild16215OrGreater)
+            //    return;

             var cq = new ConcurrentQueue<int>();
             var tasks = new List<Task>();


Enable skipped test.

Enable skipped test.

--- src/System.Linq.Expressions/tests/Dynamic/ExpandoObjectTests.cs
+++ src/System.Linq.Expressions/tests/Dynamic/ExpandoObjectTests.cs
@@ -64,7 +64,7 @@
             Assert.Equal(Enumerable.Repeat(new KeyValuePair<string, object>("key", 2), 1), eo);
         }

-        [Fact, ActiveIssue(13541)]
+        [Fact]
         public void DictionaryMatchesProperties()
         {
             dynamic eo = new ExpandoObject();


[driver] Skip Objective-C support files if not targetting it.

--- binder/Driver.cs
+++ binder/Driver.cs
@@ -122,7 +122,14 @@
                 var path = GetSupportDirectory();

                 foreach (var file in Directory.EnumerateFiles(path))
+                {
+                    // Skip Objective-C support files if we are not targetting it.
+                    if (Options.GeneratorKind != GeneratorKind.ObjectiveC &&
+                        (Path.GetExtension(file) == ".m" || file.Contains("objc")))
+                        continue;
+
                     Output.WriteOutput(Path.GetFileName(file), File.ReadAllText(file));
+                }
             }
             catch (Exception)
             {


Added body to PutResponse output

Added body to PutResponse output

--- src/WebServer/Converters/RestResponseToHttpResponseConverter.cs
+++ src/WebServer/Converters/RestResponseToHttpResponseConverter.cs
@@ -40,27 +40,12 @@

         public IHttpResponse Visit(GetResponse response, RestRequest restReq)
         {
-            string bodyString = _bodySerializer.ToBody(response.BodyData, restReq);
-
-            int bodyLength = bodyString == null ? 0 : Encoding.UTF8.GetBytes(bodyString).Length;
-
-            var rawHttpResponseBuilder = new StringBuilder();
-            rawHttpResponseBuilder.Append(CreateDefaultResponse(response));
-            rawHttpResponseBuilder.AppendFormat("Content-Length: {0}\r\n", bodyLength);
-            rawHttpResponseBuilder.AppendFormat("Content-Type: {0}\r\n", HttpCodesTranslator.GetMediaType(restReq.AcceptHeaders.First()));
-            rawHttpResponseBuilder.Append(CreateHttpNewLine());
-            rawHttpResponseBuilder.Append(bodyString);
-
-            return CreateHttpResponse(rawHttpResponseBuilder);
+            return VisitWithBody(response, restReq);
         }

         public IHttpResponse Visit(PutResponse response, RestRequest restReq)
         {
-            var rawHttpResponseBuilder = new StringBuilder();
-            rawHttpResponseBuilder.Append(CreateDefaultResponse(response));
-            rawHttpResponseBuilder.Append(CreateHttpNewLine());
-
-            return CreateHttpResponse(rawHttpResponseBuilder);
+            return VisitWithBody(response, restReq);
         }

         public IHttpResponse Visit(StatusOnlyResponse statusOnlyResponse, RestRequest restReq)
@@ -78,6 +63,22 @@
             rawHttpResponseBuilder.Append(CreateDefaultResponse(methodNotAllowedResponse));
             rawHttpResponseBuilder.AppendFormat("Allow: {0}", string.Join(",", methodNotAllowedResponse.Allows));
             rawHttpResponseBuilder.Append(CreateHttpNewLine());
+
+            return CreateHttpResponse(rawHttpResponseBuilder);
+        }
+
+        private IHttpResponse VisitWithBody(IBodyRestResponse response, RestRequest restReq)
+        {
+            string bodyString = _bodySerializer.ToBody(response.BodyData, restReq);
+
+            int bodyLength = bodyString == null ? 0 : Encoding.UTF8.GetBytes(bodyString).Length;
+
+            var rawHttpResponseBuilder = new StringBuilder();
+            rawHttpResponseBuilder.Append(CreateDefaultResponse(response));
+            rawHttpResponseBuilder.AppendFormat("Content-Length: {0}\r\n", bodyLength);
+            rawHttpResponseBuilder.AppendFormat("Content-Type: {0}\r\n", HttpCodesTranslator.GetMediaType(restReq.AcceptHeaders.First()));
+            rawHttpResponseBuilder.Append(CreateHttpNewLine());
+            rawHttpResponseBuilder.Append(bodyString);

             return CreateHttpResponse(rawHttpResponseBuilder);
         }


Added the ability to exclude certain assemblies from type and member searches.

This is a performance enhancement in cases where a plugin might have a large
assembly that will never be referenced from the game, but slows down type
searches nonetheless.

--- Duality/Utility/ReflectionHelper.cs
+++ Duality/Utility/ReflectionHelper.cs
@@ -24,6 +24,7 @@
 		private	static	Dictionary<MemberInfo,Attribute[]>	customAttributeCache	= new Dictionary<MemberInfo,Attribute[]>();
 		private	static	List<SerializeErrorHandler>			serializeHandlerCache	= new List<SerializeErrorHandler>();
 		private	static	Dictionary<KeyValuePair<Type,Type>,bool>	resRefCache	= new Dictionary<KeyValuePair<Type,Type>,bool>();
+		private static	List<Assembly>						exlucdeFromTypeSearch	= new List<Assembly>();

 		/// <summary>
 		/// Equals <c>BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic</c>.
@@ -582,6 +583,20 @@
 			customAttributeCache.Clear();
 		}
 		/// <summary>
+		/// Excludes an assembly from type searches in ResolveType and ResolveMember calls. Use this when you have large assemblies that you're sure you don't
+		/// want to be searchable and would otherwise slow down searches. Slow searches can really affect usability in case where the user has to wait for the
+		/// search to complete.
+		/// </summary>
+		/// <param name="assemblies"></param>
+		public static void ExcludeFromTypeSearches(IEnumerable<Assembly> assemblies)
+		{
+			foreach (var assembly in assemblies)
+			{
+				if(exlucdeFromTypeSearch.Contains(assembly) == false)
+					exlucdeFromTypeSearch.Add(assembly);
+			}
+		}
+		/// <summary>
 		/// Resolves a Type based on its <see cref="GetTypeId">type id</see>.
 		/// </summary>
 		/// <param name="typeString">The type string to resolve.</param>
@@ -595,7 +610,7 @@
 			Type result;
 			if (typeResolveCache.TryGetValue(typeString, out result)) return result;

-			Assembly[] searchAsm = AppDomain.CurrentDomain.GetAssemblies().Except(DualityApp.DisposedPlugins).ToArray();
+			Assembly[] searchAsm = AppDomain.CurrentDomain.GetAssemblies().Except(DualityApp.DisposedPlugins).Except(exlucdeFromTypeSearch).ToArray();
 			result = FindType(typeString, searchAsm, declaringMethod);
 			if (result != null && declaringMethod == null) typeResolveCache[typeString] = result;

@@ -613,7 +628,7 @@
 			MemberInfo result;
 			if (memberResolveCache.TryGetValue(memberString, out result)) return result;

-			Assembly[] searchAsm = AppDomain.CurrentDomain.GetAssemblies().Except(DualityApp.DisposedPlugins).ToArray();
+			Assembly[] searchAsm = AppDomain.CurrentDomain.GetAssemblies().Except(DualityApp.DisposedPlugins).Except(exlucdeFromTypeSearch).ToArray();
 			result = FindMember(memberString, searchAsm);
 			if (result != null) memberResolveCache[memberString] = result;


Fill out systems not populated by history list

--- EDDiscovery/3DMap/DatasetBuilder.cs
+++ EDDiscovery/3DMap/DatasetBuilder.cs
@@ -224,6 +224,11 @@
             ISystem lastknownps = null;
             foreach (SystemPosition ps in VisitedSystems)
             {
+                if (ps.curSystem == null)
+                {
+                    ps.curSystem = SystemData.GetSystem(ps.Name);
+                }
+
                 if (ps.curSystem != null && ps.curSystem.HasCoordinate)
                 {
                     ps.lastKnownSystem = lastknownps;


We need to go deeper

We need to go deeper

--- EDDiscovery/TravelHistoryControl.cs
+++ EDDiscovery/TravelHistoryControl.cs
@@ -230,8 +230,7 @@
             if (visitedSystems == null)
                 return;

-            if (!_discoveryForm.SystemsUpdating)
-                VisitedSystemsClass.UpdateSys(visitedSystems, EDDConfig.Instance.UseDistances);
+            VisitedSystemsClass.UpdateSys(visitedSystems, EDDConfig.Instance.UseDistances, !_discoveryForm.SystemsUpdating);
             var filter = (TravelHistoryFilter) comboBoxHistoryWindow.SelectedItem ?? TravelHistoryFilter.NoFilter;
             List<VisitedSystemsClass> result = filter.Filter(visitedSystems);


Don't check for null twice

Don't check for null twice

--- EDDiscovery/TravelHistoryControl.cs
+++ EDDiscovery/TravelHistoryControl.cs
@@ -515,7 +515,7 @@

             FormMap map2;
-            if (TrilaterationControl.Visible && TrilaterationControl.TargetSystem!=null)
+            if (TrilaterationControl.Visible)
             {
                 var centerSystem = TrilaterationControl.TargetSystem;
                 if (centerSystem == null || !centerSystem.HasCoordinate) centerSystem = TrilaterationControl.LastKnownSystem;


MOD: The ReadCsv overload that call itself :P

git-svn-id: cdbd3c3453b226d8644b39c93ea790e37ea3ca1b@595 fafefce7-770d-0410-b8bf-a6f642d37c66

--- FileHelpers/Engines/CommonEngine.cs
+++ FileHelpers/Engines/CommonEngine.cs
@@ -717,7 +717,7 @@
         /// <returns>An enumeration of <see cref="RecordIndexer"/></returns>
         public static IEnumerable<RecordIndexer> ReadCsv(string filename, char delimiter, int headerLines)
         {
-            return ReadCsv(filename, delimiter, 0);
+            return ReadCsv(filename, delimiter, 0, Encoding.Default);
         }

         /// <summary>


Fix type

Fix type

--- GameOfLife/Model/GameInitializer.cs
+++ GameOfLife/Model/GameInitializer.cs
@@ -44,7 +44,7 @@
             var cell = CreateCell(isAlive);
             row.Add(cell);

-            new NieghborhoodInitializer(field, cell).Initialize();
+            new NeighborhoodInitializer(field, cell).Initialize();
         }

         private static Cell CreateCell(bool cellState)