{
    /**
     * Metadata about some SMAPI mods used in compatibility, update, and dependency checks. This
     * field shouldn't be edited by players in most cases.
     *
     * Standard fields
     * ===============
     * The predefined fields are documented below (only 'ID' is required). Each entry's key is the
     * default display name for the mod if one isn't available (e.g. in dependency checks).
     *
     *   - ID: the mod's latest unique ID (if any).
     *
     *   - FormerIDs: uniquely identifies the mod across multiple versions, and supports matching
     *     other fields if no ID was specified. This doesn't include the latest ID, if any. Multiple
     *     variants can be separated with '|'.
     *
     * Versioned metadata
     * ==================
     * Each record can also specify extra metadata using the field keys below.
     *
     * Each key consists of a field name prefixed with any combination of version range and 'Default',
     * separated by pipes (whitespace trimmed). For example, 'UpdateKey' will always override,
     * 'Default | UpdateKey' will only override if the mod has no update keys, and
     * '~1.1 | Default | Name' will do the same up to version 1.1.
     *
     * The version format is 'min~max' (where either side can be blank for unbounded), or a single
     * version number.
     *
     * These are the valid field names:
     *
     *   - UpdateKey: the update key to set in the mod's manifest. This is used to enable update
     *     checks for older mods that haven't been updated to use it yet.
     *
     *   - Status: overrides compatibility checks. The possible values are Obsolete (SMAPI won't load
     *     it because the mod should no longer be used), AssumeBroken (SMAPI won't load it because
     *     the specified version isn't compatible), or AssumeCompatible (SMAPI will try to load it
     *     even if it detects incompatible code).
     *
     *     Note that this shouldn't be set to 'AssumeBroken' if SMAPI can detect the incompatibility
     *     automatically, since that hides the details from trace logs.
     *
     *   - StatusReasonPhrase: a message to show to the player explaining why the mod can't be loaded
     *     (if applicable). If blank, will default to a generic not-compatible message.
     *
     *   - StatusReasonDetails: a technical reason shown in TRACE logs, indicating why the status
     *     was overridden. If not provided, it defaults to the StatusReasonPhrase or 'no reason given'.
     *
     *   - AlternativeUrl: a URL where the player can find an unofficial update or alternative if the
     *     mod is no longer compatible.
     */
    "ModData": {
        /*********
        ** Common dependencies for friendly errors
        *********/
        "Advanced Location Loader": {
            "ID": "Entoarox.AdvancedLocationLoader",
            "Default | UpdateKey": "Nexus:2270"
        },

        "Content Patcher": {
            "ID": "Pathoschild.ContentPatcher",
            "Default | UpdateKey": "Nexus:1915"
        },

        "Custom Farming Redux": {
            "ID": "Platonymous.CustomFarming",
            "Default | UpdateKey": "Nexus:991"
        },

        "Custom Shirts": {
            "ID": "Platonymous.CustomShirts",
            "Default | UpdateKey": "Nexus:2416"
        },

        "Entoarox Framework": {
            "ID": "Entoarox.EntoaroxFramework",
            "Default | UpdateKey": "Nexus:2269"
        },

        "JSON Assets": {
            "ID": "spacechase0.JsonAssets",
            "Default | UpdateKey": "Nexus:1720"
        },

        "Mail Framework": {
            "ID": "DIGUS.MailFrameworkMod",
            "Default | UpdateKey": "Nexus:1536"
        },

        "MTN": {
            "ID": "SgtPickles.MTN",
            "Default | UpdateKey": "Nexus:2256"
        },

        "PyTK": {
            "ID": "Platonymous.Toolkit",
            "Default | UpdateKey": "Nexus:1726"
        },

        "Rubydew": {
            "ID": "bwdy.rubydew",
            "SuppressWarnings": "UsesDynamic", // mod explicitly loads DLLs for Linux/Mac compatibility
            "Default | UpdateKey": "Nexus:3656"
        },

        "SpaceCore": {
            "ID": "spacechase0.SpaceCore",
            "Default | UpdateKey": "Nexus:1348"
        },

        "Stardust Core": {
            "ID": "Omegasis.StardustCore",
            "Default | UpdateKey": "Nexus:2341"
        },

        "TMXL Map Toolkit": {
            "ID": "Platonymous.TMXLoader",
            "Default | UpdateKey": "Nexus:1820"
        },

        /*********
        ** Obsolete
        *********/
        "Animal Mood Fix": {
            "ID": "GPeters-AnimalMoodFix",
            "~ | Status": "Obsolete",
            "~ | StatusReasonPhrase": "the animal mood bugs were fixed in Stardew Valley 1.2."
        },

        "Bee House Flower Range Fix": {
            "ID": "kirbylink.beehousefix",
            "~ | Status": "Obsolete",
            "~ | StatusReasonPhrase": "the bee house flower range was fixed in Stardew Valley 1.4."
        },

        "Colored Chests": {
            "ID": "4befde5c-731c-4853-8e4b-c5cdf946805f",
            "~ | Status": "Obsolete",
            "~ | StatusReasonPhrase": "colored chests were added in Stardew Valley 1.1."
        },

        "Modder Serialization Utility": {
            "ID": "SerializerUtils-0-1",
            "~ | Status": "Obsolete",
            "~ | StatusReasonPhrase": "it's no longer maintained or used."
        },

        "No Debug Mode": {
            "ID": "NoDebugMode",
            "~ | Status": "Obsolete",
            "~ | StatusReasonPhrase": "debug mode was removed in SMAPI 1.0."
        },

        "Split Screen": {
            "ID": "Ilyaki.SplitScreen",
            "~ | Status": "Obsolete",
            "~ | StatusReasonPhrase": "split-screen mode was added in Stardew Valley 1.5"
        },

        /*********
        ** Broke in SDV 1.5 (Content Patcher packs)
        *********/
        "mi.Mermaids": {
            "ID": "mi.Mermaids",
            "~1.0.0 | Status": "AssumeBroken",
            "~1.0.0 | StatusReasonDetails": "causes errors due to removed Stardew Valley 1.5 content"
        },

        /*********
        ** Broke in SDV 1.5 (SMAPI mods)
        *********/
        "Audio Devices": {
            "ID": "maxvollmer.audiodevices",
            "~2.0.0 | Status": "AssumeBroken",
            "~2.0.0 | StatusReasonDetails": "causes crash to desktop when starting the game"
        },

        "ChestEx": {
            "ID": "berkayylmao.ChestEx",
            "~1.3.4 | Status": "AssumeBroken",
            "~1.3.4 | StatusReasonDetails": "has no effect due to changes in Stardew Valley 1.5, causes crashes in other mods like Chests Anywhere"
        },

        "Custom Furniture": {
            "ID": "Platonymous.CustomFurniture",
            "~0.11.2 | Status": "AssumeBroken",
            "~0.11.2 | StatusReasonDetails": "causes errors and custom furniture no longer work in Stardew Valley 1.5"
        },
        
        "Custom Localization": {
            "ID": "ZaneYork.CustomLocalization",
            "FormerIDs": "SMAPI.CustomLocalization", // changed in 1.0.1
            "~1.1 | Status": "AssumeBroken",
            "~1.1 | StatusReasonDetails": "reflection error due to renamed _localizedAssets field"
        },

        "Geode Info Menu": {
            "ID": "cat.geodeinfomenu",
            "~1.5.2 | Status": "AssumeBroken",
            "~1.5.2 | StatusReasonDetails": "shows no info, freezes game if you try to search"
        },

        "Mod Settings Tab": {
            "ID": "GilarF.ModSettingsTab",
            "~0.2.1 | Status": "AssumeBroken",
            "~0.2.1 | StatusReasonDetails": "fails extending title menu"
        },

        "More Grass": {
            "ID": "EpicBellyFlop45.MoreGrass",
            "~1.0.8 | Status": "AssumeBroken",
            "~1.0.8 | StatusReasonDetails": "crashes on save load"
        },

        "Movement Speed": {
            "ID": "bcmpinc.MovementSpeed",
            "~3.0.0 | Status": "AssumeBroken",
            "~3.0.0 | StatusReasonDetails": "broken due to transpiler errors"
        },

        "Tree Spread": {
            "ID": "bcmpinc.TreeSpread",
            "~3.0.0 | Status": "AssumeBroken",
            "~3.0.0 | StatusReasonDetails": "broken due to transpiler errors"
        },

        "TreeTransplant": {
            "ID": "TreeTransplant",
            "~1.0.9 | Status": "AssumeBroken",
            "~3.0.0 | StatusReasonDetails": "breaks game launch due to AccessViolationException"
        },

        /*********
        ** Broke in SDV 1.4
        *********/
        "Auto Quality Patch": {
            "ID": "SilentOak.AutoQualityPatch",
            "~2.1.3-unofficial.7-mizzion | Status": "AssumeBroken",
            "~2.1.3-unofficial.7-mizzion | StatusReasonDetails": "broken due to runtime errors"
        },

        "Fix Dice": {
            "ID": "ashley.fixdice",
            "~1.1.2 | Status": "AssumeBroken",
            "~1.1.2 | StatusReasonDetails": "crashes game on startup"
        },

        "Invite Code Mod": {
            "ID": "KOREJJamJar.InviteCodeMod",
            "~1.0.1 | Status": "AssumeBroken"
        },

        "Loved Labels": {
            "ID": "Advize.LovedLabels",
            "~2.2.1-unofficial.2-pathoschild | Status": "AssumeBroken"
        },

        "Neat Additions": {
            "ID": "ilyaki.neatadditions",
            "~1.0.3 | Status": "AssumeBroken"
        },

        "Remote Fridge Storage": {
            "ID": "EternalSoap.RemoteFridgeStorage",
            "~1.5 | Status": "AssumeBroken"
        },

        "Stack Everything": {
            "ID": "cat.stackeverything",
            "~2.15 | Status": "AssumeBroken"
        },

        /*********
        ** Broke in SMAPI 3.0 (runtime errors due to lifecycle changes)
        *********/
        "Advancing Sprinklers": {
            "ID": "warix3.advancingsprinklers",
            "~1.0.0 | Status": "AssumeBroken"
        },

        "Better Sprinklers": {
            "ID": "Speeder.BetterSprinklers",
            "~2.3.1-unofficial.7-pathoschild | Status": "AssumeBroken"
        },

        "Current Location (Vrakyas)": {
            "ID": "Vrakyas.CurrentLocation",
            "~1.5.4 | Status": "AssumeBroken"
        },

        "Custom Adventure Guild Challenges": {
            "ID": "DefenTheNation.CustomGuildChallenges",
            "~1.8 | Status": "AssumeBroken"
        },

        "Decrafting Mod": {
            "ID": "MSCFC.DecraftingMod",
            "~1.0 | Status": "AssumeBroken",
            "~1.0 | StatusReasonDetails": "fails due to NullReferenceException in ModEntry"
        },

        "Level Extender": {
            "ID": "DevinLematty.LevelExtender",
            "~3.1 | Status": "AssumeBroken"
        },

        "Mod Update Menu": {
            "ID": "cat.modupdatemenu",
            "~1.4 | Status": "AssumeBroken"
        },

        "Quick Start": {
            "ID": "WuestMan.QuickStart",
            "~1.5 | Status": "AssumeBroken"
        },

        "Stardew Valley ESP": {
            "ID": "reimu.sdv-helper",
            "~1.1 | Status": "AssumeBroken"
        },

        "Underdark Krobus": {
            "ID": "melnoelle.underdarkkrobus",
            "~1.0 | Status": "AssumeBroken",
            "~1.0 | StatusReasonDetails": "fails due to NullReferenceException in ModEntry"
        },

        "Underdark Sewer": {
            "ID": "melnoelle.underdarksewer",
            "~1.1.0 | Status": "AssumeBroken",
            "~1.1.0 | StatusReasonDetails": "fails due to NullReferenceException in ModEntry"
        },

        /*********
        ** Broke in SDV 1.3.36
        *********/
        "2cute FarmCave": {
            "ID": "taintedwheat.2CuteFarmCave",
            "Default | UpdateKey": "Nexus:843",
            "~2.0    | Status": "AssumeBroken",
            "~2.0    | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Ace's Expanded Caves - Default Cave": {
            "ID": "Acerbicon.AECdefault",
            "Default | UpdateKey": "Nexus:2131",
            "~1.2.2  | Status": "AssumeBroken",
            "~1.2.2  | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Ace's Expanded Caves - Desert Cave": {
            "ID": "Acerbicon.AECdesert",
            "Default | UpdateKey": "Nexus:2131",
            "~1.2.2  | Status": "AssumeBroken",
            "~1.2.2  | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Ace's Expanded Caves - Ice Cave": {
            "ID": "Acerbicon.AECice",
            "Default | UpdateKey": "Nexus:2131",
            "~1.2.2  | Status": "AssumeBroken",
            "~1.2.2  | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Ace's Expanded Caves - Lava Cave": {
            "ID": "Acerbicon.AEClava",
            "Default | UpdateKey": "Nexus:2131",
            "~1.2.2  | Status": "AssumeBroken",
            "~1.2.2  | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Ace's Expanded Caves - Slime Cave": {
            "ID": "Acerbicon.AECslime",
            "Default | UpdateKey": "Nexus:2131",
            "~1.2.2  | Status": "AssumeBroken",
            "~1.2.2  | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Green Pastures Farm": {
            "ID": "bugbuddy.GreenPasturesFarm",
            "Default | UpdateKey": "Nexus:2326",
            "~1.0    | Status": "AssumeBroken",
            "~1.0    | StatusReasonDetails": "references the deleted Content/weapons asset"
        },

        "Immersive Farm 2": {
            "ID": "zander.immersivefarm2",
            "~2.0.1 | Status": "AssumeBroken",
            "~2.0.1 | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        "Karmylla's Immersive Map Edits": {
            "ID": "Karmylla.ImmersiveMapEdits",
            "Default | UpdateKey": "Nexus:1149",
            "~2.4    | Status": "AssumeBroken",
            "~2.4    | StatusReasonDetails": "references the deleted Content/weapons asset"
        },

        "Secret Gardens Greenhouse": {
            "ID": "jessebot.secretgardens",
            "Default | UpdateKey": "Nexus:3067",
            "~2.0.1  | Status": "AssumeBroken",
            "~2.0.1  | StatusReasonDetails": "references the deleted Content/Mine asset"
        },

        /*********
        ** Broke circa SDV 1.3
        *********/
        "Canon-Friendly Dialogue Expansion": {
            "ID": "gizzymo.canonfriendlyexpansion",
            "~1.1.1 | Status": "AssumeBroken",
            "~1.1.1 | StatusReasonDetails": "causes a save crash on certain dates"
        },

        "Everytime Submarine": {
            "ID": "MustafaDemirel.EverytimeSubmarine",
            "~1.0.0 | Status": "AssumeBroken",
            "~1.1.1 | StatusReasonDetails": "breaks player saves if their beach bridge is fixed"
        },

        "BJS Night Sounds": {
            "ID": "BunnyJumps.BJSNightSounds",
            "~1.0.0 | Status": "AssumeBroken",
            "~1.0.0 | StatusReasonDetails": "runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+"
        },

        "Fishing Adjust": {
            "ID": "shuaiz.FishingAdjustMod",
            "~2.0.1 | Status": "AssumeBroken",
            "~2.0.1 | StatusReasonDetails":  "fails with 'method not found' error for 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'"
        },

        "Fishing Automaton": {
            "ID": "Drynwynn.FishingAutomaton",
            "~1.1 | Status": "AssumeBroken",
            "~1.1 | StatusReasonDetails":  "runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+"
        },

        "More Silo Storage": {
            "ID": "OrneryWalrus.MoreSiloStorage",
            "~1.0.1 | Status": "AssumeBroken"
        },

        "No Added Flying Mine Monsters": {
            "ID": "Drynwynn.NoAddedFlyingMineMonsters",
            "~1.1 | Status": "AssumeBroken",
            "~1.1 | StatusReasonDetails": "runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+"
        },

        "Server Bookmarker": {
            "ID": "Ilyaki.ServerBookmarker",
            "~1.0.0 | Status": "AssumeBroken",
            "~1.0.0 | StatusReasonDetails": "runtime errors in Stardew Valley 1.3.29"
        },

        "Stephan's Lots of Crops": {
            "ID": "stephansstardewcrops",
            "~1.1 | Status": "AssumeBroken",
            "~1.1 | StatusReasonDetails": "causes errors due to overwritten Stardew Valley 1.3 items"
        }
    }
}