Ecng.Configuration 1.0.245

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Configuration --version 1.0.245
                    
NuGet\Install-Package Ecng.Configuration -Version 1.0.245
                    
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.Configuration" Version="1.0.245" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Configuration" Version="1.0.245" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.Configuration" />
                    
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.Configuration --version 1.0.245
                    
#r "nuget: Ecng.Configuration, 1.0.245"
                    
#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.Configuration@1.0.245
                    
#: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.Configuration&version=1.0.245
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Configuration&version=1.0.245
                    
Install as a Cake Tool

Ecng.Configuration

A lightweight and efficient configuration management library for .NET applications, providing typed access to configuration sections, application settings, and a flexible service registry.

Overview

Ecng.Configuration wraps and extends the .NET System.Configuration framework, offering:

  • Type-safe access to configuration sections and groups
  • Service registry pattern for dependency injection and service location
  • Event-driven notifications for service registration
  • AppSettings helpers with type conversion
  • Thread-safe operations for concurrent access

Installation

This library requires:

  • .NET Standard 2.0+ or .NET 6.0+
  • System.Configuration.ConfigurationManager package
<PackageReference Include="System.Configuration.ConfigurationManager" />

Key Features

1. Configuration Sections

Access configuration sections by type or name with built-in caching for performance.

Access by Type
using Ecng.Configuration;

// Get a custom configuration section by type
var section = ConfigManager.GetSection<MyCustomSection>();

// Section will be null if not found
if (section != null)
{
    // Use the section
    var value = section.SomeProperty;
}
Access by Name
// Get section by name
var connectionStrings = ConfigManager.GetSection<ConnectionStringsSection>("connectionStrings");

// Or without type parameter
var section = ConfigManager.GetSection("mySection");
Example Configuration File
<configuration>
  <configSections>
    <section name="mySection" type="MyNamespace.MyCustomSection, MyAssembly"/>
  </configSections>

  <mySection someProperty="value" />
</configuration>

2. Configuration Section Groups

Organize related configuration sections into groups.

// Get a section group by type
var group = ConfigManager.GetGroup<MyConfigurationGroup>();

// Get a section group by name
var systemWeb = ConfigManager.GetGroup<SystemWebSectionGroup>("system.web");

3. Application Settings

Simple access to AppSettings with type conversion support.

// Get a setting with default value
int timeout = ConfigManager.TryGet<int>("RequestTimeout", 30);

// Get a boolean setting
bool enableLogging = ConfigManager.TryGet<bool>("EnableLogging", false);

// Get a string setting
string apiUrl = ConfigManager.TryGet<string>("ApiUrl", "https://default-api.com");

// Direct access to all AppSettings
var allSettings = ConfigManager.AppSettings;
foreach (string key in allSettings.AllKeys)
{
    Console.WriteLine($"{key} = {allSettings[key]}");
}

Configuration File:

<configuration>
  <appSettings>
    <add key="RequestTimeout" value="60" />
    <add key="EnableLogging" value="true" />
    <add key="ApiUrl" value="https://api.example.com" />
  </appSettings>
</configuration>

4. Service Registry

A lightweight service locator pattern for managing application services without heavy DI frameworks.

Register Services
// Register a service with default name (type's AssemblyQualifiedName)
var securityProvider = new CollectionSecurityProvider(securities);
ConfigManager.RegisterService<ISecurityProvider>(securityProvider);

// Register a service with a custom name
ConfigManager.RegisterService<ILogger>("FileLogger", new FileLogger());
ConfigManager.RegisterService<ILogger>("ConsoleLogger", new ConsoleLogger());
Retrieve Services
// Get a service by type (using default name)
var provider = ConfigManager.GetService<ISecurityProvider>();

// Get a service by name
var fileLogger = ConfigManager.GetService<ILogger>("FileLogger");
var consoleLogger = ConfigManager.GetService<ILogger>("ConsoleLogger");

// Try to get a service (returns default if not found)
var optionalService = ConfigManager.TryGetService<IOptionalFeature>();
if (optionalService != null)
{
    // Service is available
}
Check Service Registration
// Check if a service is registered
if (ConfigManager.IsServiceRegistered<IMessageAdapter>())
{
    var adapter = ConfigManager.GetService<IMessageAdapter>();
}

// Check by name
if (ConfigManager.IsServiceRegistered<ILogger>("FileLogger"))
{
    // Use the file logger
}
Conditional Registration
// Register only if not already registered
ConfigManager.TryRegisterService<IDefaultService>(new DefaultServiceImpl());

