diff --git a/src/MysqlMigrations/Migrations/20241202131932_Patch241130.Designer.cs b/src/MysqlMigrations/Migrations/20241202131932_Patch241130.Designer.cs
new file mode 100644
index 00000000..8a32b990
--- /dev/null
+++ b/src/MysqlMigrations/Migrations/20241202131932_Patch241130.Designer.cs
@@ -0,0 +1,2370 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using dsstats.db8;
+
+#nullable disable
+
+namespace MysqlMigrations.Migrations
+{
+ [DbContext(typeof(ReplayContext))]
+ [Migration("20241202131932_Patch241130")]
+ partial class Patch241130
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.11")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
+
+ modelBuilder.Entity("DsAbilityDsUnit", b =>
+ {
+ b.Property("AbilitiesDsAbilityId")
+ .HasColumnType("int");
+
+ b.Property("DsUnitsDsUnitId")
+ .HasColumnType("int");
+
+ b.HasKey("AbilitiesDsAbilityId", "DsUnitsDsUnitId");
+
+ b.HasIndex("DsUnitsDsUnitId");
+
+ b.ToTable("DsAbilityDsUnit");
+ });
+
+ modelBuilder.Entity("ReplayUploader", b =>
+ {
+ b.Property("ReplaysReplayId")
+ .HasColumnType("int");
+
+ b.Property("UploadersUploaderId")
+ .HasColumnType("int");
+
+ b.HasKey("ReplaysReplayId", "UploadersUploaderId");
+
+ b.HasIndex("UploadersUploaderId");
+
+ b.ToTable("UploaderReplays", (string)null);
+ });
+
+ modelBuilder.Entity("dsstats.db8.ArcadePlayerRating", b =>
+ {
+ b.Property("ArcadePlayerRatingId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadePlayerRatingId"));
+
+ b.Property("Confidence")
+ .HasColumnType("double");
+
+ b.Property("Consistency")
+ .HasColumnType("double");
+
+ b.Property("Games")
+ .HasColumnType("int");
+
+ b.Property("IsUploader")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Main")
+ .HasColumnType("int");
+
+ b.Property("MainCount")
+ .HasColumnType("int");
+
+ b.Property("Mvp")
+ .HasColumnType("int");
+
+ b.Property("PlayerId")
+ .HasColumnType("int");
+
+ b.Property("Pos")
+ .HasColumnType("int");
+
+ b.Property("Rating")
+ .HasColumnType("double");
+
+ b.Property("RatingType")
+ .HasColumnType("int");
+
+ b.Property("TeamGames")
+ .HasColumnType("int");
+
+ b.Property("Wins")
+ .HasColumnType("int");
+
+ b.HasKey("ArcadePlayerRatingId");
+
+ b.HasIndex("PlayerId");
+
+ b.HasIndex("RatingType");
+
+ b.ToTable("ArcadePlayerRatings");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ArcadePlayerRatingChange", b =>
+ {
+ b.Property("ArcadePlayerRatingChangeId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadePlayerRatingChangeId"));
+
+ b.Property("ArcadePlayerRatingId")
+ .HasColumnType("int");
+
+ b.Property("Change10d")
+ .HasColumnType("float");
+
+ b.Property("Change24h")
+ .HasColumnType("float");
+
+ b.Property("Change30d")
+ .HasColumnType("float");
+
+ b.HasKey("ArcadePlayerRatingChangeId");
+
+ b.HasIndex("ArcadePlayerRatingId")
+ .IsUnique();
+
+ b.ToTable("ArcadePlayerRatingChanges");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ArcadeReplay", b =>
+ {
+ b.Property("ArcadeReplayId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayId"));
+
+ b.Property("BnetBucketId")
+ .HasColumnType("bigint");
+
+ b.Property("BnetRecordId")
+ .HasColumnType("bigint");
+
+ b.Property("CreatedAt")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("Duration")
+ .HasColumnType("int");
+
+ b.Property("GameMode")
+ .HasColumnType("int");
+
+ b.Property("Imported")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("PlayerCount")
+ .HasColumnType("int");
+
+ b.Property("RegionId")
+ .HasColumnType("int");
+
+ b.Property("ReplayHash")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("TournamentEdition")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("WinnerTeam")
+ .HasColumnType("int");
+
+ b.HasKey("ArcadeReplayId");
+
+ b.HasIndex("ReplayHash");
+
+ b.HasIndex("GameMode", "CreatedAt");
+
+ b.HasIndex("RegionId", "BnetBucketId", "BnetRecordId")
+ .IsUnique();
+
+ b.HasIndex("RegionId", "GameMode", "CreatedAt");
+
+ b.ToTable("ArcadeReplays");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayer", b =>
+ {
+ b.Property("ArcadeReplayDsPlayerId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayDsPlayerId"));
+
+ b.Property("ArcadeReplayId")
+ .HasColumnType("int");
+
+ b.Property("Discriminator")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("PlayerId")
+ .HasColumnType("int");
+
+ b.Property("PlayerResult")
+ .HasColumnType("int");
+
+ b.Property("SlotNumber")
+ .HasColumnType("int");
+
+ b.Property("Team")
+ .HasColumnType("int");
+
+ b.HasKey("ArcadeReplayDsPlayerId");
+
+ b.HasIndex("ArcadeReplayId");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("ArcadeReplayDsPlayers");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ArcadeReplayDsPlayerRating", b =>
+ {
+ b.Property("ArcadeReplayDsPlayerRatingId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayDsPlayerRatingId"));
+
+ b.Property("ArcadeReplayDsPlayerId")
+ .HasColumnType("int");
+
+ b.Property("ArcadeReplayRatingId")
+ .HasColumnType("int");
+
+ b.Property("Confidence")
+ .HasColumnType("float");
+
+ b.Property("Consistency")
+ .HasColumnType("float");
+
+ b.Property("GamePos")
+ .HasColumnType("int");
+
+ b.Property("Games")
+ .HasColumnType("int");
+
+ b.Property("Rating")
+ .HasColumnType("float");
+
+ b.Property("RatingChange")
+ .HasColumnType("float");
+
+ b.HasKey("ArcadeReplayDsPlayerRatingId");
+
+ b.HasIndex("ArcadeReplayDsPlayerId")
+ .IsUnique();
+
+ b.HasIndex("ArcadeReplayRatingId");
+
+ b.ToTable("ArcadeReplayDsPlayerRatings");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ArcadeReplayRating", b =>
+ {
+ b.Property("ArcadeReplayRatingId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ArcadeReplayRatingId"));
+
+ b.Property("ArcadeReplayId")
+ .HasColumnType("int");
+
+ b.Property("AvgRating")
+ .HasColumnType("int");
+
+ b.Property("ExpectationToWin")
+ .HasColumnType("float");
+
+ b.Property("LeaverType")
+ .HasColumnType("int");
+
+ b.Property("RatingType")
+ .HasColumnType("int");
+
+ b.HasKey("ArcadeReplayRatingId");
+
+ b.HasIndex("ArcadeReplayId")
+ .IsUnique();
+
+ b.ToTable("ArcadeReplayRatings");
+ });
+
+ modelBuilder.Entity("dsstats.db8.BattleNetInfo", b =>
+ {
+ b.Property("BattleNetInfoId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("BattleNetInfoId"));
+
+ b.Property("BattleNetId")
+ .HasColumnType("int");
+
+ b.Property("UploaderId")
+ .HasColumnType("int");
+
+ b.HasKey("BattleNetInfoId");
+
+ b.HasIndex("UploaderId");
+
+ b.ToTable("BattleNetInfos");
+ });
+
+ modelBuilder.Entity("dsstats.db8.BonusDamage", b =>
+ {
+ b.Property("BonusDamageId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("BonusDamageId"));
+
+ b.Property("Damage")
+ .HasColumnType("int");
+
+ b.Property("DsWeaponId")
+ .HasColumnType("int");
+
+ b.Property("PerUpgrade")
+ .HasColumnType("int");
+
+ b.Property("UnitType")
+ .HasColumnType("int");
+
+ b.HasKey("BonusDamageId");
+
+ b.HasIndex("DsWeaponId");
+
+ b.HasIndex("UnitType");
+
+ b.ToTable("BonusDamages");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ComboPlayerRating", b =>
+ {
+ b.Property("ComboPlayerRatingId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ComboPlayerRatingId"));
+
+ b.Property("Confidence")
+ .HasColumnType("double");
+
+ b.Property("Consistency")
+ .HasColumnType("double");
+
+ b.Property("Games")
+ .HasColumnType("int");
+
+ b.Property("PlayerId")
+ .HasColumnType("int");
+
+ b.Property("Pos")
+ .HasColumnType("int");
+
+ b.Property("Rating")
+ .HasColumnType("double");
+
+ b.Property("RatingType")
+ .HasColumnType("int");
+
+ b.Property("Wins")
+ .HasColumnType("int");
+
+ b.HasKey("ComboPlayerRatingId");
+
+ b.HasIndex("PlayerId");
+
+ b.HasIndex("RatingType");
+
+ b.ToTable("ComboPlayerRatings");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ComboReplayPlayerRating", b =>
+ {
+ b.Property("ComboReplayPlayerRatingId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ComboReplayPlayerRatingId"));
+
+ b.Property("Change")
+ .HasPrecision(5, 2)
+ .HasColumnType("double");
+
+ b.Property("Confidence")
+ .HasPrecision(5, 2)
+ .HasColumnType("double");
+
+ b.Property("Consistency")
+ .HasPrecision(5, 2)
+ .HasColumnType("double");
+
+ b.Property("GamePos")
+ .HasColumnType("int");
+
+ b.Property("Games")
+ .HasColumnType("int");
+
+ b.Property("Rating")
+ .HasColumnType("int");
+
+ b.Property("ReplayPlayerId")
+ .HasColumnType("int");
+
+ b.HasKey("ComboReplayPlayerRatingId");
+
+ b.HasIndex("ReplayPlayerId")
+ .IsUnique();
+
+ b.ToTable("ComboReplayPlayerRatings");
+ });
+
+ modelBuilder.Entity("dsstats.db8.ComboReplayRating", b =>
+ {
+ b.Property("ComboReplayRatingId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ComboReplayRatingId"));
+
+ b.Property("AvgRating")
+ .HasColumnType("int");
+
+ b.Property("ExpectationToWin")
+ .HasPrecision(5, 2)
+ .HasColumnType("double");
+
+ b.Property("IsPreRating")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("LeaverType")
+ .HasColumnType("int");
+
+ b.Property("RatingType")
+ .HasColumnType("int");
+
+ b.Property("ReplayId")
+ .HasColumnType("int");
+
+ b.HasKey("ComboReplayRatingId");
+
+ b.HasIndex("RatingType");
+
+ b.HasIndex("ReplayId")
+ .IsUnique();
+
+ b.ToTable("ComboReplayRatings");
+ });
+
+ modelBuilder.Entity("dsstats.db8.CommanderMmr", b =>
+ {
+ b.Property("CommanderMmrId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("CommanderMmrId"));
+
+ b.Property("AntiSynergyMmr")
+ .HasColumnType("double");
+
+ b.Property("OppRace")
+ .HasColumnType("int");
+
+ b.Property("Race")
+ .HasColumnType("int");
+
+ b.Property("SynergyMmr")
+ .HasColumnType("double");
+
+ b.HasKey("CommanderMmrId");
+
+ b.HasIndex("Race", "OppRace");
+
+ b.ToTable("CommanderMmrs");
+ });
+
+ modelBuilder.Entity("dsstats.db8.DsAbility", b =>
+ {
+ b.Property("DsAbilityId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsAbilityId"));
+
+ b.Property("AbilityTarget")
+ .HasColumnType("int");
+
+ b.Property("AoeRadius")
+ .HasColumnType("float");
+
+ b.Property("CastRange")
+ .HasColumnType("int");
+
+ b.Property("Commander")
+ .HasColumnType("int");
+
+ b.Property("Cooldown")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(310)
+ .HasColumnType("varchar(310)");
+
+ b.Property("EnergyCost")
+ .HasColumnType("float");
+
+ b.Property("GlobalTimer")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.Property("Requirements")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.HasKey("DsAbilityId");
+
+ b.HasIndex("Name");
+
+ b.ToTable("DsAbilities");
+ });
+
+ modelBuilder.Entity("dsstats.db8.DsPickBan", b =>
+ {
+ b.Property("DsPickBanId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsPickBanId"));
+
+ b.Property("Bans")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("PickBanMode")
+ .HasColumnType("int");
+
+ b.Property("Picks")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Time")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.HasKey("DsPickBanId");
+
+ b.ToTable("DsPickBans");
+ });
+
+ modelBuilder.Entity("dsstats.db8.DsUnit", b =>
+ {
+ b.Property("DsUnitId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsUnitId"));
+
+ b.Property("Armor")
+ .HasColumnType("int");
+
+ b.Property("Color")
+ .HasColumnType("int");
+
+ b.Property("Commander")
+ .HasColumnType("int");
+
+ b.Property("Cost")
+ .HasColumnType("int");
+
+ b.Property("EnergyRegen")
+ .HasColumnType("float");
+
+ b.Property("HealthRegen")
+ .HasColumnType("float");
+
+ b.Property("Life")
+ .HasColumnType("int");
+
+ b.Property("MaxEnergy")
+ .HasColumnType("int");
+
+ b.Property("MovementType")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.Property("ShieldArmor")
+ .HasColumnType("int");
+
+ b.Property("Shields")
+ .HasColumnType("int");
+
+ b.Property("Size")
+ .HasColumnType("int");
+
+ b.Property("Speed")
+ .HasColumnType("float");
+
+ b.Property("StartingEnergy")
+ .HasColumnType("int");
+
+ b.Property("Tier")
+ .HasColumnType("int");
+
+ b.Property("UnitId")
+ .HasColumnType("int");
+
+ b.Property("UnitType")
+ .HasColumnType("int");
+
+ b.HasKey("DsUnitId");
+
+ b.HasIndex("Commander");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("Name", "Commander");
+
+ b.ToTable("DsUnits");
+ });
+
+ modelBuilder.Entity("dsstats.db8.DsUpdate", b =>
+ {
+ b.Property("DsUpdateId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsUpdateId"));
+
+ b.Property("Change")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Commander")
+ .HasColumnType("int");
+
+ b.Property("DiscordId")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Time")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.HasKey("DsUpdateId");
+
+ b.HasIndex("Time");
+
+ b.ToTable("DsUpdates");
+ });
+
+ modelBuilder.Entity("dsstats.db8.DsUpgrade", b =>
+ {
+ b.Property("DsUpgradeId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsUpgradeId"));
+
+ b.Property("Commander")
+ .HasColumnType("int");
+
+ b.Property("Cost")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(300)
+ .HasColumnType("varchar(300)");
+
+ b.Property("DsUnitId")
+ .HasColumnType("int");
+
+ b.Property("RequiredTier")
+ .HasColumnType("int");
+
+ b.Property("Upgrade")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.HasKey("DsUpgradeId");
+
+ b.HasIndex("DsUnitId");
+
+ b.HasIndex("Upgrade");
+
+ b.ToTable("DsUpgrades");
+ });
+
+ modelBuilder.Entity("dsstats.db8.DsWeapon", b =>
+ {
+ b.Property("DsWeaponId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("DsWeaponId"));
+
+ b.Property("AttackSpeed")
+ .HasColumnType("float");
+
+ b.Property("Attacks")
+ .HasColumnType("int");
+
+ b.Property("CanTarget")
+ .HasColumnType("int");
+
+ b.Property("Damage")
+ .HasColumnType("int");
+
+ b.Property("DamagePerUpgrade")
+ .HasColumnType("int");
+
+ b.Property("DsUnitId")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.Property("Range")
+ .HasColumnType("float");
+
+ b.HasKey("DsWeaponId");
+
+ b.HasIndex("DsUnitId");
+
+ b.ToTable("DsWeapons");
+ });
+
+ modelBuilder.Entity("dsstats.db8.Event", b =>
+ {
+ b.Property("EventId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("EventId"));
+
+ b.Property("EventGuid")
+ .HasColumnType("char(36)");
+
+ b.Property("EventStart")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("ExternalLink")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("GameMode")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("WinnerTeam")
+ .HasColumnType("longtext");
+
+ b.HasKey("EventId");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("Events");
+ });
+
+ modelBuilder.Entity("dsstats.db8.Faq", b =>
+ {
+ b.Property("FaqId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("FaqId"));
+
+ b.Property("Answer")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("varchar(400)");
+
+ b.Property("CreatedAt")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("CreatedBy")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)");
+
+ b.Property("Level")
+ .HasColumnType("int");
+
+ b.Property("Question")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)");
+
+ b.Property("UpdatedAt")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("Upvotes")
+ .HasColumnType("int");
+
+ b.HasKey("FaqId");
+
+ b.HasIndex("Question");
+
+ b.ToTable("Faqs");
+ });
+
+ modelBuilder.Entity("dsstats.db8.FaqVote", b =>
+ {
+ b.Property("FaqVoteId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("FaqVoteId"));
+
+ b.Property("FaqId")
+ .HasColumnType("int");
+
+ b.HasKey("FaqVoteId");
+
+ b.ToTable("FaqVotes");
+ });
+
+ modelBuilder.Entity("dsstats.db8.FunStatsMemory", b =>
+ {
+ b.Property("FunStatsMemoryId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("FunStatsMemoryId"));
+
+ b.Property("AvgGameDuration")
+ .HasColumnType("int");
+
+ b.Property("Created")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("FirstReplay")
+ .HasColumnType("longtext");
+
+ b.Property("GreatestArmyReplay")
+ .HasColumnType("longtext");
+
+ b.Property("GreatestComebackReplay")
+ .HasColumnType("longtext");
+
+ b.Property("MostCompetitiveReplay")
+ .HasColumnType("longtext");
+
+ b.Property("MostUpgradesReplay")
+ .HasColumnType("longtext");
+
+ b.Property("RatingType")
+ .HasColumnType("int");
+
+ b.Property("TimePeriod")
+ .HasColumnType("int");
+
+ b.Property("TotalTimePlayed")
+ .HasColumnType("bigint");
+
+ b.Property("UnitCountLeast")
+ .HasColumnType("int");
+
+ b.Property("UnitCountMost")
+ .HasColumnType("int");
+
+ b.Property("UnitNameLeast")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("UnitNameMost")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("FunStatsMemoryId");
+
+ b.ToTable("FunStatMemories");
+ });
+
+ modelBuilder.Entity("dsstats.db8.GroupByHelper", b =>
+ {
+ b.Property("Count")
+ .HasColumnType("int");
+
+ b.Property("Group")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("Name");
+
+ b.ToTable((string)null);
+
+ b.ToView("GroupByHelper", (string)null);
+ });
+
+ modelBuilder.Entity("dsstats.db8.IhSession", b =>
+ {
+ b.Property("IhSessionId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("IhSessionId"));
+
+ b.Property("Closed")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Created")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("Games")
+ .HasColumnType("int");
+
+ b.Property("GroupId")
+ .HasColumnType("char(36)");
+
+ b.Property("GroupState")
+ .HasColumnType("longtext");
+
+ b.Property("GroupStateV2")
+ .HasColumnType("longtext");
+
+ b.Property("Players")
+ .HasColumnType("int");
+
+ b.Property("RatingType")
+ .HasColumnType("int");
+
+ b.HasKey("IhSessionId");
+
+ b.HasIndex("GroupId")
+ .IsUnique();
+
+ b.ToTable("IhSessions");
+ });
+
+ modelBuilder.Entity("dsstats.db8.IhSessionPlayer", b =>
+ {
+ b.Property("IhSessionPlayerId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("IhSessionPlayerId"));
+
+ b.Property("Games")
+ .HasColumnType("int");
+
+ b.Property("IhSessionId")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Obs")
+ .HasColumnType("int");
+
+ b.Property("Performance")
+ .HasColumnType("int");
+
+ b.Property("PlayerId")
+ .HasColumnType("int");
+
+ b.Property("RatingEnd")
+ .HasColumnType("int");
+
+ b.Property("RatingStart")
+ .HasColumnType("int");
+
+ b.Property("Wins")
+ .HasColumnType("int");
+
+ b.HasKey("IhSessionPlayerId");
+
+ b.HasIndex("IhSessionId");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("IhSessionPlayers");
+ });
+
+ modelBuilder.Entity("dsstats.db8.MaterializedArcadeReplay", b =>
+ {
+ b.Property("MaterializedArcadeReplayId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("MaterializedArcadeReplayId"));
+
+ b.Property("ArcadeReplayId")
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("Duration")
+ .HasColumnType("int");
+
+ b.Property("GameMode")
+ .HasColumnType("int");
+
+ b.Property("WinnerTeam")
+ .HasColumnType("int");
+
+ b.HasKey("MaterializedArcadeReplayId");
+
+ b.HasIndex("CreatedAt");
+
+ b.ToTable("MaterializedArcadeReplays");
+ });
+
+ modelBuilder.Entity("dsstats.db8.NoUploadResult", b =>
+ {
+ b.Property("NoUploadResultId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("NoUploadResultId"));
+
+ b.Property("Created")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("LatestNoUpload")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("LatestReplay")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("LatestUpload")
+ .HasPrecision(0)
+ .HasColumnType("datetime(0)");
+
+ b.Property("NoUploadDefeats")
+ .HasColumnType("int");
+
+ b.Property("NoUploadTotal")
+ .HasColumnType("int");
+
+ b.Property("PlayerId")
+ .HasColumnType("int");
+
+ b.Property("TotalReplays")
+ .HasColumnType("int");
+
+ b.HasKey("NoUploadResultId");
+
+ b.HasIndex("PlayerId");
+
+ b.ToTable("NoUploadResults");
+ });
+
+ modelBuilder.Entity("dsstats.db8.Player", b =>
+ {
+ b.Property("PlayerId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PlayerId"));
+
+ b.Property("ArcadeDefeatsSinceLastUpload")
+ .HasColumnType("int");
+
+ b.Property("DisconnectCount")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("NotUploadCount")
+ .HasColumnType("int");
+
+ b.Property("RageQuitCount")
+ .HasColumnType("int");
+
+ b.Property("RealmId")
+ .HasColumnType("int");
+
+ b.Property("RegionId")
+ .HasColumnType("int");
+
+ b.Property