I-Synergy.Framework.AspNetCore.Monitoring 2025.11225.12213

Prefix Reserved
dotnet add package I-Synergy.Framework.AspNetCore.Monitoring --version 2025.11225.12213
                    
NuGet\Install-Package I-Synergy.Framework.AspNetCore.Monitoring -Version 2025.11225.12213
                    
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="I-Synergy.Framework.AspNetCore.Monitoring" Version="2025.11225.12213" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="I-Synergy.Framework.AspNetCore.Monitoring" Version="2025.11225.12213" />
                    
Directory.Packages.props
<PackageReference Include="I-Synergy.Framework.AspNetCore.Monitoring" />
                    
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 I-Synergy.Framework.AspNetCore.Monitoring --version 2025.11225.12213
                    
#r "nuget: I-Synergy.Framework.AspNetCore.Monitoring, 2025.11225.12213"
                    
#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 I-Synergy.Framework.AspNetCore.Monitoring@2025.11225.12213
                    
#: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=I-Synergy.Framework.AspNetCore.Monitoring&version=2025.11225.12213
                    
Install as a Cake Addin
#tool nuget:?package=I-Synergy.Framework.AspNetCore.Monitoring&version=2025.11225.12213
                    
Install as a Cake Tool

I-Synergy Framework AspNetCore Monitoring

Real-time monitoring and communication infrastructure using SignalR for ASP.NET Core applications. This package provides SignalR hub integration, monitor services for publishing events, connection management, and group-based messaging for building real-time dashboards, notifications, and collaboration features.

NuGet License .NET

Features

  • SignalR hub integration with OpenIddict authentication
  • Monitor service for publishing real-time events to groups
  • Connection lifecycle management with automatic group assignment
  • User and account-based groups for tenant isolation
  • Generic event publishing with typed entity support
  • Real-time notifications for connected/disconnected users
  • Detailed error logging for debugging SignalR connections
  • Scalable architecture supporting multiple concurrent connections

Installation

Install the package via NuGet:

dotnet add package I-Synergy.Framework.AspNetCore.Monitoring

Quick Start

1. Configure Monitoring Services

In your Program.cs:

using ISynergy.Framework.AspNetCore.Monitoring.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Add monitoring with SignalR (specify your entity type)
builder.Services.AddMonitorSignalR<MonitorEvent>();

builder.Services.AddControllers();

var app = builder.Build();

// Map the monitor hub
app.MapHub<MonitorHub>("/hubs/monitor");

app.Run();

2. Using the Monitor Service

Publish events to connected clients:

using ISynergy.Framework.Monitoring.Abstractions.Services;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    private readonly IMonitorService<OrderEvent> _monitorService;

    public OrdersController(IMonitorService<OrderEvent> monitorService)
    {
        _monitorService = monitorService;
    }

    [HttpPost]
    public async Task<IActionResult> CreateOrder([FromBody] CreateOrderRequest request)
    {
        var order = await CreateOrderAsync(request);

        // Publish event to all users in the account group
        await _monitorService.PublishAsync(
            channel: request.AccountId.ToString(),
            eventname: "OrderCreated",
            data: new OrderEvent
            {
                OrderId = order.Id,
                Status = "Created",
                CreatedAt = DateTime.UtcNow
            });

        return Ok(order);
    }

    [HttpPut("{id}")]
    public async Task<IActionResult> UpdateOrderStatus(
        int id,
        [FromBody] UpdateOrderStatusRequest request)
    {
        var order = await UpdateOrderAsync(id, request);

        // Notify users about status change
        await _monitorService.PublishAsync(
            channel: order.AccountId.ToString(),
            eventname: "OrderStatusChanged",
            data: new OrderEvent
            {
                OrderId = order.Id,
                Status = order.Status,
                UpdatedAt = DateTime.UtcNow
            });

        return Ok(order);
    }
}

