Ecng.StringSearch 1.0.224

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.StringSearch --version 1.0.224
                    
NuGet\Install-Package Ecng.StringSearch -Version 1.0.224
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ecng.StringSearch" Version="1.0.224" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.StringSearch" Version="1.0.224" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.StringSearch" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.StringSearch --version 1.0.224
                    
#r "nuget: Ecng.StringSearch, 1.0.224"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ecng.StringSearch@1.0.224
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.StringSearch&version=1.0.224
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.StringSearch&version=1.0.224
                    
Install as a Cake Tool

StringSearch - Efficient String Search Data Structures

A collection of high-performance string search data structures including Trie, Patricia Trie, and Ukkonen's Suffix Tree implementations. These data structures are optimized for fast prefix and substring searching operations.

Features

  • Multiple trie implementations for different use cases
  • Fast prefix and substring searching
  • Generic value associations with string keys
  • Memory-efficient Patricia Trie (compressed trie)
  • Ukkonen's Suffix Tree for advanced substring searching
  • Concurrent trie support for multi-threaded scenarios
  • MIT licensed open-source implementation

Installation

Add a reference to the StringSearch project in your solution.

Quick Start

Basic Trie Usage

using Gma.DataStructures.StringSearch;

// Create a Patricia Trie (most commonly used)
var trie = new PatriciaTrie<int>();

// Add key-value pairs
trie.Add("apple", 1);
trie.Add("application", 2);
trie.Add("apply", 3);
trie.Add("banana", 4);

// Retrieve values by prefix
var results = trie.Retrieve("app");
// Returns: [1, 2, 3] (values associated with "apple", "application", "apply")

var results2 = trie.Retrieve("ban");
// Returns: [4] (value associated with "banana")

Data Structures

PatriciaTrie

A space-optimized trie (radix tree) that stores strings efficiently by compressing chains of nodes with single children.

Best for:

  • Prefix searching
  • Autocomplete features
  • Memory-efficient storage of strings with common prefixes
using Gma.DataStructures.StringSearch;

var trie = new PatriciaTrie<string>();

// Add entries
trie.Add("test", "Test Value");
trie.Add("testing", "Testing Value");
trie.Add("tester", "Tester Value");
trie.Add("tea", "Tea Value");

// Search by prefix
var results = trie.Retrieve("test");
// Returns: ["Test Value", "Testing Value", "Tester Value"]

var results2 = trie.Retrieve("te");
// Returns: ["Test Value", "Testing Value", "Tester Value", "Tea Value"]

PatriciaSuffixTrie

A Patricia Trie that indexes all suffixes of added strings, enabling substring searching.

Best for:

  • Substring searching
  • Finding all occurrences of a pattern within stored strings
  • "Contains" queries
using Gma.DataStructures.StringSearch;

// Create with minimum query length of 3 characters
var suffixTrie = new PatriciaSuffixTrie<string>(minQueryLength: 3);

// Add strings with associated values
suffixTrie.Add("hello world", "Document 1");
suffixTrie.Add("world peace", "Document 2");
suffixTrie.Add("hello there", "Document 3");

// Search for substring "wor"
var results = suffixTrie.Retrieve("wor");
// Returns: ["Document 1", "Document 2"] (both contain "world")

// Search for substring "hello"
var results2 = suffixTrie.Retrieve("hello");
// Returns: ["Document 1", "Document 3"]

SuffixTrie

A standard trie-based suffix tree implementation.

using Gma.DataStructures.StringSearch;

// Create with minimum suffix length of 2
var suffixTrie = new SuffixTrie<string>(minSuffixLength: 2);

suffixTrie.Add("programming", "Item 1");
suffixTrie.Add("grammar", "Item 2");

// Search for "gram"
var results = suffixTrie.Retrieve("gram");
// Returns: ["Item 1", "Item 2"] (both contain "gram")

UkkonenTrie

An implementation of Ukkonen's linear-time suffix tree construction algorithm.