// This won't override the existing registration
ConfigManager.TryRegisterService<IDefaultService>(new AnotherImpl());
Get All Services of a Type
// Get all registered services of a specific type
var allLoggers = ConfigManager.GetServices<ILogger>();

foreach (var logger in allLoggers)
{
    logger.Log("Application started");
}

5. Service Registration Events

React to service registration with event handlers or subscriptions.

Global Event Handler
// Subscribe to all service registrations
ConfigManager.ServiceRegistered += (type, service) =>
{
    Console.WriteLine($"Service registered: {type.Name}");
};

// Now register a service
ConfigManager.RegisterService<IMyService>(new MyServiceImpl());
// Output: Service registered: IMyService
Type-Specific Subscription
// Subscribe to a specific service type registration
ConfigManager.SubscribeOnRegister<ISecurityProvider>(provider =>
{
    Console.WriteLine($"SecurityProvider registered with {provider.Count} securities");
    // Initialize or configure the provider
});

// When this service is registered, the callback will be invoked
ConfigManager.RegisterService<ISecurityProvider>(new CollectionSecurityProvider(securities));

6. Service Fallback

Provide a fallback mechanism to create services on-demand when they're not registered.

// Set up a service fallback handler
ConfigManager.ServiceFallback += (type, name) =>
{
    // Create services dynamically based on type
    if (type == typeof(ILogger))
    {
        return new DefaultLogger();
    }

    if (type == typeof(ICache))
    {
        return new MemoryCache();
    }

    // Return null to indicate service cannot be created
    return null;
};

// Now getting an unregistered service will use the fallback
var logger = ConfigManager.GetService<ILogger>(); // Creates DefaultLogger

7. Access Underlying Configuration

For advanced scenarios, access the underlying .NET Configuration object.

// Get the underlying Configuration object
var config = ConfigManager.InnerConfig;

if (config != null)
{
    Console.WriteLine($"Configuration file: {config.FilePath}");

    // Access sections directly
    foreach (ConfigurationSection section in config.Sections)
    {
        Console.WriteLine($"Section: {section.SectionInformation.Name}");
    }
}

Complete Usage Example

Here's a complete example showing typical usage in an application:

using Ecng.Configuration;
using System;

namespace MyApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            // 1. Configure service fallback (optional)
            ConfigManager.ServiceFallback += CreateDefaultServices;

            // 2. Subscribe to service registrations (optional)
            ConfigManager.SubscribeOnRegister<ILogger>(logger =>
            {
                logger.Initialize();
            });

            // 3. Register core services
            ConfigManager.RegisterService<ILogger>(new FileLogger("app.log"));
            ConfigManager.RegisterService<IExchangeInfoProvider>(
                new InMemoryExchangeInfoProvider()
            );

            // 4. Register multiple implementations with names
            ConfigManager.RegisterService<ICache>("Memory", new MemoryCache());
            ConfigManager.RegisterService<ICache>("Distributed", new RedisCache());

            // 5. Read application settings
            var timeout = ConfigManager.TryGet<int>("Timeout", 30);
            var apiUrl = ConfigManager.TryGet<string>("ApiUrl");

            // 6. Get configuration section
            var customSection = ConfigManager.GetSection<CustomAppSettings>();

            // 7. Use services throughout your application
            RunApplication();
        }

        static void RunApplication()
        {
            // Retrieve services when needed
            var logger = ConfigManager.GetService<ILogger>();
            logger.Log("Application started");

            var provider = ConfigManager.GetService<IExchangeInfoProvider>();
            var exchanges = provider.GetExchanges();

            // Use named service
            var cache = ConfigManager.GetService<ICache>("Memory");
            cache.Set("key", "value");
        }

        static object CreateDefaultServices(Type type, string name)
        {
            // Provide default implementations
            if (type == typeof(ILogger))
                return new ConsoleLogger();

            return null;
        }
    }

    // Example interfaces
    public interface ILogger
    {
        void Initialize();
        void Log(string message);
    }

    public interface IExchangeInfoProvider
    {
        IEnumerable<Exchange> GetExchanges();
    }

    public interface ICache
    {
        void Set(string key, string value);
        string Get(string key);
    }
}

Thread Safety

All operations in ConfigManager are thread-safe:

  • Configuration sections and groups are cached on first access
  • Service registry operations use locking to prevent race conditions
  • Multiple threads can safely register and retrieve services concurrently
// Safe to call from multiple threads
Parallel.For(0, 100, i =>
{
    var service = ConfigManager.GetService<IMyService>();
    service.DoWork();
});

Best Practices

1. Register Services at Application Startup

// Register all services during application initialization
public static void ConfigureServices()
{
    ConfigManager.RegisterService<ILogger>(new Logger());
    ConfigManager.RegisterService<IDataService>(new DataService());
    // ... register other services
}