public class OrderEvent
{
    public int OrderId { get; set; }
    public string Status { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime? UpdatedAt { get; set; }
}

3. Client-Side Connection (JavaScript/TypeScript)

Connect to the SignalR hub from your frontend:

import * as signalR from "@microsoft/signalr";

// Configure connection with authentication
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/monitor", {
        accessTokenFactory: () => getAuthToken()
    })
    .withAutomaticReconnect()
    .configureLogging(signalR.LogLevel.Information)
    .build();

// Listen for order events
connection.on("OrderCreated", (event) => {
    console.log("New order created:", event);
    updateOrdersList(event);
});

connection.on("OrderStatusChanged", (event) => {
    console.log("Order status changed:", event);
    updateOrderStatus(event);
});

// Listen for user connection events
connection.on("Connected", (message) => {
    console.log(`User connected: ${message.Data}`);
    updateOnlineUsers(message);
});

connection.on("Disconnected", (message) => {
    console.log(`User disconnected: ${message.Data}`);
    updateOnlineUsers(message);
});

// Start connection
async function startConnection() {
    try {
        await connection.start();
        console.log("SignalR Connected");
    } catch (err) {
        console.error("SignalR Connection Error:", err);
        setTimeout(startConnection, 5000);
    }
}

// Handle disconnections
connection.onclose(async () => {
    await startConnection();
});

// Get authentication token
function getAuthToken() {
    return localStorage.getItem("authToken");
}

// Start the connection
startConnection();

4. Client-Side Connection (.NET Client)

Connect from a .NET application:

using Microsoft.AspNetCore.SignalR.Client;

public class MonitorClient : IAsyncDisposable
{
    private readonly HubConnection _connection;

    public MonitorClient(string hubUrl, string accessToken)
    {
        _connection = new HubConnectionBuilder()
            .WithUrl(hubUrl, options =>
            {
                options.AccessTokenProvider = () => Task.FromResult(accessToken);
            })
            .WithAutomaticReconnect()
            .Build();

        // Register event handlers
        _connection.On<OrderEvent>("OrderCreated", OnOrderCreated);
        _connection.On<OrderEvent>("OrderStatusChanged", OnOrderStatusChanged);
        _connection.On<HubMessage<string>>("Connected", OnUserConnected);
        _connection.On<HubMessage<string>>("Disconnected", OnUserDisconnected);
    }

    public async Task StartAsync()
    {
        await _connection.StartAsync();
    }

    private void OnOrderCreated(OrderEvent orderEvent)
    {
        Console.WriteLine($"Order created: {orderEvent.OrderId}");
    }

    private void OnOrderStatusChanged(OrderEvent orderEvent)
    {
        Console.WriteLine($"Order {orderEvent.OrderId} status: {orderEvent.Status}");
    }

    private void OnUserConnected(HubMessage<string> message)
    {
        Console.WriteLine($"User connected: {message.Data}");
    }

    private void OnUserDisconnected(HubMessage<string> message)
    {
        Console.WriteLine($"User disconnected: {message.Data}");
    }

    public async ValueTask DisposeAsync()
    {
        if (_connection != null)
        {
            await _connection.DisposeAsync();
        }
    }
}

// Usage
var client = new MonitorClient("https://api.example.com/hubs/monitor", authToken);
await client.StartAsync();

Core Components

Hubs

ISynergy.Framework.AspNetCore.Monitoring.Hubs/
└── MonitorHub                    # SignalR hub with authentication

Services

ISynergy.Framework.AspNetCore.Monitoring.Services/
└── MonitorService<TEntity>       # Publish events to hub groups

Extensions

ISynergy.Framework.AspNetCore.Monitoring.Extensions/
├── ServiceCollectionExtensions   # DI configuration
├── HostApplicationBuilderExtensions  # Builder configuration
└── ApplicationBuilderExtensions  # Middleware configuration

Advanced Features

Publishing to Specific Users

The MonitorHub automatically creates groups based on user ID and account ID:

using ISynergy.Framework.Monitoring.Abstractions.Services;

public class NotificationService
{
    private readonly IMonitorService<NotificationEvent> _monitorService;

    public NotificationService(IMonitorService<NotificationEvent> monitorService)
    {
        _monitorService = monitorService;
    }