Best for:

  • Large text indexing
  • Efficient substring search in big datasets
  • Advanced pattern matching
using Gma.DataStructures.StringSearch;

// Create with minimum suffix length
var ukkonen = new UkkonenTrie<string>(minSuffixLength: 3);

ukkonen.Add("banana", "Fruit 1");
ukkonen.Add("bandana", "Clothing 1");

// Search for "ana"
var results = ukkonen.Retrieve("ana");
// Returns: ["Fruit 1", "Clothing 1"]

ConcurrentTrie

Thread-safe trie implementation for concurrent access scenarios.

using Gma.DataStructures.StringSearch;
using System.Threading.Tasks;

var concurrentTrie = new ConcurrentTrie<int>();

// Safe for concurrent access
Parallel.For(0, 1000, i =>
{
    concurrentTrie.Add($"key{i}", i);
});

// Retrieve from multiple threads
var results = concurrentTrie.Retrieve("key1");

Common Interface: ITrie<TValue>

All trie implementations implement the ITrie<TValue> interface:

public interface ITrie<TValue>
{
    void Add(string key, TValue value);
    IEnumerable<TValue> Retrieve(string query);
    void Remove(TValue value);
    void RemoveRange(IEnumerable<TValue> values);
    void Clear();
}

Usage Examples

Autocomplete System

using Gma.DataStructures.StringSearch;

public class AutocompleteSystem
{
    private readonly PatriciaTrie<string> _trie;

    public AutocompleteSystem()
    {
        _trie = new PatriciaTrie<string>();
    }

    public void AddWord(string word)
    {
        _trie.Add(word.ToLower(), word);
    }

    public IEnumerable<string> GetSuggestions(string prefix)
    {
        return _trie.Retrieve(prefix.ToLower()).Distinct();
    }
}

// Usage
var autocomplete = new AutocompleteSystem();
autocomplete.AddWord("Apple");
autocomplete.AddWord("Application");
autocomplete.AddWord("Approach");
autocomplete.AddWord("Banana");

var suggestions = autocomplete.GetSuggestions("app");
// Returns: ["Apple", "Application", "Approach"]

Document Search Engine

using Gma.DataStructures.StringSearch;
using System.Linq;

public class DocumentSearchEngine
{
    private readonly PatriciaSuffixTrie<string> _index;

    public DocumentSearchEngine(int minQueryLength = 3)
    {
        _index = new PatriciaSuffixTrie<string>(minQueryLength);
    }

    public void IndexDocument(string documentId, string content)
    {
        // Index the document content
        _index.Add(content.ToLower(), documentId);
    }

    public IEnumerable<string> Search(string query)
    {
        if (query.Length < 3)
            return Enumerable.Empty<string>();

        return _index.Retrieve(query.ToLower()).Distinct();
    }
}

// Usage
var searchEngine = new DocumentSearchEngine();
searchEngine.IndexDocument("doc1", "The quick brown fox jumps over the lazy dog");
searchEngine.IndexDocument("doc2", "A quick movement in the forest");
searchEngine.IndexDocument("doc3", "The lazy cat sleeps");

var results = searchEngine.Search("quick");
// Returns: ["doc1", "doc2"]

var results2 = searchEngine.Search("lazy");
// Returns: ["doc1", "doc3"]

Phone Directory

using Gma.DataStructures.StringSearch;

public class Contact
{
    public string Name { get; set; }
    public string Phone { get; set; }

    public override string ToString() => $"{Name}: {Phone}";
}

public class PhoneDirectory
{
    private readonly PatriciaTrie<Contact> _trie;

    public PhoneDirectory()
    {
        _trie = new PatriciaTrie<Contact>();
    }

    public void AddContact(string name, string phone)
    {
        var contact = new Contact { Name = name, Phone = phone };
        _trie.Add(name.ToLower(), contact);
    }

    public IEnumerable<Contact> FindByPrefix(string namePrefix)
    {
        return _trie.Retrieve(namePrefix.ToLower());
    }