2. Use Type-Safe Access

// Prefer type-safe access over string-based access
var section = ConfigManager.GetSection<MySection>();  // Good
var section = (MySection)ConfigManager.GetSection("mySection");  // Less safe

3. Provide Defaults for AppSettings

// Always provide sensible defaults
var timeout = ConfigManager.TryGet<int>("Timeout", 30);  // Good
var timeout = ConfigManager.TryGet<int>("Timeout");  // May return 0

4. Check Service Registration Before Use

// For optional services, check registration first
if (ConfigManager.IsServiceRegistered<IOptionalFeature>())
{
    var feature = ConfigManager.GetService<IOptionalFeature>();
    feature.Execute();
}

5. Use Named Services for Multiple Implementations

// Register different implementations with descriptive names
ConfigManager.RegisterService<IRepository>("User", new UserRepository());
ConfigManager.RegisterService<IRepository>("Product", new ProductRepository());

// Retrieve specific implementation
var userRepo = ConfigManager.GetService<IRepository>("User");

Common Patterns

Singleton Services

// Register singleton services
var singletonService = new MySingletonService();
ConfigManager.RegisterService<IMySingletonService>(singletonService);

// Every call returns the same instance
var service1 = ConfigManager.GetService<IMySingletonService>();
var service2 = ConfigManager.GetService<IMySingletonService>();
// service1 == service2

Factory Pattern with Fallback

// Use fallback as a factory
ConfigManager.ServiceFallback += (type, name) =>
{
    if (type == typeof(IDataService))
    {
        // Create with dependencies
        var logger = ConfigManager.GetService<ILogger>();
        return new DataService(logger);
    }
    return null;
};

// First call creates and registers the service
var service = ConfigManager.GetService<IDataService>();

Configuration-Driven Service Selection

// Select service implementation based on configuration
var loggerType = ConfigManager.TryGet<string>("LoggerType", "Console");

ILogger logger = loggerType switch
{
    "File" => new FileLogger(),
    "Console" => new ConsoleLogger(),
    "Database" => new DatabaseLogger(),
    _ => new ConsoleLogger()
};

ConfigManager.RegisterService<ILogger>(logger);

Migration from .NET ConfigurationManager

If you're migrating from using ConfigurationManager directly:

// Before:
var setting = ConfigurationManager.AppSettings["MySetting"];

// After:
var setting = ConfigManager.AppSettings["MySetting"];
// Or with type conversion:
var typedSetting = ConfigManager.TryGet<int>("MySetting", 0);

// Before:
var section = (MySection)ConfigurationManager.GetSection("mySection");

// After:
var section = ConfigManager.GetSection<MySection>("mySection");

Limitations

  • Configuration file must exist and be valid at application startup
  • Configuration sections are cached on first load (not reloaded automatically)
  • Service registry is in-memory only (not persisted)
  • Not a replacement for full dependency injection frameworks (suitable for simpler scenarios)

See Also

License

Part of the StockSharp/Ecng framework.

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 (6)

Showing the top 5 NuGet packages that depend on Ecng.Configuration:

Package Downloads
StockSharp.BusinessEntities

Trading entities (security, trade etc.). More info on web site https://stocksharp.com/store/

StockSharp.Configuration

Configuration components. More info on web site https://stocksharp.com/store/

StockSharp.Finam

Finam

StockSharp.Mfd

MFD

StockSharp.Algo.Compilation

Compilation components. More info on web site https://stocksharp.com/store/