    public async Task SendToUserAsync(string userId, NotificationEvent notification)
    {
        // Send to specific user's group
        await _monitorService.PublishAsync(
            channel: userId,
            eventname: "Notification",
            data: notification);
    }

    public async Task SendToAccountAsync(Guid accountId, NotificationEvent notification)
    {
        // Send to all users in an account
        await _monitorService.PublishAsync(
            channel: accountId.ToString(),
            eventname: "Notification",
            data: notification);
    }

    public async Task BroadcastAsync(NotificationEvent notification)
    {
        // Send to all connected users
        await _monitorService.PublishAsync(
            channel: "all",
            eventname: "Notification",
            data: notification);
    }
}

Custom Event Types

Define strongly-typed events for different scenarios:

// Base event
public abstract class MonitorEvent
{
    public string EventId { get; set; } = Guid.NewGuid().ToString();
    public DateTime Timestamp { get; set; } = DateTime.UtcNow;
}

// Specific event types
public class OrderEvent : MonitorEvent
{
    public int OrderId { get; set; }
    public string Status { get; set; }
    public decimal Amount { get; set; }
}

public class InventoryEvent : MonitorEvent
{
    public int ProductId { get; set; }
    public int Quantity { get; set; }
    public string Action { get; set; } // Added, Removed, Updated
}

public class UserActivityEvent : MonitorEvent
{
    public string UserId { get; set; }
    public string Action { get; set; }
    public string Resource { get; set; }
}

// Register multiple monitor services
builder.Services.AddMonitorSignalR<OrderEvent>();
builder.Services.AddSingleton<IMonitorService<InventoryEvent>, MonitorService<InventoryEvent>>();
builder.Services.AddSingleton<IMonitorService<UserActivityEvent>, MonitorService<UserActivityEvent>>();

Connection State Management

Track connection states in your hub:

using ISynergy.Framework.AspNetCore.Monitoring.Hubs;
using Microsoft.AspNetCore.SignalR;

public class CustomMonitorHub : MonitorHub
{
    private readonly IConnectionTracker _connectionTracker;

    public CustomMonitorHub(
        ILogger<CustomMonitorHub> logger,
        IConnectionTracker connectionTracker)
        : base(logger)
    {
        _connectionTracker = connectionTracker;
    }

    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();

        var accountId = Context.User.GetAccountId();
        var userId = Context.User.GetUserId();

        // Track connection
        await _connectionTracker.AddConnectionAsync(
            Context.ConnectionId,
            userId,
            accountId);

        // Send current online users to the connected client
        var onlineUsers = await _connectionTracker.GetOnlineUsersAsync(accountId);
        await Clients.Caller.SendAsync("OnlineUsers", onlineUsers);
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        var accountId = Context.User.GetAccountId();
        var userId = Context.User.GetUserId();

        // Remove connection
        await _connectionTracker.RemoveConnectionAsync(
            Context.ConnectionId,
            userId,
            accountId);

        await base.OnDisconnectedAsync(exception);
    }
}

Real-Time Dashboard

Build a real-time monitoring dashboard:

// Backend service
public class DashboardService
{
    private readonly IMonitorService<DashboardMetric> _monitorService;
    private readonly IMetricsCollector _metricsCollector;
    private Timer _timer;

    public DashboardService(
        IMonitorService<DashboardMetric> monitorService,
        IMetricsCollector metricsCollector)
    {
        _monitorService = monitorService;
        _metricsCollector = metricsCollector;
    }