    public void RemoveContact(Contact contact)
    {
        _trie.Remove(contact);
    }

    public void Clear()
    {
        _trie.Clear();
    }
}

// Usage
var directory = new PhoneDirectory();
directory.AddContact("Alice Smith", "555-0001");
directory.AddContact("Alice Johnson", "555-0002");
directory.AddContact("Bob Brown", "555-0003");

var contacts = directory.FindByPrefix("alic");
// Returns all contacts starting with "alic"

IP Address Lookup

using Gma.DataStructures.StringSearch;

public class IpAddressLookup
{
    private readonly PatriciaTrie<string> _trie;

    public IpAddressLookup()
    {
        _trie = new PatriciaTrie<string>();
    }

    public void AddMapping(string ipPrefix, string location)
    {
        _trie.Add(ipPrefix, location);
    }

    public IEnumerable<string> FindLocations(string ipPrefix)
    {
        return _trie.Retrieve(ipPrefix);
    }
}

// Usage
var ipLookup = new IpAddressLookup();
ipLookup.AddMapping("192.168.1", "Local Network A");
ipLookup.AddMapping("192.168.2", "Local Network B");
ipLookup.AddMapping("10.0.0", "VPN Network");

var locations = ipLookup.FindLocations("192.168");
// Returns: ["Local Network A", "Local Network B"]

Tag Search System

using Gma.DataStructures.StringSearch;
using System.Collections.Generic;

public class TaggedItem
{
    public string Id { get; set; }
    public string Title { get; set; }
    public List<string> Tags { get; set; }
}

public class TagSearchSystem
{
    private readonly PatriciaTrie<TaggedItem> _tagIndex;

    public TagSearchSystem()
    {
        _tagIndex = new PatriciaTrie<TaggedItem>();
    }

    public void AddItem(TaggedItem item)
    {
        foreach (var tag in item.Tags)
        {
            _tagIndex.Add(tag.ToLower(), item);
        }
    }

    public IEnumerable<TaggedItem> SearchByTag(string tagPrefix)
    {
        return _tagIndex.Retrieve(tagPrefix.ToLower()).Distinct();
    }

    public void RemoveItem(TaggedItem item)
    {
        _tagIndex.Remove(item);
    }
}

// Usage
var tagSystem = new TagSearchSystem();

tagSystem.AddItem(new TaggedItem
{
    Id = "1",
    Title = "Article about C#",
    Tags = new List<string> { "csharp", "programming", "dotnet" }
});

tagSystem.AddItem(new TaggedItem
{
    Id = "2",
    Title = "Article about C++",
    Tags = new List<string> { "cpp", "programming", "native" }
});

var items = tagSystem.SearchByTag("prog");
// Returns both articles (both have "programming" tag)

var csharpItems = tagSystem.SearchByTag("csh");
// Returns only the first article
using Gma.DataStructures.StringSearch;

public class Symbol
{
    public string Name { get; set; }
    public string Type { get; set; }  // class, method, property, etc.
    public string FilePath { get; set; }
}

public class CodeSymbolIndex
{
    private readonly PatriciaTrie<Symbol> _symbolTrie;
    private readonly PatriciaSuffixTrie<Symbol> _substringTrie;

    public CodeSymbolIndex()
    {
        _symbolTrie = new PatriciaTrie<Symbol>();
        _substringTrie = new PatriciaSuffixTrie<Symbol>(minQueryLength: 2);
    }

    public void IndexSymbol(Symbol symbol)
    {
        var key = symbol.Name.ToLower();
        _symbolTrie.Add(key, symbol);
        _substringTrie.Add(key, symbol);
    }

    public IEnumerable<Symbol> SearchByPrefix(string prefix)
    {
        return _symbolTrie.Retrieve(prefix.ToLower());
    }

    public IEnumerable<Symbol> SearchBySubstring(string substring)
    {
        return _substringTrie.Retrieve(substring.ToLower());
    }
}

// Usage
var codeIndex = new CodeSymbolIndex();

