From 33c6ea31c5bbaa7b67cf70c5d30a379c78236e1e Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Mon, 6 Apr 2026 23:38:55 -0400 Subject: [PATCH 01/28] make it actually work --- libs.versions.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs.versions.toml b/libs.versions.toml index 836285c..0a9c66c 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -2,9 +2,10 @@ loom = "1.15-SNAPSHOT" minotaur = "2.+" -mc = "26.1-snapshot-9" +mc = "26.1.1" +# https://fabricmc.net/develop/ fl = "0.18.4" -fapi = "0.143.5+26.1" +fapi = "0.145.4+26.1.1" [plugins] loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } From 21f24a4ac5b2df0a99d28b45c4f519e37341ad37 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Mon, 6 Apr 2026 23:39:59 -0400 Subject: [PATCH 02/28] move the version catalog to the standard location gradle can import it automatically, and it's good to follow the standard --- libs.versions.toml => gradle/libs.versions.toml | 0 settings.gradle | 8 -------- 2 files changed, 8 deletions(-) rename libs.versions.toml => gradle/libs.versions.toml (100%) diff --git a/libs.versions.toml b/gradle/libs.versions.toml similarity index 100% rename from libs.versions.toml rename to gradle/libs.versions.toml diff --git a/settings.gradle b/settings.gradle index dce0b1d..d6b700e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,11 +4,3 @@ pluginManagement { gradlePluginPortal() } } - -dependencyResolutionManagement { - versionCatalogs { - create("libs") { - from(files("libs.versions.toml")) - } - } -} From ef783b18ea4d185b030827915b03bcebe47108b5 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Mon, 6 Apr 2026 23:41:20 -0400 Subject: [PATCH 03/28] remove multiProjectOptimisation this is *long* gone. removed in loom 1.8 --- gradle.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 8692522..dcfd307 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,7 @@ org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 org.gradle.caching=true org.gradle.configureondemand=true org.gradle.configuration-cache=true -# Loom -fabric.loom.multiProjectOptimisation=true + # Mod Metadata group=io.github.username user=username From 5553cf7305302c326791ea0ead5e505d68a9894a Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Mon, 6 Apr 2026 23:56:28 -0400 Subject: [PATCH 04/28] add more gradle flags - parallel: enable parallel mode. should be on by default IMO. - caching: enable the build cache (https://docs.gradle.org/current/userguide/build_cache.html) - configuration-cache: enable the config cache (https://docs.gradle.org/current/userguide/configuration_cache.html) - configuration-cache.parallel: enable additional parallelization of the config cache (https://docs.gradle.org/current/userguide/configuration_cache_enabling.html#config_cache:usage:parallel) - configureondemand: avoids configuring projects that aren't needed for a build (https://docs.gradle.org/current/userguide/configuration_on_demand.html) - warning.mode: enabled all warnings, to catch problems before they become errors These flags are pretty stable, but may cause issues with some use cases. For a simple mod project, they should all work fine and provide significant performance boosts. It's possible to also enable isolated projects, but that is known to not be fully compatible with loom yet. It's also still incubating, and labeled as unsafe. (https://docs.gradle.org/current/userguide/isolated_projects.html) --- gradle.properties | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index dcfd307..0f6337a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,15 @@ # Gradle org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 + +# various flags to optimize Gradle performance. +org.gradle.parallel=true org.gradle.caching=true -org.gradle.configureondemand=true org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true +org.gradle.configureondemand=true + +# enable all Gradle warnings +org.gradle.warning.mode=all # Mod Metadata group=io.github.username From e0ee0b72c6324788f2b70f4719cf982e4c722748 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Mon, 6 Apr 2026 23:59:05 -0400 Subject: [PATCH 05/28] resolve warnings --- build.gradle | 6 ++---- settings.gradle | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 43c6a05..2b5a9ca 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,3 @@ -//file:noinspection GroovyAssignabilityCheck -//file:noinspection GroovyAccessibility plugins { id "maven-publish" alias libs.plugins.loom @@ -70,7 +68,7 @@ publishing { repositories { } publications { - mavenJava(MavenPublication) { + register("mavenJava", MavenPublication) { from components.java } } @@ -79,7 +77,7 @@ publishing { modrinth { token = "$System.env.MODRINTH_TOKEN" projectId = slug - versionNumber = project.version + versionNumber = project.version.toString() uploadFile = jar gameVersions = compatibleVersions.split(", ").toList() loaders = compatibleLoaders.split(", ").toList() diff --git a/settings.gradle b/settings.gradle index d6b700e..0932734 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,6 @@ pluginManagement { repositories { - maven { url "https://maven.fabricmc.net/" } + maven { url = "https://maven.fabricmc.net/" } gradlePluginPortal() } } From da4a38b9590b374947045746be31ddf341f92dcc Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 02:58:20 -0400 Subject: [PATCH 06/28] use providers for environment variables this is required for configuration cache support --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2b5a9ca..b82b1bd 100644 --- a/build.gradle +++ b/build.gradle @@ -75,13 +75,13 @@ publishing { } modrinth { - token = "$System.env.MODRINTH_TOKEN" + token.set(providers.environmentVariable("MODRINTH_TOKEN")) projectId = slug versionNumber = project.version.toString() uploadFile = jar gameVersions = compatibleVersions.split(", ").toList() loaders = compatibleLoaders.split(", ").toList() - changelog = "$System.env.CHANGELOG" + changelog.set(providers.environmentVariable("CHANGELOG")) syncBodyFrom = "\n" + rootProject.file("README.md").text dependencies { required.version "fabric-api", libs.versions.fapi.get() From 149f4b278231ed748ca47221ab353f2a9125c2d7 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:08:45 -0400 Subject: [PATCH 07/28] port buildscript to kts better IDE support, official best practice. https://docs.gradle.org/current/userguide/best_practices_general.html#use_kotlin_dsl --- build.gradle | 89 ---------------------- build.gradle.kts | 100 +++++++++++++++++++++++++ settings.gradle => settings.gradle.kts | 2 +- 3 files changed, 101 insertions(+), 90 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts rename settings.gradle => settings.gradle.kts (56%) diff --git a/build.gradle b/build.gradle deleted file mode 100644 index b82b1bd..0000000 --- a/build.gradle +++ /dev/null @@ -1,89 +0,0 @@ -plugins { - id "maven-publish" - alias libs.plugins.loom - alias libs.plugins.minotaur -} - -version = "$modVersion+$branchName" -base.archivesName = project.slug - -repositories { - // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven - // To use in a dependency, use: maven.modrinth:mod-id - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } - } - filter { - includeGroup("maven.modrinth") - } - } -} - -dependencies { - minecraft libs.mc - - implementation libs.fl - implementation libs.fapi -} - -processResources { - final Map meta = [ - version : version, - modId : modId, - modName : modName, - modDescription: modDescription, - homepage : "https://modrinth.com/mod/${slug}", - issues : "https://github.com/${user}/${slug}/issues", - sources : "https://github.com/${user}/${slug}", - license : license, - authors : authors.split(", ").join("\",\n \""), - contributors : contributors.split(", ").join("\",\n \""), - members : "${authors}${contributors ? ". Contributions by ${contributors}." : ""}", - mc : compatibleVersions.split(", ")[0], - fl : libs.versions.fl.get(), - fapi : libs.versions.fapi.get(), - ] - inputs.properties meta - filesMatching("*.mod.json") { expand(meta) } - filesMatching("META-INF/*mods.toml") { expand(meta) } -} - -tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - it.options.release = 25 -} - -java { - withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_25 - targetCompatibility = JavaVersion.VERSION_25 -} - - -publishing { - repositories { - } - publications { - register("mavenJava", MavenPublication) { - from components.java - } - } -} - -modrinth { - token.set(providers.environmentVariable("MODRINTH_TOKEN")) - projectId = slug - versionNumber = project.version.toString() - uploadFile = jar - gameVersions = compatibleVersions.split(", ").toList() - loaders = compatibleLoaders.split(", ").toList() - changelog.set(providers.environmentVariable("CHANGELOG")) - syncBodyFrom = "\n" + rootProject.file("README.md").text - dependencies { - required.version "fabric-api", libs.versions.fapi.get() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..a4552a9 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,100 @@ +plugins { + alias(libs.plugins.loom) + alias(libs.plugins.minotaur) + `maven-publish` +} + +val modVersion: String by project +val branchName: String by project +val slug: String by project + +version = "$modVersion+$branchName" +base.archivesName = slug + +repositories { + // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven + // To use in a dependency, use: maven.modrinth:mod-id + exclusiveContent { + forRepositories(maven("https://api.modrinth.com/maven")).filter { + includeGroup("maven.modrinth") + } + } +} + +dependencies { + minecraft(libs.mc) + + implementation(libs.fl) + implementation(libs.fapi) +} + +tasks.processResources { + val user: String by project + val authors: String by project + val contributors: String by project + + val meta: Map = mapOf( + "version" to project.version, + "modId" to providers.gradleProperty("modId"), + "modName" to providers.gradleProperty("modName"), + "modDescription" to providers.gradleProperty("modDescription"), + "homepage" to "https://modrinth.com/mod/$slug", + "issues" to "https://github.com/$user/$slug/issues", + "sources" to "https://github.com/$user/$slug", + "license" to providers.gradleProperty("license"), + "authors" to authors.split(", ").joinToString("\",\n \""), + "contributors" to contributors.split(", ").joinToString("\",\n \""), + "members" to "$authors${if (contributors.isEmpty()) "" else ". Contributions by $contributors."}", + "mc" to providers.gradleProperty("compatibleVersions").map { it.split(", ")[0] }, + "fl" to libs.versions.fl, + "fapi" to libs.versions.fapi + ) + + inputs.properties(meta) + + filesMatching(listOf("*.mod.json", "META-INF/*mods.toml")) { + expand(meta) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release = 25 +} + +java { + withSourcesJar() + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 +} + +publishing { + publications { + register("mavenJava") { + from(components["java"]) + } + } +} + +modrinth { + val compatibleVersions: String by project + val compatibleLoaders: String by project + val readme: RegularFile = rootProject.layout.projectDirectory.file("README.md") + + projectId = slug + token = providers.environmentVariable("MODRINTH_TOKEN") + + versionNumber = project.version.toString() + uploadFile.set(tasks.jar) + gameVersions = compatibleVersions.split(", ") + loaders = compatibleLoaders.split(", ") + changelog = providers.environmentVariable("CHANGELOG") + + syncBodyFrom = providers.fileContents(readme).asText.map { + "\n$it" + } + + dependencies { + required.version("fabric-api", libs.versions.fapi.get()) + } +} diff --git a/settings.gradle b/settings.gradle.kts similarity index 56% rename from settings.gradle rename to settings.gradle.kts index 0932734..04277f1 100644 --- a/settings.gradle +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { repositories { - maven { url = "https://maven.fabricmc.net/" } + maven("https://maven.fabricmc.net/") gradlePluginPortal() } } From 3901d83137dc2a143580bf1470efbf0d5a4d44aa Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:13:17 -0400 Subject: [PATCH 08/28] avoid setting base.archivesName setting the root project name is preferred --- build.gradle.kts | 1 - settings.gradle.kts | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index a4552a9..1b62cf6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,6 @@ val branchName: String by project val slug: String by project version = "$modVersion+$branchName" -base.archivesName = slug repositories { // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven diff --git a/settings.gradle.kts b/settings.gradle.kts index 04277f1..73c5e42 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,6 @@ +val slug: String by settings +rootProject.name = slug + pluginManagement { repositories { maven("https://maven.fabricmc.net/") From 20d7aad68af4c973f5929eac960514fee809f407 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:17:21 -0400 Subject: [PATCH 09/28] set the project java version with toolchains --- build.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1b62cf6..f7f3ada 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -58,13 +58,11 @@ tasks.processResources { tasks.withType { options.encoding = "UTF-8" - options.release = 25 } java { withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_25 - targetCompatibility = JavaVersion.VERSION_25 + toolchain.languageVersion = JavaLanguageVersion.of(25) } publishing { From ce2d05b3f87865c10a09d6b2b38697c362c67cf4 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:17:55 -0400 Subject: [PATCH 10/28] don't set encodings as far as I know there's no reason to do this --- build.gradle.kts | 4 ---- gradle.properties | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f7f3ada..b26fac8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -56,10 +56,6 @@ tasks.processResources { } } -tasks.withType { - options.encoding = "UTF-8" -} - java { withSourcesJar() toolchain.languageVersion = JavaLanguageVersion.of(25) diff --git a/gradle.properties b/gradle.properties index 0f6337a..fd111b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Gradle -org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=512m # various flags to optimize Gradle performance. org.gradle.parallel=true From cac0581869ed477434302cee858bcffc8cded963 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:19:42 -0400 Subject: [PATCH 11/28] don't set MaxMetaspaceSize no clue why this is here --- gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index fd111b3..fed5458 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,14 @@ -# Gradle -org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=512m +# Allocate additional memory to the Gradle JVM. The default is often not enough to decompile Minecraft. +org.gradle.jvmargs=-Xmx2G -# various flags to optimize Gradle performance. +# Various flags to optimize Gradle performance. org.gradle.parallel=true org.gradle.caching=true org.gradle.configuration-cache=true org.gradle.configuration-cache.parallel=true org.gradle.configureondemand=true -# enable all Gradle warnings +# Enable all Gradle warnings org.gradle.warning.mode=all # Mod Metadata From 1fb8882869f7578ac555f6ffe8ab1ceab3959428 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:22:11 -0400 Subject: [PATCH 12/28] don't abbreviate dependencies --- build.gradle.kts | 12 ++++++------ gradle/libs.versions.toml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b26fac8..04c29d0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,10 +21,10 @@ repositories { } dependencies { - minecraft(libs.mc) + minecraft(libs.minecraft) - implementation(libs.fl) - implementation(libs.fapi) + implementation(libs.fabric.loader) + implementation(libs.fabric.api) } tasks.processResources { @@ -45,8 +45,8 @@ tasks.processResources { "contributors" to contributors.split(", ").joinToString("\",\n \""), "members" to "$authors${if (contributors.isEmpty()) "" else ". Contributions by $contributors."}", "mc" to providers.gradleProperty("compatibleVersions").map { it.split(", ")[0] }, - "fl" to libs.versions.fl, - "fapi" to libs.versions.fapi + "fl" to libs.versions.fabric.loader, + "fapi" to libs.versions.fabric.api ) inputs.properties(meta) @@ -88,6 +88,6 @@ modrinth { } dependencies { - required.version("fabric-api", libs.versions.fapi.get()) + required.version("fabric-api", libs.versions.fabric.api.get()) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0a9c66c..84f8e53 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,16 +2,16 @@ loom = "1.15-SNAPSHOT" minotaur = "2.+" -mc = "26.1.1" +minecraft = "26.1.1" # https://fabricmc.net/develop/ -fl = "0.18.4" -fapi = "0.145.4+26.1.1" +fabric-loader = "0.18.4" +fabric-api = "0.145.4+26.1.1" [plugins] loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } [libraries] -mc = { group = "mojang", name = "minecraft", version.ref = "mc" } -fl = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fl" } -fapi = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fapi" } +minecraft = { group = "mojang", name = "minecraft", version.ref = "minecraft" } +fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" } +fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric-api" } From bf5b6db380c95ffc6ae0da26dbb3fbfbe3d95ec8 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:22:52 -0400 Subject: [PATCH 13/28] use a bundle for fabric loader + API --- build.gradle.kts | 4 +--- gradle/libs.versions.toml | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 04c29d0..47ecc2a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,9 +22,7 @@ repositories { dependencies { minecraft(libs.minecraft) - - implementation(libs.fabric.loader) - implementation(libs.fabric.api) + implementation(libs.bundles.fabric) } tasks.processResources { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 84f8e53..67bf9e9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,3 +15,6 @@ minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } minecraft = { group = "mojang", name = "minecraft", version.ref = "minecraft" } fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" } fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric-api" } + +[bundles] +fabric = [ "fabric-loader", "fabric-api" ] From dedda952719e1c2dd820f5aa01ab8a5b0afee52e Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:26:15 -0400 Subject: [PATCH 14/28] declare repos in the settings file this is more accurate to gradle's internal model, and allows a project to be scaled into a multiproject build more easily. this is an official gradle best practice: https://docs.gradle.org/current/userguide/best_practices_dependencies.html#set_up_repositories_in_settings --- build.gradle.kts | 10 ---------- settings.gradle.kts | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 47ecc2a..e5c8cea 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,16 +10,6 @@ val slug: String by project version = "$modVersion+$branchName" -repositories { - // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven - // To use in a dependency, use: maven.modrinth:mod-id - exclusiveContent { - forRepositories(maven("https://api.modrinth.com/maven")).filter { - includeGroup("maven.modrinth") - } - } -} - dependencies { minecraft(libs.minecraft) implementation(libs.bundles.fabric) diff --git a/settings.gradle.kts b/settings.gradle.kts index 73c5e42..99b5a08 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,3 +7,15 @@ pluginManagement { gradlePluginPortal() } } + +dependencyResolutionManagement { + repositories { + // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven + // Mods may be pulled from here will this format: "maven.modrinth::" + exclusiveContent { + forRepositories(maven("https://api.modrinth.com/maven")).filter { + includeGroup("maven.modrinth") + } + } + } +} From 0524fde96395cecf54852a51725d4c3885e15c6d Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:27:54 -0400 Subject: [PATCH 15/28] declare an API dependency on fabric loader + API it's expected that fabric loader and API are part of a mod's API surface --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index e5c8cea..6cfe1fc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ version = "$modVersion+$branchName" dependencies { minecraft(libs.minecraft) - implementation(libs.bundles.fabric) + api(libs.bundles.fabric) } tasks.processResources { From 4170a7d14b369cec70a555c437f017bdf72112b5 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:55:08 -0400 Subject: [PATCH 16/28] replace Minotaur with Modmuss' Mod Publish Plugin mod-publish-plugin is a much more modern method of publishing mods. it's config-cache compatible, and supports a lot more than just modrinth. --- build.gradle.kts | 47 +++++++++++++++++++++++---------------- gradle/libs.versions.toml | 4 ++-- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6cfe1fc..ba2e955 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { alias(libs.plugins.loom) - alias(libs.plugins.minotaur) + alias(libs.plugins.mod.publish) `maven-publish` } @@ -15,6 +15,11 @@ dependencies { api(libs.bundles.fabric) } +java { + withSourcesJar() + toolchain.languageVersion = JavaLanguageVersion.of(25) +} + tasks.processResources { val user: String by project val authors: String by project @@ -44,11 +49,6 @@ tasks.processResources { } } -java { - withSourcesJar() - toolchain.languageVersion = JavaLanguageVersion.of(25) -} - publishing { publications { register("mavenJava") { @@ -57,25 +57,34 @@ publishing { } } -modrinth { +publishMods { + file = tasks.jar.flatMap { it.archiveFile } + changelog = providers.environmentVariable("CHANGELOG") + + type = version.map { when { + it.contains("alpha") -> ALPHA + it.contains("beta") -> BETA + else -> STABLE + }} + val compatibleVersions: String by project val compatibleLoaders: String by project val readme: RegularFile = rootProject.layout.projectDirectory.file("README.md") - projectId = slug - token = providers.environmentVariable("MODRINTH_TOKEN") + modrinth { + projectId = slug + accessToken = providers.environmentVariable("MODRINTH_TOKEN") - versionNumber = project.version.toString() - uploadFile.set(tasks.jar) - gameVersions = compatibleVersions.split(", ") - loaders = compatibleLoaders.split(", ") - changelog = providers.environmentVariable("CHANGELOG") + minecraftVersions.addAll(compatibleVersions.split(", ")) + modLoaders.addAll(compatibleLoaders.split(", ")) - syncBodyFrom = providers.fileContents(readme).asText.map { - "\n$it" - } + projectDescription = providers.fileContents(readme).asText.map { + "\n$it" + } - dependencies { - required.version("fabric-api", libs.versions.fabric.api.get()) + requires { + slug = "fabric-api" + version = libs.versions.fabric.api + } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 67bf9e9..08330c6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] loom = "1.15-SNAPSHOT" -minotaur = "2.+" +mod-publish = "1.1.0" minecraft = "26.1.1" # https://fabricmc.net/develop/ @@ -9,7 +9,7 @@ fabric-api = "0.145.4+26.1.1" [plugins] loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } -minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } +mod-publish = { id = "me.modmuss50.mod-publish-plugin", version.ref = "mod-publish" } [libraries] minecraft = { group = "mojang", name = "minecraft", version.ref = "minecraft" } From 6d4e3b4d0a686a8138737f6c62431cabcb2a35f1 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 04:59:07 -0400 Subject: [PATCH 17/28] publish sources as well --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index ba2e955..0b94d46 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -59,6 +59,7 @@ publishing { publishMods { file = tasks.jar.flatMap { it.archiveFile } + additionalFiles.from(tasks.named("sourcesJar")) changelog = providers.environmentVariable("CHANGELOG") type = version.map { when { From c390a37f71a2142fea89dd485286fff4209ddb77 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:02:44 -0400 Subject: [PATCH 18/28] update gradle wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 43764 -> 48966 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 ++----- gradlew.bat | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55baabb587c669f562ae36f953de2481846..d997cfc60f4cff0e7451d19d49a82fa986695d07 100644 GIT binary patch delta 40557 zcmXVXQ+Oq9*Yw2Nv36|Rwrxyo+ujq~w(Xf%6LaEBY}@8P@ALg9eb85*bl+=L^{T3M z{}+7t6THC=2{btgAIyvbx$R4Qm4LlG^O&Jqp$eHQ3aVdgvmqW%2zh*{ZeB7z%!cm1 zpfPV#llOR(JwJ&1Wdk2ad5d$0*8kT+N;ZeoBW{q)1Qvs*GbfsAVKG4oQloXj-jRm3 z5F#sayFnFE2U#kdhK6NC1W8CdfK%MzFki1TCza4Jj;uhxXA5!_sMFd}x3k#NL4z>G z{RXZq2Lo#}J)x8O?c2BZZ^<`&_{k{9vIxlV2KP@=gK*AMGsHq_>TmqT%uPzw1hAkHmSHvpbL&H-m?>B-<=zh0I9}hC8yswH)x_ zyinmFe1Z4B@38$UFHQ>f?VD5bH6KB812bVVN*RL&ND((6{1nTZyg_%%axtr06dGx&V&`HbEZ;R|ge=f(5J z>RaDDy=oco@$m@J%b$j`NrcbO)T3gfw}GBkmV)6fHAYjlVTDWi1XvsAvQtprL@nE{ zD~JcVUmpJLP<~q19MF*ETX&OCv_5@-c05ERGA(QwZ62bia*w+B%uTaa?XSIirw{F) zLzIIZX>c3AL>Qr99LKgiw21OnIHz-b>jj!H6()N*|oQ-t7zdAtZRWvtI3oHgqg`k;Y)aLD;8oN&VEL_{Xo{`8|?E>`!`v5l_J z>LMC@w#5|hZpV3#E^qlv-G;P^*KqV`dQ1tOi4*;}Cv(w#LV|2&aqB(ONGa?9*_;A#o%TxZdcQv>|Nh`d_{n6swb5IcO*m?qjn*PPb} zb2-P`uh8a77zLurcT=(T&O&48%l1Zzr3Su>_>{zMG-HeAiS*TX`a0N_+sL*_S?SFK zRZpV31t<8i`~tB~GLQRp9htb@F9|`pnBiK-G_3bp0zMbEUF|#3KOj%YX0K2ve!|h9+$M zp5+#B#hgdsn6^W8xY%Pv|AZ;0OQaY8f`^@OqnvdOqPdrjkS;;|GzyZW-X;0OaSoy< z!y8k5lOnbPK;4CYg8i>pjcY9CTc&- zxK~NJE15@`nYp5Oh0qO4;MH>F_=eM)=>ff2=hQmIj^BZO}HYQ z1zx#Yr_;z-v z6O5K3k7?Nzg0M#6&)~I_;IjdK-QAZoH;6nNK<>?~@S^QXLLZ-ZT#a#-$bGfFQ9X3J zPsgZ(oF&Np&otPvt|cZOs6Xz!%$6e0-F{7N8h(yns{#SR4awM|4|LU#<@;|b`BcVuE!lD8>&TFFxv`#M8 zI-l5jGc=TxvD>3@36m(`rIlXXs!oW7)TWRII^?VkF2s*|tm>0I6J2K#eM7U;a`W~R z+m&MAYf-b8Bf7*!TZx<&VDp^%vwo8f+VcPA1jdD9!0+o(e=T0?)2?#K;HL`9mHI7<)giIj7a~n2E;Gcfrmt|*VY)6I)`0MDQpb4qG|*oVHM)N z9{@NQoDPC)QnwFkhp?fNxQX3bmudu^iSmyJ~0NG}#< zPM;IX_b6jl&PLtyR<}dy0k99yC(=cGcQ%Gu!bK6%91t|9h#B>OvL&3YOI78lD2eM9 zz}mT{*x6i0VfS@P)L~V6%`bMsqptV$Wcp?0jem;oai_X??^jN{l_9o$1-pRNW-!&x_yfjl&Y_M17B0xp5NJ>n}iv+5U zh>?vv4BnvcH|rwY7Jr{7@57lV3vb6fDM`fY=bV#Kr3$&2!8)m(l*-m6gJVJUD@2O| z|N4>Iytm6TfB~lzCllYa2l45~=Usw(}RNog#Rx*jFyI-cZ=pb7nHCl;u zC|Mt^l>wekqAS`;h=WCFv61e5kziq~nf`#?Nt3-ltqpgb*)j86n6GMIbC`QacMGW6 z*0)8_6E_^=8CQ`D$+}`lQ%K!Tt)Vo;kk*5m+HsU+@l7Q>7xz+30h6{tSB#=+{}c={ zKz%|(I5;fU1#_VRF8jbnh;Clib9Ky4wnQIFAF&-a%ZGO*30Y*%XC76X&Vm+KJKksW zbXz@4rk;j%-TpLgzK$fMjFz3W#t1ZjyOUr}uFlRT9o)!P&dyJrspF*G=TBEy%{{)J zeXip92jQC3_@3Al{(CkuXAK)Z zu3%ttK-g;$3FpLkl_LVegM!Lq&6(LuqzLulTzCvoV8%kO@Gz)_GA2YC zQj&o$;i@M>W+PB<4;qQU35i2%7sFIEEoI72NRM<&DHV3qh7mD-4-RK+p3X$O0=J&t z_x)H@y>Iria~qDFeg|?c4bSPp8Fgk}P7u|a2%U*frFBEldBr>iqaw^z_Vw~0+4~h^ zYMdXDn!Crszz1=Jq(u)^RTmV%owq06bJXr+SuINx{sHVShvT4Gr*gAw&n)s^{7NkB zE!l~KLhFxQ3zM?H8%_0+?Tbq_z8uH35M8Df+#8u+9&6MkuPA6y-^>eT?6e6nFR*0o zV!#xaZTZlTQIP-_UBx>vqE%s_UA9lH(`d74;Y_K?j|Qg8%4Zoa$%8Z#)7WAawMT36 zII9oq;dT2C^+Iy%D#5E5Bs`(!ITx!fVaFv};E^b~6Eq2`+x}FUreWgKb8u)Tv-5`^ zePr}o()`4l>bL813BSmplo~qHHg0K4;jo*vEPZ>X*{Y35`%Di7_DQyRQiU^QGZr@eNU4nowa6_dO(zb?_`)Kr}h3ABYdaq z(TH{2UdtJayUCfkj>7-x{_KERXX0t>NQ#*Y2%=00g-0;&S zJ?T|WFWJwLx=DCSS^}oD-;aCtkwr-ldmE1OvjnRM>6?z%x!wDJLyu~v^i=sXx15JEQ6lox0yTt8}7xC*)KUJ@s7~+;|-{?-Vl)CLNBWjNw z(HH&}rUJ%Aws`%*@9SIa(E>Z)&tw0X7qiK@i4DOo)LXn&UY(`jhXDKhz?BefHxt zr|)q7##4TDg!J4IsI%Q610RmGq#Zvgj&GaVHX~d@v4;PGiE_3-I{f4TD2nO!D$}#a zFHa_fw3r2nf+>A@yizb!@GpzsI$S>bs0haY^2Q_JPv&gFSX1_2+M)a1SfY|zU`wdN zUmJjipkoW#_a!Z_tjSD4{DDTd$lez6IEJ!^UfVsROHw>f1)=fz=SO|+9|SMn#l!3o zHnxb7Roc&(Qy)YBA^fBPg+?dxmS3A(;S0ioNrgc4pG>khIC`h0Zie#!%6~7rGZG|E)j$T2~0-LH_v|?r1XLeom9vc_Mo0!uU?U z>W24QnK|~AS<8{ui)iGvf|b;E?{!zm1$QfJAeLgvs-kyAy5#M(f4^IXohh-BE5}sl z-IiQWdFhbM?&RXC9Q#Z0+0{ir=>SxG3o(InDfO4sN4ZeFNO6b-Gi_B8LqvRjz@ZSB`qwLCd^O|mhzyR2V_YMj zf@Uv;hb5Maj^p6OzF+7D&*Y|GEanZC%DR!`lo8!$r2X>`_h%B1ZPSHD#u-EI8jR_=`Ca|k^vFF`;fDa<=?lFucdI5I;RT02hC7Et^2<6PxA;I zt>^#l`TEuX2;Ld!>x&-dtDT$_AYriAVDoIMvUoKZarWMSp1bywOAtb-+b%4K@8oCy zqi=i}s?P*k(DZD>i>g{|M2zcF&YDVH}eWSSb(uROBcW5I!_ z0JOkctbvNprmj*_WDaB~bXpf6(Fl+dCyEfXh6RaOG|4_~-Te}Fb(b|!s&6adY`-+V z28jA3rpJ>@#aBeXGK>ha4)WqJ$_t~lP#)i-pJI`JzGZs3Ah{I-&#TdHjh|L^N<17$ zhXh@;krutQRenj`4>)V+4eJr6J4pqSJ@uweML?@aVL3gK%0-3yhOE3rQJ5tXE^ zGbM@h4$ew66EYG^!xEEJ!u_q-8fMJu;po=g0&8&FLdPsIsdaqGx;jfg;}G-cjbT+g zV-1ZHlfXdVGvzl>Ij)5vL>5qX%urgu6QnUnT&l`DKX5)GUN38#MlaV?38e8#!(cO` z!unmXJn&bxIovj1b<&%@q~S!}l|M|wX9gyL73)jbv9YK=?|q;{r=E`sqH1}-OuI<6qBt{2_XBq!o8);aLA zp_Ag5ZV1pDCBKizrj0!7`I}(M4L#IBnj2T<#>Kv=JJS|0rFHqmQ&($&6Y zht~p=@a)4;d+We_;<`Tuua2qq+20(qZ3mh#>#W;Fr6)MxHn8W4wL>gnq@aIgkv#rY zLNo#-{#E^cy4!4y5Ehxl&Q`V`#=zQPZ+<8jH=u7CnUdCi9}3@j; z)eJbPnp)yN1>xX6d|^PlpM>@DY_yTGO)6hG>KgbRBR$qSf%y)*Fo4o_6pDDeeV+F_ zsY$H>#Yj&;8}w)}6bU&IZYQUDhXd`IN2Q~qIJ^ez}L*|7){sJU+cQ0}tyxw><(TGQ`=zv8?9 z-&3ub5ho@5=cJ>O?;as%zUtZ(ZY!H@OdmDZN}@z z@`Y_=Zuz|E65wO7d8XSQ7Ok`@31!To2hBsG0c`ocoek|dy1KgBV{C4QGD`4j_{#b{ zOeJzOAS6=su&_eg*m|>qZ78u|ns@JPUv+a`Qg4b0*91sO7OXzlVVtI_$tio4h4Dad z_@97}R*T!q$Y>MVAekAszf3Feg{DG`g&1ppWfc;eo3L2x+wA@dIXta)IiB3rmGevha%mPQXC@Eh|1B&&4!I- zB)RGyaDtX`3V$|XrF_pY#gV;g#Bnt4Xr62@`>GF6rx^+%Fntaao6B4fmpqMGfy0>q zv1}QFS~ro^vLLbVh#{N8CCt%YNipHPbTjD30cBA|;$v3zqpk}lKXQAD8qGB0WVi0N zjE-ki5Kh6_POWAYei`p0848O>(nYkJEc0!<~l;-KSCl+Z)+v#zl51O|I;3m$f1)>X$U~`iw>2#atPW`nEJ}AbM~g{cD>KUkxInFxPYFFlgkGE<@!Gk zZzlVo<9`}CI&~!F=QmJ_k0-)SF-NleR8ITTI-lj`6OmyLSX(^hKzMO6_C>2sI$n4` zTeJJ*@)B;=PG{i7_2{F(#)E=L7e?GaMw}o-b}y!i8ECi)TLrxedWz1@fXjJ$7pyf7 z2VdfHEfK2L*ySHxJrRUQG>klSx?$v*`-)1h{fZ!f#ZhJ0U7PfsY;lMRd}M?fPPlsZ zw~i=pAp^P@>M+Q;%%d_4H0oyeoViS|la?Oog^4m=K{`+8QZH&G7-tA>Lu|UVSvGrg z!1PC8nBmOn>3{$SwOi@MDTrY;`O+v}X1*Tx8OEi&gj`b#9x^RDYZ}g|q5K$ns)+*& z7>q_b5&%Votx+GqHIq?bg{K{X+_4n%Pg!w^qEzx^1Iq7^hj=<7EOyHYsu<(#& zU^dsIo*`HKu`oF3Ef>X1hUJ^_q7q*eZI=MD*tEdbkW{G8f2Mi#KLH92xW_DUwJo;f zJ$b^&I+LCie#MH-MJ|YIo`(Dq`-$_k>t}oMrZW+5eXKwI14a2HBQVxVi56{!of8f% zy0M5@m35iJI*QkU?F80d(&J&w&E-!eU>@A&hORqEABUqxfKybqk6t_@J&oqOAE9nG4pmkl_}plY0$rZnoKK!UcGeuNa0;GZLn zANQv~ad7EkbiGfkHPU^5#XkJx?mpz(e`)OM_pqVY%BA1F%jgqS6Y2$zA&ilk3J4lf z`8y{UeoB1^61QyaJ;T8GKl358!aS+w9|lbQhXKP3CZK01%ow;NU@Rg~1u!_cerb>v zy3skg!C(`^A2Gd+tN>5>c@5@Ay=OuKqVNC<3wh<@Pc;{*F3 z-X~SJQ*`w;$ie+EI}v1A9PrJxNh?_aO)b0QS}iyZy-N}GF*lhRV?8T z9B~Z9f_N@9j@ksclsq+FfWI}K_~Ap=*4rec{=dhd?Do%NuurkV`YgwKbdicR& zwiwj$bI^1N9qma`}uByL_>EP;zHKzw?T*KC%ChCRvdN1G36qgGtJpoT06iNv zOO?wX{0S}Njb%a1)hW`%5Mm@?jloZ?ld7|1q!|)YUuV`?V2(ZOZVST$h?VO}lVN|6 zwJ1Pd>}pl>^+#ddW#htUj1k9^GMHv=q7Deto0MK^h5C$D=Lx4tCYCMb5XXCn7;tW? z&CjKcmI+6(2yda~mL2Di^XV;n*(5*5^<_c;u#uT<@QvQ_W(M_phZZjae#Y2o-OAB< z!lBpdwWP{nA~_$}(g}oC+n>}WpN#!J_EyC&9)ZWhLyQr$O(=qP=n)9H=?J_5_8M_g zkXI0#<}8P06^PTrM*gRT#=}NQxhBUmYl3vO(6xXYBal>s+7t!sSms$aaDfT51}I%a z5vkyCXbX}}_sp)+l9X)D7X77~M0)<0I)bOBhJNs z*pB=x^Zk2%{hoNgnPzeX%NYhAh^A5+ej^+zZ)c?gaBLE3S?q2&57nr1Ue6TuE8Hl!Ew2ywEcOe-9)76+@D zW=2N#-QbJa4MHs8D=6s}kz>u7t~-aA17_m()+rUWAm6eq?yU7I0OyPYV82ek*E3?_ z{}Y)u`dx$94pa=>aoXy#?^{|GjgwgQ=0t@e== z^2A`VOQ7_9O0sV=iyedOZ%}bJc+b};PRT~F;A@7~eixmr;WKniz9 z9AXyx`szxIzUil#Rs(VC{~p^>3444`Q^2*KW9a)U@g0*bMT<7@R(;ZaPNjd+v!(Ps z>ooM?{I)-{k-kUzuTONz?qh^SvN{!7C&He+i!u2Gfgj3N$`~`HQ@rY+ z-WB&+rgWaD-YMO?^V z_XH-(N*l_VrHi~fkFGX_4k<3p<4q0x2w4>fGWYHP(nC&)ZKFRIDQ4C#+05NIn|Fs` zxGHyLma!HiT|6KZ1*~*b|KPOUYgQx*kmwn*6NseiccA?UA@Ul&y>@@&_Pka?@eL-q z0m(^lej&n!V8+mBA@olM&+cwun_JTbpI_=ZuTPcGGj46;HkzP!V0NR?{Q}yn0r3Y} zQr%5I8te4zv%-&Vy^lM@pF`XA2~h)q+6^cK@^wa5IAoyT_P>ri8sqI(siKBv>oC{# zhd-9K<)~xbJ^;BpJaOdK>gLY`<*xhMRlaajx#`s)caT!uRUf`Uz3}Tlu&XUv>O>jy z!?m*4m!Nx;wn|_|swu(&b1afc$zgY-GTw=0QTk$T^p~6Czheh@od<&c^ZfTwgPG1C zzkQoaF62=C4+Akik>C`8;91mBI=XUg98gJhEbaw5Avp0A`k=6_t|8h*ZhN`2E( zG4gu6Kk0r>?~6&=*a^eUfwOS!lV-NXipr|v&H`DBBb1HHI6CLjahAvHMiERp+?>bh z(=PXA<`k{*qtPE0LzM#mipSVyT1({iD7I*J?c~#)@Y0+!Q1HssuaDY7AEjCB%XCgK zWV<8^3bJsZ##i}qJ*UFNh$v=K&`mg6^IF1YXbPsaVrU#S*3=DM(xy%RrTC?+4B!yC zAqTbLDB96=%F1iS_}K~kn*0?PVhR|UETSGU@Jn(L*9=RJtTG;(y&`!H0FI?%rTh6htnoVgY^ojZJueUw~)1T0@-?@{4r}jt-~0|CE8L zi{r$;sv3eH4h#o7M2hG&bVC9<{?JLzSzeBq&@srbvo8O^1TtNsOa&VB<_Wh4Kx?#! zt*g-45M%0(xF-#v4qmIMQsOY-;)o+1xsGedwsQyxrP$! zHno8sNVQ0!H?!N-Ui{ALp8F2#D%XTdT(q1CI>nO9s&hFVd}B?M`1{F)^_SD!Eh`t< zr;*fW`QK>k6rNFq5#59VEHb_Lz6wHLN>=88BbUhIfaW~y)89=n#6xJU1bo~XCvUf)P8&OE0J(q}{FNT^k$_$y^A(1;x=d(wcMr7%oI|EuM@6)O3 zJ&q8-WtOKZxWxxkrs5xkbMX{5)MwXaMRnXR=EyW!ojp}QQ0V4!he9<0l%_&*=6xrCp5Uh1zavNH z7#lFxLvcyimxBSyg%}zK?SORuBs+!faMY!-(xChY6seRr(D$Icy7#+f+z zE4J=3-Q8~=W>yksed||}$a({C8U5|^;{lO&@v9J}e^&)v-*uYqcNhridUg{vEgC!; znGtTH2EHt)@H9K*<@AjRSaQXV?au$pEz^P5G{uNWjH$7)BVNvp{EUJ49VJ_RY zPI;U_(OpXQ)9s!@aHSgSaG?CThR`Y$+e+nj0AqFM*A2zA}!zO}cEnYs*gzSJYhJfk9 zg3eZldt#`SHK1s*h*Y{SHZ&?|=77Cjp;G|}@kRG|Ja^gFA%&LOSb2YGaayI58U1?St`t8som zj4t^i--V2Qo9Cg5APheE61e z5$`Sh4N<5l@kuWTg?h_86z)XU8f|$@9)D0$GAl^AdRr1#PK8YlEmM-=(iWLY%Y%ik zfj5B+$0~DJq?50J*^`BdStzN4n6BY()~iIFo0IiFG@{AQciz^~E2aI7;^gskNk?tk z2*Ab+j0N2?rcG#zlm?+;VKIku1g=p2#WEhRnCP-OhVn$q)PI?pJpk*62CNR)~ z2GZ!HmcE2lbJ9xq*}oBDfcl!DTi=lwh{mOl8ow|eNn1|=h-|E%8Hx6P8(Tcde`5Np zkPPV%O64)Hp=~~Z*3VMIDl-zgr%IpnMD;}ehAzQE*j^XJ0_p0pF*_tPfB}G8qbVOp zV#*>l*UodIcPNuBk|5BK=ZU8-|CfyBhFKWLf^_>38H4!JTOWfeB)8)mqvJ;)MBf6Sq}Ie{N2jDs~zpl5C8-HWLdcD8W*8 zi0vMFX)o?54rmZ+Y){v}|2NpObjjitSEF!N%%5#QaV&;5g4wOTXqez~B`!uL>;xrm z;1S7g0Ldqc%!YD_hU%>7#4Q>>1Z9X3hitgvJ;4}fGx4j?l`(`HO{8BTsnT-7O>UV- zIa-=wA;~Cz#KHOve89%g@Cm>Ma$j(MHd}P6jPb?kSK^~RE|y9Qr9#MTIZHdjCP5b! zLUJ<^f(EV@XMSf54_Xc%P=^fmk+CpBB@oiHP*ij?7?hj)IQCnhx`&@jp~a0MasG?2 z1F7k;%dMzN9SsSvEsAF2T8jvIfoGk&)G*mz`DLwR)0uEU4{iQV;)BEl!b&gkLQ>Iu zXE#W%$4!Gtw3nmQ$SL(xW11}pVtrz_syDJ>0x1LXouWJWvQ@h;L*oqZwcS z$-vopIcmB1DE_b@P#d{FnG!1hY08;~v3E3g7GNxQZ6h~p$0qHgY}HyuQ2W)Oqt7$*XsxAC-ZyKOle-pw=>qm z=-a^lGiK^BH#Y46*<59Xsb35G%xD-&1Et@CVBOY0IN~}0B2sJDM)6-GcTXN}DlA?1w<+$xDne9=rY(e5RELck z_wLT)UaMJ3TZ*ed`9KNy;i?3SgwJ!W(z{H%+e>KSx#@dn!Txr))Oz&|=|*{besVJV zB%C=y|8$0ifkJ>b(?I~j*>ZNrr~m!c;qr;(TVLn+>qXF z(t0@wrY4fW9r_XIt6x9TGn=*295joZr0}ciI(k5)&2GMCf3q9F)gDz zSw?d+ayr8ytrA+~YVc~1QuE)xmBN;uS1u78_b}JYC_wXD-ZHjiJ|BJCsz1%WQCg>mTc1Gk4500>e=}{IFge{OAmR+=9Uq!oH-04GW z!;ob6URj4V!t4Xie!VLZj(whv?@(v0wFU7c?|eQkQjRg8ULp|vkbmIxaZjgt!vrbO z+WV?;V0`Kp{Uzb_E~JG7OuiG$pKIwR$OIwJ})aW1+|1m;&Dz+` zmC@AB*ws}-9qQY^r@noQ)!1-F*TDGNpgf_p{^6%gOQaDaJ+Ckq;rF*i-P)do(mtWd zC`yMjJKJq-(qY*yiU8W+18>l>oXNie2{K`Jr*i7~>bYc3dwQb;V|6=W+IL#u=zZ!X z*LC{y=8EYz7&lDx4yfmsjgF z2Pr+pM^%6KRJL2CR!V9-%HSx{sy3;Hwz-7TFNeuMSr(fysg9$|)X?FW7w%L}_7-5@ zt}+XlVwkK*a7)#7??i}F^jC1yz=e?zI*>NuJqHH2l0rlH_=u`m8Q7m*(_(} z%>lA?!-~osv}J3DYh|L-+l*~7k|4RnoW6h8Q0*{LS8d;A)v|}%01&Q~nBnxVZ0vP0 zh~k)YE32Po@fsd!u2N?MHcYb$SM~r9jUT6P6v0b4dX0T&VE5ZUh|rLrw?n64kb}UU zb*q^NMAmdVLH!riX)?xZwtzdw{T>Qu7bY%%1_m|9hCvLH$2e7+7Ud3Xu-Q#kUB%!@ z;_|*3%)qzJeifltC%chQh%62bi6b;c=C=9+7gr`}zmpWZtzkaF`#o~8czcUUK6RW^ zg0T6gL2)yw{u`=}H5BFl&?H9)>|vXF?wtNZT}qFlZT+Rh~Mc&+Ui(=)ROo=oyAgky_-o9dJ%o6qx}3?cF^ z#h`t0YEd?5>pasNi8Qz+_h~s|oL#6AMV8Kk2xLBRw_qP6`VP+6F$z`85i!>1I1hluYuva@hGzVqWe@4>B!-;Yntq1%G6V%x>r_=)1#E|LD+pOCT@l8 z?2+V4;II^Cy9bqod^uytEx{E_Y{9%1#;x!I7h&oW$ZtL>c=m#+TDYBbcj@&BS7*h6oEfri!iA0l)dXNcir?j*n~o{lho^}5mXOkc3y4$^_A^&!uf)n zTuhyN09!Bpigl4WPpI$o0iz7~2aK|Cg2`+DrmfTe*vwNz9;B-OZ}S5~fGl+ACo%lc zRsBP$Rr=qGW#zqKAUZm1SX5d3{KbWb5pQQ^?&HuX@{QKDI+~0h$Bk5_XJv&5I#*`y zI@{5@?{x0V>&3j~w|Ep-zxA!Hy5GpFtea%>aEn20cnd+?7nZVe<*Mk9^GGZXGRc1; zk$qW__Xvl4UqA)z=S^auRGR1L7 ztL6KT6YQp%f%WzLdX?b>xX?spB#`5iZbqg)mF#c}YT4qEsRRnMy)*Tbf8qF2BghMANVZ#or=AMkJNiFoFqlHSf?J}yDCF7Z z$1-ZBf0eyujJyQ-?Uc+-FY?p71RCC2NH(5UJvTQ^jm&Ags%%evArf%8wa38M!OC}} z*k7+#m0QQWwuPNRorDQn=hkZ(wVXUd*^i&c+S%?JEA@-rG&0HGp|uUox~4Gq`8tJU zYTDjyl1#-mTtgv9RWw~LO18O0RFkdqR}kRaI^KbhcKM>eA2!B=GqC3L4I=-K3YW^! z+E)LO+{iyFGzGc;`(GDDYh%PeA3f86grtk){xL`c3nzz9=ZewAG6yXQE z)f9**k3~#IJ~|X8NP%{^lkFe!9DDDjAe?I!Mn?7#~N?=R>N;^;}Cd z9VPlrsBm9dr=`8|&(yNs3=bbuCnV85(Ibq^@ZGa1glr*CjfLVJf?9)UtBZFQ-#EPD z7GIUE$H}iMctPpAq!qa?9HOc z8D(uDjzv&NIXqqNWj0n;+lqKd8bI2%F1Y_=YGvy+`Iiu1n6Yzq@}+L*$611m2pgT! zLDFYm=Vyu@gznd1N1FJuW`r!f=mUIb?pJ1u6HKSVxsj6bLwgs^s&=vyJl<_OSBb0+ z&z0;_T2)CMf!^*Swh`RM@L~N;+>BO3s5HSat3)HXid)LA@!a@uN~m%< zi4{}QJ1!J>j9CbYkeyMZd&s{hx)*<&0;j0`=B}0Xlxvxn`Lvh$^0Bf<^=-;Hbf>e^ zbIH~ahrq!BZkja>@s}+3{)_5QE%RmguuFPp zp*AzLNBcC4xm2EWkJ^Ezdt{r)#lfe;c?V>OfPtWx+RjQGmH4(7XQ3Es2uAev>h8*r z&I+2?-kAzBbnU@NAWa=_ol(VGpnfBSLwnIrg6lqE$W*$|mZR5oUS|n6?{i5I(@{QD z4?zU89j`GtKWc?En;F+jf|lOpN^0{|88aCs8Gx+LagEd{!@h@7nC*KFTa3;Ec(zo^ z=+F}Cmm{Uy!j1@WSR7IKmlGuBi3FfV=4Rz3<-5XjiGM%t@QCI-syS)scZ!asnmn{jycg!mGUO&9Y*pPrf1CZ z5){uQE3`A?Xl2=4!{NyUn$90SUu>;h^JRWy&i}i<*6pF;{R8*L!etz}BE<#%WuC_z zx!l82!z+GEQwI zP9^hhaFaaW!Evs7;XhfiO*O+(?%( zT(+(AD!G|1Hgl4TPk&Pd>k7?IrXv-QDx7!nc}r z{!1G%B)W@8=i4L-q_-!Gl`=FI{EiD^scLrH1Wj1cmTpYCyc zu$C1c3F{3kj=M}cJ(!1QY@43Z;(?@+yNS@4S@2LSh$?RGg%F)MNNM8C1OA}dWKA(^ zo8-bRY5A|cW`PLW5t@M-FBNn_)PM%{QaE62paLQyI|-BRa&R|Exjz7cFH*T7zYt_< z@%Xt1K5&wY#S&;4US!R$nyXey~?H`Z)S^tqTDD~WfifWrqP$LtshhO)btO(5L( z%A#RlL)C*3HdPevm8C#*geL5xb`y_dtr0T!90wEH#LcBpR4@x}=n810{7&5_{IkHoDkj$b3OgT;&8n)?c+Lq< zY{QKx+}fhH1|x>~T&KLTGKE^2fV{aHF!Du42DN1MGccXWm4}hS(8P)hP3abQ*ja3d z`j&mne)x|3cima`zl^Y|7_!emaHqnKcgM`ay`JzE;PeTMi8tt-U>_P-dkjLFsft~s z?KtsH_wa9WEN;!BuQ6KMwj2~9et!tbxyXU2&?^`S>fY+KwLslHzAd1)4fWjYr6}G zeZdewF0{u~LRGP1-yy1w2n5nB=to4tDYmiiV7LXU-U)0Zh zGFx*A89N?0ZtSQr}~{+>(I%#7;4n=MUE_dQnD2#9T8YpM7z5ptD6ARoTF%|F@y4~Rf_zc=&Gym=2l zfA_rr)`%8?+poWV+q!G&`_$wfO;3N-x7H{7>znJ7MmCqusCL@WBUvM*k#A}lO|>*m z4yslpIjAM~Soy3~-`cNcEUmddHxS9Hxky^-IHzx|np%4<*P81}^8NWth74;^jhsnR z(+ASJrkQDdfZV;BX>l*|*R`D8vM!R+_SRqLgAnk?jl7xEHl;I~z+%H3hz@_4YAT~e z_nB%grP*Vy#0@YWld(~)0)d!-N_FbtZZ3SKdZ^jrH&`ipAO{1X8nQWtQ z&NK#0&9b`EmaXYh;DYG{N;|H&MC(`c8M{Ppog^+*T0{KKa)yF-TC)V^bvZWX?Q|yE zt>(CBuCCep40BIUI;$CZTR?ww2%M5Mbb7^(Pf^g+P^RI;L|bDSdy8rfy2@*&Fck#p zlJnDg+P+X=Rzu_V0On(XAGKI0Fn>DT3QiU9X}WC=#WfmO(@?${S#1Fk?ZkP5h48Vt~DpY@BLjVEHkzbbxwEZ7YSFlN7*-YlRDBI%4W^@GL$85Q4X8?0C zPkwa^EFt3i(*t=^qxStn>+|*?5tmLnRVaWey!I`J3Bh3WCBHdw{?{K zRU!of<+OqxfhtBS&gzwAsJ6@a^;Muj?+TZ<)i8fuw9)2Wc&VIuS#d_S z2LpJyyIOS-a9Lh638AFRObN^;bCanKWO~{Yfn+-K-!Zu;_$>ZFxo@tCh{`OrlLHt8pr18=;(PT3U#De8>reXFgWX zplR$=`!ZV5Ak%*j11xBB2W>mol9NI2wKUU*{Dd0fl&pP>!hkG2tENeuY13o~SI@?N zT*Hbh^;_i|Tqn>n6WS*OP}ZMUur4)Bs@?86Ug^gTcoi$#xML@YzJ}MBrP;+CVg$-y zJ7KA#@O5~-AFst5SZ38!YGN7)G){tiIn~u}=sHi&h17pEq4v9OVIhAD{cUPj<z@DOvY;`Ik^O)sjO<;EKq-fo!0jnd$eemn(a%e-I}fTt4W@U z74{b9LiPkh;F0njigJ_~G*VksoiVXibQ#8;d~RlZPY~=G%4sid(%o`q*~Y1}?P?|y z=fy^_y&HeG`tdH@HqVRO1u6-r3=i2d1utcEe_nSY72Q<)pqlsMeL*&6?oghY0e$>6A=|kFrn}bD)O@(|tI=Hlr*- z9D~z3?_yoeM0dDL+f6Mck;(Q?!6yhS-ldya7>j@E1$zI7Dt8i>OndEq5})$pPJCKm z^$Xg;&C<_GnS-VBH~oGJ?jlf&u5e4mVaB4!*s59<`?Qn~1@>o?x7mNarmOc|qA!l;`BsSpu8ka zs1AP$zT{p`rNsd}BGZ30t*GhE3ja?s>=@S5q!;$HayBpVaNJyv5wg0 zP_IQBLtA=!wuXH8#w5`R5&4$1``g^mmY`#Koi5nl#rLWhxbG998#L9_%uo@cKNP4t zX}h7|$JDz)`oo8x2xLPO>uAVeZyi$gP+EVtv?N=OP;%Tk@?J|7Z-NkoLYti(Lgg9R z658s#hNPG!lPHuQKX$yuhoAAf;-e#gpUYD|hF>r`(gMRwU+oy+!!OxK6i?*ClL0*7 z9`rZ#x??xFzbo~S4qD08)~-?T2i_(O-9|mhhm|QoQeIZvRV#|Kbl{)xXFvXkzX*RU zcfpW0qRBydZ`<@TE1znn+FhD?{1n~R+p}pm+t)>1Q`Q&PQS0CFbQS)Ff4Gg$h9O(N zOvc->X+#=#vf2C>o{?~QR^Zf=S*+kVONr(XJ>w1d!iJq2rmY3fW6Y1|_+&!(gvRxK zj1+Gg+2Y63*<42J$Y%4lY(3nLUsQigsvRfqz$H?J$1i4yO8($X`9tRfd8Td54$T@b zcmYu*i_9_MFCEWOwBEAhBg)V>nkJh85nw^+D3;QYCV8!)UOr!P+>T9E@DPIm0`i4dc3hEMSQws@r#U1^0H zR$6V&e`DFFPw*kLT zVNy3^7G;2VcoemX&S9KVz|s+%F3{C9f<}Sca2`J*0{0`DNOX_jEP(>n#zt_SV6pXy z?gN<9>`-KPha=4eT(slB*n{DNR4YUie_P-gLl6}TY8Ad;@f^Ymq6&Z7#%PPj<&xq* zm|9g#g88_(Xy6$%SQ@w@oY=K%80(vkpuPDBHjZL*qO)ljF9{z(*U}@16>!-h$iFIV zL%b+`3n}TAi$>9#kQxfOyi;@)u(P{>-4_4r9;3 z&QTbN;8o#a*!MX~X7hicoTV3QoH2+6&bSbD&bS!MoH2ycopB}3az@t$0f;e@^oT-U zjeG?bO^h=Ff@4$oFg6DFj^Nq~`nATPu6L+os2Rl#3CS78tB>N1@|+cpS}!V=Jc~J^ zncsd?U`IIfipbF_NgO+&zrD3%Iws zwSX@~_))+YV^UA6ClY*+d)!Z$bIqYTPwW6f)cKV}thiOHM?~aSV^4}!&w;VWBM-rI zh$}7+esy;NU%!7HYa_J2y;E+~75wHfzH=BqI0k?4M_dji_|sNTxT%h@yf^r`yK@0g zM1sHSbe1iaVv*g!U%PVdg02GyM-Jn+$8fQn4*s5#NAXw5x(oj-;NJxyiYuE(#Vmq9 z+%zn_1)=a9%?07(P!O{Zjfy#mS}|`}1n(P%jiDQriu~_Y7)XUTBc4I! z!sC*4C)1))Cct9~MmX)v9>**vGioI4OUyAWm+RWf7^|Fh&i^r)HcK23T*w>`5(E)~ z;Cv!$C$;1WfSU+`TPb}PtHYyAiYEw{r-%sb$BaDR(T z973m7EO3AD$a8l(ZTv{SqJq~@^I9*xoy9Y{wo9t@!&Z-s5 z? z`5#bA2M9B)4G&NY0012p002-+0|XQR2nYxO005K!I}VdndKZ(=rv{U7Rw92<5IvUy zyZu11qM-Q2s!$TP8>3=_!~~_lLk*<0CO$Q{yVLE`{mR|l8e-&!_%DnJ8cqBG{wU+L zXpG{6FZa%znKN@{?)~=t^H%^5uq^QI__$enV|1lGpwKZk47+En8Fm!Jo-b1`3e6yL zh;cS-^+F=$g)XB*QVI8ByjHzmt(guDjkh|4K%o_7%BCI9CxMknxt6P>h7FncJ6((+~KTKnBYvQrJy0t?&qovn7`MQ4AvxwYM>ciOFb zv$MDVye?2~{ARS$k+R1E`ljuBp_e`p$W>Nf3e5kV^fdE)hm?kr!1U%gw}f*j7BGYJ z0{M)kRr{<>$Av#swT_aM0u2`hiY}!GD&l$4BZ1}0StYAyp%O0PashLg=f1uUcXD^LTQw8QK|7?B}w?@pR5_IJAn8Iy=$!Gl7y!$C= z{J{iQ=h)cNQ9zOJyX>uCf-PY23uaz@#B90z2@5BbBX^v`X57gxG`dC>(eI9tz=t@WJx`*}v_t?~hLa zxPYmE_wDvReU%yN4Y^z{r7q-5>ZWdu#m+QN)lE*!Jz2s)+^jGtU6Fs@guV`PS)dIx zlWnPLY?T>zTxJW*7gs#%(|>=_TgxC+sLoiDD~%)a#+6J5@_}zLPv__JROK|tw+RRV z(}$+_nr@6G0jG^GlhR{uDS7tTw&au5uYCGbw`knawI2VDVOPN68V5`)x-z-T)}*@_ z_65ZBLb~sGVRU@*$Y320Vi-fPWda9d1rg^Rh<*T2O9u!+{qJ}90000ilkhtolaN?9 zf6ZEXd{ouF|NYJ^cXBg8NC+@2GD47SlL#te5HVp5BmoIahef=Zxk*N5iL(UaLe*-m zt=nsDD{A|!wM}d7W^oct743rB+EriezP#>>-B+vTeb2dfl9^-z`rbc}Pr|+ToZs(v ze%tvi=j2PTJ@y0ANYqG267fJR z5jHWNG^3`GGBMd}qynK{Gju4GiKP}dbsN!?S--fiClE9G0uf2$ysni-c;)$kO|Ht} zcW0te45WIEz;b+=@t#QBG?S5d4@UdVWD09xd{x6a4XXlSvw!h59%3fFGm%M#f6R@M zsL527NcJ@LB#m&?Y&@Ja`ufad<0kdF$NFkFB5{qJOl6lF{YGQdi1##Z>$=Fvox8brY2`h-PeadnMFBV~p% z$w+#jaU#rWFL`O2PNg)R>5Nmue`-|5Gz|-_gR(4%nHEf1Vtf|F%c(-AnKX-O?o?13 z&1NbE*|tPT854@h5sjPa#$7wwKxi)cbeco+n7sKj8ZBUQr4ze$v`#{61=<<3NT-G5 zFGOqAXfaa>*6f6j#30739BRI{y;Ma@by`Aa!7AM_u7|1%tY*P!RLkTxf3L{E$CxUs z+a{WIbHr{#1m zQ~Bh1jaGuCbi(q;F}(mpjsSZVT~JErQxmu;;$|9MnDYiT+>ub8w%+XCn8?J#8;)%+spg67)gJ3 zG7w^ z1O7y}KizBkf4A&z_g9+@Jq`ZA`q+S+T@xGVH=-G{2HWA?SRrhtLdl4&pYmdE@Lsx0 z@_8&5wbkm)$)quWh&=V z!-e&R?QdRshMtvhUxL5JjDao_D<#w0Y!5G*Jwg0A`if3Z(N~#7AmE{|GX+j7NOL#X zwd0XS-;^8R_3Hcuot~%vf{cN{zDw5}sPoW^fA~ONLMfH<(sv{`b@W{%g;b_1WxID} zb!*W${eAj@g#IC7ZX#YF?cUcJ{7);YMKI5DSoX*C6REQQW?J#a@iqDxqM6OEv~qJ2 z5}sZCI(RAM;urKwoqkTg0=4S3sTy0KYZ_`j^c$!&5)Ye4wspg2puAQu{f=Iey86BJ zf92Mx)cHpV@+Y(;iFmUe#+h1*dCnW<_Am5T$?e~eAQZQfS;gx=5WT997i1!bJFSnT z0efgdl{kH#t0mc2(RS20mV;q4%03xU(;z+rq0q(0@X+)p4w^-c+q5`e14Dx z)0~N-v}7XDFfuQrrQ(2x-8#EuY2%g^e^opT%%b8?L1wj=OIQa9E=BxEC#*>?PeTcV zL9|KJQ5_&G=G5!uGWsGk!!woEp~k)_iaak@DDyIUA9oa;WV%;HgH|uk<~gtu&xMSM zct^sn3%oo}YWOLhkKM26A&c5s@nd{e2`}Ykx!$G_K;s&nYh{4tH6E^?B9KW3=LV^lMkey`a%ihB zGqDP^Bju@U-CQ{3bNF28H0L3GS`y|LoP0jhlIp@%Vv53$W%BdG&-zi=7rJm29k_pyp`Q%l6R5 zu`04bR*?;=isa2Oa9~qLF0B=)v0p^Rj7G+8>(#X;O&Us1#D`( z!)oPH*dJq6@5B;EmK9#!$-7G6iMz4cavR>uZ<4$H0S?M2nA#BQlZ)-ce=g%%MoZ#M zMXtpDx)j?80|zH%mpo|<34vB*QC@+7vZu$0s<1ZR>M-KOe2Y~-lD9vWiKZji$bPH9 zYVdHk&ZZ12i)^TH!c6&POV?}kn|>ocV1WV>oy@W+JIh@#%x2i7Es;2sfu;^27_Q&2 zv3Xb9&V!qFG_P;laBx@We})|gH*ag-;N=(!SdMbsIw8qveu6yTf8HS@elw%1SzJU4`|x0cIx9d*<99)18MK!b4L1{YXo>wEo$uuL zVogg5rlQ9j_EPI?e@P81yz?=>y9DUyaOM|5T8~~dnlQo|zpuEb7Ne>$nx5%#GkrLb zJhU?sGZQj6Gt$`y`2G^UkI~l50k8d#Vsg-{tDZvEVr>t9h(E0J`x$M|it1ugTW+$t z2yUyTypKxs2g?YNX-?FLb%l+p!h@x%vzcxyN_&FwRu?;de>w$Ar%?CmV#XiK0=vEZ zasGr(F8<^UH=_+(Jicxu-k&&RHnu5A+Re1lZG^zvfW{9aFvP|On4ZfI3^pDxdJ|zQ zGo`Amz*8jEO@%0r0seQB){>{jt(iQ#&WJ`kBeLk^l8pJzI7%8hqQot=&sdnIJ^6O4}78;-~>u`6TsebXl#;qx>6 ztPC&ciMi3k&%xoNMk?KEHAi0ls#P?84b#xoH&8L8e~fN(R}xA1j44ji$4EcVFUUZF zW_DUS(cHPNwKZ4mzo-tc`P;|=?d#9;@ON`3rDGQu?Pe-v^qA`-J*F&izi(w|Wt6zQ z7+F4bhAvJ6{QQuAr1KB>$4stWJ2wVac^Dn42V`3Y(lUz9E=F@-iM7-A)hxdjh1D zYG1V=UjyWokv@ejNR0`$#uS`zSYv4L=9x!Af6+`T(ywmYnnNL|u-%A5izso{Ch#Q)LgYm}`yun9g38$V9^`4uz5?Jj&mv4#fT89JIQ&kZQGJmq(y)^~8;MLKX+A z)!pJ13&k0z2E`&5$$v9iE_M*V@MNz4hqiVgMI>UDA=D+3K%cpA>_#ipYsBMbG^Mn< z&ic^AS-Ja`Ng!?DM-$adB6-*&YIU(xf3|J9RF(zCbY^wljao7KP+mYZ09Bw9)zZlU zNmNFYsqo}Hkd})Tx>zR8VOsrva6?VVc2%AJt&1j7<|XoAJvuPH`LVj1$X&yT^TjG% ztP~d%^lUqOVYRR(RwELmqNdp=H}@6^zD8W6iwnitT(e$yv7?D*K!)I%Ua^jzf0f?0 z9$K(3*1cjQZP!JO*d&YNNS8;nqA)Gu!7YhI8k^ndlQ~cwl%eLr#@VWiHW@WaqKE}j zcKB~i;ZBMhF{zcbOceVj+*^tcu}wPY_S`X$eGROfz75$&>Tid z5$G^0Cv1}(#+wiv$9na=8F^wpe`#-7Q{ZK<*r$u2*zYC7db?E0vaj&wdJ1f7Ghe2Q zPGKPXARoxhWf^Va>99451w$e%Er-ojnUc5g@T?>00(R$BPraV#5xo*!CPrAS!9FO6 z8ku;g*Gx88rHizeM;wwC0;U~dmY$~D%*C9Th)X>rJmj(N1g$!c>EhE|e^^=s@<}Gm zZh1RlSBjvW6e*obMY`bZun;6NM^1G+dY(D}MTa<6&C z)za@f#WhSD#v`NZG);9|Wp|f3ZThz~@5pO9^E01)p)1~u;A{6$^2*C2u9JUFQRG}V z?_g5A1zA_zz|`o6Phg?2fB&!%Ndrhlu;J!C?GUMBD8ad*Pi;Qe!``(xI?F%0QD;Rg+87g;W zX-1YRvot?TX9nA{w5+@)OO3~XK+v~Eleuy^Lx5>%2M`;Js zr$=aK(D^uN!L5$E&hp*0!?bsZ_MO-&$7_e^vJ-?#g{D)G4$yq6qH0=8Lfk3;WQm-k z_!Jtg(P#;=Mr%g_e`tL-6OED%Tsei;*+2lq0r74{O)?MH#e56ib@{gnmS~y}Lh3}$ zhidC`JcsbxUEW)Md6wcsbVZiZ)=%3A^#}Lw?--&Z&PV8K*W*+d3_8k>b~?+i?aa~* z<#mtH+jFD0VDvUQx+gbs2S(m0M}p;d0!2bl(Wwe;;gej?e?az;XIWmOe2= zpB|#)Ba{s`xdJ}t5Iy=RonUHm``nMx(@e+sS)WV3f0^k?kZ#hl^tEIB5uaB64P}a% zBlJ9QCF-{ZN1wy^x3l!UW8?#x1_S=cryb1FPqXyvCfDHTLzw@qns1QvWoxqZhm{hr z5}<#!Kr3C&f6LU{kFxZ4iF6o9|5QkRiR2sy^=a;Lu^MfVBrUv;@m3bFX*ZQfs1gNrqt7+MuAr~vU8Q7r)Al9|7*v6f38Z8^D-%FrANuy)4= zKn9G@(*z2Gqffw6R~N7=i4VSJOwE}Mu~wpFd4YUC$LEx6EgGQ*gB?TcFTW$pOOA7O zmg`_Vmt||(B;RtDc2{s9%V!5yYWEU!gU=ONUb$y*^m%+#YCgB4Qj>zXotH^7yAN8k zk4Vq1f2-hCL%e#Jo10v6$zb51&o#vBv%IN-TeI9|t#FdO`1HAl`I0?8XR!Pz#=zH} zuY!<1*(5X^zjWz8qN&fil9tAekd<1}nH{ zhp0)Lb%fs^ ze{2ub9_I(J)-ZqM;1GYT-si4+j7Nw*l@~1QJ1h9{T(m?qQ!$Zmrv;;QKWSDBR6qS1 z-LKJ88hxJV6)khH?Jw;&wCc&%l9HmV~fPS6>8b!b?nTiI>`Sqkv zHE;b$pgB_jAtYM>XP%1FQ7R?(*fd#_e{y(!-mpdwstM41l^P{?|D=UdCEPhm+oe8q znKLFKa3|5304&AOt5jo6T+E{s%2zbsAX!y;=OUS3)VoSICuunn4T@a+zXVeaU^R+=Slf2K^A$}U}9Be<%Uk-L4?W%1%ER)r~BMZ+8|9E3tn1%5LAZwTUq{2lc$2eH_Sg#8?}NFMt_;*-;VH0 z2(r$V*lK^O^kB>UwX7=3f46tx5dQ=FPp$4fXzj!%O-3xwaef(u5KL5>f7E@>rV`XD zK8(B~N5maIS5ry7j0locy`*%UN5_cC$StXO=+qk3GFjEGW13gCGHwe>?{dRADqRB)?IBWXLmND--9k`S}TurVEM&x$#B z({d~9Osmg|d5ST=3?ve_fA(O7Sdbs1WHjM+?id#SS>nuCg;;W-h%HhWDL{=Sf577U5z!WG9}?~O zz9iUwlFI6zaNb9Hy<sdh|b{tt$^5>6?@tdH5UdEG>653tN^=R!=k%3 zD=x1P(X8mhY$;-D`I^oOaRr7mV-+dm>#99jadf;;ZFAHD?Akgz_Dy=fOWW|jY;wEX{f06=S*VfyL8pHDGu!)s7fcTDa&@q6LDF9T>Tp@0+9TM+6fdJn} z{f>8tTWNr9QqNoI9{J=K`G?{HB#W2$uj=_Szbc=CMTvTr2(PHYbGn$Rp0mXw^;{xq z)U!owav-paP2v&--zj#>r-L1(>N(9(rk>@FD)n6ESSz1)e~S7k%^gMM?a}yz44!-+ zD)d~qmHFaj(qExjEYnJH7!~kerMQQNRCbz<%rOO=0#PA(HKKPO5RHN0#lvnpiA*L% z`A`z%X4yt4k_%+U0+lt0^`ca!4|`&k%!hJ96H7I*43nCuapq<(M%0%W%kaAt#6-&| zM#eB|au`d;e=t1A7i7`0;bqG*f&TdNyJQPw@%4&g_FvQ~^Q(J|hy=F?&6K^4J(?#$ z9XT;QHX&`H1SA_sDa$W$Cl1LjOWdl`UOz3Qc}RPUkoKy;@GEB2C4 z97Ec3A?>vy?cIVkh3f9`zjzOxUSb}GZ$8AI=7;_VP)i30OlKHPf*1e*?J|?`I~q$DA9Is~PQvmWHx*90ahvOD zJ7HTHo0|hxCL9~EV;5wy$xMBu&q`$MruxDDaMBtKJHlgiZ>tq=J(jfTHO2FN*+ha1 znE@+&6j3|X@1$%y?WFp-y4_A^D2wZBnvZT?6OP;4>)&faDFnLQY&vFda1yq{VmE)? z-_oD9;t9KDN7@=3w9_r^sf=eO5=)OVP^K_1?z?G1SjQqYZcNB6ZM`7E2=jW%eSoK@^gZihw4g{qc(^Ds^n`y5W)OcD2Q2@ zEnf!*F$Z(y>ktKhgPg0up#d1EQz)bB>A!;-mUm2!A*~CR8ew3m!mNJVJKKMfK<1-0 zw|KB@dnv-T1k7d26=Ka3!_<>wb0Yz zgH&80-0()iH=ZqsB8#K2N~9f4Xv}4Z=;zX>K-IIT)u9FciL9EL!ouV*@#;)tlxQVQ1pKW;qL9EYPcdEjo z=~KeMX}pkDEM{kzkt>;#{S7l_(3@E?!{Ma`*d~RBzH7(Z0yrIKC>;3~4;eU<+U5yQ zcawC$S(1>QID0~w=(;H5*+~N%={Y;idtG}#?X#(+M_p|zNewn(b0vSea1QTypXDU7 zY5Pq2!RlwqR8N&K??6AT`mWT73h9bbo)JE5+OPVgm|?PMOxlQY6-LK10j7MVogDNo>fi~+qUZ@tDQk4ZyYZd?-i7y)G{F@SPp8dmSiWU)&3GT) zFY-RXOEPKCzz2(=)U4N~)0UQL;6njiCPl<=#p9D=S*T!gC9i+LhlTD+CeTC$4SbZr zbUd3eaG8PgCz#M)Sf_Fy!^f*|6|Sb0Z`?Os%DQ?+YDYf6i9iq**nb6tPyPUxenG>c< z=mTc(;2z}U;4sVTc)-Y@g+s=vJ7e}>{?6T*??3rcJeq&E<8H1sXY}PWaW9dy&4Rt1 z)uw*>wo|-JL3{`I3zzTG8%3>7$@cZxX*<5rwsht z82J7aVbeY7p#UDl4;0EbZ`u%EW8y~&jpKwRJf`hxj|8wEKbDeq;8+rQ zcwNf%>iVQ|)$vXZ)UlE==YPXXGexEsQ_a9{8L5obXKzlkkS=MMRO2Q`=^6Y!fZyTS zNwY+;Xv{cEJSR8rj|!^U#GmO7Iw|9(B2@A(()WLCuh5=?_^Y_**Z3P%b2H5;PB|w2 z&apvKF6~l(k2Um&w=~R9@;~r$fPL_v#hRZlV{#+tzJDwDHg_H9h$VYG`5(MmiC6Gn ziuT+NcL#e9Ulik_OR1+6{Xe`Oz=as2Av>H@+})8e72gOZ$7|1WQY`5Qms-&_V5Ph4 z3$uTADyFN7@~bkQSLO6iuahbS(Nu=Q!tqmdi3~W!2~kx_Rt@kKW2!0^vSU}THq|T| zFU{9VxhaSG>YJSdO z`o?U^bCPz6Ehh!k$iWoy5;(rkuX8fgr;aa6Ctk;PqW79jwVr`$ z<8zxzba{NypJ@$l5=}YGNTKY^CVPMFv|izZt(=n~ZASUrdGcrj2!jR42b+d`u4%~U z9RMHcYj6;slDq%v#!)Pbb~FxQVGheju_D^oGmIvUuFT<>>Q?^C;kaR(FoZ=poVf?pDi znENSf?1hjyip!#rz%VYqx3z!D-x{n9)>eHUhlb4B;Hqe3mR7nd6bSL_Bi)w<)$XyU zLxG4HGVjDS3i*#uD(u41^0iB`Z7(A~>VLC1BoyeW{_HSrp_zGKW7E%=rA73;mL@Z!!JT+#Mq5a zaad(Y7Vc|`7A-P*s-LDsBltrOf2w}|fLXteeaC6R(?hu zUu)j*dUr7e_*<-*-Clo^2&zi9qmeQRaP>$O?d!qgt73?ajQM0?sTPt#EUTsBB*RVP$rxr48a%#ygWW*7j;)aM3 z;!=I}!#(ubqalNi7*$J2H>{S?ollZr9~wdxHR{NSS#}SMXrzDAA2Pb=?#i56!C*es zxf^r&TO^ED@?(B@M78D=jen7t85S7chr>c;MK_iA)TrYpWkyruikw>8tuIiV;O(8^ z+eg*OQMnDnYTbSEosVseYSU-`RHIHU1eg0*g=_d;cn9vn&78ai-o|lS;1EYtf#1b` z4Ije88vcRLx#Xt*_H{}a0437VjmMIokn22I!?nA)kY1IYEV6mr__b& z3JtGRS7~^)x>3WM)QE<6t4B3_R6VAi1=JJj=Nf-jJulFAmG650Y}KM+K!trb`97y{ zfr8)S`;x{53Vy3^kH!TGKH?kIxIn@0_1&*=fr3Ba+oykVfr3Bi`<2E83jVb3IgJYx z`~}}j8W$+|%f44ME>Q6Q`YSXpkhs6vzd&#eiNmK(W7)kNb^pUT29_DaaM8!Sicc`!mw;8JCHTX#-&K#%VR)Go<*wT%b z@r|<54RLvX;}sk>#tvP^K3yQ>NGac)`BXZvp{Qv$-`rkcEBdGc@OC>Sew-$4Jn=sdR9_IOCsP^@v#& z<5=K#u+X1C$Ums%`1RP~|36Sm2MA9re$T`V006QWlkqzolT>;|e_B^-J>7V>3ZA+y z;;E>3BZz_`C=rVMT<3EdqxXt{MaNaIXtnX5GM;xr`I4QY~=c(X077qlt3v7OkuJ1wa# z)!i)eVwriW@Yrl_f5~ubn_1KNnQwKpX2G_lx5h0ckxGb+N+MRfWGtV>dSi8cwc&-- zb?=8D1S%J4#{_h!Gzl!ECh{XALrwmzky%E@KTd2ewVwaZ2gSw8=oc8jmR;#^M%BR(hKDhLnu7{PifU4z|A1c!HEzoMGksh!#Z|3fI13I3 zqr6UYH;WPnP+h*ddcpY0GbZZKn0f+wXsKsW`UFr*2MCl3!<1?P008Hc@H-uoBYZD^ z3w&GEdH+uIxRR_qY{yAN0=cncVoR2tgvJgEFUJYsSb1RQfk;ZYmagqfBwe9<700{= zYuGy2*3q)HNmpQW%xq;{vw<9%LSXBFveB-4cVl!L?H(;%JGO3v4ZQz%?v*V&GIU*j z`RUy6obP<+JKy*J9>=e|_r>Rk=tJUvPC=*dzI$-%9nHg9`k0>2G$)$VBh4MnX){+a zvYKs}`FPIE=$J3+SzWVqERJbbJUynTk6ERh)tng7vXtwHSA}%V51oKatLsEaSM;t2dq2Eo--y z*W@WzR&O@)wqDF@*{%^Vc4f_f^f6qxYv+R7A>4n3kvHtC1bw*eee``_4Qnm#)9kTc z%hGehS!{1VD9F>+elSc+XjzC9su#5F|Dm@+jUif2^3Q-+@ zT?BV(a@YEe8#f9Xt$9J$q1%$unTFZLhq;t=?U2o=+1CC(o7cNzAH$S?eLJe#eOb-2 z1U0s`SILr-+ro4Stz|2yg2L6uD%1>z=qC)zwxq#s3e$RO4N(hSItOl!P71XNYLc@h z+sJnHnb|B*2xMCdMFj=*T*015LYkn4iXM`a=b%Oh#X}UMPOxS%!z$q1`nLANbFC4k zjkJli*eq!2yfp=ZO^vgEqI-))O`fSxcZhn}({+Zm!ze;Cvp5l^%bg1)a6v5t^f$F7 z=f}}DzW5b%CGQ6^m&{dMp=$&whP9J#7pCphT1UOqC+L>zq<7Q|n2N@5i7laSXtg$| z8B@2^ylJaxGjD4~Ue)pwU~_abbgNU{d7=P9Pkju`ojs-Mt*(sp)2-892D(HWqf z@Xv@@%xN&`*)FrwNt;K4L>5R6dDlJ()NKcl`*zEL`m8s$ZHw5 z>k>)*VcJJGu%QMK>I)jmwT}fem}>6FwbFhZi4b7l_P1YXkuV*kL#)b;;L94r0lJA1 z0e#zR7-PF>+E7z}E9{11L$+2#s#w2Cp$~`XW=2>0T$|*z9Onz0vrY{d-@+$pf_8l{ zR`__W$XA^~jap+D?wc000yV`LnW*H%KDS^A+EN20AM8W`eCYb#_~tF$0UAXqkt~*; zE)@-XqH8yD8q(knV^rsGFc4xew?s=m4S#Q{ai;5s+A?5&nq!m=(X9lHS5|A+pD&bb zh|sm1LMA7Nxyn0uyDdZoLNQu&c)LP&B_Dui&i3N~B)$;yzP7{L8ImVxB1GeKJEE#o z$Y?fnSFqII&tmVSyI7;UE8^sB_Ky|Kac!7$PC^#j z9;W-~r&!2;Pgky0Ws>bBBb(t`@-rd2pOI8Q%h8X5B&j7+reh*!dM1xn8ry`-J+1lPv<-(;O{?z0LBld^b0(UR1VV@=u8N`;aTL4QvPTk1c~vY5{T@OM zubtgyQQw)>bC8P2{C#e3zDzG759Rd}w!1Jtwr48q%k&jye+3ok0(* z_n=UQ>8l*cuhQ3$aTe^yIp+5lHGVaJX-+f3nepprUM+1zW(1Zc=+Yl4XF;<9xnt-aaM!js6bZr7WE@tAe`PlC@1&xy;z9#ZeT{j+P3)GS&;Vx3rzoQfA$ZwXZa z+1aT_v;A|$C=1C!)QC&P1~wO-oejWhx|BuBcEHk$y`zvA7EvGs%P}B?XXA1@AmWu| zbb(MsbU~D*+k;~@NbDDfu)(mndoC7B1#~!JkwQ|(%1u7vf6It)68eTw1c=4Yc|Cu@pRwjg_4*z9 zh*rwl6?)&i?KuB`W^t6=e9PRwEB#*uDPkDqxzhaMv1ymAzA;=>myecRyBI7Pp@&3T zj3Bqpw0Gm0r5dxh?hJ@As6&W(3W#G!t3~-R-EW3PjysSRfyk?`PHnQY3Kd4&t7B!lEH&^F z`6s7;5IskKJ*ngrZGG-4Pq(+pd+}p*akR<1Ic1%7TvSik_Lq{7?(WW|TXN|}P)bTV zlx`LzrD3Hz1f&}T;Rh_;B_Ps>bf=WhijVs8KKuFXKQrIG=00c7IXg2ub6<&vi8fzZ z(7I_ao36$bD^oK3=>)L-LfuhBKqVJ?T3QHMF}b03`BpYF?ZQfh3A7?0AEqtHGJIWY z?9*C`rhsznGclPDpi{AWlQxD#B{?!o^>G|#pNKiL;~TeX7gt_3PyEx@tUqWuz|rCx ze(&CJkA7D?jz}(v?K6DcWu_>L6h2F2k_TFKzgd)uEHbslGHA}UCQUkCuI+xm-IqU> zGyszd)G9{iv*iO7u3%XnIFTUMvSIq{yq}yJbd8iT4ytUl+2ixAMd4NS{D#Sl9Rj_b zZNjQG$95-Qydv&;67@y#uocb({3%3ya`|zB8ePRRugu(&&oRk;K82>c?CTd9`O>T_ z(W>z}|3$UoD_qjPaQ{N_!SN?_3On{vO!bcEwu^pVHQV}_%RBh?&RcAiW3r#e5C8h0 z_m0K8eR9w4xI5b?N@Pv7ZE)M>YQOf>gf(y&t7F*>=b$Fq;%bT}ymzVy3!HfhhhuzT zA{<+A{%)&UTZ1Kub#hJeE1qIVYl29^p?99l;%r={c^?&(?PYZMjMF%TMQF2eM44j* z3a{#lqoOAHI+FbBQHw>7DOFM2fw+F|SUDO2KC9{^Yr+pqdeo5pOv{tb)fhah%jJqj z79hsfT}gMs8+}RZffQGYT`;Hg^6l;VhKc)TJ%U3|nYC?Prqkdc6S-V{ zassWcO;q?c({rGEGW}9Q*l$!4pQ+WWEnj6x6e_V1KP=re;BHg5?rf-7LZ1FXC&pol zqjzwNRd~O^$XR9Lg)kU%0!NrKHyv-!iR~1(<)P1=)_iuAK=BZMsa*l96*QY zMG~+E7j<^ZMNm2JFx&p)CiHo)-c?8HRF?HNOT=s9o*03fYkcr6_DT@I?o$26wQ1?q z8nTma;f3M!rRM3>5StjU@`e*J9IpR2Ok~kM?itpc?T}}e8EdUrit=%uEp%xKdLGoe zgi;%xF9T~(q)hTrM9mnqC?&pS%>`;FFHhB)dFhpvG1qxx`H+F+5J^;{X%h}3g4OA7 z5?(p5<^pSQ;X=WLl2@v7iPoxcmhIR-)!hKk@>nIC~DCZdW<9=*<8 z$*hsBs9--bKx+&8qn6f=ER(7t&eemszH=HW%aI7O!By~~&0J%iBdDt1V<|o>XF5n7 zgKDrl-taJYRKpWw1i5GnQ=1&PM9Z4;d83Ysq0P2EV8(~LdB{hj+ct>nz3u%5G8tRb z7Tsx5Zx%1vMFm!xpJT46GG%bpxPa$w@W6kO)vd0YhZVQ!oX22Kq-DdfiG5N33M@bA$fA? zFvhgylJGr#YgAirLX77YzLnjEGW8D4KNVI+wR$!PV_~jsifQs=opd)UgYjDoW*-Z@ zUV7I*XM%zIIA7_9=_Z3#17KxWa@@2wl;G4h)p-_JoxilN%%b-9N2X&nHpMZzD$Hi7 z+K+k&s$=p=QFA~7HqTcysEU-z)YnSAI~D*qiXZ8DW*?*eSj^C%35}pz)%1SQa@WjIgwDHe8SgCN@zZ?@9_Mp2d{;={H!Phm7v`G4n=1<`w6EnbK%%6LDx8$}tYU(f%g(H1$FR zx>vC~tveH3N+d&}#o70+vH0j?bj8Rdcv^%Qzo3KG%`Hfc2Kt&mFX%4(dX!-(u40VF zmt2$|Cxf|9BbES&K9L@;TI7?E_<;uEMl%<5}uJ|`dhY;f&_v5`3 z*A+Xuo|yQXfWb&r!^A-JL5@KxVj4@znYkhT^!~b(Ttb&M&a~v#tMh#*k=MX-KMur^PJBJOSooSR3+ z)BGGa(~LVis8Zp~%;)2KX`n$=CE81H^{96CKa7on0YW|`zEQWr!N+hux9QmdBe%9Y zU%-MXXvJs9lbm(AlYxXld(>j%BcdE+j0PRlCl0gU+J-B7_01i~KS^Dj32Fpl6#Lz8 zsHThfFiZ!V__V#B_zaDe0b^<~s!1!eywmFL$sv}OE_1L6eqkSvCLqc1T%~on{~J9? z%21R`V9iv;c?Z?_lTCBuYy7zy-RtG_gS$uIAg&(2P-Xb8_j-0bF6ZlClTY?;ua~%t z;hMtTLYc5A*)9FU37Q%hhs^A03lq)yQ!I5H7M8OdQ$LjG;M02q(}0`U6!cacl}b?@ zhR;eJ?en@Yp3$4T3+t@ADvT5oC#|%bO;-X`{#s4$>PD z#VA)RWRbK0lN1TMy?2YSiG$K=edX~QU1fk>97P$NqMxk8PeY*&20~k+F(58=qKdlI z6-E{cBntF}Qs2xX46tL;x<@Ct%WqSk|j z{5A)<=xK&5m&_}f&wbh*HfTN|LAL{a>~lv%D_~9@l@-ZVIxjeb-(hLcD`r^-=~cgV z7#h0ak}h|+3pzz;cO<$MshsLv;GSrBKTrm}mk;U;LOkei4?~xx}Fd|KmpQvQ%Ky5S&U!sL8qCCd|wX}x`ohI+u{r_6pIDD1P~E>$7~ZA znrVcWpRBeKb$~5gL%3tmb?g!X^go5o$>MZov=`L1NRxOHx&;t>&$`PiHO#y=3V9Pt z(z*Yns7JcVE5J|mJK7T(krql1F%P{9)-K4Urb>T-!R6C#K1<@o*SBw4(xr`k8!Rxh zR~qU@v??*uSW#7mQld>LA8R>Ry<~s{0P}E;+0QK{5nn|U% zjQ4>lsxJ*aTJ_`h>{d4>$f}X~a9gtpD=MD#o%Ry^lfd3!aqHgYr5A8Mno-t`v zhCEwVb2GierU-1s{Kl=Vlu%&s`8u~*%?-{Tc3xP=dnmDpBEn5t@k$pS^XT}6J=yIK zU-!qa9L<3ef@woc4cO%?3#5xnJqmZ{gngd7NSt7vAqL}Ry3pQ~oY+$IA3sPPPgOnx zubb|yBHCJ@{6p(ZBDR+|$yZcw17kE3{G}pDj|bIv{$t2mOSk$`gu;M&dnQnKBOnX& zGtpk`w8gN*nBFAJn0fb-EB;)*%mgsLOwo-^skJRbj5&gJ ze4ldwXgT_w2bLh&68V4sxFUkImmouaLMXxazS_N`lDY3W-y2BAmGse`!@qZCBRK3- zWsu@7H=(9~Ij7e6`0IkDhXHQ%FZ)VlReP9yJHn+#5AT8zhefsOc}D8V&&*U|tMB*z zl_od>sJ_ijeHIc5Ncv*t`ilDT5wML7tlOW{^0bu4>!0dyac2mo3>5bRpXY)tOP-r{ z^VYuLf1k*sqbfl6`PZg5UT9zdBa?|UBZaUqlwbI%yLNC+GtfNRG7}xBB zNEjf%+Z(B+onP%pH_qcLUaFy{+5%5mv3eBMdQM zVBh|KDqfKXP1+Zs`ULRMJ?$T8nZ^U(c68wHE|i8xy2K60ItfPI)^^LaEW8(JCEZb? z_=-#36?Zqx;qH;K%Eh9bR4m*EkfVkN> z+7du}LW=W3;#=(eInwZXAef>$*@^aCva4?==G<(wsw2;fe>L*pP$rtj^|jG;e9vQ` z<(>R$B-IgLo2st^_3Fo)%g!UDqof@9OFwJ9j_TVO3}N^7>e-v5?&*At{4ha`|Hy>& z+shCg*u6YGeQzk_XdBb8qvvfpg)SJI1X+4IRa1`nY0e2Q)q{oTGr)*Ao1GGpubi7v zCmnqsX{i~?4iarD`UhRNxo8>m zSZX=Ay*=ob0F?D)qcg>lf0=e;=Akc=Z%TSw7F|#q|D3*j<8cJ5K|}?(`@}nR@>7Qn zXL<%zb_&QN+|zNOFACHZVwEBW!zC%{KwEiO``n{R4aGg2aX+Vv<0aCDUT`;c|yof-6W; z@nJI{X;lsGxm*BwuE?sE3TY#*Xv3L?3M%_WJ^~x@_q0zvv@%uox&~7Y z1iF!|Wx0sFIs;@|=s#W)L2nGp397N%7v2@hylgnU>~&<3`7PO`MAvZ7?xr|mTXJ=O}*CB zMqY9s$Z$d5uoN;qL)i4#du7pd-ONmq5eSh-Wcu2dD4buq=U6PdSwQ|2P0^NfzI>5$ zn*o0%N9%QDlCwE!flaOL6*tjOPl82;R|oWq>$2`gG7wJ>k+szivQiWK8`CL{zYJ*& zx%5YH_E5ppVWzMd6;A`7t}gGW@FDA1yvVC#PfI;Mb)d5$&r&l*XGfmc zY{6S|IGBF{EfN!-v%dB9d-<^1&@3!216$6W!<8*?+Vp|0L1*pMY)x}~a`{!drN_b4 zPTrlAH|FTI6FL`A_9uA9flA<%+bjGk;%j^CwG%!U_x#fZ7wKtFbN?ae&jcA3)gLkq~sr+#cuZB0#Me2_!OK^ZYR&ti>4YVhq1i2EB^JCka*2Bz880Q4Z7}va zy6X{YG_JUAN-*@N30yTX%Lyp7wTq)_8CR{~YR-Jz=@Vt`QAIRl!&=NM6uxQP5Y9VSN9#dI~UDM&T24@$Deak2H1jNHPp`H7U*)U>W9?8XC6bDTfFM2;F zx3sWeL28b+OvBY_^E3(7mui7c5>My?O0VXbwztbTqg{=8{;YG(V)sD1Iy%_FxhnQu z6;cA3%_sS>aW(sbY46HBo7@ZgT~-lNbF1VGS-Ny3Whw{6u*BJ?y86qgFX)0^6czN! z=KYL&KH`lE8X(stUH)vT0=+ zrC%fY23Q}G_W=|F(a2UO#{oiQwO|4eWB@?yLA??oOoR@iPDp>>TH)P1mN5(x!2$rp zAAne-_uwH3!!MA`E{HEj1=eCRti^|ltB~BB=j5PJx1MQOy%NmC>Y-3B{V$;e`gkPd#} zuYf4-T@PX3>o3oF_6KcMi2kBzAQS}*6n`zgU|J6k(M%iw!4?z0*ZS)z1&dwkf!4nC zFNzeBD8YSy8vdHB!1NwoQ3xQ2kK*1b0(JYskDexdv1#}eu zc1r;OtPk2mu=qm*DgLc61OR9sP~ZLjH?m@8iofgOU@dbzpb#SeP$&==Z?gM1|4sb@ z0MrlY@u)vEGUT+FisIjd9RNV}faK5mO-4lC-xCynC#GN#JiL;>=lmwgW61AY|2Omm z05~6LTIT&GGh^?c4T!(`O6} Kt*`#|wEG{3k;I+= delta 35566 zcmXt;Q+OR**RIo;jhhuWwr$&NY}-y&xMHiZZ98df+je7n_x=8BpUOVeNR_= zZo6#k03c}HU-Y|`(JM`Ft8-B#BX9Wi8V~fiPZH! z6D^Pt5f}ooV!6sL+$;y{6M@JyKm%A9M7`#9&D#Mi;p*8UpNYeSr`8FZ>S#)rBjSuA z$xewN;-BF(sKjl;ZQqNKd^$164PuX}>xpAs*o>KQkPfZ`JNaKO^izgVP}PZXP((`_ zMef(Aj5tmpE{OS0bDk0@2a$kw-;8In&5Ke!N|2aO%=8AwA{Pv3qhl!2?3?_kAZ5+^>9teyb6P!CAyF^@aHFL%{nWw~4=jfjNBp z_aAtPxl9C!e|a#0rpnq1=t?M`-!W2}X%ur|^&GpJicINX)fu}{7)aHk$WWpfN;*O> z0=if`wDXy61@4ib%f(48jC>y5pLrHmL)OsrrZUs+CZ8tL()5AdA7G4;WS}Q+?`azQ zMs5zbU~8+$^tvKUwtnaIxud-MjfDNQz`gETC}c=Jb`M1$Gfv+MoR)kpot+~OiddCp zGTs*LXjnmats=YGG2HpDwHIx=^2(I)k*6YkO!r0FXQ1$irvdbV~E{~vi>7pXop$yZ}kkNI(Rh1{&kd*)J=PBUS$wQ?M*Nytw3zsv7)| z@`#b>AXtLb{Vr|4frQIuVsW4pXkhKA0fu^tBx?Z3rK1=hVdvXgXmm~K7%_H1S{>YX z?5a&U1AsO;2+5vi%pP~gY#*fE?w*jopA4zf__-Y(V|v2!({T^#7>2w zk2eA%C{+Y7w7wvjmGn=C@`X|kqwhldBXgG>+gwB?aA1FMwg>lvKT#kQ$wLWJp$kARH58sp_omu zSG&P``G=-y)&B}z3H&EU8+}Zpn z+xaSu$KCJiKhj2BgLz4Z?gzTHcSxm7GVm5qgvM2n-F( z?BHds0_qxGgvtr9rkrgch>cos7Ej|A;|`b7(NAe3#KKlkm%Mw;-&v4s93Jt~g}CTY z1v?dqbifFQBt<^bI3piZ7t?)@iWM~atqCK#UwlI`x3 z49S;qv$u^-rmGHH=4RrT@(ekniAWOxf+>ar$DwROPO1z1F#R6Y?Ze0(tNU|Q_Tr9{ zDR(@G{Q>VVE%Q*zA)ZQmhY5`k*))h*H;xKR)@=+y?zd=~{hUE3#Z~52UNU?P^}2IX zKz#I8@h8B@gJAa3k!B0dr@jZMOfQga!)PSzDSnS;%<@%OoM=;@$CbsY>o!99z4i<= z>xAR(z!ARw+X!$DK4ZX0+G?wB;UB%0T}y1`&sxk>u+LARC{i^?V>~iMyp-W5SNf~- z2yQ|}#qxd$TYR6OKvQ7Swa{W>)(Q>I`aWI`vl*RY1f$3BfM(A=>5~Ru5oCjSCgXGY zJmk={pHTz}SHGI`dxaj)xbV5zA@E#Zi|dZ{dxBik?e?F^?`1Qi=~Oo8`+%p2ZKk)Q zsDeay|0AjTO3ZHL@SgufXI%-Cru|QJ&5-}o+&d9jqCo>Guu08YVcr14PfrlOi4yC^ z4;vHPh6a6x>o>3&LQ`H{b4Z~v ztmVoJ@2%s^yUcO#*Zt!X1~75Qpxwp0WA}Q6MdIbuU|nSjRbM5!vUX!Nq{KInv2}_H z8mW5-RV#%Bu%VAnt_Ie3v_dnRyKY2Ip>V-Uv%y1+1sr!!)=ZR;Pey~|O&eHemQH$2 zt%I9aR67o$3$|V{O`u0uCebII{vL~D-jtxBp3@Y-G~!uubhejn2oH+dPnkDOO_hyb zk|W`}(D>0J!(wvE?#{RSs1PnTOxAe*@}gB&$B-8S+|?<(tg=G6I)Hb_P3WBVCCW?A zTdV=-eOW@gl8?#8%p4=FUo$Z45JrK%qDv!X&K=tFJfUnY?1$+o;Z6Rg5E&wigc_rZ zEF*ie&>~Lp?v3->I(1}Dy$M-4XOM}+C*g!^q(VeUt>>wqhzWCu_?Y_~1^s>;JrQCM zp&g3`216ivXSFlfpGjE+=TWfg+##{}26-oI>P=E{2KQfZhLIrZW;B!G8C%dJw{C3h)Bj<-$Y96)(B@rfEFUX!E{b+t4`H!6BQtw?D|V?A%oGQ)}D!GmR&``W=k z;G4QdE{5z+3S+!uY_FDDG-zL?Apre_$^FK=L;wZ0p2TzYgRGN^2i* zhFK0GXUYOByFycJck570#US`7RWt{GX%#by#mgETVF-J(X7=o7`YCvlDA5Z6{^$br zW4GA#xiH0t$O1xRen>Vln)M0Q1XStA)y&Oz2^GRzKM|neBhL_;>+Ft%NKxXB){|Lg=M`F(&M0t`$S=6`nTASFwb$Dsh8x}%$7 zeetoHuDOV6E!B4-3gyZrivOrK-24UU zKHCyG=J;{|)8lndII~Zt>qw&9(#{jo{6{q=IV4933yg~&k2 z*Isk+IFp;sKOjf9Kp>4ALYxO|OrAUiot>p%Pio;%v`r#ab7y`JRij8JI64)P=RXf# z3svpkjaQ^cpDb@HrT0O!TW_Z7dSRYxT90@X@$CN@z)~sBF-yV0(mvW&m4TfQXNS^ozE00FBe}ppUPVn_X+H%@}X0vsVDqwK91x)NDi7 zQ~xqmDK&6V_`f9-R4q^U1Vi`%HkZ%X45ux=9@bd}!4tnW^0L^Uweq}Gz zP0dDCXS}JNkwzRXTthX$)-n%ON6Qps&&Tn+WTXuzRFzoJ*jkL%D6y?DcHDFf>2up$ z*u+O1&Nu=*{>_^rSls~jSzemMvR>F-rq22g3Q218)s_nDprtUWvb{t^3(*e4V|I1scqB|ggzit1h@#PO-3Hkuk-oEEYTz<`{Fka5dETwb2?mR$gK zyH(tn;N+o&HnS*A^M@xr2^LOkt9@ABP*Vi1siVpuGd76c1$mCn8K(;kk*OWl`iI$z zA{A}}niCKa>rIqf*H}z7Qd%9{)SNT#2sR0+q@cXIvH`;uQ$Vo#U)ottA z6bL`ObN7rDzT|vONxW^6!Q+uv4zr+RLtS^=Ohc;@aFwzN#U=Jmn~koRT>?)pka|tb zB=og4ARFh1_;z-UrdP}W;N<^F?i;_PExRS*CoJ&exX}Q7 z^L{zO>X)j70zc2l1;6Xe&WfnENWMVpVky>o=GNID{Zn@1XcxtW6_B`oOZJ3|H z!zVz7^c#Dy3e0y^Im1&+T7`?WzOida^%kJ4ft(4rbpg7@GT`?gFGC_;+do5rA4>Jv z64M{Mj+OWl_bfJkFxuMWvu=nFy9=CLX#3^IO4#O&Q!UYDp!BPTIOL#+6?+_`1(%d?dgi&J1oI3n1iuV(2vE5hAP-JW4&0q#p|e{R=;#i%!+8;&_{eyB2;T#~m3j z{G3+y?i952&KUa(*)%+?5v5-T*`wt99%K3pF}@1VTEEyRv0#SqF z?cFzZ%Nko`*6EnU{la>Bk<(9P-*=F&C9oA_%x7qYEE2sh`FyjFGqas9r}ejiV5PkV z&$T^Y`8V>`j?M}r&CTU$_*I2z+3QXC1Z&x>IyH17R|pcBT+tJZ_pV&x`L4!hi{ljqINu*8b74bhAP-zCbH9a7X~BpJ^HrF zsox^9`_T_Rim2=G!AFI+4!>9N$*02TrSl>z;&dh1b=tMfhC}L<>j`3)L7*YXpOm9R z=?vM|n&u!+k#S0qJHgukZHTnL5QtU5xM4>y$_MKqX&C+dWMdingnfBNfjVN(5_PU{ zw@y8$IIqZ9U<5xu|N9TE$kL&`c3`ewYuZ8De1^S8&M!RrsxfuIq8nXLf9?r#V5btj z{4VRwX9(p8>cAn<1FK@4{|oEX9$tSG#aF^MHjx1F&S-=h55G*WSUR!-8nE#^EbeH( z_>*uJd05R6TgFnS4-@m)k%+o}DDLI}L=oEaVWFxPi$yM>+-`o@J4^@&VT(R+ofSj<_?2)_4b;CtGBZjvLuhi-YTt4q~jP^i;ff3{z zj%OjHR8e%GzrfhD8^mEsrJTHX_LFDMlhfAYQx0JdSd?MF?%n99)@wof@oTpO{8?1_ zRjHI3!x~KSAYa3Yg4NQ}b!|Gz-6};~@-D)*=LqFXw(nSc7hL-@dSDcs8 zQ6*oSz*c78!yc7-TJR0s>gYLjPS7bVk=*dldqv4qBh+jH0z!FfD92L2au{RS8Y~%Q ztQt8PMp?|FcxF-t4dNngGpjm_^$n`ZIOQ0bUn2pF5CX>&F!T)ZuCd<2LUBZzi!UIc z1inbnXHH*k^#&T{Ji@Yx8TMJH?mRxAE!3AHb2^&^e?G(91HD4NhJgQ*K9CVdxKs>X zgt7TA1Zrb&-cKAMKH=`N=)A$BVNanD>6$r4P|V60fxrP(B#*e&=H0X@`)9ULI9;ow zEvHf}%z=AGer^UO`;!I11}s57OB4a{UimyizWGEayr*5E(`s;eIw*bdSCt=>FQVMu zNFpyubOIgTbWtC5o=mo75wr5`KIZ&`8HwTzYp@?8W8Jtey( z;D|aA%!I_9w?piEhB(1Q7buOXPXy*wg;V)9mu{>l4EN zdnMzuv+qZNH|BtjPQHBLg&<qk(qm>A?mzPLcU}}gEdDUe*4aN#(l#OzZ~%g z!*iHK#5pT>ID=v<_X1#{TZ(RzJ_smX;mZ!ga$Wq*)q=6Kxw~Z=hw);2QYSIiark-s zA}y)+SiR%P2=|MvR)pmsU3wg`$+&j=jL&`E-R~PujhjvJNldG+TM_EiFrkuZ-pp)$ zIZUGmG{V+F>x2=jfM;dxYdmyCkN}&3pH;hn;(baSs(j66-{0tEtS(-T_+N~0CFHlA zso1m%yeD!pc75PcsdDlJ+r4vuZSU-QY8M5e!*BmZj+m3hC;uO4_DvAOPs~9lOWYxa zPAq7`1iC8gD*O-eS!)t#uZf`{;=y10OTuY*H%h1 z&ZjAVu~k1`R3||O-uUHHaS0Q>TWN*ge z1ADKNbsI2S3QN=G%52}N$N8*7lO9{)L$tP#_R^8_H8`S4`zPS8Zqg63b=PgPV1X>s zB!h7~V`h|p-@EaYn*qw7f`Ng@F~_0|0Cnko&wa_4I1`ye5u{~Dl1NrNs}Tb)oMpxW zBAzIC#IzAYX26m3p%kVpwm5XlC-p~p-nxk-z!5XVKC85!Q6R7JHXZ~;Yvu^!jveu} z)$^Bo4vjkc?JEzN+aqoejUWMz7YJ)XKk_P7W;`S5BhybpJB${~HetvgqYeN(sF_LH z&5JS~>}@}`pEn14^=m8V%0m}f(wD@=W))BpzOf4e77J&)rAx#}Exxr$H+Y6`oI%|# zB24&wgU0Z(PihS%6%#CQit))?8SX;Xcm@@j9kwcV2K&XV@@L;Gy$0{W{;Yn71CrB= zBtK&KhSD%mQr!HniPC9tNB#cK=pz3|g7awwflB}9bP6IF2r4Qlud_Uw?^4O8P?(h9 z1K&i8q)~qc{(q;(bY@7xCL`}Ma1uTIfw?cB9wJhVBOXlnFguFgUSR=#eRx9pBR%)+ zTs}TFy6#Kp=;XzG*y_7{6f?-KrA8djo&02DQr^fH&L)cI%ZADi-J`}W1g73tc22dzQA! z_wApciCqe%33>jqO1omB1TNto-!UQ(Qtt?b2$g+SIO+vpn=dQ-;S))%zPDa+_ZqZq zeby|GZtlC|U?G-^_l$S^j^o%h^FDLWhT8VA3hm9Dl@RYqTFbdFJng$8vlj1>;#y#G z-SZzBGU$bhfwl~OjFNzt*)HWGXjOwg;+8mO_RN9B-ko@Y`Q72}!#g>9XZ%WIXej#& zf6~CTQivVtjD+@&g+bwg11f)PeTp89ss#T>(5W31yz56T>C7d~RTIH=9ah zaen%I{n)4Q_nct%;pg;F`Yip`)3|88a5XfXO7D?rs`m-puJ$H?%Ez~xm{o#|!G$H- z{F8Um9f$gm@6qN`qRMVlR|7ozW;{|E>S`H2TulME44q@bAGKBZopPK`lXrFZry6D6 znVy8GL?6mq=$T%lg6ed*?&0?^@jr+ANIYY=+JRIHbwJ8RBtp0@;Y7Vf{ft13)x)=q zdyk#p=XL47m3@~4XoLLH+eVFBZqN(g0&rVzM4;o}a_U%mUj~jj010g+FGxrqt-pnE zG?B3HABaPUkZ|ZJ?L|e9y^=YGX0F1X;bK#YRG!38=AYZ%e}we=Q<`>CZw-%I5jM2F zdt#-*K~R@@692#iGL0;@Fmv{6w4_+0qTn$%1Wjn%c{aJQ;ie0!3d?5hho^IAMVoIvMKV;IHBm4@G$u;0` zgHkX=G}QA=Zi7t6PVFht)TARpU#pGgx5Z(7l}@=su(iJSDV2`BjC+>6!l&3a$sjzR z`pSll!M$b>2Ajj%1!~kXQWOnX&}vd#uA_yM5w2ArnluU;@P7#QlS-HD3wb`F+hrPE{H?_6D