    public void StartMonitoring(Guid accountId)
    {
        _timer = new Timer(async _ =>
        {
            var metrics = await _metricsCollector.GetCurrentMetricsAsync();

            await _monitorService.PublishAsync(
                channel: accountId.ToString(),
                eventname: "DashboardUpdate",
                data: new DashboardMetric
                {
                    ActiveUsers = metrics.ActiveUsers,
                    OrdersPerHour = metrics.OrdersPerHour,
                    Revenue = metrics.Revenue,
                    ServerLoad = metrics.ServerLoad
                });
        }, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
    }
}

public class DashboardMetric
{
    public int ActiveUsers { get; set; }
    public int OrdersPerHour { get; set; }
    public decimal Revenue { get; set; }
    public double ServerLoad { get; set; }
}

Frontend (React example):

import { useEffect, useState } from 'react';
import * as signalR from '@microsoft/signalr';

interface DashboardMetric {
    activeUsers: number;
    ordersPerHour: number;
    revenue: number;
    serverLoad: number;
}

export function Dashboard() {
    const [metrics, setMetrics] = useState<DashboardMetric | null>(null);
    const [connection, setConnection] = useState<signalR.HubConnection | null>(null);

    useEffect(() => {
        const newConnection = new signalR.HubConnectionBuilder()
            .withUrl('/hubs/monitor', {
                accessTokenFactory: () => getAuthToken()
            })
            .withAutomaticReconnect()
            .build();

        newConnection.on('DashboardUpdate', (metric: DashboardMetric) => {
            setMetrics(metric);
        });

        newConnection.start()
            .then(() => console.log('Connected to monitoring hub'))
            .catch(err => console.error('Connection error:', err));

        setConnection(newConnection);

        return () => {
            newConnection.stop();
        };
    }, []);

    return (
        <div className="dashboard">
            <MetricCard
                title="Active Users"
                value={metrics?.activeUsers ?? 0}
            />
            <MetricCard
                title="Orders/Hour"
                value={metrics?.ordersPerHour ?? 0}
            />
            <MetricCard
                title="Revenue"
                value={`$${metrics?.revenue?.toFixed(2) ?? '0.00'}`}
            />
            <MetricCard
                title="Server Load"
                value={`${metrics?.serverLoad?.toFixed(1) ?? '0.0'}%`}
            />
        </div>
    );
}

Usage Examples

Real-Time Collaboration

Implement collaborative editing features:

public class DocumentService
{
    private readonly IMonitorService<DocumentChangeEvent> _monitorService;

    public DocumentService(IMonitorService<DocumentChangeEvent> monitorService)
    {
        _monitorService = monitorService;
    }

    public async Task UpdateDocumentAsync(
        Guid documentId,
        string userId,
        DocumentChange change)
    {
        // Save the change
        await SaveChangeAsync(documentId, change);

        // Notify all users viewing this document
        await _monitorService.PublishAsync(
            channel: documentId.ToString(),
            eventname: "DocumentChanged",
            data: new DocumentChangeEvent
            {
                DocumentId = documentId,
                UserId = userId,
                Change = change,
                Timestamp = DateTime.UtcNow
            });
    }
}

// Client-side (TypeScript)
connection.on("DocumentChanged", (event) => {
    if (event.userId !== currentUserId) {
        // Apply changes from other users
        applyDocumentChange(event.change);
    }
});

Real-Time Notifications

Send instant notifications to users:

public class NotificationHub
{
    private readonly IMonitorService<Notification> _monitorService;

    public NotificationHub(IMonitorService<Notification> monitorService)
    {
        _monitorService = monitorService;
    }

    public async Task SendNotificationAsync(
        string userId,
        string title,
        string message,
        NotificationType type)
    {
        await _monitorService.PublishAsync(
            channel: userId,
            eventname: "Notification",
            data: new Notification
            {
                Title = title,
                Message = message,
                Type = type,
                Timestamp = DateTime.UtcNow
            });
    }
}

// Client-side
connection.on("Notification", (notification) => {
    showToast(notification.title, notification.message, notification.type);
});

Best Practices

Use groups to efficiently broadcast messages to multiple connected clients without iterating through all connections.

Always implement automatic reconnection on the client side to handle network interruptions gracefully.

Monitor SignalR connection count and message throughput to ensure your infrastructure can handle the load.

Hub Design

  • Keep hub methods focused and simple
  • Use groups for efficient message routing
  • Implement proper authentication and authorization
  • Log connection events for monitoring
  • Handle exceptions gracefully
  • Limit message size to avoid performance issues

Scalability