codeIndex.IndexSymbol(new Symbol
{
    Name = "GetUserById",
    Type = "method",
    FilePath = "UserService.cs"
});

codeIndex.IndexSymbol(new Symbol
{
    Name = "UserRepository",
    Type = "class",
    FilePath = "UserRepository.cs"
});

// Prefix search
var prefixResults = codeIndex.SearchByPrefix("getuser");
// Returns: GetUserById

// Substring search
var substringResults = codeIndex.SearchBySubstring("user");
// Returns: GetUserById, UserRepository

Performance Characteristics

Data Structure Add Search Space Best Use Case
PatriciaTrie O(k) O(k) Low Prefix search, autocomplete
PatriciaSuffixTrie O(k²) O(k) Medium Substring search
SuffixTrie O(k²) O(k) High Suffix-based search
UkkonenTrie O(k) O(k) Medium Large text indexing
ConcurrentTrie O(k) O(k) Medium Multi-threaded scenarios

where k is the length of the string

Choosing the Right Data Structure

Use PatriciaTrie when:

  • You need prefix-based searching (autocomplete, type-ahead)
  • Memory efficiency is important
  • Your strings share common prefixes
  • You only need to find strings that START with a query

Use PatriciaSuffixTrie when:

  • You need substring searching (find strings CONTAINING a query)
  • You want to find all occurrences of a pattern
  • Memory usage is acceptable
  • Query strings have a minimum length

Use UkkonenTrie when:

  • You're indexing large amounts of text
  • You need the most efficient suffix tree construction
  • Substring search performance is critical
  • You have complex pattern matching requirements

Use ConcurrentTrie when:

  • Multiple threads need to access the trie simultaneously
  • Thread safety is required
  • You're building a shared index in a multi-threaded application

Important Notes

  1. Case Sensitivity: Most examples use .ToLower() for case-insensitive search. The trie itself is case-sensitive.

  2. Minimum Query Length: Suffix tries accept a minimum query/suffix length to reduce memory usage and improve performance.

  3. Duplicate Values: Retrieve() may return duplicate values if the same value was added with different keys. Use .Distinct() if needed.

  4. Remove Operations: Remove() removes all occurrences of a value, regardless of which keys it was added with.

  5. Thread Safety: Only ConcurrentTrie is thread-safe. Other implementations require external synchronization for concurrent access.

Target Frameworks

  • .NET Standard 2.0
  • .NET 6.0
  • .NET 10.0

License

This code is distributed under MIT license. Copyright (c) 2013 George Mamaladze See license.txt or http://opensource.org/licenses/mit-license.php

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Ecng.StringSearch:

Package Downloads
StockSharp.Algo

Trading algorithms. More info on web site https://stocksharp.com/store/

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Ecng.StringSearch:

Repository Stars
StockSharp/StockSharp
Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).
Version Downloads Last Updated
1.0.229 92 1/4/2026
1.0.228 113 12/30/2025
1.0.227 87 12/29/2025
1.0.226 94 12/26/2025
1.0.225 83 12/26/2025
1.0.224 81 12/26/2025
1.0.223 100 12/26/2025
1.0.222 174 12/25/2025
1.0.221 170 12/25/2025
1.0.220 186 12/22/2025
1.0.219 160 12/21/2025
1.0.218 238 12/19/2025
1.0.217 232 12/19/2025
1.0.216 323 12/17/2025
1.0.215 312 12/15/2025
1.0.214 245 12/15/2025
1.0.213 221 12/14/2025
1.0.212 149 12/12/2025
1.0.211 111 12/12/2025
1.0.210 103 12/12/2025
1.0.209 109 12/12/2025
1.0.208 115 12/12/2025
1.0.207 773 12/2/2025
1.0.206 658 12/2/2025
1.0.205 659 12/2/2025
1.0.204 264 11/30/2025
1.0.203 119 11/29/2025
1.0.202 123 11/28/2025
1.0.201 120 11/28/2025
1.0.200 185 11/27/2025
1.0.199 282 11/24/2025
1.0.198 199 11/24/2025
1.0.197 210 11/23/2025
1.0.196 246 11/22/2025
1.0.195 472 11/20/2025
1.0.194 433 11/18/2025
1.0.193 390 11/18/2025
1.0.192 375 11/13/2025
1.0.191 279 11/10/2025
1.0.190 1,140 11/1/2025
1.0.189 236 10/28/2025
1.0.188 237 10/27/2025
1.0.187 186 10/27/2025
1.0.186 119 10/25/2025
1.0.185 1,189 10/3/2025
1.0.184 337 9/28/2025
1.0.183 261 9/25/2025
1.0.182 3,625 8/30/2025
1.0.181 2,711 7/13/2025
1.0.180 194 7/13/2025
1.0.179 169 7/12/2025
1.0.178 492 7/8/2025
1.0.177 468 7/4/2025
1.0.176 223 7/2/2025
1.0.175 1,481 6/16/2025
1.0.174 357 6/9/2025
1.0.173 258 6/8/2025
1.0.172 619 5/21/2025
1.0.171 189 5/17/2025
1.0.170 694 5/12/2025
1.0.169 268 5/12/2025
1.0.168 355 4/17/2025
1.0.167 1,409 3/22/2025
1.0.166 227 3/20/2025
1.0.165 211 3/20/2025
1.0.164 215 3/19/2025
1.0.163 1,108 2/26/2025
1.0.162 160 2/26/2025
1.0.161 1,325 2/5/2025
1.0.160 244 1/21/2025
1.0.159 179 1/14/2025
1.0.158 176 1/12/2025
1.0.157 184 1/10/2025
1.0.156 1,491 12/27/2024
1.0.155 366 11/20/2024
1.0.154 1,131 11/18/2024
1.0.153 504 11/7/2024
1.0.152 315 10/19/2024
1.0.151 898 10/12/2024
1.0.150 772 10/5/2024
1.0.149 1,167 9/18/2024
1.0.148 202 9/17/2024
1.0.147 890 9/3/2024
1.0.146 207 9/1/2024
1.0.145 3,640 6/12/2024
1.0.144 705 5/28/2024
1.0.143 1,319 5/4/2024
1.0.142 862 4/23/2024
1.0.141 213 4/21/2024
1.0.140 214 4/14/2024
1.0.139 1,098 3/28/2024
1.0.138 279 3/17/2024
1.0.137 1,362 2/23/2024
1.0.136 239 2/23/2024
1.0.135 1,004 2/18/2024
1.0.134 244 2/18/2024
1.0.133 260 2/16/2024
1.0.132 826 2/13/2024
1.0.131 716 2/8/2024
1.0.130 982 2/5/2024
1.0.129 273 2/4/2024
1.0.128 991 1/23/2024
1.0.127 268 1/23/2024
1.0.126 996 1/12/2024
1.0.125 1,094 1/2/2024
1.0.124 327 12/29/2023
1.0.123 3,251 11/12/2023
1.0.122 344 11/10/2023
1.0.121 307 11/10/2023
1.0.120 332 11/9/2023
1.0.119 362 11/3/2023
1.0.118 376 11/1/2023
1.0.117 330 11/1/2023
1.0.116 4,260 9/8/2023
1.0.115 425 9/8/2023
1.0.114 466 9/3/2023
1.0.113 558 8/21/2023
1.0.112 534 8/14/2023
1.0.111 564 8/10/2023
1.0.110 3,944 6/29/2023
1.0.109 2,164 5/27/2023
1.0.108 625 5/21/2023
1.0.107 611 5/19/2023
1.0.106 2,505 5/8/2023
1.0.105 686 4/21/2023
1.0.104 4,258 4/3/2023
1.0.103 828 3/13/2023
1.0.102 2,157 3/6/2023
1.0.101 709 2/26/2023
1.0.100 2,474 2/21/2023
1.0.99 663 2/20/2023
1.0.98 709 2/15/2023
1.0.97 687 2/14/2023
1.0.96 3,299 2/9/2023
1.0.95 2,351 2/7/2023
1.0.94 731 2/4/2023
1.0.93 2,470 2/2/2023
1.0.92 2,513 1/30/2023
1.0.91 820 1/18/2023
1.0.90 5,083 12/30/2022
1.0.89 749 12/23/2022
1.0.88 3,056 12/12/2022
1.0.87 2,793 12/4/2022
1.0.86 803 12/4/2022
1.0.85 773 11/30/2022
1.0.84 797 11/29/2022
1.0.83 791 11/28/2022
1.0.82 822 11/18/2022
1.0.81 3,388 11/11/2022
1.0.80 820 11/11/2022
1.0.79 836 11/10/2022
1.0.78 843 11/5/2022
1.0.77 823 11/4/2022
1.0.76 18,850 11/1/2022
1.0.75 21,106 10/16/2022
1.0.74 1,021 9/10/2022
1.0.73 42,624 9/8/2022
1.0.72 900 9/8/2022
1.0.71 941 9/8/2022
1.0.70 927 9/4/2022
1.0.69 83,767 8/24/2022
1.0.68 950 8/8/2022
1.0.67 965 7/26/2022
1.0.66 870 7/26/2022
1.0.65 43,445 7/19/2022
1.0.64 42,659 7/18/2022
1.0.63 952 7/8/2022
1.0.62 974 6/18/2022
1.0.61 963 6/6/2022
1.0.60 84,876 4/30/2022
1.0.59 950 4/20/2022
1.0.58 988 4/10/2022
1.0.57 985 4/7/2022
1.0.56 939 4/7/2022
1.0.55 1,006 4/2/2022
1.0.54 7,712 3/29/2022
1.0.53 936 3/27/2022
1.0.52 223,271 1/24/2022
1.0.51 144,856 12/29/2021
1.0.50 26,059 12/20/2021
1.0.49 852 12/13/2021
1.0.48 51,046 12/6/2021
1.0.47 830 12/2/2021
1.0.46 27,898 11/29/2021
1.0.45 26,017 11/22/2021
1.0.44 894 11/17/2021
1.0.43 26,915 11/13/2021
1.0.42 879 11/10/2021
1.0.41 841 11/9/2021
1.0.40 56,654 11/5/2021
1.0.39 849 11/4/2021
1.0.38 846 11/4/2021
1.0.37 884 11/3/2021
1.0.36 947 10/30/2021
1.0.35 29,715 10/21/2021
1.0.34 912 10/17/2021
1.0.33 55,821 10/14/2021
1.0.32 4,906 10/13/2021
1.0.31 870 10/12/2021
1.0.30 29,347 10/11/2021
1.0.29 885 10/9/2021
1.0.28 32,836 10/7/2021
1.0.27 31,405 10/7/2021
1.0.26 834 10/7/2021
1.0.25 862 10/6/2021
1.0.24 857 9/28/2021
1.0.23 30,465 9/23/2021
1.0.22 938 9/10/2021
1.0.21 892 9/9/2021
1.0.20 860 9/8/2021
1.0.19 838 9/8/2021
1.0.18 29,055 9/6/2021
1.0.17 904 8/31/2021
1.0.16 840 8/30/2021
1.0.15 30,028 7/31/2021
1.0.14 55,179 7/30/2021
1.0.13 956 7/26/2021
1.0.12 82,637 7/5/2021
1.0.11 819 7/1/2021
1.0.10 57,886 6/4/2021
1.0.9 83,474 4/26/2021
1.0.8 29,094 4/19/2021
1.0.7 136,309 4/7/2021
1.0.6 28,329 4/3/2021
1.0.5 163,818 3/22/2021
1.0.4 102,426 3/4/2021
1.0.3 28,193 2/26/2021
1.0.2 152,075 2/2/2021
1.0.1 101,905 1/24/2021
1.0.0 972 1/24/2021