[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n!Source/SightPlayer.Omr.Test/x64/*.dll\n!Source/SightPlayer.Omr.Test/x64/*.exe\n!Source/SightPlayer.Omr.Test/x86/*.exe\n!Source/SightPlayer.Omr.Test/x86/*.dll\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbuild/\nbld/\n[Bb]in/\n[Oo]bj/\n\n# Visual Studo 2015 cache/options directory\n.vs/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding addin-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings \n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n\n# Windows Azure Build Output\ncsx/\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\n*Resource.Designer.cs\n*.[Cc]ache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\nbower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Xamarin Components (will be restored like nuget packages)\nComponents"
  },
  {
    "path": "CONTRIBUTORS.md",
    "content": "Special thanks to the contributors\n\n- [Steve Hansen](https://github.com/beefo)\n- [Eric Domke](https://github.com/erdomke)\n- [Jonas Nyrup](https://github.com/jnyrup)"
  },
  {
    "path": "IntervalTree/IIntervalTree.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace IntervalTree\n{\n    /// <summary>\n    /// The standard interval tree implementation. Keeps a root node and forwards all queries to it.\n    /// Whenever new items are added or items are removed, the tree goes temporarily \"out of sync\", which means that the\n    /// internal index is not updated immediately, but upon the next query operation.    \n    /// </summary>\n    /// <typeparam name=\"TKey\">The type of the range.</typeparam>\n    /// <typeparam name=\"TValue\">The type of the data items.</typeparam>\n    public interface IIntervalTree<TKey, TValue> : IEnumerable<RangeValuePair<TKey, TValue>>\n    {\n        /// <summary>\n        /// Returns all items contained in the tree.\n        /// </summary>\n        IEnumerable<TValue> Values { get; }\n\n        /// <summary>\n        /// Gets the number of elements contained in the tree.\n        /// </summary>\n        int Count { get; }\n\n        /// <summary>\n        /// Performs a point query with a single value. All items with overlapping ranges are returned.\n        /// </summary>\n        IEnumerable<TValue> Query(TKey value);\n\n        /// <summary>\n        /// Performs a range query. All items with overlapping ranges are returned.\n        /// </summary>\n        IEnumerable<TValue> Query(TKey from, TKey to);\n\n        /// <summary>\n        /// Adds the specified item.\n        /// </summary>\n        void Add(TKey from, TKey to, TValue value);\n\n        /// <summary>\n        /// Removes the specified item.\n        /// </summary>\n        void Remove(TValue item);\n\n        /// <summary>\n        /// Removes the specified items.\n        /// </summary>\n        void Remove(IEnumerable<TValue> items);\n\n        /// <summary>\n        /// Removes all elements from the range tree.\n        /// </summary>\n        void Clear();\n    }\n}"
  },
  {
    "path": "IntervalTree/IntervalTree.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace IntervalTree\n{\n    public class IntervalTree<TKey, TValue> : IIntervalTree<TKey, TValue>\n    {\n        private IntervalTreeNode<TKey, TValue> root;\n        private List<RangeValuePair<TKey, TValue>> items;\n        private readonly IComparer<TKey> comparer;\n        private bool isInSync;\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\n        public TKey Max\n        {\n            get\n            {\n                if (!isInSync)\n                    Rebuild();\n\n                return root.Max;\n            }\n        }\n\n        public TKey Min\n        {\n            get\n            {\n                if (!isInSync)\n                    Rebuild();\n\n                return root.Min;\n            }\n        }\n\n        public IEnumerable<TValue> Values => items.Select(i => i.Value);\n\n        public int Count => items.Count;\n\n        /// <summary>\n        /// Initializes an empty tree.\n        /// </summary>\n        public IntervalTree() : this(Comparer<TKey>.Default) { }\n\n        /// <summary>\n        /// Initializes an empty tree.\n        /// </summary>\n        public IntervalTree(IComparer<TKey> comparer)\n        {\n            this.comparer = comparer ?? Comparer<TKey>.Default;\n            isInSync = true;\n            root = new IntervalTreeNode<TKey, TValue>(this.comparer);\n            items = new List<RangeValuePair<TKey, TValue>>();\n        }\n\n        public IEnumerable<TValue> Query(TKey value)\n        {\n            if (!isInSync)\n                Rebuild();\n\n            return root.Query(value);\n        }\n\n        public IEnumerable<TValue> Query(TKey from, TKey to)\n        {\n            if (!isInSync)\n                Rebuild();\n\n            return root.Query(from, to);\n        }\n\n        public void Add(TKey from, TKey to, TValue value)\n        {\n            if (comparer.Compare(from, to) > 0)\n                throw new ArgumentOutOfRangeException($\"{nameof(from)} cannot be larger than {nameof(to)}\");\n\n            isInSync = false;\n            items.Add(new RangeValuePair<TKey, TValue>(from, to, value));\n        }\n\n        public void Remove(TValue value)\n        {\n            isInSync = false;\n            items = items.Where(l => !l.Value.Equals(value)).ToList();\n        }\n\n        public void Remove(IEnumerable<TValue> items)\n        {\n            isInSync = false;\n            this.items = this.items.Where(l => !items.Contains(l.Value)).ToList();\n        }\n\n        public void Clear()\n        {\n            root = new IntervalTreeNode<TKey, TValue>(comparer);\n            items = new List<RangeValuePair<TKey, TValue>>();\n            isInSync = true;\n        }\n\n        public IEnumerator<RangeValuePair<TKey, TValue>> GetEnumerator()\n        {\n            if (!isInSync)\n                Rebuild();\n\n            return items.GetEnumerator();\n        }\n\n        private void Rebuild()\n        {\n            if (isInSync)\n                return;\n\n            if (items.Count > 0)\n                root = new IntervalTreeNode<TKey, TValue>(items, comparer);\n            else\n                root = new IntervalTreeNode<TKey, TValue>(comparer);\n            isInSync = true;\n        }\n    }\n}"
  },
  {
    "path": "IntervalTree/IntervalTree.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard1.2;netstandard2.0;net45</TargetFrameworks>\n    <PackageVersion>3.0.1</PackageVersion>\n  </PropertyGroup>\n  \n  <PropertyGroup>\n    <title>IntervalTree</title>\n    <Description>A generic implementation of a centered interval tree in C#. \nIn computer science, an interval tree is an ordered tree data structure to hold intervals. Specifically, it allows one to efficiently find all intervals that overlap with any given interval or point. It is often used for windowing queries, for instance, to find all roads on a computerized map inside a rectangular viewport, or to find all visible elements inside a three-dimensional scene.</Description>\n    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>\n    <PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>\n    <Copyright>Copyright (c) 2020, Matthias Buchetics and Alexander Pacha</Copyright>\n    <PackageLicenseUrl></PackageLicenseUrl>\n    <PackageProjectUrl>https://github.com/mbuchetics/RangeTree</PackageProjectUrl>\n    <RepositoryUrl>https://github.com/mbuchetics/RangeTree.git</RepositoryUrl>\n    <RepositoryType>git</RepositoryType>\n    <PackageTags>range, tree, interval</PackageTags>\n    <Version>3.0.1</Version>\n    <PackageId>RangeTree</PackageId>\n    <Authors>Matthias Buchetics, Alexander Pacha and others, see CONTRIBUTORS.md</Authors>\n    <Product>IntervalTree  - A generic interval tree implementation in C#</Product>\n    <PackageReleaseNotes>This version contains a bug-fix for elements that have overlapping intervals. \nThanks to @nordic81.\n\nFor a full list changes at https://github.com/mbuchetics/RangeTree/releases</PackageReleaseNotes>\n    <AssemblyVersion>3.0.1</AssemblyVersion>\n    <FileVersion>3.0.1</FileVersion>\n    <Company>Matthias Buchetics, Alexander Pacha</Company>\n  </PropertyGroup>\n  \n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <CodeAnalysisRuleSet>$(SolutionDir)\\rangetree.ruleset</CodeAnalysisRuleSet>\n    <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|netstandard1.2|AnyCPU'\">\n    <WarningLevel>3</WarningLevel>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\LICENSE.txt\">\n      <Pack>True</Pack>\n      <PackagePath></PackagePath>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "IntervalTree/IntervalTreeNode.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace IntervalTree\n{\n    /// <summary>\n    ///     A node of the range tree. Given a list of items, it builds\n    ///     its subtree. Also contains methods to query the subtree.\n    ///     Basically, all interval tree logic is here.\n    /// </summary>\n    internal class IntervalTreeNode<TKey, TValue> : IComparer<RangeValuePair<TKey, TValue>>\n    {\n        private readonly TKey center;\n\n        private readonly IComparer<TKey> comparer;\n        private readonly RangeValuePair<TKey, TValue>[] items;\n        private readonly IntervalTreeNode<TKey, TValue> leftNode;\n        private readonly IntervalTreeNode<TKey, TValue> rightNode;\n\n        /// <summary>\n        ///     Initializes an empty node.\n        /// </summary>\n        /// <param name=\"comparer\">The comparer used to compare two items.</param>\n        public IntervalTreeNode(IComparer<TKey> comparer)\n        {\n            this.comparer = comparer ?? Comparer<TKey>.Default;\n\n            center = default;\n            leftNode = null;\n            rightNode = null;\n            items = null;\n        }\n\n        /// <summary>\n        ///     Initializes a node with a list of items, builds the sub tree.\n        /// </summary>\n        /// <param name=\"items\">The items that should be added to this node</param>\n        /// <param name=\"comparer\">The comparer used to compare two items.</param>\n        public IntervalTreeNode(IList<RangeValuePair<TKey, TValue>> items, IComparer<TKey> comparer)\n        {\n            this.comparer = comparer ?? Comparer<TKey>.Default;\n\n            // first, find the median\n            var endPoints = new List<TKey>(items.Count * 2);\n            foreach (var item in items)\n            {\n                endPoints.Add(item.From);\n                endPoints.Add(item.To);\n            }\n\n            endPoints.Sort(this.comparer);\n\n            // the median is used as center value\n            if (endPoints.Count > 0)\n            {\n                Min = endPoints[0];\n                center = endPoints[endPoints.Count / 2];\n                Max = endPoints[endPoints.Count - 1];\n            }\n\n            var inner = new List<RangeValuePair<TKey, TValue>>();\n            var left = new List<RangeValuePair<TKey, TValue>>();\n            var right = new List<RangeValuePair<TKey, TValue>>();\n\n            // iterate over all items\n            // if the range of an item is completely left of the center, add it to the left items\n            // if it is on the right of the center, add it to the right items\n            // otherwise (range overlaps the center), add the item to this node's items\n            foreach (var o in items)\n                if (this.comparer.Compare(o.To, center) < 0)\n                    left.Add(o);\n                else if (this.comparer.Compare(o.From, center) > 0)\n                    right.Add(o);\n                else\n                    inner.Add(o);\n\n            // sort the items, this way the query is faster later on\n            if (inner.Count > 0)\n            {\n                if (inner.Count > 1)\n                    inner.Sort(this);\n                this.items = inner.ToArray();\n            }\n            else\n            {\n                this.items = null;\n            }\n\n            // create left and right nodes, if there are any items\n            if (left.Count > 0)\n                leftNode = new IntervalTreeNode<TKey, TValue>(left, this.comparer);\n            if (right.Count > 0)\n                rightNode = new IntervalTreeNode<TKey, TValue>(right, this.comparer);\n        }\n\n        public TKey Max { get; }\n\n        public TKey Min { get; }\n\n        /// <summary>\n        ///     Returns less than 0 if this range's From is less than the other, greater than 0 if greater.\n        ///     If both are equal, the comparison of the To values is returned.\n        ///     0 if both ranges are equal.\n        /// </summary>\n        /// <param name=\"x\">The first item.</param>\n        /// <param name=\"y\">The other item.</param>\n        /// <returns></returns>\n        int IComparer<RangeValuePair<TKey, TValue>>.Compare(RangeValuePair<TKey, TValue> x,\n            RangeValuePair<TKey, TValue> y)\n        {\n            var fromComp = comparer.Compare(x.From, y.From);\n            if (fromComp == 0)\n                return comparer.Compare(x.To, y.To);\n            return fromComp;\n        }\n\n        /// <summary>\n        ///     Performs a point query with a single value.\n        ///     All items with overlapping ranges are returned.\n        /// </summary>\n        public IEnumerable<TValue> Query(TKey value)\n        {\n            var results = new List<TValue>();\n\n            // If the node has items, check for leaves containing the value.\n            if (items != null)\n                foreach (var o in items)\n                    if (comparer.Compare(o.From, value) > 0)\n                        break;\n                    else if (comparer.Compare(value, o.From) >= 0 && comparer.Compare(value, o.To) <= 0)\n                        results.Add(o.Value);\n\n            // go to the left or go to the right of the tree, depending\n            // where the query value lies compared to the center\n            var centerComp = comparer.Compare(value, center);\n            if (leftNode != null && centerComp < 0)\n                results.AddRange(leftNode.Query(value));\n            else if (rightNode != null && centerComp > 0)\n                results.AddRange(rightNode.Query(value));\n\n            return results;\n        }\n\n        /// <summary>\n        ///     Performs a range query.\n        ///     All items with overlapping ranges are returned.\n        /// </summary>\n        public IEnumerable<TValue> Query(TKey from, TKey to)\n        {\n            var results = new List<TValue>();\n\n            // If the node has items, check for leaves intersecting the range.\n            if (items != null)\n                foreach (var o in items)\n                    if (comparer.Compare(o.From, to) > 0)\n                        break;\n                    else if (comparer.Compare(to, o.From) >= 0 && comparer.Compare(from, o.To) <= 0)\n                        results.Add(o.Value);\n\n            // go to the left or go to the right of the tree, depending\n            // where the query value lies compared to the center\n            if (leftNode != null && comparer.Compare(from, center) < 0)\n                results.AddRange(leftNode.Query(from, to));\n            if (rightNode != null && comparer.Compare(to, center) > 0)\n                results.AddRange(rightNode.Query(from, to));\n\n            return results;\n        }\n    }\n}"
  },
  {
    "path": "IntervalTree/RangeValuePair.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace IntervalTree\n{\n    /// <summary>\n    /// Represents a range of values.\n    /// Both values must be of the same type and comparable.\n    /// </summary>\n    /// <typeparam name=\"TKey\">Type of the values.</typeparam>\n    public readonly struct RangeValuePair<TKey, TValue> : IEquatable<RangeValuePair<TKey, TValue>>\n    {\n        public TKey From { get; }\n        public TKey To { get; }\n        public TValue Value { get; }\n\n        /// <summary>\n        /// Initializes a new <see cref=\"RangeValuePair&lt;TKey, TValue&gt;\"/> instance.\n        /// </summary>\n        public RangeValuePair(TKey from, TKey to, TValue value) : this()\n        {\n            From = from;\n            To = to;\n            Value = value;\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString()\n        {\n            return string.Format(\"[{0} - {1}] {2}\", From, To, Value);\n        }\n\n        public override int GetHashCode()\n        {\n            var hash = 23;\n            if (From != null)\n                hash = hash * 37 + From.GetHashCode();\n            if (To != null)\n                hash = hash * 37 + To.GetHashCode();\n            if (Value != null)\n                hash = hash * 37 + Value.GetHashCode();\n            return hash;\n        }\n\n        public bool Equals(RangeValuePair<TKey, TValue> other)\n        {\n            return EqualityComparer<TKey>.Default.Equals(From, other.From)\n                   && EqualityComparer<TKey>.Default.Equals(To, other.To)\n                   && EqualityComparer<TValue>.Default.Equals(Value, other.Value);\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (!(obj is RangeValuePair<TKey, TValue>))\n                return false;\n\n            return Equals((RangeValuePair<TKey, TValue>)obj);\n        }\n\n        public static bool operator ==(RangeValuePair<TKey, TValue> left, RangeValuePair<TKey, TValue> right)\n        {\n            return left.Equals(right);\n        }\n\n        public static bool operator !=(RangeValuePair<TKey, TValue> left, RangeValuePair<TKey, TValue> right)\n        {\n            return !(left == right);\n        }\n    }\n}"
  },
  {
    "path": "IntervalTree.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30011.22\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IntervalTree\", \"IntervalTree\\IntervalTree.csproj\", \"{A12CFD40-6EA9-459A-84AD-2DF944E332CE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IntervalTreeExamples\", \"IntervalTreeExamples\\IntervalTreeExamples.csproj\", \"{A2ECC374-8BB1-4B8C-AF67-062595E6FBDB}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IntervalTreeTests\", \"IntervalTreeTests\\IntervalTreeTests.csproj\", \"{087BD1DE-623A-4C8B-A41B-E99938EC9296}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A12CFD40-6EA9-459A-84AD-2DF944E332CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A12CFD40-6EA9-459A-84AD-2DF944E332CE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A12CFD40-6EA9-459A-84AD-2DF944E332CE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A12CFD40-6EA9-459A-84AD-2DF944E332CE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A2ECC374-8BB1-4B8C-AF67-062595E6FBDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A2ECC374-8BB1-4B8C-AF67-062595E6FBDB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A2ECC374-8BB1-4B8C-AF67-062595E6FBDB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A2ECC374-8BB1-4B8C-AF67-062595E6FBDB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{087BD1DE-623A-4C8B-A41B-E99938EC9296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{087BD1DE-623A-4C8B-A41B-E99938EC9296}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{087BD1DE-623A-4C8B-A41B-E99938EC9296}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{087BD1DE-623A-4C8B-A41B-E99938EC9296}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {ECFD1131-4EBD-489E-81BE-550DBF8805EF}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "IntervalTreeExamples/IntervalTreeExamples.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard1.6</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.118\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\IntervalTree\\IntervalTree.csproj\" />\n  </ItemGroup>\n\n  <PropertyGroup>\n    <CodeAnalysisRuleSet>$(SolutionDir)\\rangetree.ruleset</CodeAnalysisRuleSet>\n    <ApplicationIcon />\n    <OutputType>Exe</OutputType>\n    <StartupObject />\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DocumentationFile>bin\\Release\\netstandard1.3\\RangeTree.Examples.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DocumentationFile>bin\\Debug\\netstandard1.3\\RangeTree.Examples.xml</DocumentationFile>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "IntervalTreeExamples/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing IntervalTree;\n\nnamespace IntervalTreeExamples\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            TreeExample1();\n            TreeExample2();\n            Console.WriteLine(\"Press any key to continue...\");\n            Console.ReadKey();\n        }\n\n        static void TreeExample1()\n        {\n            Console.WriteLine(\"Example 1\");\n\n            var tree = new IntervalTree<int, string>()\n            {\n                { 0, 10, \"1\" },\n                { 20, 30, \"2\" },\n                { 15, 17, \"3\" },\n                { 25, 35, \"4\" },\n            };\n\n            PrintQueryResult(\"query 1\", tree.Query(5));\n            PrintQueryResult(\"query 2\", tree.Query(10));\n            PrintQueryResult(\"query 3\", tree.Query(29));\n            PrintQueryResult(\"query 4\", tree.Query(5, 15));\n\n            Console.WriteLine();\n        }\n\n        static void TreeExample2()\n        {\n            Console.WriteLine(\"Example 2\");\n\n            var tree = new IntervalTree<int, string>();\n            var stopwatch = new Stopwatch();\n            stopwatch.Start();\n\n            for (int i = 0; i < 100; i++)\n            {\n                for (int j = 0; j < 100; j++)\n                {\n                    RandomTreeInsert(tree, 1000);\n                }\n\n                var resultCount = tree.Query(50, 60).Count();\n                Console.WriteLine(\"query: {0} results (tree count: {1})\", resultCount, tree.Count);\n            }\n\n            stopwatch.Stop();\n            Console.WriteLine(\"elapsed time: {0}\", stopwatch.Elapsed);\n        }\n\n        static Random random = new Random();\n\n        static void RandomTreeInsert(IIntervalTree<int, string> tree, int limit)\n        {\n            var a = random.Next(limit);\n            var b = random.Next(limit);\n\n            tree.Add(Math.Min(a, b), Math.Max(a, b), \"value\");\n        }\n\n        static void PrintQueryResult(string queryTitle, IEnumerable<string> result)\n        {\n            Console.WriteLine(queryTitle);\n            foreach (var item in result)\n            {\n                Console.WriteLine(item);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "IntervalTreeTests/ComparerTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing IntervalTree;\nusing NUnit.Framework;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    public class ComparerTests\n    {\n        [Test]\n        public void AddingAnItem_FromIsLargerThanTo_ShouldThrowException()\n        {\n            var comparer = Comparer<int>.Create((x, y) => x - y);\n            var tree = new IntervalTree<int, string>(comparer);\n\n            Assert.That(() => tree.Add(2, 0, \"FOO\"), Throws.InstanceOf<ArgumentOutOfRangeException>());\n        }\n\n        [Test]\n        public void CreatingTreeWithNullComparer_AddingAnItem_ShouldNotThrowException()\n        {\n            var tree = new IntervalTree<int, string>(null);\n\n            Assert.That(() => tree.Add(0, 1, \"FOO\"), Throws.Nothing);\n        }\n    }\n}\n"
  },
  {
    "path": "IntervalTreeTests/IntervalTreeTests.cs",
    "content": "﻿using NUnit.Framework;\nusing IntervalTree;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    public class IntervalTreeTests\n    {\n        [Test]\n        public void GettingMin_InnerItems()\n        {\n            var tree = new IntervalTree<int, int>\n            {\n                { 1, 5, -1 },\n                { 2, 5, -1 },\n                { 3, 5, -1 },\n            };\n\n            var min = tree.Min;\n\n            Assert.That(min, Is.EqualTo(1));\n        }\n\n        [Test]\n        public void GettingMin_LeftRecurse()\n        {\n            var tree = new IntervalTree<int, int>\n            {\n                { 1, 2, -1 },\n                { 3, 4, -1 }\n            };\n\n            var min = tree.Min;\n\n            Assert.That(min, Is.EqualTo(1));\n        }\n\n        [Test]\n        public void GettingMax_InnerItems()\n        {\n            var tree = new IntervalTree<int, int>\n            {\n                { 1, 2, -1 },\n                { 1, 3, -1 },\n                { 1, 4, -1 },\n            };\n\n            var max = tree.Max;\n\n            Assert.That(max, Is.EqualTo(4));\n        }\n\n        [Test]\n        public void GettingMax_RightRecurse()\n        {\n            var tree = new IntervalTree<int, int>\n            {\n                { 1, 2, -1 },\n                { 3, 4, -1 },\n                { 5, 6, -1 }\n            };\n\n            var max = tree.Max;\n\n            Assert.That(max, Is.EqualTo(6));\n        }\n\n        [Test]\n        public void GettingMin_Mixed()\n        {\n            var tree = new IntervalTree<int, int>\n            {\n                { 2, 3, -1 },\n                { 8, 9, -1 },\n                { 1, 10, -1 },\n            };\n\n            var min = tree.Min;\n\n            Assert.That(min, Is.EqualTo(1));\n        }\n        \n        [Test]\n        public void GettingMax_Mixed()\n        {\n            var tree = new IntervalTree<int, int>\n            {\n                { 1, 10, -1 },\n                { 2, 3, -1 },\n                { 4, 5, -1 },\n                { 8, 9, -1 },\n            };\n\n            var max = tree.Max;\n\n            Assert.That(max, Is.EqualTo(10));\n        }\n    }\n}\n"
  },
  {
    "path": "IntervalTreeTests/IntervalTreeTests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>    \n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.6.1\" />\n    <PackageReference Include=\"NUnit\" Version=\"3.12.0\" />\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"3.16.1\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\IntervalTree\\IntervalTree.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.118\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <PropertyGroup>\n    <CodeAnalysisRuleSet>$(SolutionDir)\\rangetree.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DocumentationFile>bin\\Release\\netcoreapp1.1\\.xml</DocumentationFile>\n    <WarningLevel>3</WarningLevel>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DocumentationFile>bin\\Debug\\netcoreapp1.1\\.xml</DocumentationFile>\n    <WarningLevel>3</WarningLevel>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "IntervalTreeTests/MultipleComparerTests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing NUnit.Framework;\nusing IntervalTree;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    public class MultipleComparerTests\n    {\n        [Test]\n        public void CreateTwoTrees_ProvideDifferentComparers_ExpectBothToHaveTheComparersFromConstruction()\n        {\n            var tree = new IntervalTree<string, string>(StringComparer.Ordinal)\n            {\n                { \"a\", \"e\", \"value1\" },\n                { \"B\", \"D\", \"value2\" },\n            };\n            var results = tree.Query(\"c\").ToArray();\n            Assert.That(results.Length, Is.EqualTo(1));\n            Assert.That(results[0], Is.EqualTo(\"value1\"));\n\n            tree = new IntervalTree<string, string>(StringComparer.OrdinalIgnoreCase)\n            {\n                { \"a\", \"e\", \"value1\" },\n                { \"B\", \"D\", \"value2\" },\n            };\n            results = tree.Query(\"c\").ToArray();\n            Assert.That(results.Length, Is.EqualTo(2));\n            Assert.That(results[0], Is.EqualTo(\"value1\"));\n            Assert.That(results[1], Is.EqualTo(\"value2\"));\n        }\n    }\n}\n"
  },
  {
    "path": "IntervalTreeTests/ReadmeExampleTests.cs",
    "content": "﻿using System.Linq;\nusing NUnit.Framework;\nusing IntervalTree;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    public class ReadmeExampleTests\n    {\n        [Test]\n        public void Query_CreateTreeAndExecuteQuery_ExpectCorrectElementsToBeReturned()\n        {\n            var tree = new IntervalTree<int, string>()\n            {\n                { 0, 10, \"1\" },\n                { 20, 30, \"2\" },\n                { 15, 17, \"3\" },\n                { 25, 35, \"4\" },\n            };\n\n            var results1 = tree.Query(5).ToArray();\n            Assert.That(results1.Count, Is.EqualTo(1));\n            Assert.That(results1[0], Is.EqualTo(\"1\"));\n\n            var results2 = tree.Query(10).ToArray();\n            Assert.That(results2.Count, Is.EqualTo(1));\n            Assert.That(results2[0], Is.EqualTo(\"1\"));\n\n            var results3 = tree.Query(29).ToArray();\n            Assert.That(results3.Count, Is.EqualTo(2));\n            Assert.That(results3[0], Is.EqualTo(\"2\"));\n            Assert.That(results3[1], Is.EqualTo(\"4\"));\n\n            var results4 = tree.Query(5, 15).ToArray();\n            Assert.That(results4.Count, Is.EqualTo(2));\n            Assert.That(results4[0], Is.EqualTo(\"3\"));\n            Assert.That(results4[1], Is.EqualTo(\"1\"));\n        }\n    }\n}\n"
  },
  {
    "path": "IntervalTreeTests/TreeOfDateTimeTests.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing NUnit.Framework;\nusing IntervalTree;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    internal class TreeOfDateTimeTests\n    {\n        private static readonly DateTime ZERO = new DateTime(2001, 01, 01, 10, 00, 00);\n\n        [Test]\n        public void BuildEmptyIntervalTree()\n        {\n            var emptyTree = new IntervalTree<DateTime, int>();\n            Assert.Pass();\n        }\n\n        [Test]\n        public void CreateEmptyIntervalTree()\n        {\n            var emptyTree = new IntervalTree<DateTime, int>();\n            Assert.That(emptyTree, Is.Not.Null);\n        }\n\n        [Test]\n        public void GetIntervalByExactEndTime()\n        {\n            var tree = new IntervalTree<DateTime, int>();\n            tree.Add(ZERO, ZERO.AddHours(1), 100);\n\n            var result = tree.Query(ZERO.AddHours(1)).ToList();\n            Assert.That(result.Count, Is.EqualTo(1));\n        }\n\n        [Test]\n        public void GetIntervalByExactStartTime()\n        {\n            var tree = new IntervalTree<DateTime, int>();\n            tree.Add(ZERO, ZERO.AddHours(1), 100);\n\n            var result = tree.Query(ZERO).ToList();\n            Assert.That(result.Count, Is.EqualTo(1));\n        }\n\n        /// <summary>\n        ///     0-----5-----10------15--------20\n        ///     |=====100====|\n        ///     |==200=|\n        ///     |====300==========|\n        /// </summary>\n        [Test]\n        public void OverlapOnExactEndAndStart_AssertCount()\n        {\n            var tree = new IntervalTree<DateTime, int>();\n            tree.Add(ZERO, ZERO.AddHours(10), 100);\n            tree.Add(ZERO.AddHours(10), ZERO.AddHours(15), 200);\n            tree.Add(ZERO.AddHours(10), ZERO.AddHours(20), 200);\n\n            var result = tree.Query(ZERO.AddHours(10)).ToList();\n            Assert.That(result.Count, Is.EqualTo(3));\n        }\n\n        [Test]\n        public void TestSeparateIntervals()\n        {\n            var tree = new IntervalTree<DateTime, int>();\n            tree.Add(ZERO, ZERO.AddHours(10), 100);\n            tree.Add(ZERO.AddHours(20), ZERO.AddHours(30), 200);\n\n            var result = tree.Query(ZERO.AddHours(5)).ToList();\n            Assert.That(result.Count, Is.EqualTo(1));\n            Assert.That(result[0], Is.EqualTo(100));\n        }\n\n        [Test]\n        public void TwoIntersectingIntervals()\n        {\n            var tree = new IntervalTree<DateTime, int>();\n            tree.Add(ZERO, ZERO.AddHours(10), 100);\n            tree.Add(ZERO.AddHours(3), ZERO.AddHours(30), 200);\n\n            var result = tree.Query(ZERO.AddHours(5)).ToList();\n            Assert.That(result.Count, Is.EqualTo(2));\n            Assert.That(result[0], Is.EqualTo(100));\n            Assert.That(result[1], Is.EqualTo(200));\n        }\n    }\n}"
  },
  {
    "path": "IntervalTreeTests/TreeOfIntTests.cs",
    "content": "﻿using System.Linq;\nusing NUnit.Framework;\nusing IntervalTree;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    internal class TreeOfIntTests\n    {\n        [Test]\n        public void BuildEmptyIntervalTree()\n        {\n            var emptyTree = new IntervalTree<int, int>();\n            Assert.Pass();\n        }\n\n        [Test]\n        public void CreateEmptyIntervalTree()\n        {\n            var emptyTree = new IntervalTree<int, int>();\n            Assert.That(emptyTree, Is.Not.Null);\n        }\n\n        [Test]\n        public void TestSeparateIntervals()\n        {\n            var tree = new IntervalTree<int, int>();\n            tree.Add(0, 10, 100);\n            tree.Add(20, 30, 200);\n\n            var result = tree.Query(5).ToList();\n            Assert.That(result.Count, Is.EqualTo(1));\n            Assert.That(result[0], Is.EqualTo(100));\n        }\n\n        [Test]\n        public void TwoIntersectingIntervals()\n        {\n            var tree = new IntervalTree<int, int>();\n            tree.Add(0, 10, 100);\n            tree.Add(3, 30, 200);\n\n            var result = tree.Query(5).ToList();\n            Assert.That(result.Count, Is.EqualTo(2));\n            Assert.That(result[0], Is.EqualTo(100));\n            Assert.That(result[1], Is.EqualTo(200));\n        }\n\n        [Test]\n        public void QueryOutOfSyncTree_ExpectObsoleteResults()\n        {\n            var tree = new IntervalTree<int, int>();\n            tree.Add(0, 10, 100);\n\n            var result = tree.Query(5).ToList();\n            Assert.That(result.Count, Is.EqualTo(1));\n\n            tree.Add(3, 30, 200);\n\n            result = tree.Query(5).ToList();\n            Assert.That(result.Count, Is.EqualTo(2));\n        }\n    }\n}"
  },
  {
    "path": "IntervalTreeTests/TreeSpecs.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing NUnit.Framework;\nusing IntervalTree;\n\nnamespace IntervalTreeTests\n{\n    [TestFixture]\n    public class If_the_user_searches_for_overlapping_entries_in_an_interval_tree : Spec\n    {\n        private static IEnumerable<Tuple<int, int>> TestEntries()\n        {\n            yield return Tuple.Create(1400, 1500);\n            yield return Tuple.Create(0100, 0130);\n            yield return Tuple.Create(1700, 1800);\n            yield return Tuple.Create(0230, 0240);\n            yield return Tuple.Create(0530, 0540);\n            yield return Tuple.Create(2330, 2400);\n            yield return Tuple.Create(0700, 0800);\n            yield return Tuple.Create(0900, 1000);\n            yield return Tuple.Create(0000, 0100);\n            yield return Tuple.Create(0540, 0700);\n            yield return Tuple.Create(1800, 2130);\n            yield return Tuple.Create(2130, 2131);\n            yield return Tuple.Create(0200, 0230);\n        }\n\n        private static IEnumerable TestCases\n        {\n            get\n            {\n                yield return new TestCaseData(Tuple.Create(2000, 2300)).Returns(2);\n                yield return new TestCaseData(Tuple.Create(0000, 0100)).Returns(2);\n                yield return new TestCaseData(Tuple.Create(0000, 0000)).Returns(1);\n                yield return new TestCaseData(Tuple.Create(0100, 0100)).Returns(2);\n                yield return new TestCaseData(Tuple.Create(1000, 1100)).Returns(1);\n                yield return new TestCaseData(Tuple.Create(1030, 1400)).Returns(1);\n                yield return new TestCaseData(Tuple.Create(0150, 0155)).Returns(0);\n                yield return new TestCaseData(Tuple.Create(2132, 2133)).Returns(0);\n                yield return new TestCaseData(Tuple.Create(1030, 1350)).Returns(0);\n                yield return new TestCaseData(Tuple.Create(0000, 2359)).Returns(13);\n            }\n        }\n\n        [Test]\n        [TestCaseSource(\"TestCases\")]\n        public int CorrectQuery_BuiltInOrder(Tuple<int, int> value)\n        {\n            var tree = CreateTree(TestEntries().OrderBy(interval => interval.Item1));\n            return tree\n                .Query(value.Item1, value.Item2)\n                .Count();\n        }\n\n        [Test]\n        [TestCaseSource(\"TestCases\")]\n        public int CorrectQuery_BuiltInReverseOrder(Tuple<int, int> value)\n        {\n            var tree = CreateTree(TestEntries().OrderBy(interval => interval.Item1).Reverse());\n            return tree\n                .Query(value.Item1, value.Item2)\n                .Count();\n        }\n\n        [Test]\n        [TestCaseSource(\"TestCases\")]\n        public int CorrectQuery_BuiltRandomly(Tuple<int, int> value)\n        {\n            var tree = CreateTree(TestEntries());\n            return tree\n                .Query(value.Item1, value.Item2)\n                .Count();\n        }\n\n        private static IIntervalTree<int, string> CreateTree(IEnumerable<Tuple<int, int>> entries)\n        {\n            var tree = new IntervalTree<int, string>();\n\n            foreach (var interval in entries)\n            {\n                tree.Add(interval.Item1, interval.Item2, \"value\");\n            }\n\n            return tree;\n        }\n    }\n\n    /// <summary>\n    /// Abstract helper class to make nunit tests more readable.\n    /// </summary>\n    [DebuggerStepThrough]\n    [DebuggerNonUserCode]\n    public class Spec\n    {\n        [DebuggerStepThrough]\n        [OneTimeSetUp]\n        public void SetUp()\n        {\n            EstablishContext();\n            BecauseOf();\n        }\n\n        [DebuggerStepThrough]\n        [OneTimeTearDown]\n        public void TearDown()\n        {\n            Cleanup();\n        }\n\n        /// <summary>\n        /// Test setup. Place your initialization code here.\n        /// </summary>\n        [DebuggerStepThrough]\n        protected virtual void EstablishContext() { }\n\n        /// <summary>\n        /// Test run. Place the tested method / action here.\n        /// </summary>\n        [DebuggerStepThrough]\n        protected virtual void BecauseOf() { }\n\n        /// <summary>\n        /// Test clean. Close/delete files, close database connections ..\n        /// </summary>\n        [DebuggerStepThrough]\n        protected virtual void Cleanup() { }\n\n        /// <summary>\n        /// Creates an Action delegate.\n        /// </summary>\n        /// <param name=\"func\">Method the shall be created as delegate.</param>\n        /// <returns>A delegate of type <see cref=\"Action\"/></returns>\n        protected Action Invoking(Action func)\n        {\n            return func;\n        }\n    }\n}\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "If not noted otherwise in the file header, the project uses the MIT license.\n\nCopyright (c) 2020, Matthias Buchetics and Alexander Pacha.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# IntervalTree #\n\n[![Build status](https://ci.appveyor.com/api/projects/status/t8xvh5oquuvk17ks?svg=true)](https://ci.appveyor.com/project/apacha/rangetree)\n[![NuGet version](https://img.shields.io/nuget/v/RangeTree.svg?style=flat-square)](https://www.nuget.org/packages/RangeTree)\n\n## A generic interval tree ##\n\nA generic implementation of a centered interval tree in C#. \n\nFrom [Wikipedia](http://en.wikipedia.org/wiki/Interval_tree):\n> In computer science, an interval tree is an ordered tree data structure to hold intervals. Specifically, it allows one to efficiently find all intervals that overlap with any given interval or point. It is often used for windowing queries, for instance, to find all roads on a computerized map inside a rectangular viewport, or to find all visible elements inside a three-dimensional scene.\n\nBased on the Java implementation found here: http://www.sanfoundry.com/java-program-implement-interval-tree/\n\nQueries require `O(log n + m)` time, with `n` being the total number of intervals and `m` being the number of reported results. Construction requires `O(n log n)` time, and storage requires `O(n)` space.\n\n### Requirements ###\n- Consuming this NuGet package requires .NET Framework >= 4.5 or .NET Standard >= 1.2\n- Developing this project requires Visual Studio 2017 with .NET Framework >= 4.5 and .NET Standard >= 2.0.\n\n## Simple Interface ###\n\n```csharp\npublic interface IIntervalTree<TKey, TValue> \n    : IEnumerable<RangeValuePair<TKey, TValue>>\n{\n    IEnumerable<TValue> Values { get; }\n    int Count { get; }\n\n    IEnumerable<TValue> Query(TKey value);\n    IEnumerable<TValue> Query(TKey from, TKey to);\n\n    void Add(TKey from, TKey to, TValue value);\n    void Remove(TValue item);\n    void Remove(IEnumerable<TValue> items);\n    void Clear();\n}\n```\n    \n## Usage ###\n\n```csharp\nvar tree = new IntervalTree<int, string>()\n{\n    { 0, 10, \"1\" },\n    { 20, 30, \"2\" },\n    { 15, 17, \"3\" },\n    { 25, 35, \"4\" },\n};\n\n// Alternatively, use the Add method, for example:\n// tree.Add(0, 10, \"1\");\n\nvar results1 = tree.Query(5);     // 1 item: [0 - 10]\nvar results2 = tree.Query(10);    // 1 item: [0 - 10]\nvar results3 = tree.Query(29);    // 2 items: [20 - 30], [25 - 35]\nvar results4 = tree.Query(5, 15); // 2 items: [0 - 10], [15 - 17]\n```\n    \nThe solution file contains more examples and tests, that show how to use IntervalTree with other data types.\n    \n## Implementation Details ##\n\nIn this implementation, whenever you add or remove items from the tree, the tree goes \"out of sync\" internally, which means that the items are stored, but the tree-index is not updated yet. Upon the next query, the tree structure is automatically rebuild. Subsequent queries will use the cached index and be much faster. The creation of the tree-index requires `O(n log n)` time. Therefore, it is best suited for trees that do not change often or small trees, where the creation time is negligible.\n\n## RangeTree vs. IntervalTree ##\n\nThis project contains an IntervalTree (see [Issue #24](https://github.com/mbuchetics/RangeTree/issues/24)), but was incorrectly named RangeTree at the beginning. It was mostly renamed to IntervalTree in version 3.0.0. However, given that a large number of users are using this project, renaming the NuGet package and repository was not possible without breaking too much, so we settled with (just) renaming all occurences in the source code and documentation."
  },
  {
    "path": "rangetree.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"RangeTree\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. You should include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"15.0\">\n  <Rules AnalyzerId=\"CodeCracker.CSharp\" RuleNamespace=\"CodeCracker.CSharp\">\n    <Rule Id=\"CC0001\" Action=\"None\" />\n    <Rule Id=\"CC0091\" Action=\"None\" />\n    <Rule Id=\"CC0105\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.Analyzers.ManagedCodeAnalysis\" RuleNamespace=\"Microsoft.Rules.Managed\">\n    <Rule Id=\"CA1001\" Action=\"Warning\" />\n    <Rule Id=\"CA1002\" Action=\"Warning\" />\n    <Rule Id=\"CA1003\" Action=\"Warning\" />\n    <Rule Id=\"CA1004\" Action=\"Warning\" />\n    <Rule Id=\"CA1005\" Action=\"Warning\" />\n    <Rule Id=\"CA1006\" Action=\"Warning\" />\n    <Rule Id=\"CA1007\" Action=\"Warning\" />\n    <Rule Id=\"CA1008\" Action=\"Warning\" />\n    <Rule Id=\"CA1009\" Action=\"Warning\" />\n    <Rule Id=\"CA1010\" Action=\"Warning\" />\n    <Rule Id=\"CA1011\" Action=\"Warning\" />\n    <Rule Id=\"CA1012\" Action=\"Warning\" />\n    <Rule Id=\"CA1013\" Action=\"Warning\" />\n    <Rule Id=\"CA1014\" Action=\"Warning\" />\n    <Rule Id=\"CA1016\" Action=\"Warning\" />\n    <Rule Id=\"CA1017\" Action=\"Warning\" />\n    <Rule Id=\"CA1018\" Action=\"Warning\" />\n    <Rule Id=\"CA1019\" Action=\"Warning\" />\n    <Rule Id=\"CA1020\" Action=\"Warning\" />\n    <Rule Id=\"CA1021\" Action=\"Warning\" />\n    <Rule Id=\"CA1023\" Action=\"Warning\" />\n    <Rule Id=\"CA1024\" Action=\"Warning\" />\n    <Rule Id=\"CA1025\" Action=\"Warning\" />\n    <Rule Id=\"CA1026\" Action=\"Warning\" />\n    <Rule Id=\"CA1027\" Action=\"Warning\" />\n    <Rule Id=\"CA1028\" Action=\"Warning\" />\n    <Rule Id=\"CA1030\" Action=\"Warning\" />\n    <Rule Id=\"CA1031\" Action=\"Warning\" />\n    <Rule Id=\"CA1032\" Action=\"Warning\" />\n    <Rule Id=\"CA1033\" Action=\"Warning\" />\n    <Rule Id=\"CA1034\" Action=\"Warning\" />\n    <Rule Id=\"CA1035\" Action=\"Warning\" />\n    <Rule Id=\"CA1036\" Action=\"Warning\" />\n    <Rule Id=\"CA1038\" Action=\"Warning\" />\n    <Rule Id=\"CA1039\" Action=\"Warning\" />\n    <Rule Id=\"CA1040\" Action=\"Warning\" />\n    <Rule Id=\"CA1041\" Action=\"Warning\" />\n    <Rule Id=\"CA1043\" Action=\"Warning\" />\n    <Rule Id=\"CA1044\" Action=\"Warning\" />\n    <Rule Id=\"CA1045\" Action=\"Warning\" />\n    <Rule Id=\"CA1046\" Action=\"Warning\" />\n    <Rule Id=\"CA1047\" Action=\"Warning\" />\n    <Rule Id=\"CA1048\" Action=\"Warning\" />\n    <Rule Id=\"CA1049\" Action=\"Warning\" />\n    <Rule Id=\"CA1050\" Action=\"Warning\" />\n    <Rule Id=\"CA1051\" Action=\"Warning\" />\n    <Rule Id=\"CA1052\" Action=\"Warning\" />\n    <Rule Id=\"CA1053\" Action=\"Warning\" />\n    <Rule Id=\"CA1054\" Action=\"Warning\" />\n    <Rule Id=\"CA1055\" Action=\"Warning\" />\n    <Rule Id=\"CA1056\" Action=\"Warning\" />\n    <Rule Id=\"CA1057\" Action=\"Warning\" />\n    <Rule Id=\"CA1058\" Action=\"Warning\" />\n    <Rule Id=\"CA1059\" Action=\"Warning\" />\n    <Rule Id=\"CA1060\" Action=\"Warning\" />\n    <Rule Id=\"CA1061\" Action=\"Warning\" />\n    <Rule Id=\"CA1062\" Action=\"Warning\" />\n    <Rule Id=\"CA1063\" Action=\"Warning\" />\n    <Rule Id=\"CA1064\" Action=\"Warning\" />\n    <Rule Id=\"CA1065\" Action=\"Warning\" />\n    <Rule Id=\"CA1300\" Action=\"Warning\" />\n    <Rule Id=\"CA1301\" Action=\"Warning\" />\n    <Rule Id=\"CA1302\" Action=\"Warning\" />\n    <Rule Id=\"CA1303\" Action=\"Warning\" />\n    <Rule Id=\"CA1304\" Action=\"Warning\" />\n    <Rule Id=\"CA1305\" Action=\"Warning\" />\n    <Rule Id=\"CA1306\" Action=\"Warning\" />\n    <Rule Id=\"CA1307\" Action=\"Warning\" />\n    <Rule Id=\"CA1308\" Action=\"Warning\" />\n    <Rule Id=\"CA1309\" Action=\"Warning\" />\n    <Rule Id=\"CA1400\" Action=\"Warning\" />\n    <Rule Id=\"CA1401\" Action=\"Warning\" />\n    <Rule Id=\"CA1402\" Action=\"Warning\" />\n    <Rule Id=\"CA1403\" Action=\"Warning\" />\n    <Rule Id=\"CA1404\" Action=\"Warning\" />\n    <Rule Id=\"CA1405\" Action=\"Warning\" />\n    <Rule Id=\"CA1406\" Action=\"Warning\" />\n    <Rule Id=\"CA1407\" Action=\"Warning\" />\n    <Rule Id=\"CA1408\" Action=\"Warning\" />\n    <Rule Id=\"CA1409\" Action=\"Warning\" />\n    <Rule Id=\"CA1410\" Action=\"Warning\" />\n    <Rule Id=\"CA1411\" Action=\"Warning\" />\n    <Rule Id=\"CA1412\" Action=\"Warning\" />\n    <Rule Id=\"CA1413\" Action=\"Warning\" />\n    <Rule Id=\"CA1414\" Action=\"Warning\" />\n    <Rule Id=\"CA1415\" Action=\"Warning\" />\n    <Rule Id=\"CA1500\" Action=\"Warning\" />\n    <Rule Id=\"CA1501\" Action=\"Warning\" />\n    <Rule Id=\"CA1502\" Action=\"Warning\" />\n    <Rule Id=\"CA1504\" Action=\"Warning\" />\n    <Rule Id=\"CA1505\" Action=\"Warning\" />\n    <Rule Id=\"CA1506\" Action=\"Warning\" />\n    <Rule Id=\"CA1600\" Action=\"Warning\" />\n    <Rule Id=\"CA1601\" Action=\"Warning\" />\n    <Rule Id=\"CA1700\" Action=\"Warning\" />\n    <Rule Id=\"CA1701\" Action=\"Warning\" />\n    <Rule Id=\"CA1702\" Action=\"Warning\" />\n    <Rule Id=\"CA1703\" Action=\"Warning\" />\n    <Rule Id=\"CA1704\" Action=\"Warning\" />\n    <Rule Id=\"CA1707\" Action=\"Warning\" />\n    <Rule Id=\"CA1708\" Action=\"Warning\" />\n    <Rule Id=\"CA1709\" Action=\"Warning\" />\n    <Rule Id=\"CA1710\" Action=\"Warning\" />\n    <Rule Id=\"CA1711\" Action=\"Warning\" />\n    <Rule Id=\"CA1712\" Action=\"Warning\" />\n    <Rule Id=\"CA1713\" Action=\"Warning\" />\n    <Rule Id=\"CA1714\" Action=\"Warning\" />\n    <Rule Id=\"CA1715\" Action=\"Warning\" />\n    <Rule Id=\"CA1716\" Action=\"Warning\" />\n    <Rule Id=\"CA1717\" Action=\"Warning\" />\n    <Rule Id=\"CA1719\" Action=\"Warning\" />\n    <Rule Id=\"CA1720\" Action=\"Warning\" />\n    <Rule Id=\"CA1721\" Action=\"Warning\" />\n    <Rule Id=\"CA1722\" Action=\"Warning\" />\n    <Rule Id=\"CA1724\" Action=\"Warning\" />\n    <Rule Id=\"CA1725\" Action=\"Warning\" />\n    <Rule Id=\"CA1726\" Action=\"Warning\" />\n    <Rule Id=\"CA1800\" Action=\"Warning\" />\n    <Rule Id=\"CA1801\" Action=\"Warning\" />\n    <Rule Id=\"CA1802\" Action=\"Warning\" />\n    <Rule Id=\"CA1804\" Action=\"Warning\" />\n    <Rule Id=\"CA1806\" Action=\"Warning\" />\n    <Rule Id=\"CA1809\" Action=\"Warning\" />\n    <Rule Id=\"CA1810\" Action=\"Warning\" />\n    <Rule Id=\"CA1811\" Action=\"Warning\" />\n    <Rule Id=\"CA1812\" Action=\"Warning\" />\n    <Rule Id=\"CA1813\" Action=\"Warning\" />\n    <Rule Id=\"CA1814\" Action=\"Warning\" />\n    <Rule Id=\"CA1815\" Action=\"Warning\" />\n    <Rule Id=\"CA1816\" Action=\"Warning\" />\n    <Rule Id=\"CA1819\" Action=\"Warning\" />\n    <Rule Id=\"CA1820\" Action=\"Warning\" />\n    <Rule Id=\"CA1821\" Action=\"Warning\" />\n    <Rule Id=\"CA1822\" Action=\"Warning\" />\n    <Rule Id=\"CA1823\" Action=\"Warning\" />\n    <Rule Id=\"CA1824\" Action=\"Warning\" />\n    <Rule Id=\"CA1900\" Action=\"Warning\" />\n    <Rule Id=\"CA1901\" Action=\"Warning\" />\n    <Rule Id=\"CA1903\" Action=\"Warning\" />\n    <Rule Id=\"CA2000\" Action=\"Warning\" />\n    <Rule Id=\"CA2001\" Action=\"Warning\" />\n    <Rule Id=\"CA2002\" Action=\"Warning\" />\n    <Rule Id=\"CA2003\" Action=\"Warning\" />\n    <Rule Id=\"CA2004\" Action=\"Warning\" />\n    <Rule Id=\"CA2006\" Action=\"Warning\" />\n    <Rule Id=\"CA2100\" Action=\"Warning\" />\n    <Rule Id=\"CA2101\" Action=\"Warning\" />\n    <Rule Id=\"CA2102\" Action=\"Warning\" />\n    <Rule Id=\"CA2103\" Action=\"Warning\" />\n    <Rule Id=\"CA2104\" Action=\"Warning\" />\n    <Rule Id=\"CA2105\" Action=\"Warning\" />\n    <Rule Id=\"CA2106\" Action=\"Warning\" />\n    <Rule Id=\"CA2107\" Action=\"Warning\" />\n    <Rule Id=\"CA2108\" Action=\"Warning\" />\n    <Rule Id=\"CA2109\" Action=\"Warning\" />\n    <Rule Id=\"CA2111\" Action=\"Warning\" />\n    <Rule Id=\"CA2112\" Action=\"Warning\" />\n    <Rule Id=\"CA2114\" Action=\"Warning\" />\n    <Rule Id=\"CA2115\" Action=\"Warning\" />\n    <Rule Id=\"CA2116\" Action=\"Warning\" />\n    <Rule Id=\"CA2117\" Action=\"Warning\" />\n    <Rule Id=\"CA2118\" Action=\"Warning\" />\n    <Rule Id=\"CA2119\" Action=\"Warning\" />\n    <Rule Id=\"CA2120\" Action=\"Warning\" />\n    <Rule Id=\"CA2121\" Action=\"Warning\" />\n    <Rule Id=\"CA2122\" Action=\"Warning\" />\n    <Rule Id=\"CA2123\" Action=\"Warning\" />\n    <Rule Id=\"CA2124\" Action=\"Warning\" />\n    <Rule Id=\"CA2126\" Action=\"Warning\" />\n    <Rule Id=\"CA2130\" Action=\"Warning\" />\n    <Rule Id=\"CA2131\" Action=\"Warning\" />\n    <Rule Id=\"CA2132\" Action=\"Warning\" />\n    <Rule Id=\"CA2133\" Action=\"Warning\" />\n    <Rule Id=\"CA2134\" Action=\"Warning\" />\n    <Rule Id=\"CA2135\" Action=\"Warning\" />\n    <Rule Id=\"CA2136\" Action=\"Warning\" />\n    <Rule Id=\"CA2137\" Action=\"Warning\" />\n    <Rule Id=\"CA2138\" Action=\"Warning\" />\n    <Rule Id=\"CA2139\" Action=\"Warning\" />\n    <Rule Id=\"CA2140\" Action=\"Warning\" />\n    <Rule Id=\"CA2141\" Action=\"Warning\" />\n    <Rule Id=\"CA2142\" Action=\"Warning\" />\n    <Rule Id=\"CA2143\" Action=\"Warning\" />\n    <Rule Id=\"CA2144\" Action=\"Warning\" />\n    <Rule Id=\"CA2145\" Action=\"Warning\" />\n    <Rule Id=\"CA2146\" Action=\"Warning\" />\n    <Rule Id=\"CA2147\" Action=\"Warning\" />\n    <Rule Id=\"CA2149\" Action=\"Warning\" />\n    <Rule Id=\"CA2151\" Action=\"Warning\" />\n    <Rule Id=\"CA2200\" Action=\"Warning\" />\n    <Rule Id=\"CA2201\" Action=\"Warning\" />\n    <Rule Id=\"CA2202\" Action=\"Warning\" />\n    <Rule Id=\"CA2204\" Action=\"Warning\" />\n    <Rule Id=\"CA2205\" Action=\"Warning\" />\n    <Rule Id=\"CA2207\" Action=\"Warning\" />\n    <Rule Id=\"CA2208\" Action=\"Warning\" />\n    <Rule Id=\"CA2210\" Action=\"Warning\" />\n    <Rule Id=\"CA2211\" Action=\"Warning\" />\n    <Rule Id=\"CA2212\" Action=\"Warning\" />\n    <Rule Id=\"CA2213\" Action=\"Warning\" />\n    <Rule Id=\"CA2214\" Action=\"Warning\" />\n    <Rule Id=\"CA2215\" Action=\"Warning\" />\n    <Rule Id=\"CA2216\" Action=\"Warning\" />\n    <Rule Id=\"CA2217\" Action=\"Warning\" />\n    <Rule Id=\"CA2218\" Action=\"Warning\" />\n    <Rule Id=\"CA2219\" Action=\"Warning\" />\n    <Rule Id=\"CA2220\" Action=\"Warning\" />\n    <Rule Id=\"CA2221\" Action=\"Warning\" />\n    <Rule Id=\"CA2222\" Action=\"Warning\" />\n    <Rule Id=\"CA2223\" Action=\"Warning\" />\n    <Rule Id=\"CA2224\" Action=\"Warning\" />\n    <Rule Id=\"CA2225\" Action=\"Warning\" />\n    <Rule Id=\"CA2226\" Action=\"Warning\" />\n    <Rule Id=\"CA2227\" Action=\"Warning\" />\n    <Rule Id=\"CA2228\" Action=\"Warning\" />\n    <Rule Id=\"CA2229\" Action=\"Warning\" />\n    <Rule Id=\"CA2230\" Action=\"Warning\" />\n    <Rule Id=\"CA2231\" Action=\"Warning\" />\n    <Rule Id=\"CA2232\" Action=\"Warning\" />\n    <Rule Id=\"CA2233\" Action=\"Warning\" />\n    <Rule Id=\"CA2234\" Action=\"Warning\" />\n    <Rule Id=\"CA2235\" Action=\"Warning\" />\n    <Rule Id=\"CA2236\" Action=\"Warning\" />\n    <Rule Id=\"CA2237\" Action=\"Warning\" />\n    <Rule Id=\"CA2238\" Action=\"Warning\" />\n    <Rule Id=\"CA2239\" Action=\"Warning\" />\n    <Rule Id=\"CA2240\" Action=\"Warning\" />\n    <Rule Id=\"CA2241\" Action=\"Warning\" />\n    <Rule Id=\"CA2242\" Action=\"Warning\" />\n    <Rule Id=\"CA2243\" Action=\"Warning\" />\n    <Rule Id=\"CA5122\" Action=\"Warning\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeAnalysis.CSharp\" RuleNamespace=\"Microsoft.CodeAnalysis.CSharp\">\n    <Rule Id=\"AD0001\" Action=\"Info\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeQuality.Analyzers\" RuleNamespace=\"Microsoft.CodeQuality.Analyzers\">\n    <Rule Id=\"CA1000\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"RefactoringEssentials\" RuleNamespace=\"RefactoringEssentials\">\n    <Rule Id=\"RECS0011\" Action=\"Warning\" />\n    <Rule Id=\"RECS0018\" Action=\"Hidden\" />\n    <Rule Id=\"RECS0022\" Action=\"Info\" />\n    <Rule Id=\"RECS0025\" Action=\"Info\" />\n    <Rule Id=\"RECS0033\" Action=\"Hidden\" />\n    <Rule Id=\"RECS0059\" Action=\"Warning\" />\n    <Rule Id=\"RECS0083\" Action=\"Warning\" />\n    <Rule Id=\"RECS0091\" Action=\"Hidden\" />\n    <Rule Id=\"RECS0092\" Action=\"Warning\" />\n    <Rule Id=\"RECS0093\" Action=\"Hidden\" />\n    <Rule Id=\"RECS0105\" Action=\"Warning\" />\n    <Rule Id=\"RECS0106\" Action=\"Hidden\" />\n    <Rule Id=\"RECS0122\" Action=\"Warning\" />\n    <Rule Id=\"RECS0127\" Action=\"Warning\" />\n    <Rule Id=\"RECS0130\" Action=\"Hidden\" />\n    <Rule Id=\"RECS0145\" Action=\"Error\" />\n    <Rule Id=\"RECS0152\" Action=\"Warning\" />\n    <Rule Id=\"RECS0154\" Action=\"Info\" />\n  </Rules>\n  <Rules AnalyzerId=\"Roslynator.CSharp.Analyzers\" RuleNamespace=\"Roslynator.CSharp.Analyzers\">\n    <Rule Id=\"RCS1001\" Action=\"Error\" />\n    <Rule Id=\"RCS1018\" Action=\"None\" />\n    <Rule Id=\"RCS1023\" Action=\"None\" />\n    <Rule Id=\"RCS1024\" Action=\"None\" />\n    <Rule Id=\"RCS1029\" Action=\"None\" />\n    <Rule Id=\"RCS1095\" Action=\"None\" />\n    <Rule Id=\"RCS1123\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"SonarAnalyzer.CSharp\" RuleNamespace=\"SonarAnalyzer.CSharp\">\n    <Rule Id=\"S100\" Action=\"None\" />\n    <Rule Id=\"S101\" Action=\"None\" />\n    <Rule Id=\"S108\" Action=\"None\" />\n    <Rule Id=\"S110\" Action=\"Info\" />\n    <Rule Id=\"S1121\" Action=\"None\" />\n    <Rule Id=\"S1244\" Action=\"None\" />\n    <Rule Id=\"S125\" Action=\"None\" />\n    <Rule Id=\"S1449\" Action=\"None\" />\n    <Rule Id=\"S1854\" Action=\"None\" />\n    <Rule Id=\"S2360\" Action=\"None\" />\n    <Rule Id=\"S2743\" Action=\"None\" />\n    <Rule Id=\"S3776\" Action=\"None\" />\n    <Rule Id=\"S3881\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers\">\n    <Rule Id=\"SA0001\" Action=\"None\" />\n    <Rule Id=\"SA1008\" Action=\"None\" />\n    <Rule Id=\"SA1009\" Action=\"None\" />\n    <Rule Id=\"SA1028\" Action=\"None\" />\n    <Rule Id=\"SA1101\" Action=\"None\" />\n    <Rule Id=\"SA1108\" Action=\"None\" />\n    <Rule Id=\"SA1117\" Action=\"None\" />\n    <Rule Id=\"SA1118\" Action=\"None\" />\n    <Rule Id=\"SA1122\" Action=\"None\" />\n    <Rule Id=\"SA1200\" Action=\"None\" />\n    <Rule Id=\"SA1201\" Action=\"None\" />\n    <Rule Id=\"SA1202\" Action=\"None\" />\n    <Rule Id=\"SA1203\" Action=\"None\" />\n    <Rule Id=\"SA1204\" Action=\"None\" />\n    <Rule Id=\"SA1205\" Action=\"None\" />\n    <Rule Id=\"SA1208\" Action=\"None\" />\n    <Rule Id=\"SA1210\" Action=\"None\" />\n    <Rule Id=\"SA1214\" Action=\"None\" />\n    <Rule Id=\"SA1311\" Action=\"None\" />\n    <Rule Id=\"SA1400\" Action=\"None\" />\n    <Rule Id=\"SA1401\" Action=\"None\" />\n    <Rule Id=\"SA1407\" Action=\"None\" />\n    <Rule Id=\"SA1408\" Action=\"None\" />\n    <Rule Id=\"SA1413\" Action=\"None\" />\n    <Rule Id=\"SA1513\" Action=\"None\" />\n    <Rule Id=\"SA1600\" Action=\"None\" />\n    <Rule Id=\"SA1602\" Action=\"None\" />\n    <Rule Id=\"SA1606\" Action=\"None\" />\n    <Rule Id=\"SA1614\" Action=\"None\" />\n    <Rule Id=\"SA1616\" Action=\"None\" />\n    <Rule Id=\"SA1633\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"xunit.analyzers\" RuleNamespace=\"xunit.analyzers\">\n    <Rule Id=\"xUnit1004\" Action=\"Hidden\" />\n    <Rule Id=\"xUnit1005\" Action=\"Error\" />\n    <Rule Id=\"xUnit1006\" Action=\"Error\" />\n    <Rule Id=\"xUnit1008\" Action=\"Error\" />\n    <Rule Id=\"xUnit1012\" Action=\"Error\" />\n    <Rule Id=\"xUnit1013\" Action=\"Error\" />\n    <Rule Id=\"xUnit1014\" Action=\"Error\" />\n    <Rule Id=\"xUnit1024\" Action=\"Hidden\" />\n    <Rule Id=\"xUnit2000\" Action=\"Error\" />\n    <Rule Id=\"xUnit2001\" Action=\"Error\" />\n    <Rule Id=\"xUnit2002\" Action=\"Error\" />\n    <Rule Id=\"xUnit2003\" Action=\"Error\" />\n    <Rule Id=\"xUnit2004\" Action=\"Error\" />\n  </Rules>\n</RuleSet>"
  }
]