  • Use Azure SignalR Service for production scaling
  • Implement backplane (Redis) for multi-server deployments
  • Monitor hub performance and connection metrics
  • Set connection limits based on server capacity
  • Use distributed caching for connection state
  • Consider message batching for high-frequency updates

Security

  • Always require authentication for sensitive hubs
  • Validate user permissions before sending messages
  • Use groups to enforce tenant isolation
  • Encrypt sensitive data in messages
  • Implement rate limiting for hub methods
  • Audit hub access and message patterns

Performance

  • Minimize message payload size
  • Batch frequent updates when possible
  • Use compression for large messages
  • Implement client-side throttling
  • Cache frequently accessed data
  • Monitor and optimize hub method execution time

Testing

Example unit tests for monitoring services:

using ISynergy.Framework.Monitoring.Abstractions.Services;
using Microsoft.AspNetCore.SignalR;
using Moq;
using Xunit;

public class MonitorServiceTests
{
    [Fact]
    public async Task PublishAsync_PublishesToCorrectGroup()
    {
        // Arrange
        var mockHubContext = new Mock<IHubContext<MonitorHub>>();
        var mockClients = new Mock<IHubClients>();
        var mockGroupClients = new Mock<IClientProxy>();

        mockHubContext.Setup(h => h.Clients).Returns(mockClients.Object);
        mockClients.Setup(c => c.Group(It.IsAny<string>())).Returns(mockGroupClients.Object);

        var service = new MonitorService<OrderEvent>(mockHubContext.Object);

        var orderEvent = new OrderEvent
        {
            OrderId = 123,
            Status = "Created"
        };

        // Act
        await service.PublishAsync("account-123", "OrderCreated", orderEvent);

        // Assert
        mockClients.Verify(c => c.Group("account-123"), Times.Once);
        mockGroupClients.Verify(
            c => c.SendCoreAsync(
                "OrderCreated",
                It.Is<object[]>(o => o[0] == orderEvent),
                default),
            Times.Once);
    }
}

Dependencies

  • Microsoft.AspNetCore.SignalR - SignalR infrastructure
  • Microsoft.AspNetCore.SignalR.Core - Core SignalR abstractions
  • ISynergy.Framework.Core - Core framework utilities
  • ISynergy.Framework.Monitoring.Abstractions - Monitoring abstractions
  • ISynergy.Framework.MessageBus - Message bus models

Documentation

For more information about the I-Synergy Framework:

  • I-Synergy.Framework.Core - Core framework components
  • I-Synergy.Framework.AspNetCore - Base ASP.NET Core integration
  • I-Synergy.Framework.AspNetCore.Authentication - Authentication utilities
  • I-Synergy.Framework.MessageBus - Message bus infrastructure
  • I-Synergy.Framework.Monitoring.Abstractions - Monitoring contracts

Support

For issues, questions, or contributions, please visit the GitHub repository.

Product Compatible and additional computed target framework versions.
.NET 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2025.11225.12213 119 12/25/2025
2025.11225.12003-preview 117 12/25/2025
2025.11218.11301 263 12/18/2025
2025.11218.10050-preview 254 12/18/2025
2025.11211.11307-preview 400 12/11/2025
2025.11211.11225-preview 395 12/11/2025
2025.11210.10145-preview 416 12/10/2025
2025.11209.11459 420 12/9/2025
2025.11209.11422-preview 425 12/9/2025
2025.11207.11553-preview 203 12/7/2025
2025.11204.11448-preview 181 12/4/2025
2025.11130.12248 415 11/30/2025
2025.11130.12134-preview 331 11/30/2025
2025.11130.11725-preview 336 11/30/2025
2025.11130.11553-preview 332 11/30/2025
2025.11130.11515-preview 333 11/30/2025
2025.11130.11420.59-preview 333 11/30/2025
2025.11130.11323.56-preview 236 11/30/2025
2025.11129.10227.14-preview 93 11/29/2025
2025.11120.10114 389 11/20/2025
2025.11119.12324.6-preview 389 11/19/2025
2025.11119.10110 394 11/19/2025
2025.11118.12340.33-preview 386 11/18/2025
2025.11117.12349.4-preview 380 11/17/2025
2025.11117.11937.47-preview 380 11/17/2025
2025.11113.11532.29-preview 266 11/13/2025
2025.11113.10128.57-preview 272 11/13/2025
2025.11110.10306.55-preview 213 11/10/2025
2025.11109.10018.48-preview 129 11/8/2025
2025.11108.10119.29-preview 105 11/8/2025
2025.11106.10037.1-preview 183 11/6/2025
2025.11105.10254.54-preview 183 11/5/2025
2025.11105.10141.16-preview 173 11/5/2025
2025.11104.12308.54-preview 175 11/4/2025
2025.11104.10144.47-preview 181 11/4/2025
2025.11102.12003.8-preview 184 11/2/2025
2025.11102.11228.52-preview 149 11/2/2025
2025.11102.10309.42-preview 125 11/2/2025
2025.11029.11433.38-preview 179 10/29/2025
2025.11029.10201.38-preview 177 10/29/2025
2025.11027.11947.55-preview 173 10/27/2025
2025.11022.12207.12-preview 163 10/22/2025
2025.11019.12053.37-preview 163 10/19/2025
2025.11016.11750.24-preview 162 10/16/2025
2025.11015.10219.44-preview 159 10/15/2025
2025.11014.10245.12-preview 165 10/14/2025
2025.11012.10130.11-preview 97 10/12/2025
2025.11010.10052.52-preview 155 10/9/2025
2025.11001.12118.13-preview 164 10/1/2025
2025.10925.10144.25-preview 182 9/25/2025
2025.10921.11353.29-preview 205 9/21/2025
2025.10913.11841.29-preview 152 9/13/2025
2025.10912.12351.59-preview 103 9/12/2025
2025.10912.10210.52-preview 172 9/12/2025
2025.10911.10131.43-preview 163 9/10/2025
2025.10910.12340.34-preview 178 9/10/2025
2025.10910.11327.15-preview 163 9/10/2025
2025.10910.11206.45-preview 171 9/10/2025
2025.10910.10230.58-preview 167 9/10/2025
2025.10908.12343.47-preview 170 9/8/2025
2025.10904.12337.35-preview 195 9/4/2025
2025.10904.12245.51-preview 180 9/4/2025
2025.10904.11425.5-preview 189 9/4/2025
2025.10904.10323.39-preview 185 9/4/2025
2025.10826.11425.3-preview 246 8/26/2025
2025.10825.12350.9-preview 194 8/25/2025
2025.10810.10248-preview 136 8/10/2025
2025.10809.10146.35-preview 170 8/9/2025
2025.10806.12031.49-preview 256 8/6/2025
2025.10806.11955.54-preview 251 8/6/2025
2025.10806.11433.24-preview 246 8/6/2025
2025.10709.10105.39-preview 171 7/8/2025
2025.10707.12320.3-preview 180 7/7/2025
2025.10706.11957.9-preview 180 7/6/2025
2025.10702.11752.47-preview 166 7/2/2025
2025.10702.11256.17-preview 177 7/2/2025
2025.10702.11119.10-preview 177 7/2/2025
2025.10702.10000.31-preview 166 7/1/2025
2025.10701.11524.1-preview 175 7/1/2025
2025.10701.11310.13-preview 184 7/1/2025
2025.10630.12022.58-preview 157 6/30/2025
2025.10612.12134.8-preview 309 6/12/2025
2025.10611.12313.53-preview 325 6/11/2025
2025.10603.10159.54-preview 166 6/3/2025
2025.10602.11908.9-preview 168 6/2/2025
2025.10601.10124.29-preview 121 5/31/2025
2025.10531.12235.29-preview 133 5/31/2025
2025.10530.10121.50-preview 182 5/29/2025
2025.10527.12202.4-preview 177 5/27/2025
2025.10526.12034.25-preview 166 5/26/2025
2025.10521.11828.30-preview 184 5/21/2025
2025.10520.11715.6-preview 173 5/20/2025
2025.10520.11515.16-preview 171 5/20/2025
2025.10518.12303.43-preview 191 5/18/2025
2025.10518.11257.36-preview 189 5/18/2025
2025.10517.12347.27-preview 133 5/17/2025
2025.10517.12003.6-preview 141 5/17/2025
2025.10516.11720.13-preview 218 5/16/2025
2025.10514.12334.2-preview 265 5/14/2025
2025.10514.10015.27-preview 262 5/13/2025
2025.10511.11032.32-preview 189 5/11/2025
2025.10413.11530 251 4/13/2025
2025.10413.11434.33-preview 220 4/13/2025
2025.10413.10205.50-preview 169 4/13/2025
2025.10412.11526.4-preview 135 4/12/2025
2025.10412.10141 158 4/12/2025
2025.10411.11811.23-preview 155 4/11/2025
2025.10411.11645.1-preview 160 4/11/2025
2025.10410.11458.35-preview 202 4/10/2025
2025.10405.10143.28-preview 125 4/5/2025
2025.10403.12208.1-preview 199 4/3/2025
2025.10403.11954.16-preview 190 4/3/2025
2025.10401.11908.24-preview 186 4/1/2025
2025.10401.11559.45-preview 191 4/1/2025
2025.10331.12215.59-preview 179 3/31/2025
2025.10331.12130.34-preview 182 3/31/2025
2025.10331.10056.40-preview 181 3/30/2025
2025.10328.10150.21-preview 164 3/28/2025
2025.10323.11359-preview 310 3/23/2025
2025.10320.11800 193 3/20/2025
2025.10320.11616.45-preview 186 3/20/2025
2025.10320.10000 187 3/19/2025
2025.10319.12311.26-preview 186 3/19/2025
2025.10319.12238.6-preview 185 3/19/2025
2025.10319.12057.59-preview 187 3/19/2025
2025.10318.10055 200 3/18/2025
2025.10317.11728.13-preview 182 3/17/2025
2025.10317.11201.3-preview 198 3/17/2025
2025.10315.11523.14-preview 114 3/15/2025
2025.10305.12342 269 3/5/2025
2025.10305.12321.9-preview 241 3/5/2025
2025.10301.12313 162 3/1/2025
2025.10301.12129.38-preview 130 3/1/2025
2025.10221.10043.29-preview 137 2/21/2025
2025.1051.1246 158 2/20/2025
2025.1051.44.54-preview 129 2/20/2025
2025.1044.1 147 2/13/2025
2025.1044.0.2-preview 134 2/13/2025
2025.1043.0.2-preview 154 2/12/2025
2025.1041.0.1-preview 144 2/10/2025
2025.1038.1 155 2/7/2025
2025.1038.0.1-preview 122 2/7/2025
2025.1035.1 157 2/4/2025
2025.1035.0.1-preview 123 2/4/2025
2025.1034.1 159 2/3/2025
2025.1034.0.1-preview 132 2/3/2025
2025.1033.0.5-preview 131 2/2/2025
2025.1033.0.3-preview 134 2/2/2025
2025.1033.0.2-preview 142 2/2/2025
2025.1033.0.1-preview 145 2/2/2025
2025.1025.1 159 1/25/2025
2025.1025.0.1-preview 138 1/25/2025
2025.1021.1 165 1/21/2025
2025.1021.0.1-preview 121 1/21/2025
2025.1020.1 141 1/20/2025
2025.1020.0.3-preview 124 1/20/2025
2025.1020.0.1-preview 133 1/20/2025
2025.1018.0.7-preview 134 1/18/2025
2025.1018.0.5-preview 126 1/18/2025
2025.1018.0.4-preview 131 1/18/2025
2025.1017.0.2-preview 108 1/17/2025
2025.1017.0.1-preview 134 1/17/2025
2025.1016.0.1-preview 125 1/16/2025
2025.1010.1 149 1/10/2025
2025.1010.0.1-preview 119 1/9/2025
2025.1009.0.3-preview 119 1/9/2025
2025.1007.1 153 1/7/2025
2025.1007.0.5-preview 117 1/7/2025
2025.1007.0.3-preview 125 1/7/2025
2025.1006.1 152 1/7/2025
2025.1005.1 170 1/5/2025
2025.1005.0.2-preview 129 1/5/2025
2025.1004.1 155 1/4/2025
2024.1366.1 161 12/31/2024
2024.1366.0.2-preview 161 12/31/2024
2024.1366.0.1-preview 153 12/31/2024
2024.1365.0.2-preview 117 12/30/2024
2024.1365.0.1-preview 132 12/30/2024
2024.1361.0.2-preview 136 12/26/2024
2024.1353.0.1-preview 137 12/18/2024
2024.1352.0.3-preview 125 12/17/2024
2024.1352.0.2-preview 122 12/17/2024
2024.1352.0.1-preview 134 12/17/2024
2024.1351.1 153 12/16/2024
2024.1351.0.3-preview 135 12/16/2024
2024.1350.1 167 12/15/2024
2024.1343.1 157 12/8/2024
2024.1339.1 154 12/4/2024
2024.1336.1 150 12/1/2024
2024.1332.1 155 11/27/2024
2024.1330.1 155 11/25/2024
2024.1328.1 155 11/23/2024
2024.1325.1 155 11/20/2024
2024.1323.1 151 11/18/2024
2024.1316.1 104 11/11/2024
2024.1307.1 108 11/2/2024
2024.1300.1 94 10/26/2024
2024.1294.1 130 10/20/2024
2024.1290.1 156 10/16/2024
2024.1283.1 168 10/8/2024
2024.1282.1 147 10/8/2024
2024.1278.1 163 10/4/2024
2024.1277.1 148 10/3/2024
2024.1275.2 155 10/1/2024
2024.1275.1 158 10/1/2024
2024.1274.1 152 9/30/2024
2024.1263.1 158 9/19/2024
2024.1261.1 200 9/17/2024
2024.1258.1 157 9/13/2024
2024.1257.1 159 9/13/2024
2024.1256.1 160 9/12/2024
2024.1254.1 161 9/10/2024
2024.1250.1 162 9/6/2024
2024.1249.1 180 9/5/2024
2024.1246.1 165 9/2/2024
2024.1245.1 155 9/1/2024
2024.1237.1 186 8/24/2024
2024.1235.0.1-preview 168 8/23/2024
2024.1230.1 157 8/18/2024
2024.1229.1 167 8/16/2024
2024.1228.1 165 8/15/2024
2024.1222.1 180 8/8/2024
2024.1221.1 150 8/7/2024
2024.1221.0.2-preview 160 8/8/2024
2024.1221.0.1-preview 152 8/8/2024
2024.1220.1 158 8/7/2024
2024.1219.0.2-preview 144 8/6/2024
2024.1219.0.1-preview 128 8/6/2024
2024.1217.0.2-preview 110 8/4/2024
2024.1217.0.1-preview 108 8/4/2024
2024.1216.0.2-preview 96 8/3/2024
2024.1216.0.1-preview 105 8/3/2024
2024.1208.0.1-preview 145 7/26/2024
2024.1207.0.7-preview 145 7/25/2024
2024.1207.0.5-preview 121 7/25/2024
2024.1166.1 170 6/14/2024
2024.1165.1 142 6/13/2024
2024.1164.1 149 6/12/2024
2024.1162.1 163 6/10/2024
2024.1158.1 170 6/6/2024
2024.1156.1 149 6/4/2024
2024.1152.1 172 5/31/2024
2024.1151.1 171 5/29/2024
2024.1150.2 163 5/29/2024
2024.1150.1 159 5/29/2024
2024.1149.1 159 5/28/2024
2024.1147.1 157 5/26/2024
2024.1146.2 150 5/25/2024
2024.1146.1 153 5/25/2024
2024.1145.1 150 5/24/2024
2024.1135.2 164 5/14/2024
2024.1135.1 138 5/14/2024
2024.1134.1 138 5/13/2024
2024.1130.1 140 5/9/2024
2024.1123.1 150 5/2/2024
2024.1121.1 182 4/30/2024
2024.1114.1 179 4/22/2024