GitHub repositories (1)

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

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.251 0 1/18/2026
1.0.250 0 1/18/2026
1.0.249 144 1/14/2026
1.0.248 82 1/13/2026
1.0.247 78 1/13/2026
1.0.246 187 1/9/2026
1.0.245 193 1/4/2026
1.0.244 125 12/30/2025
1.0.243 107 12/29/2025
1.0.242 109 12/26/2025
1.0.241 91 12/26/2025
1.0.240 100 12/26/2025
1.0.239 111 12/26/2025
1.0.238 186 12/25/2025
1.0.237 183 12/25/2025
1.0.236 194 12/22/2025
1.0.235 169 12/21/2025
1.0.234 253 12/19/2025
1.0.233 242 12/19/2025
1.0.232 338 12/17/2025
1.0.231 329 12/15/2025
1.0.230 182 12/12/2025
1.0.229 144 12/12/2025
1.0.228 275 11/29/2025
1.0.227 146 11/28/2025
1.0.226 153 11/28/2025
1.0.225 203 11/27/2025
1.0.224 298 11/24/2025
1.0.223 214 11/24/2025
1.0.222 211 11/23/2025
1.0.221 261 11/22/2025
1.0.220 503 11/20/2025
1.0.219 464 11/18/2025
1.0.218 427 11/18/2025
1.0.217 413 11/13/2025
1.0.216 302 11/10/2025
1.0.215 1,175 11/1/2025
1.0.214 280 10/28/2025
1.0.213 278 10/27/2025
1.0.212 235 10/27/2025
1.0.211 155 10/25/2025
1.0.210 1,230 10/3/2025
1.0.209 450 9/25/2025
1.0.208 5,695 8/30/2025
1.0.207 355 8/19/2025
1.0.206 4,129 7/13/2025
1.0.205 243 7/13/2025
1.0.204 224 7/12/2025
1.0.203 1,119 7/8/2025
1.0.202 3,578 6/16/2025
1.0.201 421 6/9/2025
1.0.200 328 6/8/2025
1.0.199 1,068 5/21/2025
1.0.198 289 5/17/2025
1.0.197 1,139 5/12/2025
1.0.196 327 5/12/2025
1.0.195 409 4/17/2025
1.0.194 2,411 3/20/2025
1.0.193 296 3/19/2025
1.0.192 1,916 2/26/2025
1.0.191 233 2/26/2025
1.0.190 2,072 2/5/2025
1.0.189 322 1/21/2025
1.0.188 248 1/14/2025
1.0.187 262 1/12/2025
1.0.186 255 1/10/2025
1.0.185 2,202 12/27/2024
1.0.184 233 12/26/2024
1.0.183 245 12/26/2024
1.0.182 1,780 11/18/2024
1.0.181 1,064 11/7/2024
1.0.180 362 10/19/2024
1.0.179 3,035 10/5/2024
1.0.178 2,604 9/18/2024
1.0.177 257 9/17/2024
1.0.176 2,108 9/1/2024
1.0.175 6,987 6/12/2024
1.0.174 1,230 5/28/2024
1.0.173 2,676 5/4/2024
1.0.172 1,732 4/14/2024
1.0.171 2,107 3/28/2024
1.0.170 314 3/17/2024
1.0.169 1,470 2/23/2024
1.0.168 270 2/23/2024
1.0.167 2,220 2/18/2024
1.0.166 275 2/16/2024
1.0.165 1,350 2/13/2024
1.0.164 1,244 2/8/2024
1.0.163 1,496 2/4/2024
1.0.162 1,620 1/23/2024
1.0.161 343 1/12/2024
1.0.160 2,382 1/2/2024
1.0.159 307 12/29/2023
1.0.158 5,217 11/12/2023
1.0.157 248 11/10/2023
1.0.156 246 11/10/2023
1.0.155 245 11/9/2023
1.0.154 275 11/3/2023
1.0.153 266 11/1/2023
1.0.152 245 11/1/2023
1.0.151 5,730 9/8/2023
1.0.150 283 9/8/2023
1.0.149 287 9/3/2023
1.0.148 396 8/21/2023
1.0.147 339 8/14/2023
1.0.146 337 8/10/2023
1.0.145 39,117 6/29/2023
1.0.144 13,690 5/27/2023
1.0.143 393 5/19/2023
1.0.142 25,989 5/8/2023
1.0.141 460 4/21/2023
1.0.140 50,234 4/3/2023
1.0.139 580 3/13/2023
1.0.138 18,130 3/6/2023
1.0.137 469 2/26/2023
1.0.136 46,626 2/9/2023
1.0.135 15,847 2/7/2023
1.0.134 500 2/4/2023
1.0.133 18,791 2/2/2023
1.0.132 17,281 1/30/2023
1.0.131 545 1/18/2023
1.0.130 44,170 12/30/2022
1.0.129 532 12/23/2022
1.0.128 511 12/23/2022
1.0.127 20,221 12/12/2022
1.0.126 20,370 12/4/2022
1.0.125 503 12/4/2022
1.0.124 541 11/30/2022
1.0.123 541 11/28/2022
1.0.122 572 11/18/2022
1.0.121 28,295 11/11/2022
1.0.120 557 11/11/2022
1.0.119 555 11/10/2022
1.0.118 593 11/5/2022
1.0.117 586 11/4/2022
1.0.116 23,565 11/1/2022
1.0.115 24,647 10/16/2022
1.0.114 766 9/10/2022
1.0.113 49,602 9/8/2022
1.0.112 658 9/8/2022
1.0.111 650 9/8/2022
1.0.110 651 9/4/2022
1.0.109 87,769 8/24/2022
1.0.108 742 8/8/2022
1.0.107 668 7/26/2022
1.0.106 675 7/26/2022
1.0.105 51,610 7/19/2022
1.0.104 44,739 7/18/2022
1.0.103 708 7/8/2022
1.0.102 752 6/18/2022
1.0.101 724 6/6/2022
1.0.100 94,207 4/30/2022
1.0.99 1,003 4/20/2022
1.0.98 1,020 4/10/2022
1.0.97 980 4/7/2022
1.0.96 988 4/7/2022
1.0.95 1,005 4/2/2022
1.0.94 12,345 3/29/2022
1.0.93 1,232 3/27/2022
1.0.92 258,209 1/24/2022
1.0.91 157,080 12/29/2021
1.0.90 27,767 12/20/2021
1.0.89 689 12/13/2021
1.0.88 54,674 12/6/2021
1.0.87 755 12/2/2021
1.0.86 33,778 11/29/2021
1.0.85 32,565 11/22/2021
1.0.84 4,265 11/17/2021
1.0.83 34,060 11/13/2021
1.0.82 7,719 11/10/2021
1.0.81 4,451 11/9/2021
1.0.80 67,303 11/5/2021
1.0.79 6,235 11/4/2021
1.0.78 4,307 11/4/2021
1.0.77 4,220 11/3/2021
1.0.76 4,534 10/30/2021
1.0.75 35,641 10/21/2021
1.0.74 4,986 10/17/2021
1.0.73 65,582 10/14/2021
1.0.72 15,763 10/13/2021
1.0.71 4,664 10/12/2021
1.0.70 35,967 10/11/2021
1.0.69 4,445 10/9/2021
1.0.68 39,289 10/7/2021
1.0.67 41,333 10/7/2021
1.0.66 4,465 10/7/2021
1.0.65 4,536 10/6/2021
1.0.64 3,191 9/28/2021
1.0.63 36,897 9/23/2021
1.0.62 4,813 9/10/2021
1.0.61 2,913 9/9/2021
1.0.60 2,890 9/8/2021
1.0.59 2,928 9/8/2021
1.0.58 33,204 9/6/2021
1.0.57 3,177 8/31/2021
1.0.56 2,886 8/30/2021
1.0.55 36,270 7/31/2021
1.0.54 62,259 7/30/2021
1.0.53 3,307 7/26/2021
1.0.52 91,707 7/5/2021
1.0.51 3,297 7/1/2021
1.0.50 65,447 6/4/2021
1.0.49 93,208 4/26/2021
1.0.48 34,083 4/19/2021
1.0.47 151,568 4/7/2021
1.0.46 33,312 4/3/2021
1.0.45 181,485 3/22/2021
1.0.44 115,247 3/4/2021
1.0.43 36,463 2/26/2021
1.0.42 170,338 2/2/2021
1.0.41 119,876 1/24/2021
1.0.40 3,410 1/23/2021
1.0.39 60,267 1/20/2021
1.0.38 3,302 1/20/2021
1.0.37 33,725 1/18/2021
1.0.36 30,146 1/16/2021
1.0.35 118,615 12/16/2020
1.0.34 57,221 12/14/2020
1.0.33 35,218 12/9/2020
1.0.32 5,663 12/6/2020
1.0.31 6,656 12/2/2020
1.0.30 31,520 12/1/2020
1.0.29 188,946 11/12/2020
1.0.29-atestpub 1,778 11/11/2020
1.0.28 32,720 10/11/2020
1.0.27 113,020 9/9/2020
1.0.26 31,192 9/3/2020
1.0.25 31,857 8/20/2020
1.0.24 86,016 8/9/2020
1.0.23 32,090 7/28/2020
1.0.22 31,058 7/19/2020
1.0.21 57,920 7/6/2020
1.0.20 86,635 6/6/2020
1.0.19 32,348 6/4/2020
1.0.18 59,289 5/29/2020
1.0.17 59,205 5/21/2020
1.0.16 4,374 5/17/2020
1.0.15 57,438 5/12/2020
1.0.14 110,476 5/4/2020
1.0.13 8,452 4/24/2020
1.0.12 11,187 4/22/2020
1.0.11 4,289 4/22/2020
1.0.10 4,288 4/21/2020
1.0.9 32,589 4/18/2020
1.0.8 30,868 4/16/2020
1.0.7 4,175 4/16/2020
1.0.6 26,309 4/15/2020
1.0.5 29,047 4/11/2020
1.0.4 27,661 4/3/2020
1.0.3 3,805 4/1/2020
1.0.2 14,947 3/27/2020
1.0.1 13,859 3/22/2020
1.0.0 6,236 3/22/2020