%6K4SwC7IQze=vR`C9urpeXS*~OW{ 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a9..739907d 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index db3a6ac..c4bdd3a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From cb010bdc84050a3d66d163167c4192a46902d430 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:08:37 -0400 Subject: [PATCH 19/28] workflow tweaks - publish and attest sources jars too - run correct task to publish to modrinth --- .github/workflows/build.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1711fa5..d94cb7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,15 +43,13 @@ jobs: - name: Attest Build Provenance uses: actions/attest-build-provenance@v2 with: - subject-path: 'build/libs/*.jar, !build/libs/*-sources.jar' + subject-path: 'build/libs/*.jar' - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: Artifacts - path: | - build/libs/*.jar - !build/libs/*-sources.jar + path: build/libs/*.jar - name: Maven Publish if: github.event_name == 'release' && github.event.action == 'published' @@ -61,7 +59,7 @@ jobs: if: github.event_name == 'release' && github.event.action == 'published' uses: AButler/upload-release-assets@v2.0 with: - files: 'build/libs/*.jar;!build/libs/*-sources.jar' + files: 'build/libs/*.jar' repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Modrinth Publish @@ -69,6 +67,4 @@ jobs: MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} CHANGELOG: ${{ github.event.release.body }} if: ${{ github.event_name == 'release' && github.event.action == 'published' && env.MODRINTH_TOKEN != '' }} - run: | - ./gradlew --no-configuration-cache modrinth - ./gradlew --no-configuration-cache modrinthSyncBody + run: ./gradlew publishMods From e48585cbdcbc4ac9dc7b07ff08c7087f0ee57f22 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:13:16 -0400 Subject: [PATCH 20/28] bump actions versions --- .github/workflows/build.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d94cb7e..375deec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,16 +21,19 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: JDK Setup - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 25 distribution: 'temurin' - name: Gradle Setup - uses: gradle/actions/setup-gradle@v4 + # note: setup-gradle v6+ has switched to a proprietary license. + # pin this to v5 for the foreseeable future. + # https://blog.gradle.org/github-actions-for-gradle-v6 + uses: gradle/actions/setup-gradle@v5 with: validate-wrappers: true @@ -41,12 +44,12 @@ jobs: run: ./gradlew build - name: Attest Build Provenance - uses: actions/attest-build-provenance@v2 + uses: actions/attest@v4 with: subject-path: 'build/libs/*.jar' - name: Upload Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: Artifacts path: build/libs/*.jar @@ -57,7 +60,7 @@ jobs: - name: Github Publish if: github.event_name == 'release' && github.event.action == 'published' - uses: AButler/upload-release-assets@v2.0 + uses: AButler/upload-release-assets@v3.0 with: files: 'build/libs/*.jar' repo-token: ${{ secrets.GITHUB_TOKEN }} From a6d57e7efdca03522adf3411073260ea7dcb2d52 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:17:45 -0400 Subject: [PATCH 21/28] add a workflow_dispatch trigger lets you run the workflow manually --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 375deec..49bb956 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,6 +10,7 @@ on: tags-ignore: - '**' pull_request: + workflow_dispatch: permissions: id-token: write From 87af710af5a67e90e1c1e73104547c1da0a619f4 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:45:13 -0400 Subject: [PATCH 22/28] invoke providers before expanding properties --- build.gradle.kts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0b94d46..265e03f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,7 +45,11 @@ tasks.processResources { inputs.properties(meta) filesMatching(listOf("*.mod.json", "META-INF/*mods.toml")) { - expand(meta) + // providers must be invoked manually or else you get stuff like "provider(?)" instead of "mod-id" + expand(meta.mapValues { when (val value = it.value) { + is Provider<*> -> value.get() + else -> value + }}) } } From 2f3728ec5fab5e47125fa40361c40b7b308f4740 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:47:01 -0400 Subject: [PATCH 23/28] rename the workflow job it's not always making a release --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49bb956..ee8dcd0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ permissions: contents: write jobs: - release: + build: runs-on: ubuntu-latest steps: - name: Checkout From cebfa15f166b699cacfd8d148c335d8a96457eac Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:53:52 -0400 Subject: [PATCH 24/28] don't abbreviate metadata expansion keys --- build.gradle.kts | 6 +++--- src/main/resources/fabric.mod.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 265e03f..66f27a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,9 +37,9 @@ tasks.processResources { "authors" to authors.split(", ").joinToString("\",\n \""), "contributors" to contributors.split(", ").joinToString("\",\n \""), "members" to "$authors${if (contributors.isEmpty()) "" else ". Contributions by $contributors."}", - "mc" to providers.gradleProperty("compatibleVersions").map { it.split(", ")[0] }, - "fl" to libs.versions.fabric.loader, - "fapi" to libs.versions.fabric.api + "minecraftVersion" to providers.gradleProperty("compatibleVersions").map { it.split(", ")[0] }, + "fabricLoaderVersion" to libs.versions.fabric.loader, + "fabricApiVersion" to libs.versions.fabric.api ) inputs.properties(meta) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ebd4046..3356d89 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,9 +21,9 @@ "${modId}.mixins.json" ], "depends": { - "minecraft": ">=${mc}", - "fabricloader": ">=${fl}", - "fabric-api": ">=${fapi}" + "minecraft": ">=${minecraftVersion}", + "fabricloader": ">=${fabricLoaderVersion}", + "fabric-api": ">=${fabricApiVersion}" }, "suggests": { }, From e1e84381c79907b681b654b3cae57c6f6ff2c103 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 05:59:33 -0400 Subject: [PATCH 25/28] use a dynamic version instead of a changing version for loom slight semantic difference https://docs.gradle.org/current/userguide/dependency_versions.html#sec:dynamic-versions-and-changing-modules --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 08330c6..4718434 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -loom = "1.15-SNAPSHOT" +loom = "1.15.+" mod-publish = "1.1.0" minecraft = "26.1.1" From aa7424643de64c198b560756ad6f1aa05a73f999 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 06:14:55 -0400 Subject: [PATCH 26/28] deduplicate compatibleVersions query --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 66f27a3..2daa6a6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,7 @@ plugins { val modVersion: String by project val branchName: String by project val slug: String by project +val compatibleVersions: String by project version = "$modVersion+$branchName" @@ -37,7 +38,7 @@ tasks.processResources { "authors" to authors.split(", ").joinToString("\",\n \""), "contributors" to contributors.split(", ").joinToString("\",\n \""), "members" to "$authors${if (contributors.isEmpty()) "" else ". Contributions by $contributors."}", - "minecraftVersion" to providers.gradleProperty("compatibleVersions").map { it.split(", ")[0] }, + "minecraftVersion" to compatibleVersions.split(", ")[0], "fabricLoaderVersion" to libs.versions.fabric.loader, "fabricApiVersion" to libs.versions.fabric.api ) @@ -72,7 +73,6 @@ publishMods { else -> STABLE }} - val compatibleVersions: String by project val compatibleLoaders: String by project val readme: RegularFile = rootProject.layout.projectDirectory.file("README.md") From 06d9cf1fc0ed115058962b0f5f4fae24b7cdefff Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 06:18:03 -0400 Subject: [PATCH 27/28] forgot these --- src/main/resources/META-INF/neoforge.mods.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index fcfe7a4..9f76482 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -32,13 +32,13 @@ side = "BOTH" [[dependencies."${ modId }"]] modId = "minecraft" type = "required" -versionRange = "[${mc},)" +versionRange = "[${minecraftVersion},)" ordering = "NONE" side = "BOTH" [[dependencies."${ modId }"]] modId = "fabric_api" type = "required" -versionRange = "[${fapi},)" +versionRange = "[${fabricApiVersion},)" ordering = "NONE" side = "BOTH" From 49ceab6546f20cb92d229a0f08d051d24d212010 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Tue, 7 Apr 2026 06:32:46 -0400 Subject: [PATCH 28/28] don't attest on PRs --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ee8dcd0..f53aab4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,6 +45,7 @@ jobs: run: ./gradlew build - name: Attest Build Provenance + if: github.event_name != 'pull_request' uses: actions/attest@v4 with: subject-path: 'build/libs/*.jar'